diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2007-09-12 21:23:47 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2007-09-12 21:23:47 +0000 |
commit | f6b7f47cf430393041bd4262ddac2bb51a3a8a1d (patch) | |
tree | 7da918d6c0e1fcc1b1ec181d6a53855d36f9e12f /gst/rtpmanager/gstrtpbin.c | |
parent | 79800df8b6335e435e7e98c92784cdfe5f10d3c5 (diff) | |
download | gst-plugins-bad-f6b7f47cf430393041bd4262ddac2bb51a3a8a1d.tar.gz gst-plugins-bad-f6b7f47cf430393041bd4262ddac2bb51a3a8a1d.tar.bz2 gst-plugins-bad-f6b7f47cf430393041bd4262ddac2bb51a3a8a1d.zip |
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); } |