gst-plugins-base: decodebin2: Don' t use the same element multiple times in the same chain
Jan Schmidt
thaytan at noraisin.net
Sun Feb 27 04:43:18 PST 2011
Hi,
In the past, we've seen files that have at least 2 layers of id3, or
even id3 wrapped around avi and the streams contain id3. This commit
sounds like it will break those.
J.
On Sat, 2011-02-26 at 14:41 -0800, Sebastian Dröge wrote:
> Module: gst-plugins-base
> Branch: master
> Commit: 5058f792263e4214f4655c5ed5956ebfbeb17c99
> URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=5058f792263e4214f4655c5ed5956ebfbeb17c99
>
> Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
> Date: Sat Feb 26 23:39:03 2011 +0100
>
> 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.
>
> ---
>
> gst/playback/gstdecodebin2.c | 25 +++++++++++++++++++++++++
> 1 files changed, 25 insertions(+), 0 deletions(-)
>
> diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
> index caa3c42..339ec91 100644
> --- a/gst/playback/gstdecodebin2.c
> +++ b/gst/playback/gstdecodebin2.c
> @@ -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],
>
> _______________________________________________
> gstreamer-commits mailing list
> gstreamer-commits at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits
--
Jan Schmidt <thaytan at noraisin.net>
More information about the gstreamer-devel
mailing list