summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0038-glupload-need-upload-each-plane-to-singl.patch
blob: c0751d8cb68310bb49459cc20fa25145e8ac6938 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
From 2f11f9247972d09ba461de10be2398e513764045 Mon Sep 17 00:00:00 2001
From: Haihua Hu <jared.hu@nxp.com>
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