uridecodebin3: fix deadlock when switching input item

There was a race between urisourcebin src pad handlers.
One was starting the next item before the other was blocked.

See
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3297#note_2288799
for details.

Fix #3297

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6145>
This commit is contained in:
Guillaume Desmottes 2024-02-19 15:55:55 +01:00
parent eb17de27d6
commit d972acd3c5

View file

@ -1356,7 +1356,10 @@ uri_src_block_probe (GstPad * pad, GstPadProbeInfo * info,
} }
PLAY_ITEMS_LOCK (handler->uridecodebin); PLAY_ITEMS_LOCK (handler->uridecodebin);
if (play_item_is_eos (handler->uridecodebin->input_item)) { if (srcpad->block_probe_id == 0) {
GST_DEBUG_OBJECT (pad, "pad has already been unblocked");
ret = GST_PAD_PROBE_REMOVE;
} else if (play_item_is_eos (handler->uridecodebin->input_item)) {
GST_DEBUG_OBJECT (handler->uridecodebin, GST_DEBUG_OBJECT (handler->uridecodebin,
"We can switch over to the next input item"); "We can switch over to the next input item");
switch_and_activate_input_locked (handler->uridecodebin, switch_and_activate_input_locked (handler->uridecodebin,