summaryrefslogtreecommitdiff
path: root/src/lib
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
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')
-rw-r--r--src/lib/player.cc9
-rw-r--r--src/lib/video_decoder.cc73
2 files changed, 40 insertions, 42 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index a1adee0b0..db09d1768 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -645,9 +645,8 @@ Player::video (weak_ptr<Piece> wp, ContentVideo video)
return;
}
- /* Time and period of the frame we will emit */
+ /* Time of the first frame we will emit */
DCPTime const time = content_video_to_dcp (piece, video.frame);
- DCPTimePeriod const period (time, time + one_video_frame());
/* Discard if it's outside the content's period or if it's before the last accurate seek */
if (
@@ -687,7 +686,11 @@ Player::video (weak_ptr<Piece> wp, ContentVideo video)
)
);
- emit_video (_last_video[wp], time);
+ DCPTime t = time;
+ for (int i = 0; i < frc.repeat; ++i) {
+ emit_video (_last_video[wp], t);
+ t += one_video_frame ();
+ }
}
void
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 ());