[FFmpeg-devel] [PATCH] avcodec/libdav1d: clear the buffered Dav1dData on decoding failure

Ronald S. Bultje rsbultje at gmail.com
Sun Dec 29 16:11:08 EET 2024


Hi,

On Fri, Dec 27, 2024 at 5:12 PM James Almer <jamrial at gmail.com> wrote:

> Should ensure avcodec_send_packet() doesn't return EAGAIN in scenarios
> where it's not
> meant to (e.g., ffmpeg_dec.c where avcodec_receive_frame() is called in a
> loop to drain
> all produced frames before trying to submit more packets).
>
> Fixes ticket #11377.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavcodec/libdav1d.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
> index 546b42e9c6..ff67f44bd3 100644
> --- a/libavcodec/libdav1d.c
> +++ b/libavcodec/libdav1d.c
> @@ -372,9 +372,10 @@ static int
> libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
>
>      res = dav1d_get_picture(dav1d->c, p);
>      if (res < 0) {
> -        if (res == AVERROR(EINVAL))
> +        if (res == AVERROR(EINVAL)) {
> +            dav1d_data_unref(data);
>              res = AVERROR_INVALIDDATA;
> -        else if (res == AVERROR(EAGAIN))
> +        } else if (res == AVERROR(EAGAIN))
>              res = c->internal->draining ? AVERROR_EOF : 1;
>      }
>
> --
> 2.47.1
>

This looks OK.

Do we need to refine the example code in the doxy of dav1d? I feel the
error handling (including the special handling/meaning of some error codes)
is not very explicitly documented there. See also
https://code.videolan.org/videolan/dav1d/-/issues/436

And should we be using AVERROR() here? Isn't DAV1D_ERR() more appropriate?

Ronald


More information about the ffmpeg-devel mailing list