diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2007-09-12 21:23:47 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim.muller@collabora.co.uk> | 2009-08-11 02:30:30 +0100 |
commit | a93348cc6da0eff1a30fd08b2ec17962079a38a6 (patch) | |
tree | 6f61f0fdad755ee04c07f52d65729a965a263940 /gst/rtpmanager/gstrtpbin.c | |
parent | 919deb449063c2b26485b7c07b829e081b7c7fae (diff) |
gst/rtpmanager/: Various leak fixes.
Original commit message from CVS:
* gst/rtpmanager/gstrtpbin.c: (create_session), (free_session),
(get_client), (free_client), (gst_rtp_bin_associate),
(free_stream), (gst_rtp_bin_class_init), (gst_rtp_bin_dispose),
(gst_rtp_bin_finalize):
* gst/rtpmanager/gstrtpjitterbuffer.c:
(gst_rtp_jitter_buffer_class_init),
(gst_rtp_jitter_buffer_finalize):
* gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_release):
* gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize),
(gst_rtp_session_set_property), (gst_rtp_session_chain_recv_rtp),
(gst_rtp_session_chain_send_rtp):
* gst/rtpmanager/gstrtpssrcdemux.c:
(gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_dispose):
* gst/rtpmanager/rtpsession.c: (rtp_session_finalize):
* gst/rtpmanager/rtpsession.h:
Various leak fixes.
Diffstat (limited to 'gst/rtpmanager/gstrtpbin.c')
-rw-r--r-- | gst/rtpmanager/gstrtpbin.c | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index 7d5fb5d1..6f288bdc 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -245,6 +245,8 @@ static guint gst_rtp_bin_signals[LAST_SIGNAL] = { 0 }; static GstCaps *pt_map_requested (GstElement * element, guint pt, GstRtpBinSession * session); +static void free_stream (GstRtpBinStream * stream); + /* Manages the RTP stream for one SSRC. * * We pipe the stream (comming from the SSRC demuxer) into a jitterbuffer. @@ -462,6 +464,30 @@ no_demux: } } +static void +free_session (GstRtpBinSession * sess) +{ + GstRtpBin *bin; + + bin = sess->bin; + + gst_element_set_state (sess->session, GST_STATE_NULL); + gst_element_set_state (sess->demux, GST_STATE_NULL); + + gst_bin_remove (GST_BIN_CAST (bin), sess->session); + gst_bin_remove (GST_BIN_CAST (bin), sess->demux); + + g_slist_foreach (sess->streams, (GFunc) free_stream, NULL); + g_slist_free (sess->streams); + + g_mutex_free (sess->lock); + g_hash_table_destroy (sess->ptmap); + + bin->sessions = g_slist_remove (bin->sessions, sess); + + g_free (sess); +} + #if 0 static GstRtpBinStream * find_stream_by_ssrc (GstRtpBinSession * session, guint32 ssrc) @@ -565,8 +591,7 @@ gst_rtp_bin_clear_pt_map (GstRtpBin * bin) } static GstRtpBinClient * -gst_rtp_bin_get_client (GstRtpBin * bin, guint8 len, guint8 * data, - gboolean * created) +get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created) { GstRtpBinClient *result = NULL; GSList *walk; @@ -598,6 +623,14 @@ gst_rtp_bin_get_client (GstRtpBin * bin, guint8 len, guint8 * data, return result; } +static void +free_client (GstRtpBinClient * client, GstRtpBin * bin) +{ + bin->clients = g_slist_remove (bin->clients, client); + g_free (client->cname); + g_free (client); +} + /* associate a stream to the given CNAME. This will make sure all streams for * that CNAME are synchronized together. */ static void @@ -609,7 +642,7 @@ gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len, GSList *walk; /* first find or create the CNAME */ - client = gst_rtp_bin_get_client (bin, len, data, &created); + client = get_client (bin, len, data, &created); /* find stream in the client */ for (walk = client->streams; walk; walk = g_slist_next (walk)) { @@ -898,7 +931,28 @@ no_demux: } } +static void +free_stream (GstRtpBinStream * stream) +{ + GstRtpBinSession *session; + + session = stream->session; + + gst_element_set_state (stream->buffer, GST_STATE_NULL); + gst_element_set_state (stream->demux, GST_STATE_NULL); + + gst_bin_remove (GST_BIN_CAST (session->bin), stream->buffer); + gst_bin_remove (GST_BIN_CAST (session->bin), stream->demux); + + gst_object_unref (stream->sync_pad); + + session->streams = g_slist_remove (session->streams, stream); + + g_free (stream); +} + /* GObject vmethods */ +static void gst_rtp_bin_dispose (GObject * object); static void gst_rtp_bin_finalize (GObject * object); static void gst_rtp_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -951,6 +1005,7 @@ gst_rtp_bin_class_init (GstRtpBinClass * klass) g_type_class_add_private (klass, sizeof (GstRtpBinPrivate)); + gobject_class->dispose = gst_rtp_bin_dispose; gobject_class->finalize = gst_rtp_bin_finalize; gobject_class->set_property = gst_rtp_bin_set_property; gobject_class->get_property = gst_rtp_bin_get_property; @@ -1087,6 +1142,21 @@ gst_rtp_bin_init (GstRtpBin * rtpbin, GstRtpBinClass * klass) } static void +gst_rtp_bin_dispose (GObject * object) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (object); + + g_slist_foreach (rtpbin->sessions, (GFunc) free_session, NULL); + g_slist_foreach (rtpbin->clients, (GFunc) free_client, NULL); + g_slist_free (rtpbin->sessions); + rtpbin->sessions = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void gst_rtp_bin_finalize (GObject * object) { GstRtpBin *rtpbin; @@ -1094,6 +1164,8 @@ gst_rtp_bin_finalize (GObject * object) rtpbin = GST_RTP_BIN (object); g_mutex_free (rtpbin->priv->bin_lock); + gst_object_unref (rtpbin->provided_clock); + g_slist_free (rtpbin->sessions); G_OBJECT_CLASS (parent_class)->finalize (object); } |