summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/video_decoder.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc
index 142996b10..613ec9c73 100644
--- a/src/lib/video_decoder.cc
+++ b/src/lib/video_decoder.cc
@@ -60,6 +60,7 @@ VideoDecoder::emit (shared_ptr<const Film> film, shared_ptr<const ImageProxy> im
}
double const afr = _content->active_video_frame_rate(film);
+ VideoFrameType const vft = _content->video->frame_type();
Frame frame;
if (!_position) {
@@ -72,14 +73,17 @@ VideoDecoder::emit (shared_ptr<const Film> film, shared_ptr<const ImageProxy> im
If we drop the frame with the duplicated timestamp we obviously lose sync.
*/
_position = ContentTime::from_frames (decoder_frame, afr);
- if (_content->video->frame_type() == VIDEO_FRAME_TYPE_3D_ALTERNATE) {
+ if (vft == VIDEO_FRAME_TYPE_3D) {
+ frame = decoder_frame;
+ _last_emitted_eyes = EYES_RIGHT;
+ } else if (vft == VIDEO_FRAME_TYPE_3D_ALTERNATE) {
frame = decoder_frame / 2;
_last_emitted_eyes = EYES_RIGHT;
} else {
frame = decoder_frame;
}
} else {
- if (_content->video->frame_type() == VIDEO_FRAME_TYPE_3D_ALTERNATE) {
+ if (vft == VIDEO_FRAME_TYPE_3D || vft == VIDEO_FRAME_TYPE_3D_ALTERNATE) {
DCPOMATIC_ASSERT (_last_emitted_eyes);
if (_last_emitted_eyes.get() == EYES_RIGHT) {
frame = _position->frames_round(afr) + 1;