[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