From 2f11f9247972d09ba461de10be2398e513764045 Mon Sep 17 00:00:00 2001 From: Haihua Hu Date: Fri, 17 Nov 2017 13:06:56 +0800 Subject: [PATCH] [MMFMWK-7782] glupload: need upload each plane to single eglimage when output format is not RGBA when glupload out format is not RGBA, need to use single eglimage upload each plane. Upstream-Status: Inappropriate [i.MX specific] --- gst-libs/gst/gl/gstglupload.c | 62 ++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c index 5c7eca0..ed5e54b 100644 --- a/gst-libs/gst/gl/gstglupload.c +++ b/gst-libs/gst/gl/gstglupload.c @@ -657,6 +657,7 @@ _dma_buf_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps, gsize mems_skip[GST_VIDEO_MAX_PLANES]; GstMemory *mems[GST_VIDEO_MAX_PLANES]; guint i; + GstVideoFormat out_fmt; n_mem = gst_buffer_n_memory (buffer); meta = gst_buffer_get_video_meta (buffer); @@ -773,40 +774,41 @@ _dma_buf_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps, return FALSE; } -#ifdef EGL_DMA_BUF_PLANE1_FD_EXT - /* Now create one single EGLImage */ - /* check if one is cached */ - dmabuf->eglimage[0] = _get_cached_eglimage (mems[0], 0); - if (dmabuf->eglimage[0]) - return TRUE; - - dmabuf->eglimage[0] = - gst_egl_image_from_dmabuf_singleplaner (dmabuf->upload->context, - mems, in_info, n_planes, mems_skip); - if (!dmabuf->eglimage[0]) - return FALSE; - - _set_cached_eglimage (mems[0], dmabuf->eglimage[0], 0); -#else - /* Now create an EGLImage for each dmabufs */ - for (i = 0; i < n_planes; i++) { + out_fmt = GST_VIDEO_INFO_FORMAT (&dmabuf->upload->priv->out_info); + if (out_fmt == GST_VIDEO_FORMAT_RGBA) { + /* Now create one single EGLImage */ /* check if one is cached */ - dmabuf->eglimage[i] = _get_cached_eglimage (mems[i], i); - if (dmabuf->eglimage[i]) - continue; - - /* otherwise create one and cache it */ - dmabuf->eglimage[i] = - gst_egl_image_from_dmabuf (dmabuf->upload->context, - gst_dmabuf_memory_get_fd (mems[i]), in_info, i, - mems[i]->offset + mems_skip[i]); - - if (!dmabuf->eglimage[i]) + dmabuf->eglimage[0] = _get_cached_eglimage (mems[0], 0); + if (dmabuf->eglimage[0]) + return TRUE; + + dmabuf->eglimage[0] = + gst_egl_image_from_dmabuf_singleplaner (dmabuf->upload->context, + mems, in_info, n_planes, mems_skip); + if (!dmabuf->eglimage[0]) return FALSE; - _set_cached_eglimage (mems[i], dmabuf->eglimage[i], i); + _set_cached_eglimage (mems[0], dmabuf->eglimage[0], 0); + } else { + /* Now create an EGLImage for each dmabufs */ + for (i = 0; i < n_planes; i++) { + /* check if one is cached */ + dmabuf->eglimage[i] = _get_cached_eglimage (mems[i], i); + if (dmabuf->eglimage[i]) + continue; + + /* otherwise create one and cache it */ + dmabuf->eglimage[i] = + gst_egl_image_from_dmabuf (dmabuf->upload->context, + gst_dmabuf_memory_get_fd (mems[i]), in_info, i, + mems[i]->offset + mems_skip[i]); + + if (!dmabuf->eglimage[i]) + return FALSE; + + _set_cached_eglimage (mems[i], dmabuf->eglimage[i], i); + } } -#endif return TRUE; } -- 1.9.1