glupload: deal with the ANY caps feature correctly

When transforming, xplode it out into the necessary caps features both
with and without the passthough features.

Fixes negotiation in the following class of pipelines:

gl ! textoverlay ! glupload ! glimagesinkelement

https://bugzilla.gnome.org/show_bug.cgi?id=763756
This commit is contained in:
Matthew Waters 2016-03-16 22:48:00 +11:00
parent 16dec9eacc
commit 993ec87ae6

View file

@ -111,32 +111,50 @@ _set_caps_features_with_passthrough (const GstCaps * caps,
guint i, j, m, n; guint i, j, m, n;
GstCaps *tmp; GstCaps *tmp;
tmp = gst_caps_copy (caps); tmp = gst_caps_new_empty ();
n = gst_caps_get_size (caps); n = gst_caps_get_size (caps);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
GstCapsFeatures *features, *orig_features; GstCapsFeatures *features, *orig_features;
GstStructure *s = gst_caps_get_structure (caps, i);
orig_features = gst_caps_get_features (caps, i); orig_features = gst_caps_get_features (caps, i);
features = gst_caps_features_new (feature_name, NULL); features = gst_caps_features_new (feature_name, NULL);
m = gst_caps_features_get_size (orig_features); if (gst_caps_features_is_any (orig_features)) {
for (j = 0; j < m; j++) { /* if we have any features, we add both the features with and without @passthrough */
const gchar *feature = gst_caps_features_get_nth (orig_features, j); gst_caps_append_structure_full (tmp, gst_structure_copy (s),
gst_caps_features_copy (features));
/* if we already have the features */ m = gst_caps_features_get_size (passthrough);
if (gst_caps_features_contains (features, feature)) for (j = 0; j < m; j++) {
continue; const gchar *feature = gst_caps_features_get_nth (passthrough, j);
if (g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY) == 0) /* if we already have the features */
continue; if (gst_caps_features_contains (features, feature))
continue;
if (gst_caps_features_contains (passthrough, feature)) {
gst_caps_features_add (features, feature); gst_caps_features_add (features, feature);
} }
} else {
m = gst_caps_features_get_size (orig_features);
for (j = 0; j < m; j++) {
const gchar *feature = gst_caps_features_get_nth (orig_features, j);
/* if we already have the features */
if (gst_caps_features_contains (features, feature))
continue;
if (g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY) == 0)
continue;
if (gst_caps_features_contains (passthrough, feature)) {
gst_caps_features_add (features, feature);
}
}
} }
gst_caps_set_features (tmp, i, features); gst_caps_append_structure_full (tmp, gst_structure_copy (s), features);
} }
return tmp; return tmp;
@ -297,8 +315,8 @@ _gl_memory_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
gst_allocation_params_init (&params); gst_allocation_params_init (&params);
allocator = allocator =
GST_ALLOCATOR (gst_gl_memory_allocator_get_default (upload->upload-> GST_ALLOCATOR (gst_gl_memory_allocator_get_default (upload->
context)); upload->context));
gst_query_add_allocation_param (query, allocator, &params); gst_query_add_allocation_param (query, allocator, &params);
gst_object_unref (allocator); gst_object_unref (allocator);
} }
@ -584,8 +602,8 @@ _egl_image_upload_perform_gl_thread (GstGLContext * context,
} }
if (GST_IS_GL_BUFFER_POOL (image->buffer->pool)) if (GST_IS_GL_BUFFER_POOL (image->buffer->pool))
gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->buffer-> gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->
pool), image->buffer); buffer->pool), image->buffer);
} }
static GstGLUploadReturn static GstGLUploadReturn
@ -1026,11 +1044,11 @@ _upload_meta_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
gpointer handle; gpointer handle;
gl_apis = gl_apis =
gst_gl_api_to_string (gst_gl_context_get_gl_api (upload-> gst_gl_api_to_string (gst_gl_context_get_gl_api (upload->upload->
upload->context)); context));
platform = platform =
gst_gl_platform_to_string (gst_gl_context_get_gl_platform gst_gl_platform_to_string (gst_gl_context_get_gl_platform (upload->
(upload->upload->context)); upload->context));
handle = (gpointer) gst_gl_context_get_gl_context (upload->upload->context); handle = (gpointer) gst_gl_context_get_gl_context (upload->upload->context);
gl_context = gl_context =