mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 01:45:33 +00:00
decodebin2: Don't use the same element multiple times in the same chain
This is going to lead to an infinite loop of this element and can easily happen with parsers that accept their own src caps on the sinkpad.
This commit is contained in:
parent
32c30b88ff
commit
5058f79226
1 changed files with 25 additions and 0 deletions
|
@ -1667,6 +1667,8 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad,
|
|||
GstElement *element;
|
||||
GstPad *sinkpad;
|
||||
gboolean subtitle;
|
||||
gboolean skip = FALSE;
|
||||
GList *l;
|
||||
|
||||
/* Set dpad target to pad again, it might've been unset
|
||||
* below but we came back here because something failed
|
||||
|
@ -1678,6 +1680,29 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad,
|
|||
/* Remove selected factory from the list. */
|
||||
g_value_array_remove (factories, 0);
|
||||
|
||||
/* First check if this is a factory for which we have already
|
||||
* created an element in this chain. If we have, we skip this
|
||||
* factory because it will lead to an infinite loop. Examples
|
||||
* for this are parsers that accept their own src caps on the
|
||||
* sinkpad again.
|
||||
*/
|
||||
CHAIN_MUTEX_LOCK (chain);
|
||||
for (l = chain->elements; l; l = l->next) {
|
||||
GstElement *otherelement = GST_ELEMENT_CAST (l->data);
|
||||
|
||||
if (gst_element_get_factory (otherelement) == factory) {
|
||||
skip = TRUE;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
CHAIN_MUTEX_UNLOCK (chain);
|
||||
if (skip) {
|
||||
GST_DEBUG_OBJECT (dbin,
|
||||
"Skipping factory '%s' because it was already used in this chain",
|
||||
gst_plugin_feature_get_name (GST_PLUGIN_FEATURE_CAST (factory)));
|
||||
continue;
|
||||
}
|
||||
|
||||
/* emit autoplug-select to see what we should do with it. */
|
||||
g_signal_emit (G_OBJECT (dbin),
|
||||
gst_decode_bin_signals[SIGNAL_AUTOPLUG_SELECT],
|
||||
|
|
Loading…
Reference in a new issue