summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-17 16:35:36 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-17 16:35:36 +0100
commit022ab84288eb6f2ffa1c1763cf109245c067a019 (patch)
tree63be0c41bf8d7c82e529344cd5fae2a2b6d2d81c
parentd69dda039189cee9714101181bda5b4448d5931e (diff)
downloadgst-libav-022ab84288eb6f2ffa1c1763cf109245c067a019.tar.gz
av: Fix some memory leaks and misuse of libav API
-rw-r--r--ext/libav/gstavauddec.c9
-rw-r--r--ext/libav/gstavaudenc.c9
-rw-r--r--ext/libav/gstavcfg.c6
-rw-r--r--ext/libav/gstavdemux.c4
-rw-r--r--ext/libav/gstavmux.c6
-rw-r--r--ext/libav/gstavviddec.c11
-rw-r--r--ext/libav/gstavvidenc.c18
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;