glimagesinkbin: Add allocation query for GstVideoOverlayComposition

Adds an GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE query to glupload
and glimagesink.  Detects the query from the downstream elements, so
it is executed only when downstream supports the overlay API.

This makes pipelines with textoverlay ! glupload ! gldownload ! xvimagesink possible.
Uses allocation meta struct for passing the window size upstream.

https://bugzilla.gnome.org/show_bug.cgi?id=745107
This commit is contained in:
Lubosz Sarnecki 2015-07-20 14:24:22 -04:00 committed by Nicolas Dufresne
parent 555428872c
commit 2fb862b34f
2 changed files with 32 additions and 0 deletions

View file

@ -1519,6 +1519,7 @@ gst_glimage_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
GstCaps *caps; GstCaps *caps;
guint size; guint size;
gboolean need_pool; gboolean need_pool;
GstStructure *allocation_meta = NULL;
if (!_ensure_gl_setup (glimage_sink)) if (!_ensure_gl_setup (glimage_sink))
return FALSE; return FALSE;
@ -1557,6 +1558,18 @@ gst_glimage_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
if (glimage_sink->context->gl_vtable->FenceSync) if (glimage_sink->context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, 0); gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, 0);
if (glimage_sink->window_width != 0 && glimage_sink->window_height != 0) {
allocation_meta =
gst_structure_new ("GstVideoOverlayCompositionMeta",
"width", G_TYPE_UINT, glimage_sink->window_width,
"height", G_TYPE_UINT, glimage_sink->window_height, NULL);
GST_DEBUG ("sending alloc query with size %dx%d",
glimage_sink->window_width, glimage_sink->window_height);
}
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, allocation_meta);
return TRUE; return TRUE;
/* ERRORS */ /* ERRORS */

View file

@ -143,11 +143,30 @@ static gboolean
_gst_gl_upload_element_propose_allocation (GstBaseTransform * bt, _gst_gl_upload_element_propose_allocation (GstBaseTransform * bt,
GstQuery * decide_query, GstQuery * query) GstQuery * decide_query, GstQuery * query)
{ {
guint alloc_index;
gboolean alloc_has_overlay_meta;
GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt); GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt);
if (!upload->upload) if (!upload->upload)
return FALSE; return FALSE;
alloc_has_overlay_meta =
gst_query_find_allocation_meta (decide_query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, &alloc_index);
if (alloc_has_overlay_meta) {
const GstStructure *params;
GST_DEBUG ("adding allocation meta in upload for textoverlay");
/* read window size from decide_query */
gst_query_parse_nth_allocation_meta (decide_query, alloc_index, &params);
if (params)
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, params);
}
gst_gl_upload_propose_allocation (upload->upload, decide_query, query); gst_gl_upload_propose_allocation (upload->upload, decide_query, query);
return TRUE; return TRUE;