glimagesinkbin: Add allocation query for GstVideoOverlayComposition
authorLubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
Mon, 20 Jul 2015 18:24:22 +0000 (14:24 -0400)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:06 +0000 (19:32 +0000)
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

ext/gl/gstglimagesink.c
ext/gl/gstgluploadelement.c

index 4120a89..bb1ee18 100644 (file)
@@ -1519,6 +1519,7 @@ gst_glimage_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
   GstCaps *caps;
   guint size;
   gboolean need_pool;
+  GstStructure *allocation_meta = NULL;
 
   if (!_ensure_gl_setup (glimage_sink))
     return FALSE;
@@ -1557,6 +1558,18 @@ gst_glimage_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
   if (glimage_sink->context->gl_vtable->FenceSync)
     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;
 
   /* ERRORS */
index 368c2c9..6ed3f1c 100644 (file)
@@ -143,11 +143,30 @@ static gboolean
 _gst_gl_upload_element_propose_allocation (GstBaseTransform * bt,
     GstQuery * decide_query, GstQuery * query)
 {
+  guint alloc_index;
+  gboolean alloc_has_overlay_meta;
   GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt);
 
   if (!upload->upload)
     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);
 
   return TRUE;