From 17d04998c0671aa67c95afd9dc5fd2aa0f7efc92 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 1 Jun 2016 16:56:13 +0300 Subject: [PATCH] decodebin: Create a new decode element with the parser/convert capsfilter if there is a multiqueue after the parser https://bugzilla.gnome.org/show_bug.cgi?id=767102 --- gst/playback/gstdecodebin2.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index d1a7afc..a34efee 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -1740,12 +1740,10 @@ analyze_new_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad, if (is_parser_converter) { GstCaps *filter_caps; gint i; + GstElement *capsfilter; GstPad *p; GstDecodeElement *delem; - g_assert (chain->elements != NULL); - delem = (GstDecodeElement *) chain->elements->data; - filter_caps = gst_caps_new_empty (); for (i = 0; i < factories->n_values; i++) { GstElementFactory *factory = @@ -1779,17 +1777,28 @@ analyze_new_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad, /* Append the parser caps to prevent any not-negotiated errors */ filter_caps = gst_caps_merge (filter_caps, gst_caps_ref (caps)); - delem->capsfilter = gst_element_factory_make ("capsfilter", NULL); - g_object_set (G_OBJECT (delem->capsfilter), "caps", filter_caps, NULL); + if (chain->elements) { + delem = (GstDecodeElement *) chain->elements->data; + capsfilter = delem->capsfilter = + gst_element_factory_make ("capsfilter", NULL); + } else { + delem = g_slice_new0 (GstDecodeElement); + capsfilter = delem->element = + gst_element_factory_make ("capsfilter", NULL); + delem->capsfilter = NULL; + chain->elements = g_list_prepend (chain->elements, delem); + } + + g_object_set (G_OBJECT (capsfilter), "caps", filter_caps, NULL); gst_caps_unref (filter_caps); - gst_element_set_state (delem->capsfilter, GST_STATE_PAUSED); - gst_bin_add (GST_BIN_CAST (dbin), gst_object_ref (delem->capsfilter)); + gst_element_set_state (capsfilter, GST_STATE_PAUSED); + gst_bin_add (GST_BIN_CAST (dbin), gst_object_ref (capsfilter)); decode_pad_set_target (dpad, NULL); - p = gst_element_get_static_pad (delem->capsfilter, "sink"); + p = gst_element_get_static_pad (capsfilter, "sink"); gst_pad_link_full (pad, p, GST_PAD_LINK_CHECK_NOTHING); gst_object_unref (p); - p = gst_element_get_static_pad (delem->capsfilter, "src"); + p = gst_element_get_static_pad (capsfilter, "src"); decode_pad_set_target (dpad, p); pad = p; -- 2.7.4