rtpbin: Sink jitterbuffer/storage before passing as parameters to signals
authorSebastian Dröge <sebastian@centricular.com>
Tue, 6 Nov 2018 21:02:21 +0000 (23:02 +0200)
committerSebastian Dröge <slomo@coaxion.net>
Wed, 7 Nov 2018 09:11:16 +0000 (09:11 +0000)
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

index a2797cc..1e08d93 100644 (file)
@@ -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",