X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=ae4ab237f344ce8c8fd39613d0589b21475dbec6;hb=dd9be86db6cde0afa5da0d1d1ac43b42e05dca26;hp=04c97ed3ba4d6b98cb87b706ec7ae47dea44ca6d;hpb=35409488fd54aacefa6858dce4b02a576170e76e;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 04c97ed3b..ae4ab237f 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -68,11 +68,11 @@ using std::min; using std::pair; using std::max; using std::map; -using boost::shared_ptr; +using std::shared_ptr; using boost::is_any_of; using boost::split; using boost::optional; -using boost::dynamic_pointer_cast; +using std::dynamic_pointer_cast; using dcp::Size; using namespace dcpomatic; @@ -145,7 +145,7 @@ FFmpegDecoder::flush () ContentTime to_do = min (full_length - a, ContentTime::from_seconds (0.1)); shared_ptr silence (new AudioBuffers (i->channels(), to_do.frames_ceil (i->frame_rate()))); silence->make_silent (); - audio->emit (film(), i, silence, a); + audio->emit (film(), i, silence, a, true); a += to_do; } } @@ -159,12 +159,6 @@ FFmpegDecoder::flush () bool FFmpegDecoder::pass () { -#ifdef DCPOMATIC_VARIANT_SWAROOP - if (_ffmpeg_content->encrypted() && !_ffmpeg_content->kdm()) { - return true; - } -#endif - int r = av_read_frame (_format_context, &_packet); /* AVERROR_INVALIDDATA can apparently be returned sometimes even when av_read_frame @@ -416,6 +410,10 @@ DCPOMATIC_ENABLE_WARNINGS } _have_current_subtitle = false; + + BOOST_FOREACH (optional& i, _next_time) { + i = optional(); + } } void @@ -465,12 +463,14 @@ DCPOMATIC_DISABLE_WARNINGS shared_ptr data = deinterleave_audio (*stream); ContentTime ct; - if (_frame->pts == AV_NOPTS_VALUE && _next_time[stream_index]) { + if (_frame->pts == AV_NOPTS_VALUE) { /* In some streams we see not every frame coming through with a timestamp; for those that have AV_NOPTS_VALUE we need to work out the timestamp ourselves. This is particularly noticeable with TrueHD streams (see #1111). */ - ct = *_next_time[stream_index]; + if (_next_time[stream_index]) { + ct = *_next_time[stream_index]; + } } else { ct = ContentTime::from_seconds ( av_frame_get_best_effort_timestamp (_frame) *