summaryrefslogtreecommitdiff
path: root/src/lib/video_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-08-30 00:59:26 +0100
committerCarl Hetherington <cth@carlh.net>2017-08-30 00:59:26 +0100
commit9ba99535750e19c341f6ff535c6c8991658a8fbb (patch)
treeb00e41294fe3129d99d9734086a17948e7d96483 /src/lib/video_decoder.cc
parentd81db4280dd09ea9d0064272b075667d659b594a (diff)
Fix incorrect reel lengths in some cases; account for emitted data being rejected by the player, and for initial audio not to be at time 0.
Diffstat (limited to 'src/lib/video_decoder.cc')
-rw-r--r--src/lib/video_decoder.cc24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc
index afd4a83ee..dceadcd15 100644
--- a/src/lib/video_decoder.cc
+++ b/src/lib/video_decoder.cc
@@ -59,9 +59,11 @@ VideoDecoder::emit (shared_ptr<const ImageProxy> image, Frame frame)
return;
}
+ optional<bool> taken;
+
switch (_content->video->frame_type ()) {
case VIDEO_FRAME_TYPE_2D:
- Data (ContentVideo (image, frame, EYES_BOTH, PART_WHOLE));
+ taken = Data (ContentVideo (image, frame, EYES_BOTH, PART_WHOLE));
break;
case VIDEO_FRAME_TYPE_3D:
{
@@ -69,31 +71,33 @@ VideoDecoder::emit (shared_ptr<const ImageProxy> image, Frame frame)
frame this one is.
*/
bool const same = (_last_emitted && _last_emitted.get() == frame);
- Data (ContentVideo (image, frame, same ? EYES_RIGHT : EYES_LEFT, PART_WHOLE));
+ taken = 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));
+ taken = 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));
+ taken = Data (ContentVideo (image, frame, EYES_LEFT, PART_LEFT_HALF));
+ taken = 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));
+ taken = Data (ContentVideo (image, frame, EYES_LEFT, PART_TOP_HALF));
+ taken = Data (ContentVideo (image, frame, EYES_RIGHT, PART_BOTTOM_HALF));
break;
case VIDEO_FRAME_TYPE_3D_LEFT:
- Data (ContentVideo (image, frame, EYES_LEFT, PART_WHOLE));
+ taken = Data (ContentVideo (image, frame, EYES_LEFT, PART_WHOLE));
break;
case VIDEO_FRAME_TYPE_3D_RIGHT:
- Data (ContentVideo (image, frame, EYES_RIGHT, PART_WHOLE));
+ taken = Data (ContentVideo (image, frame, EYES_RIGHT, PART_WHOLE));
break;
default:
DCPOMATIC_ASSERT (false);
}
- _position = ContentTime::from_frames (frame, _content->active_video_frame_rate ());
+ if (taken.get_value_or(false)) {
+ _position = ContentTime::from_frames (frame, _content->active_video_frame_rate ());
+ }
}