summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-ti/recipes-arago/gstreamer/gstreamer1.0-plugins-bad/0001-gstwaylandsink-add-input-format-I420-support.patch
blob: 507f57b922239b6ec98ca896db17a8bbbeea7b6a (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
From 1364ee6e60eb09a3fe3b072fe4671c5d645e523a Mon Sep 17 00:00:00 2001
From: Eric Ruei <e-ruei1@ti.com>
Date: Wed, 22 Feb 2017 10:49:01 -0500
Subject: [PATCH 1/3] gstwaylandsink: add input format I420 support

The software-based video decoder produces the output in I420 format. To display
the output without additional ARM MHz consumed in video format conversion,
the function gst_wl_memory_construct_wl_buffer is enhanced to support I420 format.

Signed-off-by: Eric Ruei <e-ruei1@ti.com>
---
 ext/wayland/wldrm.c | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/ext/wayland/wldrm.c b/ext/wayland/wldrm.c
index 3dc9c21..ecbdc88 100644
--- a/ext/wayland/wldrm.c
+++ b/ext/wayland/wldrm.c
@@ -5,33 +5,60 @@
 #include <omap_drmif.h>
 #include <wayland-client.h>
 
+GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
+#define GST_CAT_DEFAULT gstwayland_debug
+
+
 struct wl_buffer *
 gst_wl_drm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
     const GstVideoInfo * info)
 {
   gint video_width = GST_VIDEO_INFO_WIDTH (info);
   gint video_height = GST_VIDEO_INFO_HEIGHT (info);
+  GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info);
   int fd = -1;
   struct omap_bo *bo;
   struct wl_buffer *buffer;
-
-  /* TODO get format, etc from caps.. and query device for
-   * supported formats, and make this all more flexible to
-   * cope with various formats:
-   */
-  uint32_t fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
+  uint32_t fourcc;
   uint32_t name;
   /* note: wayland and mesa use the terminology:
    *    stride - rowstride in bytes
    *    pitch  - rowstride in pixels
    */
   uint32_t strides[3] = {
-    GST_ROUND_UP_4 (video_width), GST_ROUND_UP_4 (video_width), 0,
+    GST_ROUND_UP_4 (video_width), 0, 0,
   };
   uint32_t offsets[3] = {
     0, strides[0] * video_height, 0
   };
 
+  if (format == GST_VIDEO_FORMAT_NV12)
+  {
+    /* NV12 */
+    fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
+    strides[1] = GST_ROUND_UP_4 (video_width);
+  }
+  else if(format == GST_VIDEO_FORMAT_I420)
+  {
+    /* YUV420 */
+    fourcc = GST_MAKE_FOURCC ('Y', 'U', '1', '2');
+    strides[1] = strides[2] = GST_ROUND_UP_4 (video_width/2);
+    offsets[2] = offsets[1] + strides[1] * video_height/2;
+  }
+  else
+  {
+
+    GST_DEBUG ("Unsupported video format: %d", format);
+    /*
+     * There are two xRGB frames with width and height = 1 required in the begining of a video stream.
+     * If we consider them as errot, then it will case libwayland-clent.so crashes
+     * due to invalid error handling.
+     * Consider them as NV12 until we can figure out a better solution
+     */
+    fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
+    strides[1] = GST_ROUND_UP_4 (video_width);
+  }
+
   fd = gst_fd_memory_get_fd (mem);
 
   if (fd < 0 ) {
-- 
1.9.1