[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