From f459fe267374c550df5b2a9345b39845302b7308 Mon Sep 17 00:00:00 2001 From: Pascal Buhler Date: Wed, 4 Jan 2012 10:29:45 +0100 Subject: [PATCH] rtpssrcdemux: Safely push on pads that might be removed due to a RTCP BYE https://bugzilla.gnome.org/show_bug.cgi?id=667815 --- gst/rtpmanager/gstrtpssrcdemux.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gst/rtpmanager/gstrtpssrcdemux.c b/gst/rtpmanager/gstrtpssrcdemux.c index c563151246..f391eb5f59 100644 --- a/gst/rtpmanager/gstrtpssrcdemux.c +++ b/gst/rtpmanager/gstrtpssrcdemux.c @@ -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;