diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-07-28 15:36:40 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-07-28 15:36:40 +0100 |
| commit | 280ca5218e193a3c54e5963dda1a80c6e78cc382 (patch) | |
| tree | 7c9b1e352ec03e4ba43d26cc3123a0db03e9ee53 /src/lib/video_decoder.cc | |
| parent | 7d651ec877927e0887da48ce441e5c5158e1f34f (diff) | |
Do repeat in the player rather than trying to do it in VideoDecoder.
Trying to repeat in VideoDecoder is the wrong side of the distinction
between content and DCP time; the repeat is for the DCP and VideoDecoder
should be emitting in terms of the source.
Diffstat (limited to 'src/lib/video_decoder.cc')
| -rw-r--r-- | src/lib/video_decoder.cc | 73 |
1 files changed, 34 insertions, 39 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 2bd8d6f51..afd4a83ee 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -59,45 +59,40 @@ VideoDecoder::emit (shared_ptr<const ImageProxy> image, Frame frame) return; } - FrameRateChange const frc = _content->film()->active_frame_rate_change (_content->position()); - for (int i = 0; i < frc.repeat; ++i) { - switch (_content->video->frame_type ()) { - case VIDEO_FRAME_TYPE_2D: - Data (ContentVideo (image, frame, EYES_BOTH, PART_WHOLE)); - break; - case VIDEO_FRAME_TYPE_3D: - { - /* We receive the same frame index twice for 3D; hence we know which - frame this one is. - */ - bool const same = (_last_emitted && _last_emitted.get() == frame); - Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); - _last_emitted = frame; - break; - } - case VIDEO_FRAME_TYPE_3D_ALTERNATE: - Data (ContentVideo (image, frame / 2, (frame % 2) ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); - frame /= 2; - break; - case VIDEO_FRAME_TYPE_3D_LEFT_RIGHT: - Data (ContentVideo (image, frame, EYES_LEFT, PART_LEFT_HALF)); - Data (ContentVideo (image, frame, EYES_RIGHT, PART_RIGHT_HALF)); - break; - case VIDEO_FRAME_TYPE_3D_TOP_BOTTOM: - Data (ContentVideo (image, frame, EYES_LEFT, PART_TOP_HALF)); - Data (ContentVideo (image, frame, EYES_RIGHT, PART_BOTTOM_HALF)); - break; - case VIDEO_FRAME_TYPE_3D_LEFT: - Data (ContentVideo (image, frame, EYES_LEFT, PART_WHOLE)); - break; - case VIDEO_FRAME_TYPE_3D_RIGHT: - Data (ContentVideo (image, frame, EYES_RIGHT, PART_WHOLE)); - break; - default: - DCPOMATIC_ASSERT (false); - } - - ++frame; + switch (_content->video->frame_type ()) { + case VIDEO_FRAME_TYPE_2D: + Data (ContentVideo (image, frame, EYES_BOTH, PART_WHOLE)); + break; + case VIDEO_FRAME_TYPE_3D: + { + /* We receive the same frame index twice for 3D; hence we know which + frame this one is. + */ + bool const same = (_last_emitted && _last_emitted.get() == frame); + Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); + _last_emitted = frame; + break; + } + case VIDEO_FRAME_TYPE_3D_ALTERNATE: + Data (ContentVideo (image, frame / 2, (frame % 2) ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); + frame /= 2; + break; + case VIDEO_FRAME_TYPE_3D_LEFT_RIGHT: + Data (ContentVideo (image, frame, EYES_LEFT, PART_LEFT_HALF)); + Data (ContentVideo (image, frame, EYES_RIGHT, PART_RIGHT_HALF)); + break; + case VIDEO_FRAME_TYPE_3D_TOP_BOTTOM: + Data (ContentVideo (image, frame, EYES_LEFT, PART_TOP_HALF)); + Data (ContentVideo (image, frame, EYES_RIGHT, PART_BOTTOM_HALF)); + break; + case VIDEO_FRAME_TYPE_3D_LEFT: + Data (ContentVideo (image, frame, EYES_LEFT, PART_WHOLE)); + break; + case VIDEO_FRAME_TYPE_3D_RIGHT: + Data (ContentVideo (image, frame, EYES_RIGHT, PART_WHOLE)); + break; + default: + DCPOMATIC_ASSERT (false); } _position = ContentTime::from_frames (frame, _content->active_video_frame_rate ()); |
