diff options
author | Olivier Crete <tester@tester.ca> | 2008-04-21 08:26:37 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-04-21 08:26:37 +0000 |
commit | 4be1b4a30a383231448c727c6413495cfdbcb5b6 (patch) | |
tree | 6cc81f8bae5e41dc09008c05a6955b98dd5403da /gst/rtpmanager/gstrtpsession.c | |
parent | a6a13dff0fdb282fa445f88654f20f0c5e9305f6 (diff) | |
download | gst-plugins-bad-4be1b4a30a383231448c727c6413495cfdbcb5b6.tar.gz gst-plugins-bad-4be1b4a30a383231448c727c6413495cfdbcb5b6.tar.bz2 gst-plugins-bad-4be1b4a30a383231448c727c6413495cfdbcb5b6.zip |
gst/rtpmanager/gstrtpbin.c: Ref caps when inserting into the cache.
Original commit message from CVS:
Patch by: Olivier Crete <tester at tester dot ca>
* gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map),
(new_ssrc_pad_found):
Ref caps when inserting into the cache.
Don't leak pads.
* gst/rtpmanager/gstrtpjitterbuffer.c:
(gst_rtp_jitter_buffer_get_clock_rate),
(gst_rtp_jitter_buffer_query):
Avoid a caps leak.
Don't leak refcount in query.
* gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps),
(gst_rtp_pt_demux_chain):
Avoid caps leaks.
* gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure),
(gst_rtp_session_init), (return_true),
(gst_rtp_session_clear_pt_map), (gst_rtp_session_cache_caps),
(gst_rtp_session_clock_rate):
Ref caps when inserting into the cache.
Fix some more caps leaks. Fixes #528245.
Diffstat (limited to 'gst/rtpmanager/gstrtpsession.c')
-rw-r--r-- | gst/rtpmanager/gstrtpsession.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index a73de15b..c27291ff 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -391,6 +391,7 @@ source_get_sdes_structure (RTPSource * src) g_value_take_string (&val, str); gst_structure_set_value (result, "priv", &val); } + g_value_unset (&val); return result; } @@ -690,7 +691,8 @@ gst_rtp_session_init (GstRtpSession * rtpsession, GstRtpSessionClass * klass) (GCallback) on_bye_timeout, rtpsession); g_signal_connect (rtpsession->priv->session, "on-timeout", (GCallback) on_timeout, rtpsession); - rtpsession->priv->ptmap = g_hash_table_new (NULL, NULL); + rtpsession->priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) gst_caps_unref); gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); @@ -1068,10 +1070,16 @@ failed_thread: } } +static gboolean +return_true (gpointer key, gpointer value, gpointer user_data) +{ + return TRUE; +} + static void gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession) { - /* FIXME, do something */ + g_hash_table_foreach_remove (rtpsession->priv->ptmap, return_true, NULL); } /* called when the session manager has an RTP packet ready for further @@ -1203,11 +1211,11 @@ gst_rtp_session_cache_caps (GstRtpSession * rtpsession, GstCaps * caps) if (!gst_structure_get_int (s, "payload", &payload)) return; - caps = g_hash_table_lookup (priv->ptmap, GINT_TO_POINTER (payload)); - if (caps) + if (g_hash_table_lookup (priv->ptmap, GINT_TO_POINTER (payload))) return; - g_hash_table_insert (priv->ptmap, GINT_TO_POINTER (payload), caps); + g_hash_table_insert (priv->ptmap, GINT_TO_POINTER (payload), + gst_caps_ref (caps)); } /* called when the session manager needs the clock rate */ @@ -1229,8 +1237,10 @@ gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, GST_RTP_SESSION_LOCK (rtpsession); ipayload = payload; /* make compiler happy */ caps = g_hash_table_lookup (priv->ptmap, GINT_TO_POINTER (ipayload)); - if (caps) + if (caps) { + gst_caps_ref (caps); goto found; + } /* not found in the cache, try to get it with a signal */ g_value_init (&args[0], GST_TYPE_ELEMENT); @@ -1258,6 +1268,8 @@ found: if (!gst_structure_get_int (s, "clock-rate", &result)) goto no_clock_rate; + gst_caps_unref (caps); + GST_DEBUG_OBJECT (rtpsession, "parsed clock-rate %d", result); done: @@ -1273,6 +1285,7 @@ no_caps: } no_clock_rate: { + gst_caps_unref (caps); GST_DEBUG_OBJECT (rtpsession, "No clock-rate in caps!"); goto done; } |