X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fvideo_decoder.cc;h=3625e074fba0460fc63729a00bc30c446f7d769b;hb=4542d9e7c510ba91e1b9b056536a2bc4a18ecf32;hp=6ec479ad262ff088fa735fe0fabd821473d2087e;hpb=de2af791bdfdcd653752cba970e59efc7bf810c7;p=dcpomatic.git diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 6ec479ad2..3625e074f 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -59,10 +59,9 @@ VideoDecoder::emit (shared_ptr image, Frame frame) return; } - /* Work out what we are going to push into _decoded next */ switch (_content->video->frame_type ()) { case VIDEO_FRAME_TYPE_2D: - Data (ContentVideo (image, VideoFrame (frame, EYES_BOTH), PART_WHOLE)); + Data (ContentVideo (image, frame, EYES_BOTH, PART_WHOLE)); break; case VIDEO_FRAME_TYPE_3D: { @@ -70,28 +69,38 @@ VideoDecoder::emit (shared_ptr image, Frame frame) frame this one is. */ bool const same = (_last_emitted && _last_emitted.get() == frame); - Data (ContentVideo (image, VideoFrame (frame, same ? EYES_RIGHT : EYES_LEFT), PART_WHOLE)); + Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE)); _last_emitted = frame; break; } case VIDEO_FRAME_TYPE_3D_ALTERNATE: - Data (ContentVideo (image, VideoFrame (frame / 2, (frame % 2) ? EYES_RIGHT : EYES_LEFT), PART_WHOLE)); + 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, VideoFrame (frame, EYES_LEFT), PART_LEFT_HALF)); - Data (ContentVideo (image, VideoFrame (frame, EYES_RIGHT), PART_RIGHT_HALF)); + 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, VideoFrame (frame, EYES_LEFT), PART_TOP_HALF)); - Data (ContentVideo (image, VideoFrame (frame, EYES_RIGHT), PART_BOTTOM_HALF)); + 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, VideoFrame (frame, EYES_LEFT), PART_WHOLE)); + Data (ContentVideo (image, frame, EYES_LEFT, PART_WHOLE)); break; case VIDEO_FRAME_TYPE_3D_RIGHT: - Data (ContentVideo (image, VideoFrame (frame, EYES_RIGHT), PART_WHOLE)); + Data (ContentVideo (image, frame, EYES_RIGHT, PART_WHOLE)); break; default: DCPOMATIC_ASSERT (false); } + + _position = ContentTime::from_frames (frame, _content->active_video_frame_rate ()); +} + +void +VideoDecoder::seek () +{ + _position = ContentTime(); + _last_emitted.reset (); }