From 0f3090cbd12558909055c4a701aacc86f66747bc Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Tue, 28 May 2024 13:11:08 +0200 Subject: [PATCH] avcodec/diracdec: Use FF_CODEC_CAP_INIT_CLEANUP This was one of the few decoders incompatible with the flag. Also only call free_sequence_buffers() instead of dirac_decode_flush() in dirac_decode_end(). Reviewed-by: Lynne Signed-off-by: Andreas Rheinhardt --- libavcodec/diracdec.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index 3a36479c59..5bf0dcc2db 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -403,11 +403,8 @@ static av_cold int dirac_decode_init(AVCodecContext *avctx) for (i = 0; i < MAX_FRAMES; i++) { s->all_frames[i].avframe = av_frame_alloc(); - if (!s->all_frames[i].avframe) { - while (i > 0) - av_frame_free(&s->all_frames[--i].avframe); + if (!s->all_frames[i].avframe) return AVERROR(ENOMEM); - } } ret = ff_thread_once(&dirac_arith_init, ff_dirac_init_arith_tables); if (ret != 0) @@ -429,7 +426,9 @@ static av_cold int dirac_decode_end(AVCodecContext *avctx) DiracContext *s = avctx->priv_data; int i; - dirac_decode_flush(avctx); + // Necessary in case dirac_decode_init() failed + if (s->all_frames[MAX_FRAMES - 1].avframe) + free_sequence_buffers(s); for (i = 0; i < MAX_FRAMES; i++) av_frame_free(&s->all_frames[i].avframe); @@ -2371,4 +2370,5 @@ const FFCodec ff_dirac_decoder = { FF_CODEC_DECODE_CB(dirac_decode_frame), .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DR1, .flush = dirac_decode_flush, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, };