mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-29 13:11:06 +00:00
baseparse: Make sure to not create an invalid event order when generating the default CAPS event because of a GAP event
There must be a SEGMENT event before the GAP event, and SEGMENT events must come after any CAPS event. We however did not produce any CAPS yet, so we need to ensure to insert the CAPS event before the SEGMENT event into the pending events list. https://bugzilla.gnome.org/show_bug.cgi?id=766970
This commit is contained in:
parent
17f9ac5657
commit
8e8b8a8d34
1 changed files with 24 additions and 3 deletions
|
@ -1405,11 +1405,32 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
|
||||||
if (!gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (parse))) {
|
if (!gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (parse))) {
|
||||||
GstCaps *default_caps = NULL;
|
GstCaps *default_caps = NULL;
|
||||||
if ((default_caps = gst_base_parse_negotiate_default_caps (parse))) {
|
if ((default_caps = gst_base_parse_negotiate_default_caps (parse))) {
|
||||||
|
GList *l;
|
||||||
|
GstEvent *caps_event = gst_event_new_caps (default_caps);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (parse,
|
GST_DEBUG_OBJECT (parse,
|
||||||
"Store caps event to pending list for initial pre-rolling");
|
"Store caps event to pending list for initial pre-rolling");
|
||||||
parse->priv->pending_events =
|
|
||||||
g_list_prepend (parse->priv->pending_events,
|
/* Events are in decreasing order. Go down the list until we
|
||||||
gst_event_new_caps (default_caps));
|
* find the first pre-CAPS event and insert our CAPS event there.
|
||||||
|
*
|
||||||
|
* There should be a SEGMENT event already, which is > CAPS */
|
||||||
|
for (l = parse->priv->pending_events; l; l = l->next) {
|
||||||
|
GstEvent *e = l->data;
|
||||||
|
|
||||||
|
if (GST_EVENT_TYPE (e) < GST_EVENT_CAPS) {
|
||||||
|
parse->priv->pending_events =
|
||||||
|
g_list_insert_before (parse->priv->pending_events, l,
|
||||||
|
caps_event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* No pending event that is < CAPS, so we have to add it at the very
|
||||||
|
* end of the list */
|
||||||
|
if (!l) {
|
||||||
|
parse->priv->pending_events =
|
||||||
|
g_list_append (parse->priv->pending_events, caps_event);
|
||||||
|
}
|
||||||
gst_caps_unref (default_caps);
|
gst_caps_unref (default_caps);
|
||||||
} else {
|
} else {
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
|
|
Loading…
Reference in a new issue