glupload: dmabuf: be explicit about gl formats used
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Fri, 9 Nov 2018 08:32:49 +0000 (09:32 +0100)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Sun, 11 Nov 2018 21:15:59 +0000 (16:15 -0500)
Rather then letting gst_gl_memory_setup_buffer guess the GL format used
for an eglimage after importing a dmabuf be explicit about it. This
fixes issues where dmabuf import may have used another format then
gst_gl_format_from_video_info would guess on the basis of the available
GL extensions.

In particular on etnaviv the gst_gl_format_from_video_info would
assuming a luminance + alpha GL format is used for YUY2, but the dmabuf
import will always use RG88. Which causes images to end up somewhat pink when
displayed on the screen.

gst-libs/gst/gl/gstglupload.c

index 9aa2576..26d2a9f 100644 (file)
@@ -488,6 +488,7 @@ struct DmabufUpload
   GstGLUpload *upload;
 
   GstEGLImage *eglimage[GST_VIDEO_MAX_PLANES];
+  GstGLFormat formats[GST_VIDEO_MAX_PLANES];
   GstBuffer *outbuf;
   GstGLVideoAllocationParams *params;
   guint n_mem;
@@ -719,6 +720,7 @@ _dma_buf_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps,
       return FALSE;
 
     _set_cached_eglimage (mems[i], dmabuf->eglimage[i], cache_id);
+    dmabuf->formats[i] = dmabuf->eglimage[i]->format;
   }
 
   return TRUE;
@@ -743,8 +745,8 @@ _dma_buf_upload_perform_gl_thread (GstGLContext * context,
 
   /* FIXME: buffer pool */
   dmabuf->outbuf = gst_buffer_new ();
-  gst_gl_memory_setup_buffer (allocator, dmabuf->outbuf, dmabuf->params, NULL,
-      (gpointer *) dmabuf->eglimage, dmabuf->n_mem);
+  gst_gl_memory_setup_buffer (allocator, dmabuf->outbuf, dmabuf->params,
+      dmabuf->formats, (gpointer *) dmabuf->eglimage, dmabuf->n_mem);
   gst_object_unref (allocator);
 }