mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
rtpssrcdemux: Release lock before emitting signal
If the lock is not released before emitting a signal, it may cause a deadlock if any other function in the element is called. Also removed an unused timestamp parameter https://bugzilla.gnome.org/show_bug.cgi?id=649617
This commit is contained in:
parent
4df5d896f0
commit
1bf94a92b0
1 changed files with 18 additions and 30 deletions
|
@ -153,10 +153,8 @@ find_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* with PAD_LOCK */
|
|
||||||
static GstRtpSsrcDemuxPad *
|
static GstRtpSsrcDemuxPad *
|
||||||
create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
|
find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc)
|
||||||
GstClockTime timestamp)
|
|
||||||
{
|
{
|
||||||
GstPad *rtp_pad, *rtcp_pad;
|
GstPad *rtp_pad, *rtcp_pad;
|
||||||
GstElementClass *klass;
|
GstElementClass *klass;
|
||||||
|
@ -166,6 +164,14 @@ create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc);
|
GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc);
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (demux);
|
||||||
|
|
||||||
|
demuxpad = find_demux_pad_for_ssrc (demux, ssrc);
|
||||||
|
if (demuxpad != NULL) {
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
return demuxpad;
|
||||||
|
}
|
||||||
|
|
||||||
klass = GST_ELEMENT_GET_CLASS (demux);
|
klass = GST_ELEMENT_GET_CLASS (demux);
|
||||||
templ = gst_element_class_get_pad_template (klass, "src_%d");
|
templ = gst_element_class_get_pad_template (klass, "src_%d");
|
||||||
padname = g_strdup_printf ("src_%d", ssrc);
|
padname = g_strdup_printf ("src_%d", ssrc);
|
||||||
|
@ -177,20 +183,12 @@ create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
|
||||||
rtcp_pad = gst_pad_new_from_template (templ, padname);
|
rtcp_pad = gst_pad_new_from_template (templ, padname);
|
||||||
g_free (padname);
|
g_free (padname);
|
||||||
|
|
||||||
/* we use the first timestamp received to calculate the difference between
|
|
||||||
* timestamps on all streams */
|
|
||||||
GST_DEBUG_OBJECT (demux, "SSRC %08x, first timestamp %" GST_TIME_FORMAT,
|
|
||||||
ssrc, GST_TIME_ARGS (timestamp));
|
|
||||||
|
|
||||||
/* wrap in structure and add to list */
|
/* wrap in structure and add to list */
|
||||||
demuxpad = g_new0 (GstRtpSsrcDemuxPad, 1);
|
demuxpad = g_new0 (GstRtpSsrcDemuxPad, 1);
|
||||||
demuxpad->ssrc = ssrc;
|
demuxpad->ssrc = ssrc;
|
||||||
demuxpad->rtp_pad = rtp_pad;
|
demuxpad->rtp_pad = rtp_pad;
|
||||||
demuxpad->rtcp_pad = rtcp_pad;
|
demuxpad->rtcp_pad = rtcp_pad;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux, "first timestamp %" GST_TIME_FORMAT,
|
|
||||||
GST_TIME_ARGS (timestamp));
|
|
||||||
|
|
||||||
gst_pad_set_element_private (rtp_pad, demuxpad);
|
gst_pad_set_element_private (rtp_pad, demuxpad);
|
||||||
gst_pad_set_element_private (rtcp_pad, demuxpad);
|
gst_pad_set_element_private (rtcp_pad, demuxpad);
|
||||||
|
|
||||||
|
@ -213,6 +211,8 @@ create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc,
|
||||||
gst_rtp_ssrc_demux_iterate_internal_links);
|
gst_rtp_ssrc_demux_iterate_internal_links);
|
||||||
gst_pad_set_active (rtcp_pad, TRUE);
|
gst_pad_set_active (rtcp_pad, TRUE);
|
||||||
|
|
||||||
|
GST_OBJECT_UNLOCK (demux);
|
||||||
|
|
||||||
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtp_pad);
|
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtp_pad);
|
||||||
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtcp_pad);
|
gst_element_add_pad (GST_ELEMENT_CAST (demux), rtcp_pad);
|
||||||
|
|
||||||
|
@ -521,15 +521,9 @@ gst_rtp_ssrc_demux_chain (GstPad * pad, GstBuffer * buf)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux, "received buffer of SSRC %08x", ssrc);
|
GST_DEBUG_OBJECT (demux, "received buffer of SSRC %08x", ssrc);
|
||||||
|
|
||||||
GST_PAD_LOCK (demux);
|
dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc);
|
||||||
dpad = find_demux_pad_for_ssrc (demux, ssrc);
|
if (dpad == NULL)
|
||||||
if (dpad == NULL) {
|
goto create_failed;
|
||||||
if (!(dpad =
|
|
||||||
create_demux_pad_for_ssrc (demux, ssrc,
|
|
||||||
GST_BUFFER_TIMESTAMP (buf))))
|
|
||||||
goto create_failed;
|
|
||||||
}
|
|
||||||
GST_PAD_UNLOCK (demux);
|
|
||||||
|
|
||||||
/* push to srcpad */
|
/* push to srcpad */
|
||||||
ret = gst_pad_push (dpad->rtp_pad, buf);
|
ret = gst_pad_push (dpad->rtp_pad, buf);
|
||||||
|
@ -549,7 +543,6 @@ create_failed:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL),
|
GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL),
|
||||||
("Could not create new pad"));
|
("Could not create new pad"));
|
||||||
GST_PAD_UNLOCK (demux);
|
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -585,14 +578,10 @@ gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstBuffer * buf)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux, "received RTCP of SSRC %08x", ssrc);
|
GST_DEBUG_OBJECT (demux, "received RTCP of SSRC %08x", ssrc);
|
||||||
|
|
||||||
GST_PAD_LOCK (demux);
|
dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc);
|
||||||
dpad = find_demux_pad_for_ssrc (demux, ssrc);
|
if (dpad == NULL)
|
||||||
if (dpad == NULL) {
|
goto create_failed;
|
||||||
GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc);
|
|
||||||
if (!(dpad = create_demux_pad_for_ssrc (demux, ssrc, -1)))
|
|
||||||
goto create_failed;
|
|
||||||
}
|
|
||||||
GST_PAD_UNLOCK (demux);
|
|
||||||
|
|
||||||
/* push to srcpad */
|
/* push to srcpad */
|
||||||
ret = gst_pad_push (dpad->rtcp_pad, buf);
|
ret = gst_pad_push (dpad->rtcp_pad, buf);
|
||||||
|
@ -618,7 +607,6 @@ create_failed:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL),
|
GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL),
|
||||||
("Could not create new pad"));
|
("Could not create new pad"));
|
||||||
GST_PAD_UNLOCK (demux);
|
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue