diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-08-30 00:59:26 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-08-30 00:59:26 +0100 |
| commit | 9ba99535750e19c341f6ff535c6c8991658a8fbb (patch) | |
| tree | b00e41294fe3129d99d9734086a17948e7d96483 /src/lib/video_decoder.cc | |
| parent | d81db4280dd09ea9d0064272b075667d659b594a (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.cc | 24 |
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 ()); + } } |
