diff mbox series

[FFmpeg-devel,6/7] avcodec/avcodec: Use avcodec_close() on avcodec_open2() failure

Message ID HE1PR0301MB2154F90498C081737B96498A8F499@HE1PR0301MB2154.eurprd03.prod.outlook.com
State Superseded
Headers show
Series [FFmpeg-devel,1/7] avcodec/avcodec: Actually honour the documentation of subtitle_header | expand


Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Andreas Rheinhardt April 19, 2021, 2:06 a.m. UTC
Compared to the earlier behaviour the following changes:
a) AVCodecInternal.byte_buffer is freed.
b) The last_pkt_props FIFO is emptied before freeing it.
c) If set AVCodecContext.hwaccel is uninitialized and its private data
is freed; hw_frames_ctx and hw_device_ctx are also unreferenced.
d) coded_side_data is freed.
e) active_thread_type is reset.
a), b), d) should be no-ops as the buffer/fifo should be empty and
no coded_side_data should exist at any point of avcodec_open2().
e) is obviously not bad.
c) is in accordance with the documentation of hw_(frames|device)_ctx
which states that libacodec takes over ownership of these references.
At least in the case of VC-1 it is possible for the hw acceleration to
be set during init and in this case freeing it actually fixes a memleak.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
The VC-1 decoder actually does not want to init hardware acceleration in
its init function; it just wants to initialize some static data during
its init function for safety. It actually needs only very few of the
static tables that are initialized during init; its initialization could
easily be factored out.

 libavcodec/avcodec.c | 46 ++------------------------------------------
 1 file changed, 2 insertions(+), 44 deletions(-)
diff mbox series


diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index c7a8001608..b054303afd 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -395,51 +395,8 @@  end:
     return ret;
-    if (avci->needs_close && avctx->codec->close)
-        avctx->codec->close(avctx);
-    if (CONFIG_FRAME_THREAD_ENCODER && avci->frame_thread_encoder)
-        ff_frame_thread_encoder_free(avctx);
-    if (HAVE_THREADS && avci->thread_ctx)
-        ff_thread_free(avctx);
-    if (codec->priv_class && avctx->priv_data)
-        av_opt_free(avctx->priv_data);
-    av_opt_free(avctx);
-    if (av_codec_is_encoder(avctx->codec)) {
-        av_frame_free(&avctx->coded_frame);
-        av_freep(&avctx->extradata);
-        avctx->extradata_size = 0;
-    }
+    avcodec_close(avctx);
-    av_freep(&avctx->priv_data);
-    if (av_codec_is_decoder(avctx->codec))
-        av_freep(&avctx->subtitle_header);
-    av_frame_free(&avci->to_free);
-    av_frame_free(&avci->compat_decode_frame);
-    av_packet_free(&avci->compat_encode_packet);
-    av_frame_free(&avci->buffer_frame);
-    av_packet_free(&avci->buffer_pkt);
-    av_packet_free(&avci->last_pkt_props);
-    av_fifo_freep(&avci->pkt_props);
-    av_packet_free(&avci->ds.in_pkt);
-    av_frame_free(&avci->es.in_frame);
-    av_bsf_free(&avci->bsf);
-    av_buffer_unref(&avci->pool);
-    av_freep(&avci);
-    avctx->internal = NULL;
-    avctx->codec = NULL;
     goto end;
@@ -586,6 +543,7 @@  av_cold int avcodec_close(AVCodecContext *avctx)
     if (av_codec_is_encoder(avctx->codec)) {
+        avctx->extradata_size = 0;