mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-29 19:50:40 +00:00
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:
parent
16dec9eacc
commit
993ec87ae6
1 changed files with 37 additions and 19 deletions
|
@ -111,32 +111,50 @@ _set_caps_features_with_passthrough (const GstCaps * caps,
|
|||
guint i, j, m, n;
|
||||
GstCaps *tmp;
|
||||
|
||||
tmp = gst_caps_copy (caps);
|
||||
tmp = gst_caps_new_empty ();
|
||||
|
||||
n = gst_caps_get_size (caps);
|
||||
for (i = 0; i < n; i++) {
|
||||
GstCapsFeatures *features, *orig_features;
|
||||
GstStructure *s = gst_caps_get_structure (caps, i);
|
||||
|
||||
orig_features = gst_caps_get_features (caps, i);
|
||||
features = gst_caps_features_new (feature_name, NULL);
|
||||
|
||||
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 (gst_caps_features_is_any (orig_features)) {
|
||||
/* if we have any features, we add both the features with and without @passthrough */
|
||||
gst_caps_append_structure_full (tmp, gst_structure_copy (s),
|
||||
gst_caps_features_copy (features));
|
||||
|
||||
/* if we already have the features */
|
||||
if (gst_caps_features_contains (features, feature))
|
||||
continue;
|
||||
m = gst_caps_features_get_size (passthrough);
|
||||
for (j = 0; j < m; j++) {
|
||||
const gchar *feature = gst_caps_features_get_nth (passthrough, j);
|
||||
|
||||
if (g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY) == 0)
|
||||
continue;
|
||||
/* if we already have the features */
|
||||
if (gst_caps_features_contains (features, feature))
|
||||
continue;
|
||||
|
||||
if (gst_caps_features_contains (passthrough, 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;
|
||||
|
@ -297,8 +315,8 @@ _gl_memory_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
|
|||
gst_allocation_params_init (¶ms);
|
||||
|
||||
allocator =
|
||||
GST_ALLOCATOR (gst_gl_memory_allocator_get_default (upload->upload->
|
||||
context));
|
||||
GST_ALLOCATOR (gst_gl_memory_allocator_get_default (upload->
|
||||
upload->context));
|
||||
gst_query_add_allocation_param (query, allocator, ¶ms);
|
||||
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))
|
||||
gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->buffer->
|
||||
pool), image->buffer);
|
||||
gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->
|
||||
buffer->pool), image->buffer);
|
||||
}
|
||||
|
||||
static GstGLUploadReturn
|
||||
|
@ -1026,11 +1044,11 @@ _upload_meta_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
|
|||
gpointer handle;
|
||||
|
||||
gl_apis =
|
||||
gst_gl_api_to_string (gst_gl_context_get_gl_api (upload->
|
||||
upload->context));
|
||||
gst_gl_api_to_string (gst_gl_context_get_gl_api (upload->upload->
|
||||
context));
|
||||
platform =
|
||||
gst_gl_platform_to_string (gst_gl_context_get_gl_platform
|
||||
(upload->upload->context));
|
||||
gst_gl_platform_to_string (gst_gl_context_get_gl_platform (upload->
|
||||
upload->context));
|
||||
handle = (gpointer) gst_gl_context_get_gl_context (upload->upload->context);
|
||||
|
||||
gl_context =
|
||||
|
|
Loading…
Reference in a new issue