From cd6b16734eeeaa7d73b6a62febac068459cf6882 Mon Sep 17 00:00:00 2001 From: Tim-Philipp Müller Date: Sat, 30 Jan 2010 19:12:24 +0000 Subject: rtspreal: add finalize function so we can free streams and rulebook Fix memory leak in Real RTSP component (#608533). --- gst/realmedia/rtspreal.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/gst/realmedia/rtspreal.c b/gst/realmedia/rtspreal.c index 1c070306..07f1df06 100644 --- a/gst/realmedia/rtspreal.c +++ b/gst/realmedia/rtspreal.c @@ -669,6 +669,7 @@ reset: static void gst_rtsp_real_extension_init (gpointer g_iface, gpointer iface_data); +static void gst_rtsp_real_finalize (GObject * obj); static void _do_init (GType rtspreal_type) @@ -697,6 +698,10 @@ gst_rtsp_real_base_init (gpointer klass) static void gst_rtsp_real_class_init (GstRTSPRealClass * g_class) { + GObjectClass *gobject_class = (GObjectClass *) g_class; + + gobject_class->finalize = gst_rtsp_real_finalize; + GST_DEBUG_CATEGORY_INIT (rtspreal_debug, "rtspreal", 0, "RealMedia RTSP extension"); } @@ -707,6 +712,29 @@ gst_rtsp_real_init (GstRTSPReal * rtspreal, GstRTSPRealClass * klass) rtspreal->isreal = FALSE; } +static void +gst_rtsp_stream_free (GstRTSPRealStream * stream) +{ + g_free (stream->stream_name); + g_free (stream->mime_type); + gst_asm_rule_book_free (stream->rulebook); + g_free (stream->type_specific_data); + + g_free (stream); +} + +static void +gst_rtsp_real_finalize (GObject * obj) +{ + GstRTSPReal *r = (GstRTSPReal *) obj; + + g_list_foreach (r->streams, (GFunc) gst_rtsp_stream_free, NULL); + g_list_free (r->streams); + g_free (r->rules); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + static void gst_rtsp_real_extension_init (gpointer g_iface, gpointer iface_data) { -- cgit v1.2.3