From 87202cc03d9cc511c17fc2ada4caf6bd9cd259e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Nov 2018 23:02:21 +0200 Subject: [PATCH] rtpbin: Sink jitterbuffer/storage before passing as parameters to signals Otherwise signal handlers from bindings will take ownership of them as they are still floating, and we won't own a reference inside rtpbin anymore. Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/issues/515 --- gst/rtpmanager/gstrtpbin.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index a2797ccefa..1e08d93872 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -782,6 +782,9 @@ create_session (GstRtpBin * rtpbin, gint id) if (!(storage = gst_element_factory_make ("rtpstorage", NULL))) goto no_storage; + /* need to sink the storage or otherwise signal handlers from bindings will + * take ownership of it and we don't own it anymore */ + gst_object_ref_sink (storage); g_signal_emit (rtpbin, gst_rtp_bin_signals[SIGNAL_NEW_STORAGE], 0, storage, id); @@ -847,6 +850,10 @@ create_session (GstRtpBin * rtpbin, gint id) gst_bin_add (GST_BIN_CAST (rtpbin), sess->rtcp_funnel); gst_bin_add (GST_BIN_CAST (rtpbin), storage); + /* unref the storage again, the bin has a reference now and + * we don't need it anymore */ + gst_object_unref (storage); + GST_OBJECT_LOCK (rtpbin); target = GST_STATE_TARGET (rtpbin); GST_OBJECT_UNLOCK (rtpbin); @@ -1850,6 +1857,9 @@ create_stream (GstRtpBinSession * session, guint32 ssrc) g_object_set (buffer, "max-ts-offset-adjustment", rtpbin->max_ts_offset_adjustment, NULL); + /* need to sink the jitterbufer or otherwise signal handlers from bindings will + * take ownership of it and we don't own it anymore */ + gst_object_ref_sink (buffer); g_signal_emit (rtpbin, gst_rtp_bin_signals[SIGNAL_NEW_JITTERBUFFER], 0, buffer, session->id, ssrc); @@ -1857,6 +1867,10 @@ create_stream (GstRtpBinSession * session, guint32 ssrc) gst_bin_add (GST_BIN_CAST (rtpbin), demux); gst_bin_add (GST_BIN_CAST (rtpbin), buffer); + /* unref the jitterbuffer again, the bin has a reference now and + * we don't need it anymore */ + gst_object_unref (buffer); + /* link stuff */ if (demux) gst_element_link_pads_full (buffer, "src", demux, "sink",