[FFmpeg-devel] [PATCH] ffmpeg: Properly handle EOF return when flushing encoder

James Almer jamrial at gmail.com
Wed Oct 23 20:25:49 EEST 2019


On 10/23/2019 9:11 AM, Andriy Gelman wrote:
> From: Andriy Gelman <andriy.gelman at gmail.com>
> 
> When flushing an encoder we send a NULL frame to avcodec_send_frame()
> and then deque all compressed packets in avcodec_recieve_packet() until
> AVERROR(EAGAIN) is returned (indicating that all compressed packets have
> been removed). The second time that avcodec_send_frame() is called with a
> NULL frame it returns AVERROR_EOF.
> 
> At the moment, avcoded_send_frame() treats all errors as fatal errors,
> even when AVERROR_EOF is returned, meaning that an encoder is not
> properly shutdown.
> Since all other returns are handled after the while loop, it suffices to
> break when AVERROR_EOF is encountered to fix this problem.
> ---
>  fftools/ffmpeg.c | 8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 8e408c808a..9e9fc7a714 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -1933,12 +1933,8 @@ static void flush_encoders(void)
>  
>              while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) {
>                  ret = avcodec_send_frame(enc, NULL);
> -                if (ret < 0) {
> -                    av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
> -                           desc,
> -                           av_err2str(ret));
> -                    exit_program(1);
> -                }
> +                if (ret == AVERROR_EOF)
> +                    break;

avcodec_receive_packet() is not meant to return EAGAIN when in flushing
mode. If it's not instead returning AVERROR_EOF when there's nothing to
output, then it's a bug in the encoder that's propagating the wrong
error code, and it should be fixed there.

>              }
>  
>              update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index);
> 



More information about the ffmpeg-devel mailing list