[FFmpeg-devel] [PATCH 1/2] lavu/pixfmt: Add Y216, Y410, and Y416 formats
Philip Langdale
philipl at overt.org
Sun Aug 14 00:18:20 EEST 2022
These are the formats returned by the Intel VAAPI decoder for 12bit
4:2:2, 10bit 4:4:4, and 12bit 4:4:4 respectively. As with the already
supported Y210 and YUVA (AVUY) formats, they are the formats Microsoft
picked as their preferred 4:2:2 and 4:4:4 video formats, and Intel ran
with it.
Y216 is simply an extension of Y210 to say all 16bits will be used, and
Y416 is a normal looking packed 4 channel format. Y410 is an annoying
format that packs three 10bit channels into 32bits with 2bits of alpha.
As a result, I had to define Y410 as a bitstream format, even though
each pixel is byte-aligned. If it is in-fact possible to define as a
normal byte-aligned format, please let me know how.
As with VUYA, I have kept the formal definition of Y410 and Y416 as
formats with alpha channels to maintain fidelity. The Intel folks say
they prefer this and they would rather explicitly use a format defined
as not having alpha than to silently drop it. The hardware decoder
does at least ensure the alpha channel is set to full opacity.
Signed-off-by: Philip Langdale <philipl at overt.org>
---
libavutil/pixdesc.c | 77 +++++++++++++++++++++++++++++++-
libavutil/pixfmt.h | 12 +++++
tests/ref/fate/imgutils | 6 +++
tests/ref/fate/sws-pixdesc-query | 25 +++++++++++
4 files changed, 119 insertions(+), 1 deletion(-)
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index e078fd5320..12330fd5ea 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -2504,6 +2504,81 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.flags = AV_PIX_FMT_FLAG_ALPHA,
},
+ [AV_PIX_FMT_Y216LE] = {
+ .name = "y216le",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 4, 0, 0, 16 }, /* Y */
+ { 0, 8, 2, 0, 16 }, /* U */
+ { 0, 8, 6, 0, 16 }, /* V */
+ },
+ },
+ [AV_PIX_FMT_Y216BE] = {
+ .name = "y216be",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 4, 0, 0, 16 }, /* Y */
+ { 0, 8, 2, 0, 16 }, /* U */
+ { 0, 8, 6, 0, 16 }, /* V */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE,
+ },
+ [AV_PIX_FMT_Y410LE] = {
+ .name = "y410le",
+ .nb_components= 4,
+ .log2_chroma_w= 0,
+ .log2_chroma_h= 0,
+ .comp = {
+ { 0, 32, 10, 0, 10 }, /* Y */
+ { 0, 32, 0, 0, 10 }, /* U */
+ { 0, 32, 20, 0, 10 }, /* V */
+ { 0, 32, 30, 0, 2 }, /* A */
+ },
+ .flags = AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_BITSTREAM,
+ },
+ [AV_PIX_FMT_Y410BE] = {
+ .name = "y410be",
+ .nb_components= 4,
+ .log2_chroma_w= 0,
+ .log2_chroma_h= 0,
+ .comp = {
+ { 0, 32, 10, 0, 10 }, /* Y */
+ { 0, 32, 0, 0, 10 }, /* U */
+ { 0, 32, 20, 0, 10 }, /* V */
+ { 0, 32, 30, 0, 2 }, /* A */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_BITSTREAM,
+ },
+ [AV_PIX_FMT_Y416LE] = {
+ .name = "y416le",
+ .nb_components= 4,
+ .log2_chroma_w= 0,
+ .log2_chroma_h= 0,
+ .comp = {
+ { 0, 8, 2, 0, 16 }, /* Y */
+ { 0, 8, 0, 0, 16 }, /* U */
+ { 0, 8, 4, 0, 16 }, /* V */
+ { 0, 8, 6, 0, 16 }, /* A */
+ },
+ .flags = AV_PIX_FMT_FLAG_ALPHA,
+ },
+ [AV_PIX_FMT_Y416BE] = {
+ .name = "y416be",
+ .nb_components= 4,
+ .log2_chroma_w= 0,
+ .log2_chroma_h= 0,
+ .comp = {
+ { 0, 8, 2, 0, 16 }, /* Y */
+ { 0, 8, 0, 0, 16 }, /* U */
+ { 0, 8, 4, 0, 16 }, /* V */
+ { 0, 8, 6, 0, 16 }, /* A */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_ALPHA,
+ },
};
static const char * const color_range_names[] = {
@@ -2739,7 +2814,7 @@ void ff_check_pixfmt_descriptors(void){
if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
continue;
-// av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
+ av_log(NULL, AV_LOG_INFO, "Checking: %s\n", d->name);
av_assert0(d->log2_chroma_w <= 3);
av_assert0(d->log2_chroma_h <= 3);
av_assert0(d->nb_components <= 4);
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 9d1fdaf82d..aea25ddd02 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -369,6 +369,15 @@ enum AVPixelFormat {
AV_PIX_FMT_VUYA, ///< packed VUYA 4:4:4, 32bpp, VUYAVUYA...
+ AV_PIX_FMT_Y216BE, ///< packed YUV 4:2:2 like YUYV422, 32bpp, big-endian
+ AV_PIX_FMT_Y216LE, ///< packed YUV 4:2:2 like YUYV422, 32bpp, big-endian
+
+ AV_PIX_FMT_Y410BE, ///< packed AVYU 2:10:10:10, 32bpp, (msb)2A 10V 10Y 10U(lsb), big-endian
+ AV_PIX_FMT_Y410LE, ///< packed AVYU 2:10:10:10, 32bpp, (msb)2A 10V 10Y 10U(lsb), little-endian
+
+ AV_PIX_FMT_Y416BE, ///< packed AVYU 16:16:16:16, 64bpp, big-endian
+ AV_PIX_FMT_Y416LE, ///< packed AVYU 16:16:16:16, 64bpp, little-endian
+
AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
};
@@ -458,6 +467,9 @@ enum AVPixelFormat {
#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE)
#define AV_PIX_FMT_Y210 AV_PIX_FMT_NE(Y210BE, Y210LE)
+#define AV_PIX_FMT_Y216 AV_PIX_FMT_NE(Y216BE, Y216LE)
+#define AV_PIX_FMT_Y410 AV_PIX_FMT_NE(Y410BE, Y410LE)
+#define AV_PIX_FMT_Y416 AV_PIX_FMT_NE(Y416BE, Y416LE)
#define AV_PIX_FMT_X2RGB10 AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE)
#define AV_PIX_FMT_X2BGR10 AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE)
diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils
index 4ec66febb8..595a9897c6 100644
--- a/tests/ref/fate/imgutils
+++ b/tests/ref/fate/imgutils
@@ -247,3 +247,9 @@ p216le planes: 2, linesizes: 128 128 0 0, plane_sizes: 6144 6144
p416be planes: 2, linesizes: 128 256 0 0, plane_sizes: 6144 12288 0 0, plane_offsets: 6144 0 0, total_size: 18432
p416le planes: 2, linesizes: 128 256 0 0, plane_sizes: 6144 12288 0 0, plane_offsets: 6144 0 0, total_size: 18432
vuya planes: 1, linesizes: 256 0 0 0, plane_sizes: 12288 0 0 0, plane_offsets: 0 0 0, total_size: 12288
+y216be planes: 1, linesizes: 256 0 0 0, plane_sizes: 12288 0 0 0, plane_offsets: 0 0 0, total_size: 12288
+y216le planes: 1, linesizes: 256 0 0 0, plane_sizes: 12288 0 0 0, plane_offsets: 0 0 0, total_size: 12288
+y410be planes: 1, linesizes: 256 0 0 0, plane_sizes: 12288 0 0 0, plane_offsets: 0 0 0, total_size: 12288
+y410le planes: 1, linesizes: 256 0 0 0, plane_sizes: 12288 0 0 0, plane_offsets: 0 0 0, total_size: 12288
+y416be planes: 1, linesizes: 512 0 0 0, plane_sizes: 24576 0 0 0, plane_offsets: 0 0 0, total_size: 24576
+y416le planes: 1, linesizes: 512 0 0 0, plane_sizes: 24576 0 0 0, plane_offsets: 0 0 0, total_size: 24576
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index bd0f1fcb82..40592cfb5f 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -21,6 +21,10 @@ is16BPS:
rgb48le
rgba64be
rgba64le
+ y216be
+ y216le
+ y416be
+ y416le
ya16be
ya16le
yuv420p16be
@@ -73,6 +77,8 @@ isNBPS:
xyz12le
y210be
y210le
+ y410be
+ y410le
yuv420p10be
yuv420p10le
yuv420p12be
@@ -161,6 +167,9 @@ isBE:
x2rgb10be
xyz12be
y210be
+ y216be
+ y410be
+ y416be
ya16be
yuv420p10be
yuv420p12be
@@ -220,6 +229,12 @@ isYUV:
xyz12le
y210be
y210le
+ y216be
+ y216le
+ y410be
+ y410le
+ y416be
+ y416le
ya16be
ya16le
ya8
@@ -656,6 +671,10 @@ ALPHA:
rgba64be
rgba64le
vuya
+ y410be
+ y410le
+ y416be
+ y416le
ya16be
ya16le
ya8
@@ -750,6 +769,12 @@ Packed:
xyz12le
y210be
y210le
+ y216be
+ y216le
+ y410be
+ y410le
+ y416be
+ y416le
ya16be
ya16le
ya8
--
2.34.1
More information about the ffmpeg-devel
mailing list