[vlc-commits] [Git][videolan/vlc][master] 10 commits: fourcc: add VUYX

Steve Lhomme (@robUx4) gitlab at videolan.org
Wed Apr 22 13:07:52 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
a3a5f575 by Thomas Guillem at 2026-04-22T12:53:44+00:00
fourcc: add VUYX

- - - - -
c66dc2b8 by Thomas Guillem at 2026-04-22T12:53:44+00:00
fourcc: add Y412

- - - - -
447c22f9 by Thomas Guillem at 2026-04-22T12:53:44+00:00
fourcc: add VAAPI 444 chromas

- - - - -
23bf702f by Thomas Guillem at 2026-04-22T12:53:44+00:00
vlc_vaapi: handle VLC_CODEC_VAAPI_444*

- - - - -
e08d5165 by Thomas Guillem at 2026-04-22T12:53:44+00:00
opengl: sampler: add swizzle for Y410/Y412/VUYX

- - - - -
ca0ceda6 by Thomas Guillem at 2026-04-22T12:53:44+00:00
interop_vaapi: handle Y410/Y412

VAAPI YUV 4:4:4 10-bit.
VAAPI YUV 4:4:4 12-bit.

- - - - -
7b5a2ab1 by Thomas Guillem at 2026-04-22T12:53:44+00:00
interop_vaapi: handle XYUV/Y410/Y412

VAAPI YUV 4:4:4 8-bit.
VAAPI YUV 4:4:4 10-bit.
VAAPI YUV 4:4:4 12-bit.

- - - - -
6ac533a5 by Thomas Guillem at 2026-04-22T12:53:44+00:00
avcodec: vaapi: support more VAAPI chromas

- - - - -
b972781a by Thomas Guillem at 2026-04-22T12:53:44+00:00
avcodec: chroma: add VUYX/Y410/Y412 in chroma table

To enable swscale color conversion

- - - - -
07800e8f by Thomas Guillem at 2026-04-22T12:53:44+00:00
vaapi: chroma: add 444 8/10/12 bits conversion support

- - - - -


11 changed files:

- include/vlc_fourcc.h
- modules/codec/avcodec/chroma.c
- modules/codec/avcodec/vaapi.c
- modules/hw/vaapi/chroma.c
- modules/hw/vaapi/filters.c
- modules/hw/vaapi/vlc_vaapi.c
- modules/hw/vaapi/vlc_vaapi.h
- modules/video_output/opengl/interop_vaapi.c
- modules/video_output/opengl/sampler.c
- src/misc/fourcc.c
- src/misc/fourcc_list.h


Changes:

=====================================
include/vlc_fourcc.h
=====================================
@@ -332,8 +332,12 @@
 #define VLC_CODEC_Y210            VLC_FOURCC('Y','2','1','0')
 /* Packed YUV 4:4:4 10-bit V10:U10:Y10:A2 */
 #define VLC_CODEC_Y410            VLC_FOURCC('Y','4','1','0')
+/* Packed YUV 4:4:4 12-bit V12:U12:Y12:A2 */
+#define VLC_CODEC_Y412            VLC_FOURCC('Y','4','1','2')
 /* Packed YUV 4:4:4 V:U:Y:A */
 #define VLC_CODEC_VUYA            VLC_FOURCC('V','U','Y','A')
+/* Packed YUV 4:4:4 V:U:Y:X, alpha channel undefined */
+#define VLC_CODEC_VUYX            VLC_FOURCC('V','U','Y','X')
 
 /* RGB / RGBA */
 
@@ -458,6 +462,9 @@
 #define VLC_CODEC_VAAPI_420 VLC_FOURCC('V','A','O','P') /* 4:2:0  8 bpc */
 #define VLC_CODEC_VAAPI_420_10BPP VLC_FOURCC('V','A','O','0') /* 4:2:0 10 bpc */
 #define VLC_CODEC_VAAPI_420_12BPP VLC_FOURCC('V','A','O','2') /* 4:2:0 12 bpc */
+#define VLC_CODEC_VAAPI_444       VLC_FOURCC('V','A','4','P') /* 4:4:4 8 bpc */
+#define VLC_CODEC_VAAPI_444_10BPP VLC_FOURCC('V','A','4','0') /* 4:4:4 10 bpc */
+#define VLC_CODEC_VAAPI_444_12BPP VLC_FOURCC('V','A','4','2') /* 4:4:4 12 bpc */
 
 /* MediaCodec/IOMX opaque buffer type */
 #define VLC_CODEC_ANDROID_OPAQUE  VLC_FOURCC('A','N','O','P')


=====================================
modules/codec/avcodec/chroma.c
=====================================
@@ -119,6 +119,11 @@ static const struct vlc_chroma_ffmpeg chroma_table[] =
 
 #if LIBAVUTIL_VERSION_CHECK(57, 34, 100)
     {VLC_CODEC_VUYA, AV_PIX_FMT_VUYX,     COLOR_RANGE_UNDEF },
+    {VLC_CODEC_VUYX, AV_PIX_FMT_VUYX,     COLOR_RANGE_UNDEF },
+#endif
+#if LIBAVUTIL_VERSION_CHECK(57, 36, 100)
+    {VLC_CODEC_Y410, AV_PIX_FMT_XV30LE,   COLOR_RANGE_UNDEF },
+    {VLC_CODEC_Y412, AV_PIX_FMT_XV36LE,   COLOR_RANGE_UNDEF },
 #endif
 
     /* Packed RGB formats */


=====================================
modules/codec/avcodec/vaapi.c
=====================================
@@ -365,11 +365,24 @@ static int Create(vlc_va_t *va, struct vlc_va_cfg *cfg)
             case AV_PIX_FMT_YUV420P10LE:
                 vlc_chroma = VLC_CODEC_VAAPI_420_10BPP;
                 break;
+#if LIBAVUTIL_VERSION_CHECK( 57, 34, 100 )
+            case AV_PIX_FMT_VUYX:
+                vlc_chroma = VLC_CODEC_VAAPI_444;
+                break;
+#endif
 #if LIBAVUTIL_VERSION_CHECK( 57, 36, 100 )
             case AV_PIX_FMT_P012LE:
             case AV_PIX_FMT_P012BE:
                 vlc_chroma = VLC_CODEC_VAAPI_420_12BPP;
                 break;
+            case AV_PIX_FMT_XV30BE:
+            case AV_PIX_FMT_XV30LE:
+                vlc_chroma = VLC_CODEC_VAAPI_444_10BPP;
+                break;
+            case AV_PIX_FMT_XV36BE:
+            case AV_PIX_FMT_XV36LE:
+                vlc_chroma = VLC_CODEC_VAAPI_444_12BPP;
+                break;
 #endif
             default:
                 break;


=====================================
modules/hw/vaapi/chroma.c
=====================================
@@ -131,6 +131,12 @@ FillPictureFromVAImage(picture_t *dest,
                 vlc_assert_unreachable();
         }
         break;
+    case VA_FOURCC_XYUV:
+    case VA_FOURCC_Y410:
+    case VA_FOURCC_Y412:
+        CopyPacked(dest, src_planes[0], src_pitches[0], src_img->height,
+                   cache);
+        break;
     default:
         vlc_assert_unreachable();
         break;
@@ -250,6 +256,12 @@ FillVAImageFromPicture(VAImage *dest_img, uint8_t *dest_buf,
                          src->format.i_height, cache);
         break;
     }
+    case VLC_CODEC_VUYX:
+    case VLC_CODEC_Y410:
+    case VLC_CODEC_Y412:
+        CopyPacked(dest_pic, src_planes[0], src_pitches[0],
+                   src->format.i_height, cache);
+        break;
     default:
         vlc_assert_unreachable();
     }
@@ -348,6 +360,27 @@ static int CheckFmt(const video_format_t *in, const video_format_t *out,
                 return VLC_SUCCESS;
             }
             break;
+        case VLC_CODEC_VAAPI_444:
+            if (out->i_chroma == VLC_CODEC_VUYX)
+            {
+                *pixel_bytes = 4;
+                return VLC_SUCCESS;
+            }
+            break;
+        case VLC_CODEC_VAAPI_444_10BPP:
+            if (out->i_chroma == VLC_CODEC_Y410)
+            {
+                *pixel_bytes = 4;
+                return VLC_SUCCESS;
+            }
+            break;
+        case VLC_CODEC_VAAPI_444_12BPP:
+            if (out->i_chroma == VLC_CODEC_Y412)
+            {
+                *pixel_bytes = 8;
+                return VLC_SUCCESS;
+            }
+            break;
     }
 
     *upload = true;
@@ -373,6 +406,27 @@ static int CheckFmt(const video_format_t *in, const video_format_t *out,
                 return VLC_SUCCESS;
             }
             break;
+        case VLC_CODEC_VAAPI_444:
+            if (in->i_chroma == VLC_CODEC_VUYX)
+            {
+                *pixel_bytes = 4;
+                return VLC_SUCCESS;
+            }
+            break;
+        case VLC_CODEC_VAAPI_444_10BPP:
+            if (in->i_chroma == VLC_CODEC_Y410)
+            {
+                *pixel_bytes = 4;
+                return VLC_SUCCESS;
+            }
+            break;
+        case VLC_CODEC_VAAPI_444_12BPP:
+            if (in->i_chroma == VLC_CODEC_Y412)
+            {
+                *pixel_bytes = 8;
+                return VLC_SUCCESS;
+            }
+            break;
     }
     return VLC_EGENERIC;
 }


=====================================
modules/hw/vaapi/filters.c
=====================================
@@ -1127,6 +1127,9 @@ static void ProbeChroma(vlc_chroma_conv_vec *vec)
     vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_420_10BPP, VLC_CODEC_I420_10L, true);
     vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_420_12BPP, VLC_CODEC_P012, true);
     vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_420_12BPP, VLC_CODEC_I420_12L, true);
+    vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_444, VLC_CODEC_VUYX, true);
+    vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_444_10BPP, VLC_CODEC_Y410, true);
+    vlc_chroma_conv_add(vec, 1.1, VLC_CODEC_VAAPI_444_12BPP, VLC_CODEC_Y412, true);
 }
 
 vlc_module_begin()


=====================================
modules/hw/vaapi/vlc_vaapi.c
=====================================
@@ -59,6 +59,18 @@ vlc_chroma_to_vaapi(int i_vlc_chroma, unsigned *va_rt_format, int *va_fourcc)
             *va_rt_format = VA_RT_FORMAT_YUV420_12;
             *va_fourcc = VA_FOURCC_P012;
             break;
+        case VLC_CODEC_VAAPI_444:
+            *va_rt_format = VA_RT_FORMAT_YUV444;
+            *va_fourcc = VA_FOURCC_XYUV;
+            break;
+        case VLC_CODEC_VAAPI_444_10BPP:
+            *va_rt_format = VA_RT_FORMAT_YUV444_10;
+            *va_fourcc = VA_FOURCC_Y410;
+            break;
+        case VLC_CODEC_VAAPI_444_12BPP:
+            *va_rt_format = VA_RT_FORMAT_YUV444_12;
+            *va_fourcc = VA_FOURCC_Y412;
+            break;
         default:
             vlc_assert_unreachable();
     }


=====================================
modules/hw/vaapi/vlc_vaapi.h
=====================================
@@ -198,6 +198,9 @@ vlc_vaapi_IsChromaOpaque(int i_vlc_chroma)
         case VLC_CODEC_VAAPI_420:
         case VLC_CODEC_VAAPI_420_10BPP:
         case VLC_CODEC_VAAPI_420_12BPP:
+        case VLC_CODEC_VAAPI_444:
+        case VLC_CODEC_VAAPI_444_10BPP:
+        case VLC_CODEC_VAAPI_444_12BPP:
             return true;
         default:
             return false;


=====================================
modules/video_output/opengl/interop_vaapi.c
=====================================
@@ -154,6 +154,11 @@ vaegl_init_fourcc(struct priv *priv, unsigned va_fourcc)
             priv->drm_fourccs[0] = VLC_FOURCC('R', '1', '6', ' ');
             priv->drm_fourccs[1] = VLC_FOURCC('G', 'R', '3', '2');
             break;
+        case VA_FOURCC_XYUV:
+        case VA_FOURCC_Y410:
+        case VA_FOURCC_Y412:
+            priv->drm_fourccs[0] = va_fourcc;
+            break;
         default: return VLC_EGENERIC;
     }
     priv->fourcc = va_fourcc;
@@ -430,6 +435,18 @@ GetChromaVaFourcc(vlc_fourcc_t opaque_chroma, int *va_fourcc,
             *va_fourcc = VA_FOURCC_P012;
             *sw_chroma = VLC_CODEC_P012;
             break;
+        case VLC_CODEC_VAAPI_444:
+            *va_fourcc = VA_FOURCC_XYUV;
+            *sw_chroma = VLC_CODEC_VUYX;
+            break;
+        case VLC_CODEC_VAAPI_444_10BPP:
+            *va_fourcc = VA_FOURCC_Y410;
+            *sw_chroma = VLC_CODEC_Y410;
+            break;
+        case VLC_CODEC_VAAPI_444_12BPP:
+            *va_fourcc = VA_FOURCC_Y412;
+            *sw_chroma = VLC_CODEC_Y412;
+            break;
         default:
             vlc_assert_unreachable();
     }
@@ -504,7 +521,36 @@ Open(struct vlc_gl_interop *interop)
                 .format = GL_RG,
                 .type = GL_UNSIGNED_SHORT,
             };
-
+            break;
+        case VLC_CODEC_VAAPI_444: /* VLC_CODEC_VUYX */
+            interop->tex_count = 1;
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                .w = {1, 1},
+                .h = {1, 1},
+                .internal = GL_RGBA,
+                .format = GL_RGBA,
+                .type = GL_UNSIGNED_BYTE,
+            };
+            break;
+        case VLC_CODEC_VAAPI_444_10BPP: /* VLC_CODEC_Y410 */
+            interop->tex_count = 1;
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                .w = {1, 1},
+                .h = {1, 1},
+                .internal = GL_RGB10_A2,
+                .format = GL_RGBA,
+                .type = GL_UNSIGNED_INT_2_10_10_10_REV,
+            };
+            break;
+        case VLC_CODEC_VAAPI_444_12BPP: /* VLC_CODEC_Y412 */
+            interop->tex_count = 1;
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                .w = {1, 1},
+                .h = {1, 1},
+                .internal = GL_RGBA16,
+                .format = GL_RGBA,
+                .type = GL_UNSIGNED_SHORT,
+            };
             break;
         default:
             vlc_assert_unreachable();


=====================================
modules/video_output/opengl/sampler.c
=====================================
@@ -532,6 +532,13 @@ opengl_init_swizzle(struct vlc_gl_sampler *sampler,
                 swizzle_per_tex[0] = "rgb";
                 assert(sampler->glfmt.tex_count == 1);
                 break;
+            case VLC_CODEC_VUYX:
+                swizzle_per_tex[0] = "bgr";
+                break;
+            case VLC_CODEC_Y410:
+            case VLC_CODEC_Y412:
+                swizzle_per_tex[0] = "grb";
+                break;
             default:
                 assert(!"missing chroma");
                 return VLC_EGENERIC;


=====================================
src/misc/fourcc.c
=====================================
@@ -399,9 +399,10 @@ static const vlc_chroma_description_t p_list_chroma_description[] = {
     { VLC_CODEC_RGBA10LE,              PACKED_FMT(RGB, 4, 32, 10) },
     { VLC_CODEC_RGBA64,                PACKED_FMT(RGB, 8, 64, 16) },
     { VLC_CODEC_VUYA,                  PACKED_FMT(YUV444, 4, 32, 8) },
+    { VLC_CODEC_VUYX,                  PACKED_FMT(YUV444, 4, 32, 8) },
     { VLC_CODEC_Y210,                  PACKED_FMT(YUV422, 4, 32, 10) },
     { VLC_CODEC_Y410,                  PACKED_FMT(YUV444, 4, 32, 10) },
-
+    { VLC_CODEC_Y412,                  PACKED_FMT(YUV444, 8, 64, 12) },
     { VLC_CODEC_Y211, VLC_CHROMA_SUBTYPE_YUV211,1, { {{1,4}, {1,1}} }, 4, 32, 8 },
     { VLC_CODEC_XYZ_12L,               PACKED_FMT(OTHER, 6, 48, 12) },
     { VLC_CODEC_XYZ_12B,               PACKED_FMT(OTHER, 6, 48, 12) },
@@ -437,6 +438,9 @@ static const vlc_chroma_description_t p_list_chroma_description[] = {
     { VLC_CODEC_VAAPI_420,             GPU_FMT(YUV420, 8) },
     { VLC_CODEC_VAAPI_420_10BPP,       GPU_FMT(YUV420, 10) },
     { VLC_CODEC_VAAPI_420_12BPP,       GPU_FMT(YUV420, 12) },
+    { VLC_CODEC_VAAPI_444,             GPU_FMT(YUV444, 8) },
+    { VLC_CODEC_VAAPI_444_10BPP,       GPU_FMT(YUV444, 10) },
+    { VLC_CODEC_VAAPI_444_12BPP,       GPU_FMT(YUV444, 12) },
 };
 
 #undef PACKED_FMT


=====================================
src/misc/fourcc_list.h
=====================================
@@ -915,8 +915,12 @@ static const staticentry_t p_list_video[] = {
         A("Y210"),
     B(VLC_CODEC_VUYA, "Packed YUV 4:4:4, V:U:Y:A"),
         A("VUYA"),
+    B(VLC_CODEC_VUYX, "Packed YUV 4:4:4, V:U:Y:X"),
+        A("VUYX"),
     B(VLC_CODEC_Y410, "Packed 10-bit YUV 4:4:4"),
         A("Y410"),
+    B(VLC_CODEC_Y412, "Packed 12-bit YUV 4:4:4"),
+        A("Y412"),
 
     B(VLC_CODEC_NV12, "Biplanar 4:2:0 Y/UV"),
         A("NV12"),
@@ -1256,6 +1260,15 @@ static const staticentry_t p_list_video[] = {
     B(VLC_CODEC_VAAPI_420_12BPP, "4:2:0 12bits VAAPI opaque"),
         A("VAO2"),
 
+    B(VLC_CODEC_VAAPI_444,       "4:4:4 8bits VAAPI opaque"),
+        A("VA4P"),
+
+    B(VLC_CODEC_VAAPI_444_10BPP, "4:4:4 10bits VAAPI opaque"),
+        A("VA40"),
+
+    B(VLC_CODEC_VAAPI_444_12BPP, "4:4:4 12bits VAAPI opaque"),
+        A("VA42"),
+
     B(VLC_CODEC_ANDROID_OPAQUE, "Android opaque"),
         A("ANOP"),
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/f19709a71d4e2570089fe7fcbd7c2c1dbaa45887...07800e8fe156c0db660da271198a8da084ac293e

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/f19709a71d4e2570089fe7fcbd7c2c1dbaa45887...07800e8fe156c0db660da271198a8da084ac293e
You're receiving this email because of your account on code.videolan.org.




More information about the vlc-commits mailing list