diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-01-11 16:42:30 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-01-11 19:46:53 +0100 |
| commit | 0070c968403a46b464bc259e6e2dcd89c541dcf2 (patch) | |
| tree | 3b9324c64104f3647bec67a407673fb3a61fcf49 /src/lib/ffmpeg_decoder.cc | |
| parent | 3b3ab3a69bc35f30690c9e5a5703baf3c700e41b (diff) | |
Fix failure to decode multiple video frames from one packet (#2159).
Diffstat (limited to 'src/lib/ffmpeg_decoder.cc')
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 0c9f1de6e..3d6a37c8d 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -538,17 +538,19 @@ FFmpegDecoder::decode_and_process_video_packet (AVPacket* packet) LOG_WARNING("avcodec_send_packet returned %1 for a video packet", r); } - r = avcodec_receive_frame (context, _video_frame); - if (r == AVERROR(EAGAIN) || r == AVERROR_EOF || (r < 0 && !packet)) { - /* More input is required, no more frames are coming, or we are flushing and there was - * some error which we just want to ignore. - */ - return false; - } else if (r < 0) { - throw DecodeError (N_("avcodec_receive_frame"), N_("FFmpeg::decode_and_process_video_packet"), r); - } + while (true) { + r = avcodec_receive_frame (context, _video_frame); + if (r == AVERROR(EAGAIN) || r == AVERROR_EOF || (r < 0 && !packet)) { + /* More input is required, no more frames are coming, or we are flushing and there was + * some error which we just want to ignore. + */ + return false; + } else if (r < 0) { + throw DecodeError (N_("avcodec_receive_frame"), N_("FFmpeg::decode_and_process_video_packet"), r); + } - process_video_frame (); + process_video_frame (); + } return true; } @@ -557,8 +559,6 @@ FFmpegDecoder::decode_and_process_video_packet (AVPacket* packet) void FFmpegDecoder::process_video_frame () { - /* We assume we'll only get one frame here, which I think is safe */ - boost::mutex::scoped_lock lm (_filter_graphs_mutex); shared_ptr<VideoFilterGraph> graph; |
