[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