X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_examiner.cc;h=3c6d185f43f0991d3716ad31e12dfb7b5f9dfd20;hb=1dffa893a0f7042bd50500246ac94d70efa23bdc;hp=a793c7b985d09bfcd91114abe76c6723327dc252;hpb=6f832724ef942f133f6f8d0a06d7377beea8f7a6;p=dcpomatic.git diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index a793c7b98..3c6d185f4 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -33,8 +33,9 @@ extern "C" { #include #include #include -#include +#include #include +#include } DCPOMATIC_ENABLE_WARNINGS #include @@ -69,7 +70,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptrnb_streams; ++i) { auto s = _format_context->streams[i]; - auto codec = _codec_context[i]->codec; + auto codec = _codec_context[i] ? _codec_context[i]->codec : nullptr; if (s->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && codec) { /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up, @@ -228,7 +229,7 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegExaminer::video_packet"), r); } - r = avcodec_receive_frame (context, _frame); + r = avcodec_receive_frame (context, _video_frame); if (r == AVERROR(EAGAIN)) { /* More input is required */ return true; @@ -238,16 +239,17 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc } if (!_first_video) { - _first_video = frame_time (_format_context->streams[_video_stream.get()]); + _first_video = frame_time (_video_frame, _format_context->streams[_video_stream.get()]); } if (_need_video_length) { _video_length = frame_time ( + _video_frame, _format_context->streams[_video_stream.get()] ).get_value_or (ContentTime ()).frames_round (video_frame_rate().get ()); } if (temporal_reference.size() < (PULLDOWN_CHECK_FRAMES * 2)) { - temporal_reference += (_frame->top_field_first ? "T" : "B"); - temporal_reference += (_frame->repeat_pict ? "3" : "2"); + temporal_reference += (_video_frame->top_field_first ? "T" : "B"); + temporal_reference += (_video_frame->repeat_pict ? "3" : "2"); } return true; @@ -262,30 +264,29 @@ FFmpegExaminer::audio_packet (AVCodecContext* context, shared_ptrfirst_audio = frame_time (stream->stream(_format_context)); + stream->first_audio = frame_time (frame, stream->stream(_format_context)); } optional -FFmpegExaminer::frame_time (AVStream* s) const +FFmpegExaminer::frame_time (AVFrame* frame, AVStream* stream) const { optional t; - int64_t const bet = _frame->best_effort_timestamp; + int64_t const bet = frame->best_effort_timestamp; if (bet != AV_NOPTS_VALUE) { - t = ContentTime::from_seconds (bet * av_q2d (s->time_base)); + t = ContentTime::from_seconds (bet * av_q2d(stream->time_base)); } return t; @@ -479,3 +480,12 @@ FFmpegExaminer::range () const return VideoRange::FULL; } } + + +PixelQuanta +FFmpegExaminer::pixel_quanta () const +{ + auto const desc = av_pix_fmt_desc_get(video_codec_context()->pix_fmt); + return { 1 << desc->log2_chroma_w, 1 << desc->log2_chroma_h }; +} +