This was one of the few decoders incompatible with the flag. Also only call free_sequence_buffers(), dirac_decode_flush() in dirac_decode_end().
Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- 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, }; -- 2.40.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".