rtpssrcdemux: Block pad while it is announced.
authorOlivier Crête <olivier.crete@collabora.com>
Tue, 7 Aug 2012 01:02:50 +0000 (18:02 -0700)
committerOlivier Crête <olivier.crete@collabora.com>
Tue, 7 Aug 2012 01:04:58 +0000 (18:04 -0700)
Block the RTP pad and associated RTCP pads while they are being
announced. This it to prevent a race where one is announced and
before the callback has connected it, the other one gets a buffer.

We can't use the "padlock" of ssrcdemux because it causes deadlocks.

gst/rtpmanager/gstrtpssrcdemux.c

index 314cddf..3928e01 100644 (file)
@@ -225,6 +225,7 @@ find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
   GstCaps *caps;
   struct ForwardEventData fdata;
   GstPad *retpad;
+  gulong rtp_block, rtcp_block;
 
   GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc);
 
@@ -313,13 +314,23 @@ find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
   }
 
   gst_object_ref (rtp_pad);
+  gst_object_ref (rtcp_pad);
+
+  rtp_block = gst_pad_add_probe (rtp_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+      NULL, NULL, NULL);
+  rtcp_block = gst_pad_add_probe (rtcp_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+      NULL, NULL, NULL);
 
   GST_PAD_UNLOCK (demux);
 
   g_signal_emit (G_OBJECT (demux),
       gst_rtp_ssrc_demux_signals[SIGNAL_NEW_SSRC_PAD], 0, ssrc, rtp_pad);
 
+  gst_pad_remove_probe (rtp_pad, rtp_block);
+  gst_pad_remove_probe (rtcp_pad, rtcp_block);
+
   gst_object_unref (rtp_pad);
+  gst_object_unref (rtcp_pad);
 
   return retpad;
 }