From: Brendan McGrath bmcgrath@codeweavers.com
This speeds up pipeline creation and fixes a timing issue where caps negotiation is not completed prior to the first buffer being sent. --- dlls/winegstreamer/wg_parser.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 710cfe6a0a5..56d4e102a22 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -555,6 +555,38 @@ static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, return GST_AUTOPLUG_SELECT_TRY; }
+static gboolean autoplug_query_cb(GstElement *bin, GstPad *child, + GstElement *pad, GstQuery *query, gpointer user) +{ + GstCapsFeatures *features; + GstCaps *filter, *result; + GstStructure *structure; + guint i; + + GST_INFO("Query %"GST_PTR_FORMAT, query); + + if (query->type == GST_QUERY_CAPS) + { + result = gst_caps_new_empty(); + gst_query_parse_caps(query, &filter); + for (i = 0; i < gst_caps_get_size(filter); i++) + { + if (!(features = gst_caps_get_features(filter, i)) || gst_caps_features_contains(features, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY)) + { + structure = gst_caps_get_structure(filter, i); + gst_caps_append_structure(result, gst_structure_copy(structure)); + } + } + + GST_INFO("Result %"GST_PTR_FORMAT, result); + gst_query_set_caps_result(query, result); + + return TRUE; + } + + return FALSE; +} + static void no_more_pads_cb(GstElement *element, gpointer user) { struct wg_parser *parser = user; @@ -1802,6 +1834,7 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser) g_signal_connect(element, "pad-removed", G_CALLBACK(pad_removed_cb), parser); g_signal_connect(element, "autoplug-continue", G_CALLBACK(autoplug_continue_cb), parser); g_signal_connect(element, "autoplug-select", G_CALLBACK(autoplug_select_cb), parser); + g_signal_connect(element, "autoplug-query", G_CALLBACK(autoplug_query_cb), parser); g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads_cb), parser); g_signal_connect(element, "deep-element-added", G_CALLBACK(deep_element_added_cb), parser);