[FFmpeg-devel] [PATCH] avformat/utils: return pending IO error on EOF in av_read_frame()

Marton Balint cus at passwd.hu
Thu Aug 29 22:57:04 EEST 2019



On Sat, 24 Aug 2019, Marton Balint wrote:

> avio_feof() returns true both in case of actual EOF and in case of IO errors.
> Some demuxers (matroska) have special handling to be able to return the proper
> error for this exact reason, e.g.:
>
> if (avio_feof(pb)) {
>     if (pb->error) {
>         return pb->error;
>     } else {
>         return AVERROR_EOF;
>     }
> }
>
> However, most of the demuxers do not, and they simply return AVERROR_EOF if
> avio_feof() is true, so there is a real chance that IO errors are mistaken for
> EOF.
>
> We might just say that the API user should always check the IO context error
> attribute on EOF to make sure no IO errors happened, but not even ffmpeg.c does
> this. It should be more intuitive to the API user if we simply return the IO
> error as the return value of av_read_frame() instead of AVERROR_EOF.
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> libavformat/utils.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index b57e680089..b83a740500 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -1762,6 +1762,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
>                av_ts2str(pkt->dts),
>                pkt->size, pkt->duration, pkt->flags);
> 
> +    /* A demuxer might have returned EOF because of an IO error, let's
> +     * propagate this back to the user. */
> +    if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
> +        ret = s->pb->error;
> +
>     return ret;
> }

Ping, I will apply this soon.

Regards,
Marton


More information about the ffmpeg-devel mailing list