diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-12-17 16:35:36 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-12-17 16:35:36 +0100 |
commit | 022ab84288eb6f2ffa1c1763cf109245c067a019 (patch) | |
tree | 63be0c41bf8d7c82e529344cd5fae2a2b6d2d81c | |
parent | d69dda039189cee9714101181bda5b4448d5931e (diff) | |
download | gst-libav-022ab84288eb6f2ffa1c1763cf109245c067a019.tar.gz |
av: Fix some memory leaks and misuse of libav API
-rw-r--r-- | ext/libav/gstavauddec.c | 9 | ||||
-rw-r--r-- | ext/libav/gstavaudenc.c | 9 | ||||
-rw-r--r-- | ext/libav/gstavcfg.c | 6 | ||||
-rw-r--r-- | ext/libav/gstavdemux.c | 4 | ||||
-rw-r--r-- | ext/libav/gstavmux.c | 6 | ||||
-rw-r--r-- | ext/libav/gstavviddec.c | 11 | ||||
-rw-r--r-- | ext/libav/gstavvidenc.c | 18 |
7 files changed, 18 insertions, 45 deletions
diff --git a/ext/libav/gstavauddec.c b/ext/libav/gstavauddec.c index 38eaf6a..b837bbe 100644 --- a/ext/libav/gstavauddec.c +++ b/ext/libav/gstavauddec.c @@ -158,16 +158,12 @@ gst_ffmpegauddec_finalize (GObject * object) static void gst_ffmpegauddec_close (GstFFMpegAudDec * ffmpegdec) { - if (!ffmpegdec->opened) - return; - GST_LOG_OBJECT (ffmpegdec, "closing libav codec"); gst_caps_replace (&ffmpegdec->last_caps, NULL); gst_buffer_replace (&ffmpegdec->outbuf, NULL); - if (ffmpegdec->opened) - gst_ffmpeg_avcodec_close (ffmpegdec->context); + gst_ffmpeg_avcodec_close (ffmpegdec->context); ffmpegdec->opened = FALSE; if (ffmpegdec->context->extradata) { @@ -297,9 +293,6 @@ gst_ffmpegauddec_set_format (GstAudioDecoder * decoder, GstCaps * caps) gst_ffmpegauddec_drain (ffmpegdec); GST_OBJECT_LOCK (ffmpegdec); gst_ffmpegauddec_close (ffmpegdec); - - /* and reset the defaults that were set when a context is created */ - avcodec_get_context_defaults3 (ffmpegdec->context, oclass->in_plugin); } /* get size and so */ diff --git a/ext/libav/gstavaudenc.c b/ext/libav/gstavaudenc.c index 67c7653..d57db64 100644 --- a/ext/libav/gstavaudenc.c +++ b/ext/libav/gstavaudenc.c @@ -192,10 +192,8 @@ gst_ffmpegaudenc_stop (GstAudioEncoder * encoder) GstFFMpegAudEnc *ffmpegaudenc = (GstFFMpegAudEnc *) encoder; /* close old session */ - if (ffmpegaudenc->opened) { - gst_ffmpeg_avcodec_close (ffmpegaudenc->context); - ffmpegaudenc->opened = FALSE; - } + gst_ffmpeg_avcodec_close (ffmpegaudenc->context); + ffmpegaudenc->opened = FALSE; return TRUE; } @@ -243,9 +241,6 @@ gst_ffmpegaudenc_set_format (GstAudioEncoder * encoder, GstAudioInfo * info) ffmpegaudenc->opened = FALSE; } - /* set defaults */ - avcodec_get_context_defaults3 (ffmpegaudenc->context, oclass->in_plugin); - /* if we set it in _getcaps we should set it also in _link */ ffmpegaudenc->context->strict_std_compliance = -1; diff --git a/ext/libav/gstavcfg.c b/ext/libav/gstavcfg.c index 4ce9456..1d7c9d7 100644 --- a/ext/libav/gstavcfg.c +++ b/ext/libav/gstavcfg.c @@ -738,10 +738,8 @@ gst_ffmpeg_cfg_install_property (GstFFMpegVidEncClass * klass, guint base) prop_id = base; g_return_if_fail (base > 0); - ctx = avcodec_alloc_context3 (NULL); - if (ctx) - avcodec_get_context_defaults3 (ctx, NULL); - else + ctx = avcodec_alloc_context3 (klass->in_plugin); + if (!ctx) g_warning ("could not get context"); for (list = property_list; list; list = list->next) { diff --git a/ext/libav/gstavdemux.c b/ext/libav/gstavdemux.c index 2204b77..49bc2e1 100644 --- a/ext/libav/gstavdemux.c +++ b/ext/libav/gstavdemux.c @@ -336,7 +336,11 @@ gst_ffmpegdemux_close (GstFFMpegDemux * demux) gst_ffmpegdata_close (demux->context->pb); else gst_ffmpeg_pipe_close (demux->context->pb); + demux->context->pb = NULL; avformat_close_input (&demux->context); + if (demux->context) + avformat_free_context (demux->context); + demux->context = NULL; GST_OBJECT_LOCK (demux); demux->opened = FALSE; diff --git a/ext/libav/gstavmux.c b/ext/libav/gstavmux.c index 299e9f2..0d5beed 100644 --- a/ext/libav/gstavmux.c +++ b/ext/libav/gstavmux.c @@ -324,7 +324,7 @@ gst_ffmpegmux_init (GstFFMpegMux * ffmpegmux, GstFFMpegMuxClass * g_class) gst_collect_pads_set_function (ffmpegmux->collect, (GstCollectPadsFunction) gst_ffmpegmux_collected, ffmpegmux); - ffmpegmux->context = g_new0 (AVFormatContext, 1); + ffmpegmux->context = avformat_alloc_context (); ffmpegmux->context->oformat = oclass->in_plugin; ffmpegmux->context->nb_streams = 0; ffmpegmux->opened = FALSE; @@ -382,7 +382,9 @@ gst_ffmpegmux_finalize (GObject * object) { GstFFMpegMux *ffmpegmux = (GstFFMpegMux *) object; - g_free (ffmpegmux->context); + avformat_free_context (ffmpegmux->context); + ffmpegmux->context = NULL; + gst_object_unref (ffmpegmux->collect); if (G_OBJECT_CLASS (parent_class)->finalize) diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c index bd34f19..9555fa7 100644 --- a/ext/libav/gstavviddec.c +++ b/ext/libav/gstavviddec.c @@ -268,10 +268,7 @@ gst_ffmpegviddec_finalize (GObject * object) ffmpegdec->context = NULL; } - if (ffmpegdec->picture != NULL) { - av_free (ffmpegdec->picture); - ffmpegdec->picture = NULL; - } + avcodec_free_frame (&ffmpegdec->picture); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -281,9 +278,6 @@ gst_ffmpegviddec_finalize (GObject * object) static void gst_ffmpegviddec_close (GstFFMpegVidDec * ffmpegdec) { - if (!ffmpegdec->opened) - return; - GST_LOG_OBJECT (ffmpegdec, "closing ffmpeg codec"); gst_caps_replace (&ffmpegdec->last_caps, NULL); @@ -393,9 +387,6 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder, gst_ffmpegviddec_drain (ffmpegdec); GST_OBJECT_LOCK (ffmpegdec); gst_ffmpegviddec_close (ffmpegdec); - - /* and reset the defaults that were set when a context is created */ - avcodec_get_context_defaults3 (ffmpegdec->context, oclass->in_plugin); } /* set buffer functions */ diff --git a/ext/libav/gstavvidenc.c b/ext/libav/gstavvidenc.c index e4cb1bd..7b24c45 100644 --- a/ext/libav/gstavvidenc.c +++ b/ext/libav/gstavvidenc.c @@ -253,15 +253,9 @@ gst_ffmpegvidenc_finalize (GObject * object) gst_ffmpeg_cfg_finalize (ffmpegenc); - /* close old session */ - if (ffmpegenc->opened) { - gst_ffmpeg_avcodec_close (ffmpegenc->context); - ffmpegenc->opened = FALSE; - } - /* clean up remaining allocated data */ av_free (ffmpegenc->context); - av_free (ffmpegenc->picture); + avcodec_free_frame (&ffmpegenc->picture); g_free (ffmpegenc->filename); @@ -300,9 +294,6 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, ffmpegenc->opened = FALSE; } - /* set defaults */ - avcodec_get_context_defaults3 (ffmpegenc->context, oclass->in_plugin); - /* if we set it in _getcaps we should set it also in _link */ ffmpegenc->context->strict_std_compliance = -1; @@ -808,10 +799,9 @@ gst_ffmpegvidenc_stop (GstVideoEncoder * encoder) GstFFMpegVidEnc *ffmpegenc = (GstFFMpegVidEnc *) encoder; gst_ffmpegvidenc_flush_buffers (ffmpegenc, FALSE); - if (ffmpegenc->opened) { - gst_ffmpeg_avcodec_close (ffmpegenc->context); - ffmpegenc->opened = FALSE; - } + gst_ffmpeg_avcodec_close (ffmpegenc->context); + ffmpegenc->opened = FALSE; + if (ffmpegenc->file) { fclose (ffmpegenc->file); ffmpegenc->file = NULL; |