X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fffmpeg_examiner.cc;h=72db9bce1a3cd9abf1b3c2191eb5ed1f0180d10a;hb=7f2e74604a51b984e4c8cbb5d5f4bb642677ec00;hp=38dd678bbfa91da1f80562f3dac0d7fcf78c0829;hpb=8353a009aae1a604251c0160193c39741c2fa27c;p=dcpomatic.git diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 38dd678bb..72db9bce1 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -75,13 +75,13 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c) if (_packet.stream_index == _video_stream && !_first_video) { if (avcodec_decode_video2 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) { - _first_video = frame_time (_video_stream); + _first_video = frame_time (_format_context->streams[_video_stream]); } } else { for (size_t i = 0; i < _audio_streams.size(); ++i) { - if (_packet.stream_index == _audio_streams[i]->index (_format_context) && !_audio_streams[i]->first_audio) { + if (_audio_streams[i]->uses_index (_format_context, _packet.stream_index) && !_audio_streams[i]->first_audio) { if (avcodec_decode_audio4 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) { - _audio_streams[i]->first_audio = frame_time (_audio_streams[i]->index (_format_context)); + _audio_streams[i]->first_audio = frame_time (_audio_streams[i]->stream (_format_context)); } } } @@ -102,14 +102,14 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c) } } -optional -FFmpegExaminer::frame_time (int stream) const +optional +FFmpegExaminer::frame_time (AVStream* s) const { - optional t; + optional t; int64_t const bet = av_frame_get_best_effort_timestamp (_frame); if (bet != AV_NOPTS_VALUE) { - t = bet * av_q2d (_format_context->streams[stream]->time_base); + t = ContentTime::from_seconds (bet * av_q2d (s->time_base)); } return t; @@ -118,27 +118,25 @@ FFmpegExaminer::frame_time (int stream) const float FFmpegExaminer::video_frame_rate () const { - AVStream* s = _format_context->streams[_video_stream]; - - if (s->avg_frame_rate.num && s->avg_frame_rate.den) { - return av_q2d (s->avg_frame_rate); - } - - return av_q2d (s->r_frame_rate); + /* This use of r_frame_rate is debateable; there's a few different + * frame rates in the format context, but this one seems to be the most + * reliable. + */ + return av_q2d (av_stream_get_r_frame_rate (_format_context->streams[_video_stream])); } -libdcp::Size +dcp::Size FFmpegExaminer::video_size () const { - return libdcp::Size (video_codec_context()->width, video_codec_context()->height); + return dcp::Size (video_codec_context()->width, video_codec_context()->height); } -/** @return Length (in video frames) according to our content's header */ -VideoFrame +/** @return Length according to our content's header */ +ContentTime FFmpegExaminer::video_length () const { - VideoFrame const length = (double (_format_context->duration) / AV_TIME_BASE) * video_frame_rate(); - return max (1, length); + ContentTime const length = ContentTime::from_seconds (double (_format_context->duration) / AV_TIME_BASE); + return ContentTime (max (int64_t (1), length.get ())); } string