1*4882a593SmuzhiyunFrom 2d28f635b01ec5921c26fdab63da5f535f7dbfbd Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Wed, 21 Apr 2021 04:44:38 +0800
4*4882a593SmuzhiyunSubject: [PATCH 25/41] kmssink: Support NV12_10LE40 and NV12|NV12_10LE40|NV16
5*4882a593Smuzhiyun (AFBC)
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunSupport using NV12_10LE40 and ARM AFBC compressed format.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunNOTE:
10*4882a593SmuzhiyunThose formats only supported on a few planes of a few chips.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
13*4882a593Smuzhiyun---
14*4882a593Smuzhiyun sys/kms/gstkmsallocator.c |  49 +++++++++++++-
15*4882a593Smuzhiyun sys/kms/gstkmssink.c      | 137 +++++++++++++++++++++++++++++++++++++-
16*4882a593Smuzhiyun sys/kms/gstkmsutils.c     |   6 ++
17*4882a593Smuzhiyun sys/kms/gstkmsutils.h     |  46 +++++++++++++
18*4882a593Smuzhiyun 4 files changed, 234 insertions(+), 4 deletions(-)
19*4882a593Smuzhiyun
20*4882a593Smuzhiyundiff --git a/sys/kms/gstkmsallocator.c b/sys/kms/gstkmsallocator.c
21*4882a593Smuzhiyunindex 6687f3b..ad56a17 100644
22*4882a593Smuzhiyun--- a/sys/kms/gstkmsallocator.c
23*4882a593Smuzhiyun+++ b/sys/kms/gstkmsallocator.c
24*4882a593Smuzhiyun@@ -36,6 +36,7 @@
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /* it needs to be below because is internal to libdrm */
27*4882a593Smuzhiyun #include <drm.h>
28*4882a593Smuzhiyun+#include <drm_fourcc.h>
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include <gst/allocators/gstdmabuf.h>
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun@@ -416,7 +417,7 @@ static gboolean
33*4882a593Smuzhiyun gst_kms_allocator_add_fb (GstKMSAllocator * alloc, GstKMSMemory * kmsmem,
34*4882a593Smuzhiyun     gsize in_offsets[GST_VIDEO_MAX_PLANES], GstVideoInfo * vinfo)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun-  gint i, ret;
37*4882a593Smuzhiyun+  gint i, ret = -1;
38*4882a593Smuzhiyun   gint num_planes = GST_VIDEO_INFO_N_PLANES (vinfo);
39*4882a593Smuzhiyun   guint32 w, h, fmt, bo_handles[4] = { 0, };
40*4882a593Smuzhiyun   guint32 pitches[4] = { 0, };
41*4882a593Smuzhiyun@@ -442,8 +443,50 @@ gst_kms_allocator_add_fb (GstKMSAllocator * alloc, GstKMSMemory * kmsmem,
42*4882a593Smuzhiyun   GST_DEBUG_OBJECT (alloc, "bo handles: %d, %d, %d, %d", bo_handles[0],
43*4882a593Smuzhiyun       bo_handles[1], bo_handles[2], bo_handles[3]);
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun-  ret = drmModeAddFB2 (alloc->priv->fd, w, h, fmt, bo_handles, pitches,
46*4882a593Smuzhiyun-      offsets, &kmsmem->fb_id, 0);
47*4882a593Smuzhiyun+  if (GST_VIDEO_INFO_IS_AFBC (vinfo)) {
48*4882a593Smuzhiyun+    guint64 modifiers[4] = { 0 };
49*4882a593Smuzhiyun+
50*4882a593Smuzhiyun+    for (i = 0; i < num_planes; i++)
51*4882a593Smuzhiyun+      modifiers[i] = DRM_AFBC_MODIFIER;
52*4882a593Smuzhiyun+
53*4882a593Smuzhiyun+    if (fmt == DRM_FORMAT_NV12 || fmt == DRM_FORMAT_NV12_10 ||
54*4882a593Smuzhiyun+        fmt == DRM_FORMAT_NV16) {
55*4882a593Smuzhiyun+      /* The newer kernel might use new formats instead */
56*4882a593Smuzhiyun+      guint32 _handles[4] = { bo_handles[0], 0, };
57*4882a593Smuzhiyun+      guint32 _pitches[4] = { pitches[0], 0, };
58*4882a593Smuzhiyun+      guint32 _offsets[4] = { offsets[0], 0, };
59*4882a593Smuzhiyun+      guint64 _modifiers[4] = { modifiers[0], 0, };
60*4882a593Smuzhiyun+      guint32 _fmt;
61*4882a593Smuzhiyun+
62*4882a593Smuzhiyun+      if (fmt == DRM_FORMAT_NV12) {
63*4882a593Smuzhiyun+        _fmt = DRM_FORMAT_YUV420_8BIT;
64*4882a593Smuzhiyun+        /* The bpp of YUV420_8BIT is 12 */
65*4882a593Smuzhiyun+        _pitches[0] *= 1.5;
66*4882a593Smuzhiyun+      } else if (fmt == DRM_FORMAT_NV12_10) {
67*4882a593Smuzhiyun+        _fmt = DRM_FORMAT_YUV420_10BIT;
68*4882a593Smuzhiyun+        /* The bpp of YUV420_10BIT is 15 */
69*4882a593Smuzhiyun+        _pitches[0] *= 1.5;
70*4882a593Smuzhiyun+      } else {
71*4882a593Smuzhiyun+        _fmt = DRM_FORMAT_YUYV;
72*4882a593Smuzhiyun+        /* The bpp of YUYV (AFBC) is 16 */
73*4882a593Smuzhiyun+        _pitches[0] *= 2;
74*4882a593Smuzhiyun+      }
75*4882a593Smuzhiyun+
76*4882a593Smuzhiyun+      ret = drmModeAddFB2WithModifiers (alloc->priv->fd, w, h, _fmt, _handles,
77*4882a593Smuzhiyun+          _pitches, _offsets, _modifiers, &kmsmem->fb_id,
78*4882a593Smuzhiyun+          DRM_MODE_FB_MODIFIERS);
79*4882a593Smuzhiyun+    }
80*4882a593Smuzhiyun+
81*4882a593Smuzhiyun+    if (ret)
82*4882a593Smuzhiyun+      ret = drmModeAddFB2WithModifiers (alloc->priv->fd, w, h, fmt, bo_handles,
83*4882a593Smuzhiyun+          pitches, offsets, modifiers, &kmsmem->fb_id, DRM_MODE_FB_MODIFIERS);
84*4882a593Smuzhiyun+  } else {
85*4882a593Smuzhiyun+    ret = drmModeAddFB2 (alloc->priv->fd, w, h, fmt, bo_handles, pitches,
86*4882a593Smuzhiyun+        offsets, &kmsmem->fb_id, 0);
87*4882a593Smuzhiyun+    if (ret && fmt == DRM_FORMAT_NV12_10)
88*4882a593Smuzhiyun+      ret = drmModeAddFB2 (alloc->priv->fd, w, h, DRM_FORMAT_NV15, bo_handles,
89*4882a593Smuzhiyun+          pitches, offsets, &kmsmem->fb_id, 0);
90*4882a593Smuzhiyun+  }
91*4882a593Smuzhiyun   if (ret) {
92*4882a593Smuzhiyun     GST_ERROR_OBJECT (alloc, "Failed to bind to framebuffer: %s (%d)",
93*4882a593Smuzhiyun         g_strerror (errno), errno);
94*4882a593Smuzhiyundiff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
95*4882a593Smuzhiyunindex c10a374..8335963 100644
96*4882a593Smuzhiyun--- a/sys/kms/gstkmssink.c
97*4882a593Smuzhiyun+++ b/sys/kms/gstkmssink.c
98*4882a593Smuzhiyun@@ -826,6 +826,84 @@ modesetting_failed:
99*4882a593Smuzhiyun   }
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun+static void
103*4882a593Smuzhiyun+check_afbc (GstKMSSink * self, drmModePlane * plane, guint32 drmfmt,
104*4882a593Smuzhiyun+    gboolean * linear, gboolean * afbc)
105*4882a593Smuzhiyun+{
106*4882a593Smuzhiyun+  drmModeObjectPropertiesPtr props;
107*4882a593Smuzhiyun+  drmModePropertyBlobPtr blob;
108*4882a593Smuzhiyun+  drmModePropertyPtr prop;
109*4882a593Smuzhiyun+  drmModeResPtr res;
110*4882a593Smuzhiyun+  struct drm_format_modifier_blob *header;
111*4882a593Smuzhiyun+  struct drm_format_modifier *modifiers;
112*4882a593Smuzhiyun+  guint32 *formats;
113*4882a593Smuzhiyun+  guint64 value = 0;
114*4882a593Smuzhiyun+  gint i, j;
115*4882a593Smuzhiyun+
116*4882a593Smuzhiyun+  *linear = *afbc = FALSE;
117*4882a593Smuzhiyun+
118*4882a593Smuzhiyun+  res = drmModeGetResources (self->fd);
119*4882a593Smuzhiyun+  if (!res)
120*4882a593Smuzhiyun+    return;
121*4882a593Smuzhiyun+
122*4882a593Smuzhiyun+  props = drmModeObjectGetProperties (self->fd, plane->plane_id,
123*4882a593Smuzhiyun+      DRM_MODE_OBJECT_PLANE);
124*4882a593Smuzhiyun+  if (!props) {
125*4882a593Smuzhiyun+    drmModeFreeResources (res);
126*4882a593Smuzhiyun+    return;
127*4882a593Smuzhiyun+  }
128*4882a593Smuzhiyun+
129*4882a593Smuzhiyun+  for (i = 0; i < props->count_props && !value; i++) {
130*4882a593Smuzhiyun+    prop = drmModeGetProperty (self->fd, props->props[i]);
131*4882a593Smuzhiyun+    if (!prop)
132*4882a593Smuzhiyun+      continue;
133*4882a593Smuzhiyun+
134*4882a593Smuzhiyun+    if (!strcmp (prop->name, "IN_FORMATS"))
135*4882a593Smuzhiyun+      value = props->prop_values[i];
136*4882a593Smuzhiyun+
137*4882a593Smuzhiyun+    drmModeFreeProperty (prop);
138*4882a593Smuzhiyun+  }
139*4882a593Smuzhiyun+
140*4882a593Smuzhiyun+  drmModeFreeObjectProperties (props);
141*4882a593Smuzhiyun+  drmModeFreeResources (res);
142*4882a593Smuzhiyun+
143*4882a593Smuzhiyun+  /* No modifiers */
144*4882a593Smuzhiyun+  if (!value) {
145*4882a593Smuzhiyun+    *linear = TRUE;
146*4882a593Smuzhiyun+    return;
147*4882a593Smuzhiyun+  }
148*4882a593Smuzhiyun+
149*4882a593Smuzhiyun+  blob = drmModeGetPropertyBlob (self->fd, value);
150*4882a593Smuzhiyun+  if (!blob)
151*4882a593Smuzhiyun+    return;
152*4882a593Smuzhiyun+
153*4882a593Smuzhiyun+  header = blob->data;
154*4882a593Smuzhiyun+  modifiers = (struct drm_format_modifier *)
155*4882a593Smuzhiyun+      ((gchar *) header + header->modifiers_offset);
156*4882a593Smuzhiyun+  formats = (guint32 *) ((gchar *) header + header->formats_offset);
157*4882a593Smuzhiyun+
158*4882a593Smuzhiyun+  for (i = 0; i < header->count_formats; i++) {
159*4882a593Smuzhiyun+    if (formats[i] != drmfmt)
160*4882a593Smuzhiyun+      continue;
161*4882a593Smuzhiyun+
162*4882a593Smuzhiyun+    for (j = 0; j < header->count_modifiers; j++) {
163*4882a593Smuzhiyun+      struct drm_format_modifier *mod = &modifiers[j];
164*4882a593Smuzhiyun+
165*4882a593Smuzhiyun+      if ((i < mod->offset) || (i > mod->offset + 63))
166*4882a593Smuzhiyun+        continue;
167*4882a593Smuzhiyun+      if (!(mod->formats & (1 << (i - mod->offset))))
168*4882a593Smuzhiyun+        continue;
169*4882a593Smuzhiyun+
170*4882a593Smuzhiyun+      if (mod->modifier == DRM_AFBC_MODIFIER)
171*4882a593Smuzhiyun+        *afbc = TRUE;
172*4882a593Smuzhiyun+      else if (mod->modifier == DRM_FORMAT_MOD_LINEAR)
173*4882a593Smuzhiyun+        *linear = TRUE;
174*4882a593Smuzhiyun+    }
175*4882a593Smuzhiyun+  }
176*4882a593Smuzhiyun+
177*4882a593Smuzhiyun+  drmModeFreePropertyBlob (blob);
178*4882a593Smuzhiyun+}
179*4882a593Smuzhiyun+
180*4882a593Smuzhiyun static gboolean
181*4882a593Smuzhiyun ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
182*4882a593Smuzhiyun     drmModePlane * plane, drmModeRes * res)
183*4882a593Smuzhiyun@@ -859,7 +937,19 @@ ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
184*4882a593Smuzhiyun       mode = &conn->modes[i];
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun     for (j = 0; j < plane->count_formats; j++) {
187*4882a593Smuzhiyun-      fmt = gst_video_format_from_drm (plane->formats[j]);
188*4882a593Smuzhiyun+      gboolean linear = FALSE, afbc = FALSE;
189*4882a593Smuzhiyun+
190*4882a593Smuzhiyun+      check_afbc (self, plane, plane->formats[j], &linear, &afbc);
191*4882a593Smuzhiyun+
192*4882a593Smuzhiyun+      if (plane->formats[j] == DRM_FORMAT_YUV420_8BIT)
193*4882a593Smuzhiyun+        fmt = GST_VIDEO_FORMAT_NV12;
194*4882a593Smuzhiyun+      else if (plane->formats[j] == DRM_FORMAT_YUV420_10BIT)
195*4882a593Smuzhiyun+        fmt = GST_VIDEO_FORMAT_NV12_10LE40;
196*4882a593Smuzhiyun+      else if (afbc && plane->formats[j] == DRM_FORMAT_YUYV)
197*4882a593Smuzhiyun+        fmt = GST_VIDEO_FORMAT_NV16;
198*4882a593Smuzhiyun+      else
199*4882a593Smuzhiyun+        fmt = gst_video_format_from_drm (plane->formats[j]);
200*4882a593Smuzhiyun+
201*4882a593Smuzhiyun       if (fmt == GST_VIDEO_FORMAT_UNKNOWN) {
202*4882a593Smuzhiyun         GST_INFO_OBJECT (self, "ignoring format %" GST_FOURCC_FORMAT,
203*4882a593Smuzhiyun             GST_FOURCC_ARGS (plane->formats[j]));
204*4882a593Smuzhiyun@@ -884,6 +974,16 @@ ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
205*4882a593Smuzhiyun       if (!caps)
206*4882a593Smuzhiyun         continue;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun+      if (afbc) {
209*4882a593Smuzhiyun+        GstCaps *afbc_caps = gst_caps_copy (caps);
210*4882a593Smuzhiyun+        gst_caps_set_simple (afbc_caps, "arm-afbc", G_TYPE_INT, 1, NULL);
211*4882a593Smuzhiyun+
212*4882a593Smuzhiyun+        if (linear)
213*4882a593Smuzhiyun+          gst_caps_append (caps, afbc_caps);
214*4882a593Smuzhiyun+        else
215*4882a593Smuzhiyun+          gst_caps_replace (&caps, afbc_caps);
216*4882a593Smuzhiyun+      }
217*4882a593Smuzhiyun+
218*4882a593Smuzhiyun       tmp_caps = gst_caps_merge (tmp_caps, caps);
219*4882a593Smuzhiyun     }
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun@@ -1532,11 +1632,23 @@ gst_kms_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun   GstKMSSink *self;
224*4882a593Smuzhiyun   GstVideoInfo vinfo;
225*4882a593Smuzhiyun+  GstStructure *s;
226*4882a593Smuzhiyun+  gint value;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun   self = GST_KMS_SINK (bsink);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun   if (!gst_video_info_from_caps (&vinfo, caps))
231*4882a593Smuzhiyun     goto invalid_format;
232*4882a593Smuzhiyun+
233*4882a593Smuzhiyun+  /* parse AFBC from caps */
234*4882a593Smuzhiyun+  s = gst_caps_get_structure (caps, 0);
235*4882a593Smuzhiyun+  if (gst_structure_get_int (s, "arm-afbc", &value)) {
236*4882a593Smuzhiyun+    if (value)
237*4882a593Smuzhiyun+      GST_VIDEO_INFO_SET_AFBC (&vinfo);
238*4882a593Smuzhiyun+    else
239*4882a593Smuzhiyun+      GST_VIDEO_INFO_UNSET_AFBC (&vinfo);
240*4882a593Smuzhiyun+  }
241*4882a593Smuzhiyun+
242*4882a593Smuzhiyun   self->vinfo = vinfo;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun   if (!gst_kms_sink_calculate_display_ratio (self, &vinfo,
245*4882a593Smuzhiyun@@ -1611,7 +1723,9 @@ gst_kms_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
246*4882a593Smuzhiyun   gboolean need_pool;
247*4882a593Smuzhiyun   GstVideoInfo vinfo;
248*4882a593Smuzhiyun   GstBufferPool *pool;
249*4882a593Smuzhiyun+  GstStructure *s;
250*4882a593Smuzhiyun   gsize size;
251*4882a593Smuzhiyun+  gint value;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun   self = GST_KMS_SINK (bsink);
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun@@ -1623,6 +1737,10 @@ gst_kms_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
256*4882a593Smuzhiyun   if (!gst_video_info_from_caps (&vinfo, caps))
257*4882a593Smuzhiyun     goto invalid_caps;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun+  s = gst_caps_get_structure (caps, 0);
260*4882a593Smuzhiyun+  if (gst_structure_get_int (s, "arm-afbc", &value) && value)
261*4882a593Smuzhiyun+    goto afbc_caps;
262*4882a593Smuzhiyun+
263*4882a593Smuzhiyun   size = GST_VIDEO_INFO_SIZE (&vinfo);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun   pool = NULL;
266*4882a593Smuzhiyun@@ -1661,6 +1779,11 @@ invalid_caps:
267*4882a593Smuzhiyun     GST_DEBUG_OBJECT (bsink, "invalid caps specified");
268*4882a593Smuzhiyun     return FALSE;
269*4882a593Smuzhiyun   }
270*4882a593Smuzhiyun+afbc_caps:
271*4882a593Smuzhiyun+  {
272*4882a593Smuzhiyun+    GST_DEBUG_OBJECT (bsink, "no allocation for AFBC");
273*4882a593Smuzhiyun+    return FALSE;
274*4882a593Smuzhiyun+  }
275*4882a593Smuzhiyun no_pool:
276*4882a593Smuzhiyun   {
277*4882a593Smuzhiyun     /* Already warned in create_pool */
278*4882a593Smuzhiyun@@ -1893,6 +2016,11 @@ gst_kms_sink_copy_to_dumb_buffer (GstKMSSink * self, GstVideoInfo * vinfo,
279*4882a593Smuzhiyun   gboolean success;
280*4882a593Smuzhiyun   GstBuffer *buf = NULL;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun+  if (GST_VIDEO_INFO_IS_AFBC (vinfo)) {
283*4882a593Smuzhiyun+    GST_ERROR_OBJECT (self, "unable to copy AFBC");
284*4882a593Smuzhiyun+    return NULL;
285*4882a593Smuzhiyun+  }
286*4882a593Smuzhiyun+
287*4882a593Smuzhiyun   if (!ensure_internal_pool (self, vinfo, inbuf))
288*4882a593Smuzhiyun     goto bail;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun@@ -2081,6 +2209,10 @@ retry_set_plane:
291*4882a593Smuzhiyun   gst_kms_push_hdr_infoframe (self, FALSE);
292*4882a593Smuzhiyun #endif
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun+  if (GST_VIDEO_INFO_IS_AFBC (vinfo))
295*4882a593Smuzhiyun+    /* The AFBC's width should align to 4 */
296*4882a593Smuzhiyun+    src.w &= ~3;
297*4882a593Smuzhiyun+
298*4882a593Smuzhiyun   GST_TRACE_OBJECT (self,
299*4882a593Smuzhiyun       "drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
300*4882a593Smuzhiyun       result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
301*4882a593Smuzhiyun@@ -2170,6 +2302,9 @@ gst_kms_sink_drain (GstKMSSink * self)
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun     dumb_buf = gst_kms_sink_copy_to_dumb_buffer (self, &self->last_vinfo,
304*4882a593Smuzhiyun         parent_meta->buffer);
305*4882a593Smuzhiyun+    if (!dumb_buf)
306*4882a593Smuzhiyun+      dumb_buf = gst_buffer_ref (self->last_buffer);
307*4882a593Smuzhiyun+
308*4882a593Smuzhiyun     last_buf = self->last_buffer;
309*4882a593Smuzhiyun     self->last_buffer = dumb_buf;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyundiff --git a/sys/kms/gstkmsutils.c b/sys/kms/gstkmsutils.c
312*4882a593Smuzhiyunindex cc719fc..23f04da 100644
313*4882a593Smuzhiyun--- a/sys/kms/gstkmsutils.c
314*4882a593Smuzhiyun+++ b/sys/kms/gstkmsutils.c
315*4882a593Smuzhiyun@@ -68,6 +68,8 @@ static const struct
316*4882a593Smuzhiyun   DEF_FMT (YUV422, Y42B),
317*4882a593Smuzhiyun   DEF_FMT (NV61, NV61),
318*4882a593Smuzhiyun   DEF_FMT (NV16, NV16),
319*4882a593Smuzhiyun+  DEF_FMT (NV12_10, NV12_10LE40),
320*4882a593Smuzhiyun+  DEF_FMT (NV15, NV12_10LE40),
321*4882a593Smuzhiyun   DEF_FMT (UYVY, UYVY),
322*4882a593Smuzhiyun   DEF_FMT (YVYU, YVYU),
323*4882a593Smuzhiyun   DEF_FMT (YUYV, YUY2),
324*4882a593Smuzhiyun@@ -129,6 +131,8 @@ gst_drm_bpp_from_drm (guint32 drmfmt)
325*4882a593Smuzhiyun       bpp = 8;
326*4882a593Smuzhiyun       break;
327*4882a593Smuzhiyun     case DRM_FORMAT_P010:
328*4882a593Smuzhiyun+    case DRM_FORMAT_NV12_10:
329*4882a593Smuzhiyun+    case DRM_FORMAT_NV15:
330*4882a593Smuzhiyun       bpp = 10;
331*4882a593Smuzhiyun       break;
332*4882a593Smuzhiyun     case DRM_FORMAT_UYVY:
333*4882a593Smuzhiyun@@ -161,6 +165,8 @@ gst_drm_height_from_drm (guint32 drmfmt, guint32 height)
334*4882a593Smuzhiyun     case DRM_FORMAT_YVU420:
335*4882a593Smuzhiyun     case DRM_FORMAT_YUV422:
336*4882a593Smuzhiyun     case DRM_FORMAT_NV12:
337*4882a593Smuzhiyun+    case DRM_FORMAT_NV12_10:
338*4882a593Smuzhiyun+    case DRM_FORMAT_NV15:
339*4882a593Smuzhiyun     case DRM_FORMAT_NV21:
340*4882a593Smuzhiyun     case DRM_FORMAT_P010:
341*4882a593Smuzhiyun     case DRM_FORMAT_P016:
342*4882a593Smuzhiyundiff --git a/sys/kms/gstkmsutils.h b/sys/kms/gstkmsutils.h
343*4882a593Smuzhiyunindex 6570070..742372a 100644
344*4882a593Smuzhiyun--- a/sys/kms/gstkmsutils.h
345*4882a593Smuzhiyun+++ b/sys/kms/gstkmsutils.h
346*4882a593Smuzhiyun@@ -30,6 +30,52 @@
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun G_BEGIN_DECLS
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun+#ifndef DRM_FORMAT_NV12_10
351*4882a593Smuzhiyun+#define DRM_FORMAT_NV12_10 fourcc_code('N', 'A', '1', '2')
352*4882a593Smuzhiyun+#endif
353*4882a593Smuzhiyun+
354*4882a593Smuzhiyun+#ifndef DRM_FORMAT_NV15
355*4882a593Smuzhiyun+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5')
356*4882a593Smuzhiyun+#endif
357*4882a593Smuzhiyun+
358*4882a593Smuzhiyun+#ifndef DRM_FORMAT_YUV420_8BIT
359*4882a593Smuzhiyun+#define DRM_FORMAT_YUV420_8BIT fourcc_code('Y', 'U', '0', '8')
360*4882a593Smuzhiyun+#endif
361*4882a593Smuzhiyun+
362*4882a593Smuzhiyun+#ifndef DRM_FORMAT_YUV420_10BIT
363*4882a593Smuzhiyun+#define DRM_FORMAT_YUV420_10BIT fourcc_code('Y', 'U', '1', '0')
364*4882a593Smuzhiyun+#endif
365*4882a593Smuzhiyun+
366*4882a593Smuzhiyun+#ifndef DRM_FORMAT_MOD_VENDOR_ARM
367*4882a593Smuzhiyun+#define DRM_FORMAT_MOD_VENDOR_ARM 0x08
368*4882a593Smuzhiyun+#endif
369*4882a593Smuzhiyun+
370*4882a593Smuzhiyun+#ifndef DRM_FORMAT_MOD_ARM_AFBC
371*4882a593Smuzhiyun+#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) fourcc_mod_code(ARM, __afbc_mode)
372*4882a593Smuzhiyun+#endif
373*4882a593Smuzhiyun+
374*4882a593Smuzhiyun+#ifndef AFBC_FORMAT_MOD_BLOCK_SIZE_16x16
375*4882a593Smuzhiyun+#define AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 (1ULL)
376*4882a593Smuzhiyun+#endif
377*4882a593Smuzhiyun+
378*4882a593Smuzhiyun+#ifndef AFBC_FORMAT_MOD_SPARSE
379*4882a593Smuzhiyun+#define AFBC_FORMAT_MOD_SPARSE (((__u64)1) << 6)
380*4882a593Smuzhiyun+#endif
381*4882a593Smuzhiyun+
382*4882a593Smuzhiyun+#define DRM_AFBC_MODIFIER \
383*4882a593Smuzhiyun+  (DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_SPARSE) | \
384*4882a593Smuzhiyun+   DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16))
385*4882a593Smuzhiyun+
386*4882a593Smuzhiyun+#ifndef GST_VIDEO_FLAG_ARM_AFBC
387*4882a593Smuzhiyun+#define GST_VIDEO_FLAG_ARM_AFBC (1UL << 31)
388*4882a593Smuzhiyun+#define GST_VIDEO_INFO_SET_AFBC(i) \
389*4882a593Smuzhiyun+  GST_VIDEO_INFO_FLAG_SET (i, GST_VIDEO_FLAG_ARM_AFBC)
390*4882a593Smuzhiyun+#define GST_VIDEO_INFO_UNSET_AFBC(i) \
391*4882a593Smuzhiyun+  GST_VIDEO_INFO_FLAG_UNSET (i, GST_VIDEO_FLAG_ARM_AFBC)
392*4882a593Smuzhiyun+#define GST_VIDEO_INFO_IS_AFBC(i) \
393*4882a593Smuzhiyun+  GST_VIDEO_INFO_FLAG_IS_SET (i, GST_VIDEO_FLAG_ARM_AFBC)
394*4882a593Smuzhiyun+#endif
395*4882a593Smuzhiyun+
396*4882a593Smuzhiyun GstVideoFormat gst_video_format_from_drm (guint32 drmfmt);
397*4882a593Smuzhiyun guint32        gst_drm_format_from_video (GstVideoFormat fmt);
398*4882a593Smuzhiyun guint32        gst_drm_bpp_from_drm (guint32 drmfmt);
399*4882a593Smuzhiyun--
400*4882a593Smuzhiyun2.20.1
401*4882a593Smuzhiyun
402