X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fvideo_decoder.cc;h=cf21f885a3fbc6af45ba2efde1cfc18ad645eb9b;hb=c103d8c1306e5fb3937b3a6c430a3fff32653fa3;hp=215024e29b04d0179a0b8aeea5e7f9d076d1911e;hpb=cbb8260e395058da76b3de518ebc535a114c54b1;p=dcpomatic.git diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 215024e29..cf21f885a 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -32,14 +32,9 @@ #include "i18n.h" -using std::back_inserter; using std::cout; using std::dynamic_pointer_cast; -using std::list; -using std::make_shared; -using std::max; using std::shared_ptr; -using boost::optional; using namespace dcpomatic; @@ -101,7 +96,7 @@ VideoDecoder::emit (shared_ptr film, shared_ptr im if (!_position) { /* This is the first data we have received since initialisation or seek. Set the position based on the frame that was given. After this first time - we just cound frames, since (as with audio) it seems that ContentTimes + we just count frames, since (as with audio) it seems that ContentTimes are unreliable from FFmpegDecoder. They are much better than audio times but still we get the occasional one which is duplicated. In this case ffmpeg seems to carry on regardless, processing the video frame as normal. @@ -110,12 +105,12 @@ VideoDecoder::emit (shared_ptr film, shared_ptr im if (vft == VideoFrameType::THREE_D_ALTERNATE) { frame = decoder_frame / 2; - eyes = (decoder_frame % 1) ? Eyes::RIGHT : Eyes::LEFT; + eyes = (decoder_frame % 2) ? Eyes::RIGHT : Eyes::LEFT; } else { frame = decoder_frame; if (vft == VideoFrameType::THREE_D) { auto j2k = dynamic_pointer_cast(image); - /* At the moment only DCP decoders producers VideoFrameType::THREE_D, so only the J2KImagProxy + /* At the moment only DCP decoders producers VideoFrameType::THREE_D, so only the J2KImageProxy * knows which eye it is. */ if (j2k && j2k->eye()) { @@ -136,6 +131,9 @@ VideoDecoder::emit (shared_ptr film, shared_ptr im frame = _position->frames_round(afr); eyes = Eyes::RIGHT; } + } else { + /* This should not happen; see above */ + frame = _position->frames_round(afr) + 1; } } else if (vft == VideoFrameType::THREE_D_ALTERNATE) { DCPOMATIC_ASSERT (_last_emitted_eyes);