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