1*4882a593SmuzhiyunFrom c3dce1eaba3d7e75c288319cc8ce41b5c7735393 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Tue, 24 May 2022 16:16:33 +0800 4*4882a593SmuzhiyunSubject: [PATCH 12/14] glupload: Support NV12_10LE40 and NV12|NV12_10LE40|NV16 5*4882a593Smuzhiyun (AFBC) 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunTested on RK356x with: 8*4882a593Smuzhiyunexport GST_MPP_VIDEODEC_DEFAULT_ARM_AFBC=1 9*4882a593Smuzhiyungst-play-1.0 video.mp4 --videosink=glimagesink 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 12*4882a593Smuzhiyun--- 13*4882a593Smuzhiyun gst-libs/gst/gl/egl/gsteglimage.c | 49 ++++++++++++++++++++++++++----- 14*4882a593Smuzhiyun gst-libs/gst/gl/egl/gsteglimage.h | 44 +++++++++++++++++++++++++++ 15*4882a593Smuzhiyun gst-libs/gst/gl/gstglmemory.h | 2 +- 16*4882a593Smuzhiyun gst-libs/gst/gl/gstglupload.c | 15 +++++++++- 17*4882a593Smuzhiyun gst-libs/gst/gl/meson.build | 5 +++- 18*4882a593Smuzhiyun 5 files changed, 105 insertions(+), 10 deletions(-) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyundiff --git a/gst-libs/gst/gl/egl/gsteglimage.c b/gst-libs/gst/gl/egl/gsteglimage.c 21*4882a593Smuzhiyunindex 8c05328..57f261e 100644 22*4882a593Smuzhiyun--- a/gst-libs/gst/gl/egl/gsteglimage.c 23*4882a593Smuzhiyun+++ b/gst-libs/gst/gl/egl/gsteglimage.c 24*4882a593Smuzhiyun@@ -701,6 +701,19 @@ _drm_direct_fourcc_from_info (const GstVideoInfo * info) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun GST_DEBUG ("Getting DRM fourcc for %s", gst_video_format_to_string (format)); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun+ if (GST_VIDEO_INFO_IS_AFBC (info)) { 29*4882a593Smuzhiyun+ /* Mali uses these formats instead */ 30*4882a593Smuzhiyun+ if (format == GST_VIDEO_FORMAT_NV12) 31*4882a593Smuzhiyun+ return DRM_FORMAT_YUV420_8BIT; 32*4882a593Smuzhiyun+ else if (format == GST_VIDEO_FORMAT_NV12_10LE40) 33*4882a593Smuzhiyun+ return DRM_FORMAT_YUV420_10BIT; 34*4882a593Smuzhiyun+ else if (format == GST_VIDEO_FORMAT_NV16) 35*4882a593Smuzhiyun+ return DRM_FORMAT_YUYV; 36*4882a593Smuzhiyun+ 37*4882a593Smuzhiyun+ GST_INFO ("unsupported format for AFBC"); 38*4882a593Smuzhiyun+ return -1; 39*4882a593Smuzhiyun+ } 40*4882a593Smuzhiyun+ 41*4882a593Smuzhiyun switch (format) { 42*4882a593Smuzhiyun case GST_VIDEO_FORMAT_YUY2: 43*4882a593Smuzhiyun return DRM_FORMAT_YUYV; 44*4882a593Smuzhiyun@@ -784,6 +797,9 @@ _drm_direct_fourcc_from_info (const GstVideoInfo * info) 45*4882a593Smuzhiyun case GST_VIDEO_FORMAT_xBGR: 46*4882a593Smuzhiyun return DRM_FORMAT_RGBX8888; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun+ case GST_VIDEO_FORMAT_NV12_10LE40: 49*4882a593Smuzhiyun+ return DRM_FORMAT_NV15; 50*4882a593Smuzhiyun+ 51*4882a593Smuzhiyun default: 52*4882a593Smuzhiyun GST_INFO ("Unsupported format for direct DMABuf."); 53*4882a593Smuzhiyun return -1; 54*4882a593Smuzhiyun@@ -939,10 +955,12 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun EGLImageKHR img; 58*4882a593Smuzhiyun+ GstVideoFormat format = GST_VIDEO_INFO_FORMAT (in_info); 59*4882a593Smuzhiyun guint n_planes = GST_VIDEO_INFO_N_PLANES (in_info); 60*4882a593Smuzhiyun gint fourcc; 61*4882a593Smuzhiyun gint i; 62*4882a593Smuzhiyun gboolean with_modifiers; 63*4882a593Smuzhiyun+ guint64 modifier = DRM_FORMAT_MOD_LINEAR; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Explanation of array length: 66*4882a593Smuzhiyun * - 6 plane independent values are at the start (width, height, format FourCC) 67*4882a593Smuzhiyun@@ -952,6 +970,7 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun guintptr attribs[41]; /* 6 + 10 * 3 + 4 + 1 */ 70*4882a593Smuzhiyun gint atti = 0; 71*4882a593Smuzhiyun+ gfloat stride_scale = 1.0f; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun if (!gst_egl_image_check_dmabuf_direct (context, in_info, target)) 74*4882a593Smuzhiyun return NULL; 75*4882a593Smuzhiyun@@ -960,6 +979,22 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 76*4882a593Smuzhiyun with_modifiers = gst_gl_context_check_feature (context, 77*4882a593Smuzhiyun "EGL_EXT_image_dma_buf_import_modifiers"); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun+ if (GST_VIDEO_INFO_IS_AFBC (in_info)) { 80*4882a593Smuzhiyun+ if (!with_modifiers) 81*4882a593Smuzhiyun+ return NULL; 82*4882a593Smuzhiyun+ 83*4882a593Smuzhiyun+ /* Mali uses these formats instead */ 84*4882a593Smuzhiyun+ if (format == GST_VIDEO_FORMAT_NV12) 85*4882a593Smuzhiyun+ stride_scale = 1.5; 86*4882a593Smuzhiyun+ else if (format == GST_VIDEO_FORMAT_NV12_10LE40) 87*4882a593Smuzhiyun+ stride_scale = 1.5; 88*4882a593Smuzhiyun+ else if (format == GST_VIDEO_FORMAT_NV16) 89*4882a593Smuzhiyun+ stride_scale = 2; 90*4882a593Smuzhiyun+ 91*4882a593Smuzhiyun+ modifier = DRM_AFBC_MODIFIER; 92*4882a593Smuzhiyun+ n_planes = 1; 93*4882a593Smuzhiyun+ } 94*4882a593Smuzhiyun+ 95*4882a593Smuzhiyun /* EGL DMABuf importation supports a maximum of 3 planes */ 96*4882a593Smuzhiyun if (G_UNLIKELY (n_planes > 3)) 97*4882a593Smuzhiyun return NULL; 98*4882a593Smuzhiyun@@ -978,12 +1013,12 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 99*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT; 100*4882a593Smuzhiyun attribs[atti++] = offset[0]; 101*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT; 102*4882a593Smuzhiyun- attribs[atti++] = get_egl_stride (in_info, 0); 103*4882a593Smuzhiyun+ attribs[atti++] = get_egl_stride (in_info, 0) * stride_scale; 104*4882a593Smuzhiyun if (with_modifiers) { 105*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; 106*4882a593Smuzhiyun- attribs[atti++] = DRM_FORMAT_MOD_LINEAR & 0xffffffff; 107*4882a593Smuzhiyun+ attribs[atti++] = modifier & 0xffffffff; 108*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT; 109*4882a593Smuzhiyun- attribs[atti++] = (DRM_FORMAT_MOD_LINEAR >> 32) & 0xffffffff; 110*4882a593Smuzhiyun+ attribs[atti++] = (modifier >> 32) & 0xffffffff; 111*4882a593Smuzhiyun } 112*4882a593Smuzhiyun } 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun@@ -997,9 +1032,9 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 115*4882a593Smuzhiyun attribs[atti++] = get_egl_stride (in_info, 1); 116*4882a593Smuzhiyun if (with_modifiers) { 117*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT; 118*4882a593Smuzhiyun- attribs[atti++] = DRM_FORMAT_MOD_LINEAR & 0xffffffff; 119*4882a593Smuzhiyun+ attribs[atti++] = modifier & 0xffffffff; 120*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT; 121*4882a593Smuzhiyun- attribs[atti++] = (DRM_FORMAT_MOD_LINEAR >> 32) & 0xffffffff; 122*4882a593Smuzhiyun+ attribs[atti++] = (modifier >> 32) & 0xffffffff; 123*4882a593Smuzhiyun } 124*4882a593Smuzhiyun } 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun@@ -1013,9 +1048,9 @@ gst_egl_image_from_dmabuf_direct_target (GstGLContext * context, 127*4882a593Smuzhiyun attribs[atti++] = get_egl_stride (in_info, 2); 128*4882a593Smuzhiyun if (with_modifiers) { 129*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT; 130*4882a593Smuzhiyun- attribs[atti++] = DRM_FORMAT_MOD_LINEAR & 0xffffffff; 131*4882a593Smuzhiyun+ attribs[atti++] = modifier & 0xffffffff; 132*4882a593Smuzhiyun attribs[atti++] = EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT; 133*4882a593Smuzhiyun- attribs[atti++] = (DRM_FORMAT_MOD_LINEAR >> 32) & 0xffffffff; 134*4882a593Smuzhiyun+ attribs[atti++] = (modifier >> 32) & 0xffffffff; 135*4882a593Smuzhiyun } 136*4882a593Smuzhiyun } 137*4882a593Smuzhiyun 138*4882a593Smuzhiyundiff --git a/gst-libs/gst/gl/egl/gsteglimage.h b/gst-libs/gst/gl/egl/gsteglimage.h 139*4882a593Smuzhiyunindex f90fa82..e6fc1df 100644 140*4882a593Smuzhiyun--- a/gst-libs/gst/gl/egl/gsteglimage.h 141*4882a593Smuzhiyun+++ b/gst-libs/gst/gl/egl/gsteglimage.h 142*4882a593Smuzhiyun@@ -26,8 +26,52 @@ 143*4882a593Smuzhiyun #include <gst/gl/gstgl_fwd.h> 144*4882a593Smuzhiyun #include <gst/gl/gstglformat.h> 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun+#include <libdrm/drm_fourcc.h> 147*4882a593Smuzhiyun+ 148*4882a593Smuzhiyun G_BEGIN_DECLS 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun+#ifndef DRM_FORMAT_NV15 151*4882a593Smuzhiyun+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') 152*4882a593Smuzhiyun+#endif 153*4882a593Smuzhiyun+ 154*4882a593Smuzhiyun+#ifndef DRM_FORMAT_YUV420_8BIT 155*4882a593Smuzhiyun+#define DRM_FORMAT_YUV420_8BIT fourcc_code('Y', 'U', '0', '8') 156*4882a593Smuzhiyun+#endif 157*4882a593Smuzhiyun+ 158*4882a593Smuzhiyun+#ifndef DRM_FORMAT_YUV420_10BIT 159*4882a593Smuzhiyun+#define DRM_FORMAT_YUV420_10BIT fourcc_code('Y', 'U', '1', '0') 160*4882a593Smuzhiyun+#endif 161*4882a593Smuzhiyun+ 162*4882a593Smuzhiyun+#ifndef DRM_FORMAT_MOD_VENDOR_ARM 163*4882a593Smuzhiyun+#define DRM_FORMAT_MOD_VENDOR_ARM 0x08 164*4882a593Smuzhiyun+#endif 165*4882a593Smuzhiyun+ 166*4882a593Smuzhiyun+#ifndef DRM_FORMAT_MOD_ARM_AFBC 167*4882a593Smuzhiyun+#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) fourcc_mod_code(ARM, __afbc_mode) 168*4882a593Smuzhiyun+#endif 169*4882a593Smuzhiyun+ 170*4882a593Smuzhiyun+#ifndef AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 171*4882a593Smuzhiyun+#define AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 (1ULL) 172*4882a593Smuzhiyun+#endif 173*4882a593Smuzhiyun+ 174*4882a593Smuzhiyun+#ifndef AFBC_FORMAT_MOD_SPARSE 175*4882a593Smuzhiyun+#define AFBC_FORMAT_MOD_SPARSE (((__u64)1) << 6) 176*4882a593Smuzhiyun+#endif 177*4882a593Smuzhiyun+ 178*4882a593Smuzhiyun+#define DRM_AFBC_MODIFIER \ 179*4882a593Smuzhiyun+ (DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_SPARSE) | \ 180*4882a593Smuzhiyun+ DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16)) 181*4882a593Smuzhiyun+ 182*4882a593Smuzhiyun+#ifndef GST_VIDEO_FLAG_ARM_AFBC 183*4882a593Smuzhiyun+#define GST_VIDEO_FLAG_ARM_AFBC (1UL << 31) 184*4882a593Smuzhiyun+#define GST_VIDEO_INFO_SET_AFBC(i) \ 185*4882a593Smuzhiyun+ GST_VIDEO_INFO_FLAG_SET (i, GST_VIDEO_FLAG_ARM_AFBC) 186*4882a593Smuzhiyun+#define GST_VIDEO_INFO_UNSET_AFBC(i) \ 187*4882a593Smuzhiyun+ GST_VIDEO_INFO_FLAG_UNSET (i, GST_VIDEO_FLAG_ARM_AFBC) 188*4882a593Smuzhiyun+#define GST_VIDEO_INFO_IS_AFBC(i) \ 189*4882a593Smuzhiyun+ GST_VIDEO_INFO_FLAG_IS_SET (i, GST_VIDEO_FLAG_ARM_AFBC) 190*4882a593Smuzhiyun+#endif 191*4882a593Smuzhiyun+ 192*4882a593Smuzhiyun GST_GL_API GType gst_egl_image_get_type (void); 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define GST_TYPE_EGL_IMAGE (gst_egl_image_get_type()) 195*4882a593Smuzhiyundiff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h 196*4882a593Smuzhiyunindex 5000759..3c4e268 100644 197*4882a593Smuzhiyun--- a/gst-libs/gst/gl/gstglmemory.h 198*4882a593Smuzhiyun+++ b/gst-libs/gst/gl/gstglmemory.h 199*4882a593Smuzhiyun@@ -64,7 +64,7 @@ GType gst_gl_memory_allocator_get_type(void); 200*4882a593Smuzhiyun #define GST_GL_MEMORY_VIDEO_FORMATS_STR \ 201*4882a593Smuzhiyun "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, GBRA, GBR, RGBP, BGRP, RGB, BGR, RGB16, BGR16, " \ 202*4882a593Smuzhiyun "AYUV, VUYA, Y410, I420, YV12, NV12, NV21, NV16, NV61, YUY2, UYVY, Y210, Y41B, " \ 203*4882a593Smuzhiyun- "Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE, ARGB64, A420, AV12, NV12_16L32S, NV12_4L4" \ 204*4882a593Smuzhiyun+ "Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE, ARGB64, A420, AV12, NV12_10LE40, NV12_16L32S, NV12_4L4" \ 205*4882a593Smuzhiyun GST_GL_MEMORY_VIDEO_EXT_FORMATS "}" 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /** 208*4882a593Smuzhiyundiff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c 209*4882a593Smuzhiyunindex 39be33a..a5297f2 100644 210*4882a593Smuzhiyun--- a/gst-libs/gst/gl/gstglupload.c 211*4882a593Smuzhiyun+++ b/gst-libs/gst/gl/gstglupload.c 212*4882a593Smuzhiyun@@ -507,7 +507,8 @@ static GstStaticCaps _dma_buf_upload_caps = 213*4882a593Smuzhiyun GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES 214*4882a593Smuzhiyun (GST_CAPS_FEATURE_MEMORY_DMABUF, 215*4882a593Smuzhiyun GST_GL_MEMORY_VIDEO_FORMATS_STR) ";" 216*4882a593Smuzhiyun- GST_VIDEO_CAPS_MAKE (GST_GL_MEMORY_VIDEO_FORMATS_STR)); 217*4882a593Smuzhiyun+ GST_VIDEO_CAPS_MAKE (GST_GL_MEMORY_VIDEO_FORMATS_STR) ";" 218*4882a593Smuzhiyun+ GST_VIDEO_CAPS_MAKE ("{NV12, NV12_10LE40}") ", arm-afbc = (int) 1"); 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun static gpointer 221*4882a593Smuzhiyun _dma_buf_upload_new (GstGLUpload * upload) 222*4882a593Smuzhiyun@@ -2444,6 +2445,9 @@ static gboolean 223*4882a593Smuzhiyun _gst_gl_upload_set_caps_unlocked (GstGLUpload * upload, GstCaps * in_caps, 224*4882a593Smuzhiyun GstCaps * out_caps) 225*4882a593Smuzhiyun { 226*4882a593Smuzhiyun+ GstStructure *s; 227*4882a593Smuzhiyun+ gint value; 228*4882a593Smuzhiyun+ 229*4882a593Smuzhiyun g_return_val_if_fail (upload != NULL, FALSE); 230*4882a593Smuzhiyun g_return_val_if_fail (gst_caps_is_fixed (in_caps), FALSE); 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun@@ -2458,6 +2462,15 @@ _gst_gl_upload_set_caps_unlocked (GstGLUpload * upload, GstCaps * in_caps, 233*4882a593Smuzhiyun gst_video_info_from_caps (&upload->priv->in_info, in_caps); 234*4882a593Smuzhiyun gst_video_info_from_caps (&upload->priv->out_info, out_caps); 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun+ /* parse AFBC from caps */ 237*4882a593Smuzhiyun+ s = gst_caps_get_structure (in_caps, 0); 238*4882a593Smuzhiyun+ if (gst_structure_get_int (s, "arm-afbc", &value)) { 239*4882a593Smuzhiyun+ if (value) 240*4882a593Smuzhiyun+ GST_VIDEO_INFO_SET_AFBC (&upload->priv->in_info); 241*4882a593Smuzhiyun+ else 242*4882a593Smuzhiyun+ GST_VIDEO_INFO_UNSET_AFBC (&upload->priv->in_info); 243*4882a593Smuzhiyun+ } 244*4882a593Smuzhiyun+ 245*4882a593Smuzhiyun upload->priv->method = NULL; 246*4882a593Smuzhiyun upload->priv->method_impl = NULL; 247*4882a593Smuzhiyun upload->priv->method_i = 0; 248*4882a593Smuzhiyundiff --git a/gst-libs/gst/gl/meson.build b/gst-libs/gst/gl/meson.build 249*4882a593Smuzhiyunindex 1080b5d..ee1f646 100644 250*4882a593Smuzhiyun--- a/gst-libs/gst/gl/meson.build 251*4882a593Smuzhiyun+++ b/gst-libs/gst/gl/meson.build 252*4882a593Smuzhiyun@@ -1050,6 +1050,8 @@ if build_gstgl 253*4882a593Smuzhiyun # case-insensitive FS would include gst-libs/gl/egl/egl.h as EGL/egl.h. 254*4882a593Smuzhiyun common_args += '-I@0@'.format(meson.current_build_dir()) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun+ libdrm_dep = dependency('libdrm') 257*4882a593Smuzhiyun+ 258*4882a593Smuzhiyun gstgl = library('gstgl-' + api_version, 259*4882a593Smuzhiyun gl_sources, gl_egl_sources, gl_x11_sources, gl_wayland_sources, gl_priv_sources, gl_enumtypes_c, gl_enumtypes_h, 260*4882a593Smuzhiyun c_args : common_args, 261*4882a593Smuzhiyun@@ -1061,7 +1063,8 @@ if build_gstgl 262*4882a593Smuzhiyun darwin_versions : osxversion, 263*4882a593Smuzhiyun install : true, 264*4882a593Smuzhiyun dependencies : [gst_base_dep, video_dep, allocators_dep, gmodule_dep, 265*4882a593Smuzhiyun- gl_lib_deps, gl_platform_deps, gl_winsys_deps, gl_misc_deps], 266*4882a593Smuzhiyun+ gl_lib_deps, gl_platform_deps, gl_winsys_deps, gl_misc_deps, 267*4882a593Smuzhiyun+ libdrm_dep], 268*4882a593Smuzhiyun # don't confuse EGL/egl.h with gst-libs/gl/egl/egl.h on case-insensitive file systems 269*4882a593Smuzhiyun implicit_include_directories : false) 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun-- 272*4882a593Smuzhiyun2.20.1 273*4882a593Smuzhiyun 274