rtpssrcdemux: Safely push on pads that might be removed due to a RTCP BYE
authorPascal Buhler <pabuhler@cisco.com>
Wed, 4 Jan 2012 09:29:45 +0000 (10:29 +0100)
committerOlivier CrĂȘte <olivier.crete@collabora.com>
Mon, 28 Jan 2013 22:01:27 +0000 (17:01 -0500)
https://bugzilla.gnome.org/show_bug.cgi?id=667815

gst/rtpmanager/gstrtpssrcdemux.c

index c563151..f391eb5 100644 (file)
@@ -644,6 +644,17 @@ gst_rtp_ssrc_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
   /* push to srcpad */
   ret = gst_pad_push (srcpad, buf);
 
+  if (ret != GST_FLOW_OK) {
+    // check if the ssrc still there, may have been removed
+    GST_PAD_LOCK (demux);
+    dpad = find_demux_pad_for_ssrc (demux, ssrc);
+    if (dpad == NULL || dpad->rtp_pad != srcpad) {
+      // SSRC was removed during the push ... ignore the error
+      ret = GST_FLOW_OK;
+    }
+    GST_PAD_UNLOCK (demux);
+  }
+
   gst_object_unref (srcpad);
 
   return ret;
@@ -709,6 +720,17 @@ gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstObject * parent,
   /* push to srcpad */
   ret = gst_pad_push (srcpad, buf);
 
+  if (ret != GST_FLOW_OK) {
+    // check if the ssrc still there, may have been removed
+    GST_PAD_LOCK (demux);
+    dpad = find_demux_pad_for_ssrc (demux, ssrc);
+    if (dpad == NULL || dpad->rtcp_pad != srcpad) {
+      // SSRC was removed during the push ... ignore the error
+      ret = GST_FLOW_OK;
+    }
+    GST_PAD_UNLOCK (demux);
+  }
+
   gst_object_unref (srcpad);
 
   return ret;