X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_examiner.cc;h=fdcacb465602693fba0bf668cc82d7bd9b82ddd6;hb=26866fdeba6dd868b1809de49799690555164f70;hp=3c6d185f43f0991d3716ad31e12dfb7b5f9dfd20;hpb=1dffa893a0f7042bd50500246ac94d70efa23bdc;p=dcpomatic.git diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 3c6d185f4..fdcacb465 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -26,8 +26,8 @@ #include "ffmpeg_audio_stream.h" #include "ffmpeg_subtitle_stream.h" #include "util.h" -#include "warnings.h" -DCPOMATIC_DISABLE_WARNINGS +#include +LIBDCP_DISABLE_WARNINGS extern "C" { #include #include @@ -37,7 +37,7 @@ extern "C" { #include #include } -DCPOMATIC_ENABLE_WARNINGS +LIBDCP_ENABLE_WARNINGS #include #include "i18n.h" @@ -221,22 +221,25 @@ FFmpegExaminer::video_packet (AVCodecContext* context, string& temporal_referenc return false; } - int r = avcodec_send_packet (context, packet); - if (r < 0 && !(r == AVERROR_EOF && !packet)) { - /* We could cope with AVERROR(EAGAIN) and re-send the packet but I think it should never happen. - * AVERROR_EOF can happen during flush if we've already sent a flush packet. - */ - throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegExaminer::video_packet"), r); - } + bool pending = false; + do { + int r = avcodec_send_packet (context, packet); + if (r < 0) { + LOG_WARNING("avcodec_send_packet returned %1 for a video packet", r); + } - r = avcodec_receive_frame (context, _video_frame); - if (r == AVERROR(EAGAIN)) { - /* More input is required */ - return true; - } else if (r == AVERROR_EOF) { - /* No more output is coming */ - return false; - } + /* EAGAIN means we should call avcodec_receive_frame and then re-send the same packet */ + pending = r == AVERROR(EAGAIN); + + r = avcodec_receive_frame (context, _video_frame); + if (r == AVERROR(EAGAIN)) { + /* More input is required */ + return true; + } else if (r == AVERROR_EOF) { + /* No more output is coming */ + return false; + } + } while (pending); if (!_first_video) { _first_video = frame_time (_video_frame, _format_context->streams[_video_stream.get()]); @@ -486,6 +489,7 @@ PixelQuanta FFmpegExaminer::pixel_quanta () const { auto const desc = av_pix_fmt_desc_get(video_codec_context()->pix_fmt); + DCPOMATIC_ASSERT (desc); return { 1 << desc->log2_chroma_w, 1 << desc->log2_chroma_h }; }