From 3424048158759a35afbfe0219cbcff2cc09ba0b0 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 15 Mar 2006 14:39:25 +0000 Subject: [PATCH] gst/qtdemux/qtdemux.c: Series of memleak fixes: Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), (gst_qtdemux_init), (gst_qtdemux_dispose), (gst_qtdemux_add_stream), (qtdemux_parse_trak): Series of memleak fixes: - Unref the GstAdapter in finalize. - Use gst_pad_new_from_static_template(), shorter and safer. - Free unused QtDemuxStream when not used. --- gst/qtdemux/qtdemux.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 733531024d..c517b164b2 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -231,6 +231,7 @@ static const guint32 ff_qt_grayscale_palette_256[256] = { static void gst_qtdemux_class_init (GstQTDemuxClass * klass); static void gst_qtdemux_base_init (GstQTDemuxClass * klass); static void gst_qtdemux_init (GstQTDemux * quicktime_demux); +static void gst_qtdemux_dispose (GObject * object); static GstStateChangeReturn gst_qtdemux_change_state (GstElement * element, GstStateChange transition); static void gst_qtdemux_loop (GstPad * pad); @@ -309,6 +310,8 @@ gst_qtdemux_class_init (GstQTDemuxClass * klass) parent_class = g_type_class_peek_parent (klass); + gobject_class->dispose = gst_qtdemux_dispose; + gstelement_class->change_state = gst_qtdemux_change_state; } @@ -316,8 +319,7 @@ static void gst_qtdemux_init (GstQTDemux * qtdemux) { qtdemux->sinkpad = - gst_pad_new_from_template (gst_static_pad_template_get - (&gst_qtdemux_sink_template), "sink"); + gst_pad_new_from_static_template (&gst_qtdemux_sink_template, "sink"); gst_pad_set_activate_function (qtdemux->sinkpad, qtdemux_sink_activate); gst_pad_set_activatepull_function (qtdemux->sinkpad, qtdemux_sink_activate_pull); @@ -338,6 +340,17 @@ gst_qtdemux_init (GstQTDemux * qtdemux) qtdemux->mdatbuffer = NULL; } +static void +gst_qtdemux_dispose (GObject * object) +{ + GstQTDemux *qtdemux = GST_QTDEMUX (object); + + if (qtdemux->adapter) { + g_object_unref (G_OBJECT (qtdemux->adapter)); + qtdemux->adapter = NULL; + } +} + #if 0 static gboolean gst_qtdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, @@ -1173,12 +1186,10 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux, QtDemuxStream * stream, GstTagList * list) { if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) { - GstPadTemplate *templ; gchar *name = g_strdup_printf ("video_%02d", qtdemux->n_video_streams); - templ = gst_static_pad_template_get (&gst_qtdemux_videosrc_template); - stream->pad = gst_pad_new_from_template (templ, name); - gst_object_unref (templ); + stream->pad = + gst_pad_new_from_static_template (&gst_qtdemux_videosrc_template, name); g_free (name); if ((stream->n_samples == 1) && (stream->samples[0].duration == 0)) { stream->fps_n = 0; @@ -1220,8 +1231,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux, gchar *name = g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams); stream->pad = - gst_pad_new_from_template (gst_static_pad_template_get - (&gst_qtdemux_audiosrc_template), name); + gst_pad_new_from_static_template (&gst_qtdemux_audiosrc_template, name); g_free (name); if (stream->caps) { gst_caps_set_simple (stream->caps, @@ -2374,8 +2384,6 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) GstTagList *list = NULL; const gchar *codec = NULL; - stream = g_new0 (QtDemuxStream, 1); - tkhd = qtdemux_tree_get_child_by_type (trak, FOURCC_tkhd); g_return_if_fail (tkhd); @@ -2390,6 +2398,8 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mdhd); g_assert (mdhd); + stream = g_new0 (QtDemuxStream, 1); + stream->timescale = QTDEMUX_GUINT32_GET (mdhd->data + 20); GST_LOG ("track timescale: %d", stream->timescale); GST_LOG ("track duration: %d", QTDEMUX_GUINT32_GET (mdhd->data + 24)); @@ -2405,6 +2415,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) "found, assuming preview image or something; skipping track", QTDEMUX_GUINT32_GET (mdhd->data + 24), stream->timescale, qtdemux->duration, qtdemux->timescale); + g_free (stream); return; } @@ -2666,6 +2677,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) } else { GST_INFO ("unknown subtype %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->subtype)); + g_free (stream); return; }