decodebin2: mind blocked pads when shutting down

Fix regression in shutdown deadlock handling now that the
target of a ghostpad is blocked instead of ghostpad itself.

See also #574293.
This commit is contained in:
Mark Nauwelaerts 2010-01-14 18:26:03 +01:00
parent 3b842bc98b
commit 45447337ad

View file

@ -3164,14 +3164,20 @@ gst_decode_pad_set_blocked (GstDecodePad * dpad, gboolean blocked)
if (!opad) if (!opad)
goto out; goto out;
gst_pad_set_blocked_async_full (opad, blocked, /* do not block if shutting down.
(GstPadBlockCallback) source_pad_blocked_cb, gst_object_ref (dpad), * we do not consider/expect it blocked further below, but use other trick */
(GDestroyNotify) gst_object_unref); if (!blocked || !dbin->shutdown)
gst_pad_set_blocked_async_full (opad, blocked,
(GstPadBlockCallback) source_pad_blocked_cb, gst_object_ref (dpad),
(GDestroyNotify) gst_object_unref);
if (blocked) { if (blocked) {
if (dbin->shutdown) { if (dbin->shutdown) {
/* deactivate to force flushing state to prevent NOT_LINKED errors */ /* deactivate to force flushing state to prevent NOT_LINKED errors */
gst_pad_set_active (GST_PAD_CAST (dpad), FALSE); gst_pad_set_active (GST_PAD_CAST (dpad), FALSE);
/* note that deactivating the target pad would have no effect here,
* since elements are typically connected first (and pads exposed),
* and only then brought to PAUSED state (so pads activated) */
} else { } else {
gst_object_ref (dpad); gst_object_ref (dpad);
dbin->blocked_pads = g_list_prepend (dbin->blocked_pads, dpad); dbin->blocked_pads = g_list_prepend (dbin->blocked_pads, dpad);