summaryrefslogtreecommitdiff
path: root/src/lib/video_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-07-28 15:36:40 +0100
committerCarl Hetherington <cth@carlh.net>2017-07-28 15:36:40 +0100
commit280ca5218e193a3c54e5963dda1a80c6e78cc382 (patch)
tree7c9b1e352ec03e4ba43d26cc3123a0db03e9ee53 /src/lib/video_decoder.cc
parent7d651ec877927e0887da48ce441e5c5158e1f34f (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.cc73
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 ());