mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
decodebin2: forward all sticky events to decodepad
Forward all sticky events to the decodepad before exposing the pads. This makes sure all sticky events are on the exposed pad. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=696915
This commit is contained in:
parent
c082c06b6c
commit
92b77c5aa4
1 changed files with 20 additions and 13 deletions
|
@ -3976,23 +3976,34 @@ source_pad_blocked_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
|
||||||
GstDecodePad *dpad = user_data;
|
GstDecodePad *dpad = user_data;
|
||||||
GstDecodeChain *chain;
|
GstDecodeChain *chain;
|
||||||
GstDecodeBin *dbin;
|
GstDecodeBin *dbin;
|
||||||
|
GstPadProbeReturn ret = GST_PAD_PROBE_OK;
|
||||||
|
|
||||||
if (GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) {
|
if (GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) {
|
||||||
GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
|
GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
|
||||||
|
|
||||||
GST_LOG_OBJECT (pad, "Seeing event '%s'", GST_EVENT_TYPE_NAME (event));
|
GST_LOG_OBJECT (pad, "Seeing event '%s'", GST_EVENT_TYPE_NAME (event));
|
||||||
|
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_CAPS) {
|
if (!GST_EVENT_IS_SERIALIZED (event)) {
|
||||||
/* manually push event to ghost pad to avoid exposing pads
|
|
||||||
* that don't have the sticky caps event */
|
|
||||||
gst_pad_push_event (GST_PAD_CAST (dpad), gst_event_ref (event));
|
|
||||||
} else if ((GST_EVENT_IS_STICKY (event)
|
|
||||||
|| !GST_EVENT_IS_SERIALIZED (event))) {
|
|
||||||
/* do not block on sticky or out of band events otherwise the allocation query
|
/* do not block on sticky or out of band events otherwise the allocation query
|
||||||
from demuxer might block the loop thread */
|
from demuxer might block the loop thread */
|
||||||
GST_LOG_OBJECT (pad, "Letting event through");
|
GST_LOG_OBJECT (pad, "Letting OOB event through");
|
||||||
return GST_PAD_PROBE_PASS;
|
return GST_PAD_PROBE_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GST_EVENT_IS_STICKY (event)) {
|
||||||
|
/* manually push sticky events to ghost pad to avoid exposing pads
|
||||||
|
* that don't have the sticky events */
|
||||||
|
gst_pad_push_event (GST_PAD_CAST (dpad), gst_event_ref (event));
|
||||||
|
|
||||||
|
/* let the sticky events pass */
|
||||||
|
ret = GST_PAD_PROBE_PASS;
|
||||||
|
|
||||||
|
/* we only want to try to expose on CAPS events */
|
||||||
|
if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS) {
|
||||||
|
GST_LOG_OBJECT (pad, "Letting sticky non-CAPS event through");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
chain = dpad->chain;
|
chain = dpad->chain;
|
||||||
dbin = chain->dbin;
|
dbin = chain->dbin;
|
||||||
|
@ -4008,12 +4019,8 @@ source_pad_blocked_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
|
||||||
}
|
}
|
||||||
EXPOSE_UNLOCK (dbin);
|
EXPOSE_UNLOCK (dbin);
|
||||||
|
|
||||||
/* If we unblocked due to a caps event, let it go through */
|
done:
|
||||||
if ((GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) &&
|
return ret;
|
||||||
(GST_EVENT_TYPE (GST_PAD_PROBE_INFO_EVENT (info)) == GST_EVENT_CAPS))
|
|
||||||
return GST_PAD_PROBE_PASS;
|
|
||||||
|
|
||||||
return GST_PAD_PROBE_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
|
|
Loading…
Reference in a new issue