webrtc: Don't deadlock on block pads on shutdown

When changing state downward, we can't set pads
to inactive if they are blocked, it will deadlock
trying to acquire the streaming lock.

Just calling the parent state change function
will do the correct things to unblock probes and
set the pad inactive, so let it do that and
remove the probes after the parent state change
function has run

https://bugzilla.gnome.org/show_bug.cgi?id=796682
This commit is contained in:
Jan Schmidt 2018-06-27 03:05:55 +10:00
parent 22b885fd02
commit ed90d3b2ec

View file

@ -219,34 +219,41 @@ transport_send_bin_change_state (GstElement * element,
gst_object_unref (pad);
break;
}
default:
break;
}
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
if (ret == GST_STATE_CHANGE_FAILURE)
return ret;
/* Do downward state change cleanups after the element
* has been stopped, as this will have set pads to flushing as needed
* and unblocked any pad probes that are blocked */
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
{
/* Release pad blocks */
if (send->rtp_block && send->rtp_block->block_id) {
gst_pad_set_active (send->rtp_block->pad, FALSE);
gst_pad_remove_probe (send->rtp_block->pad, send->rtp_block->block_id);
send->rtp_block->block_id = 0;
}
if (send->rtcp_mux_block && send->rtcp_mux_block->block_id) {
gst_pad_set_active (send->rtcp_mux_block->pad, FALSE);
gst_pad_remove_probe (send->rtcp_mux_block->pad,
send->rtcp_mux_block->block_id);
send->rtcp_mux_block->block_id = 0;
}
if (send->rtcp_block && send->rtcp_block->block_id) {
gst_pad_set_active (send->rtcp_block->pad, FALSE);
gst_pad_remove_probe (send->rtcp_block->pad,
send->rtcp_block->block_id);
send->rtcp_block->block_id = 0;
}
if (send->rtp_nice_block && send->rtp_nice_block->block_id) {
gst_pad_set_active (send->rtp_nice_block->pad, FALSE);
gst_pad_remove_probe (send->rtp_nice_block->pad,
send->rtp_nice_block->block_id);
send->rtp_nice_block->block_id = 0;
}
if (send->rtcp_nice_block && send->rtcp_nice_block->block_id) {
gst_pad_set_active (send->rtcp_nice_block->pad, FALSE);
gst_pad_remove_probe (send->rtcp_nice_block->pad,
send->rtcp_nice_block->block_id);
send->rtcp_nice_block->block_id = 0;
@ -283,7 +290,6 @@ transport_send_bin_change_state (GstElement * element,
break;
}
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
return ret;
}