mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-27 11:32:51 +00:00
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:
parent
22b885fd02
commit
ed90d3b2ec
1 changed files with 12 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue