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/6214>
This commit is contained in:
Guillaume Desmottes 2024-02-19 15:55:55 +01:00 committed by GStreamer Marge Bot
parent dea8b1cb37
commit e62888c07f

View file

@ -1281,7 +1281,10 @@ uri_src_block_probe (GstPad * pad, GstPadProbeInfo * info,
}
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,
"We can switch over to the next input item");
switch_and_activate_input_locked (handler->uridecodebin,