* [FFmpeg-devel] [PATCH] pixfmt: add 10+12bit LSB-padded gray/420/444 pixel formats for Vulkan (PR #20756)
@ 2025-10-26 21:37 Lynne via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: Lynne via ffmpeg-devel @ 2025-10-26 21:37 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lynne
PR #20756 opened by Lynne
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20756
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20756.patch
The issue is that Vulkan defines all padding to be in the LSBs for all padded pixel formats. We previously tried to fudge it, by treating padded pixel formats as 16-bit and ignoring top bits. This worked, until libplacebo got proper support, which broke the fudge.
Instead of hacking it further, give up and define LSB-padded pixel formats, something we should have done from the start. Perhaps we could add some special cases in the command line interface to treat yuv420p as an MSB format in case yuv420p is not supported but yuv420pmsb is.
>From 56f09324966dc9b507ce477c77f47562a8157460 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sat, 18 Oct 2025 05:57:05 +0200
Subject: [PATCH 1/9] hwcontext_vulkan: add support for
VK_EXT_zero_initialize_device_memory
---
libavutil/hwcontext_vulkan.c | 16 ++++++++++++++++
libavutil/vulkan_functions.h | 1 +
libavutil/vulkan_loader.h | 3 +++
3 files changed, 20 insertions(+)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index ae4b07c698..45ca628070 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -82,6 +82,10 @@ typedef struct VulkanDeviceFeatures {
VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR subgroup_rotate;
VkPhysicalDeviceHostImageCopyFeaturesEXT host_image_copy;
+#ifdef VK_EXT_zero_initialize_device_memory
+ VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT zero_initialize;
+#endif
+
#ifdef VK_KHR_shader_expect_assume
VkPhysicalDeviceShaderExpectAssumeFeaturesKHR expect_assume;
#endif
@@ -225,6 +229,11 @@ static void device_features_init(AVHWDeviceContext *ctx, VulkanDeviceFeatures *f
FF_VK_STRUCT_EXT(s, &feats->device, &feats->host_image_copy, FF_VK_EXT_HOST_IMAGE_COPY,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT);
+#ifdef VK_EXT_zero_initialize_device_memory
+ FF_VK_STRUCT_EXT(s, &feats->device, &feats->zero_initialize, FF_VK_EXT_ZERO_INITIALIZE,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT);
+#endif
+
#ifdef VK_KHR_shader_expect_assume
FF_VK_STRUCT_EXT(s, &feats->device, &feats->expect_assume, FF_VK_EXT_EXPECT_ASSUME,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR);
@@ -311,6 +320,10 @@ static void device_features_copy_needed(VulkanDeviceFeatures *dst, VulkanDeviceF
COPY_VAL(subgroup_rotate.shaderSubgroupRotate);
COPY_VAL(host_image_copy.hostImageCopy);
+#ifdef VK_EXT_zero_initialize_device_memory
+ COPY_VAL(zero_initialize.zeroInitializeDeviceMemory);
+#endif
+
COPY_VAL(video_maintenance_1.videoMaintenance1);
#ifdef VK_KHR_video_maintenance2
COPY_VAL(video_maintenance_2.videoMaintenance2);
@@ -642,6 +655,9 @@ static const VulkanOptExtension optional_device_exts[] = {
{ VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME, FF_VK_EXT_COOP_MATRIX },
{ VK_EXT_SHADER_OBJECT_EXTENSION_NAME, FF_VK_EXT_SHADER_OBJECT },
{ VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, FF_VK_EXT_SUBGROUP_ROTATE },
+#ifdef VK_EXT_zero_initialize_device_memory
+ { VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME, FF_VK_EXT_ZERO_INITIALIZE },
+#endif
#ifdef VK_KHR_shader_expect_assume
{ VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME, FF_VK_EXT_EXPECT_ASSUME },
#endif
diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h
index 4d20b7d806..d6a88160f8 100644
--- a/libavutil/vulkan_functions.h
+++ b/libavutil/vulkan_functions.h
@@ -50,6 +50,7 @@ typedef uint64_t FFVulkanExtensions;
#define FF_VK_EXT_EXPECT_ASSUME (1ULL << 16) /* VK_KHR_shader_expect_assume */
#define FF_VK_EXT_SUBGROUP_ROTATE (1ULL << 17) /* VK_KHR_shader_subgroup_rotate */
#define FF_VK_EXT_HOST_IMAGE_COPY (1ULL << 18) /* VK_EXT_host_image_copy */
+#define FF_VK_EXT_ZERO_INITIALIZE (1ULL << 19) /* VK_EXT_zero_initialize_device_memory */
/* Video extensions */
#define FF_VK_EXT_VIDEO_QUEUE (1ULL << 36) /* VK_KHR_video_queue */
diff --git a/libavutil/vulkan_loader.h b/libavutil/vulkan_loader.h
index 3207511663..dc558f9d64 100644
--- a/libavutil/vulkan_loader.h
+++ b/libavutil/vulkan_loader.h
@@ -60,6 +60,9 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
{ VK_EXT_SHADER_OBJECT_EXTENSION_NAME, FF_VK_EXT_SHADER_OBJECT },
{ VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME, FF_VK_EXT_SUBGROUP_ROTATE },
{ VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME, FF_VK_EXT_HOST_IMAGE_COPY },
+#ifdef VK_EXT_zero_initialize_device_memory
+ { VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME, FF_VK_EXT_ZERO_INITIALIZE },
+#endif
{ VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME, FF_VK_EXT_VIDEO_MAINTENANCE_1 },
#ifdef VK_KHR_video_maintenance2
{ VK_KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME, FF_VK_EXT_VIDEO_MAINTENANCE_2 },
--
2.49.1
>From 7d177055efacd3be65977665737ecb341080d127 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Thu, 16 Oct 2025 03:11:32 +0200
Subject: [PATCH 2/9] vulkan_decode: align images to the subsampling
Normally, the Vulkan drivers handle this. But Vulkan decided "nah".
This requires API users to crop out odd-numbered images with subsampling.
---
libavcodec/vulkan_decode.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index cbf2ab8194..d22ccc21aa 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1130,8 +1130,9 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
}
}
- frames_ctx->width = avctx->coded_width;
- frames_ctx->height = avctx->coded_height;
+ const AVPixFmtDescriptor *pdesc = av_pix_fmt_desc_get(frames_ctx->sw_format);
+ frames_ctx->width = FFALIGN(avctx->coded_width, 1 << pdesc->log2_chroma_w);
+ frames_ctx->height = FFALIGN(avctx->coded_height, 1 << pdesc->log2_chroma_h);
frames_ctx->format = AV_PIX_FMT_VULKAN;
hwfc->format[0] = vkfmt;
@@ -1338,8 +1339,8 @@ int ff_vk_decode_init(AVCodecContext *avctx)
dpb_frames = (AVHWFramesContext *)ctx->common.dpb_hwfc_ref->data;
dpb_frames->format = s->frames->format;
dpb_frames->sw_format = s->frames->sw_format;
- dpb_frames->width = avctx->coded_width;
- dpb_frames->height = avctx->coded_height;
+ dpb_frames->width = s->frames->width;
+ dpb_frames->height = s->frames->height;
dpb_hwfc = dpb_frames->hwctx;
dpb_hwfc->create_pnext = (void *)ff_vk_find_struct(ctx->s.hwfc->create_pnext,
--
2.49.1
>From f6dd55b8db7ff0fde2a02e2589fee4b33562ae0b Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Fri, 17 Oct 2025 14:12:11 +0200
Subject: [PATCH 3/9] vulkan/rangecoder: ifdef out encode and decode chunks
There's little code sharing between them.
---
libavcodec/vulkan/rangecoder.comp | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/libavcodec/vulkan/rangecoder.comp b/libavcodec/vulkan/rangecoder.comp
index b6b6c0490f..98ff743b2e 100644
--- a/libavcodec/vulkan/rangecoder.comp
+++ b/libavcodec/vulkan/rangecoder.comp
@@ -31,6 +31,19 @@ struct RangeCoder {
uint8_t outstanding_byte;
};
+void rac_init(out RangeCoder r, u8buf data, uint buf_size)
+{
+ r.bytestream_start = uint64_t(data);
+ r.bytestream = uint64_t(data);
+ r.bytestream_end = uint64_t(data) + buf_size;
+ r.low = 0;
+ r.range = 0xFF00;
+ r.outstanding_count = uint16_t(0);
+ r.outstanding_byte = uint8_t(0xFF);
+}
+
+#if !defined(DECODE)
+
#ifdef FULL_RENORM
/* Full renorm version that can handle outstanding_byte == 0xFF */
void renorm_encoder(inout RangeCoder c)
@@ -165,16 +178,7 @@ uint32_t rac_terminate(inout RangeCoder c)
return uint32_t(uint64_t(c.bytestream) - uint64_t(c.bytestream_start));
}
-void rac_init(out RangeCoder r, u8buf data, uint buf_size)
-{
- r.bytestream_start = uint64_t(data);
- r.bytestream = uint64_t(data);
- r.bytestream_end = uint64_t(data) + buf_size;
- r.low = 0;
- r.range = 0xFF00;
- r.outstanding_count = uint16_t(0);
- r.outstanding_byte = uint8_t(0xFF);
-}
+#else
/* Decoder */
uint overread = 0;
@@ -239,3 +243,5 @@ bool get_rac_equi(inout RangeCoder c)
{
return get_rac_internal(c, c.range >> 1);
}
+
+#endif
--
2.49.1
>From a64d6e32ff3d3a1d135daa0ba76fa06ddda36ffa Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 21:51:40 +0100
Subject: [PATCH 4/9] lavu/pixfmt: add grayscale 10 and 12-bit MSB padded
variants
---
libavutil/pixdesc.c | 42 ++++++++++++++++++++++++++++++++
libavutil/pixfmt.h | 7 ++++++
tests/ref/fate/imgutils | 8 ++++++
tests/ref/fate/sws-pixdesc-query | 14 +++++++++++
4 files changed, 71 insertions(+)
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 3c31ee2132..9ea8fccb94 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -734,6 +734,27 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.alias = "y10le",
},
+ [AV_PIX_FMT_GRAY10MSBBE] = {
+ .name = "gray10msbbe",
+ .nb_components = 1,
+ .log2_chroma_w = 0,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE,
+ .alias = "y10msbbe",
+ },
+ [AV_PIX_FMT_GRAY10MSBLE] = {
+ .name = "gray10msble",
+ .nb_components = 1,
+ .log2_chroma_w = 0,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ },
+ .alias = "y10msble",
+ },
[AV_PIX_FMT_GRAY12BE] = {
.name = "gray12be",
.nb_components = 1,
@@ -755,6 +776,27 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.alias = "y12le",
},
+ [AV_PIX_FMT_GRAY12MSBBE] = {
+ .name = "gray12msbbe",
+ .nb_components = 1,
+ .log2_chroma_w = 0,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 4, 12 }, /* Y */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE,
+ .alias = "y12msbbe",
+ },
+ [AV_PIX_FMT_GRAY12MSBLE] = {
+ .name = "gray12msble",
+ .nb_components = 1,
+ .log2_chroma_w = 0,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 4, 12 }, /* Y */
+ },
+ .alias = "y12msble",
+ },
[AV_PIX_FMT_GRAY14BE] = {
.name = "gray14be",
.nb_components = 1,
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 6aa1c94cec..82396563a8 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -499,6 +499,11 @@ enum AVPixelFormat {
AV_PIX_FMT_OHCODEC, /// hardware decoding through openharmony
+ AV_PIX_FMT_GRAY10MSBBE, ///< Y , 10bpp, big-endian
+ AV_PIX_FMT_GRAY10MSBLE, ///< Y , 10bpp, little-endian
+ AV_PIX_FMT_GRAY12MSBBE, ///< Y , 12bpp, big-endian
+ AV_PIX_FMT_GRAY12MSBLE, ///< Y , 12bpp, 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
};
@@ -551,6 +556,8 @@ enum AVPixelFormat {
#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
+#define AV_PIX_FMT_GRAY10MSB AV_PIX_FMT_NE(GRAY10MSBBE, GRAY10MSBLE)
+#define AV_PIX_FMT_GRAY12MSB AV_PIX_FMT_NE(GRAY12MSBBE, GRAY12MSBLE)
#define AV_PIX_FMT_YUV444P10MSB AV_PIX_FMT_NE(YUV444P10MSBBE, YUV444P10MSBLE)
#define AV_PIX_FMT_YUV444P12MSB AV_PIX_FMT_NE(YUV444P12MSBBE, YUV444P12MSBLE)
diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils
index ccd1522ef2..738ce0289c 100644
--- a/tests/ref/fate/imgutils
+++ b/tests/ref/fate/imgutils
@@ -306,6 +306,10 @@ gbrp10msbbe planes: 3, linesizes: 128 128 128 0, plane_sizes: 6144 6144
gbrp10msble planes: 3, linesizes: 128 128 128 0, plane_sizes: 6144 6144 6144 0, plane_offsets: 6144 6144 0, total_size: 18432
gbrp12msbbe planes: 3, linesizes: 128 128 128 0, plane_sizes: 6144 6144 6144 0, plane_offsets: 6144 6144 0, total_size: 18432
gbrp12msble planes: 3, linesizes: 128 128 128 0, plane_sizes: 6144 6144 6144 0, plane_offsets: 6144 6144 0, total_size: 18432
+gray10msbbe planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
+gray10msble planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
+gray12msbbe planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
+gray12msble planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
image_fill_black tests
yuv420p total_size: 4608, black_unknown_crc: 0xd00f6cc6, black_tv_crc: 0xd00f6cc6, black_pc_crc: 0x234969af
@@ -559,3 +563,7 @@ gbrp10msbbe total_size: 18432, black_unknown_crc: 0x00000000, black_tv_cr
gbrp10msble total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000
gbrp12msbbe total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000
gbrp12msble total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000
+gray10msbbe total_size: 6144, black_unknown_crc: 0x02d4a26f, black_tv_crc: 0x02d4a26f, black_pc_crc: 0x00000000
+gray10msble total_size: 6144, black_unknown_crc: 0xb93165c3, black_tv_crc: 0xb93165c3, black_pc_crc: 0x00000000
+gray12msbbe total_size: 6144, black_unknown_crc: 0x02d4a26f, black_tv_crc: 0x02d4a26f, black_pc_crc: 0x00000000
+gray12msble total_size: 6144, black_unknown_crc: 0xb93165c3, black_tv_crc: 0xb93165c3, black_pc_crc: 0x00000000
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index a062088d54..af421b4eee 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -73,8 +73,12 @@ isNBPS:
gbrp9le
gray10be
gray10le
+ gray10msbbe
+ gray10msble
gray12be
gray12le
+ gray12msbbe
+ gray12msble
gray14be
gray14le
gray9be
@@ -186,7 +190,9 @@ isBE:
gbrpf16be
gbrpf32be
gray10be
+ gray10msbbe
gray12be
+ gray12msbbe
gray14be
gray16be
gray32be
@@ -625,8 +631,12 @@ Gray:
gray
gray10be
gray10le
+ gray10msbbe
+ gray10msble
gray12be
gray12le
+ gray12msbbe
+ gray12msble
gray14be
gray14le
gray16be
@@ -1225,6 +1235,10 @@ DataInHighBits:
gbrp10msble
gbrp12msbbe
gbrp12msble
+ gray10msbbe
+ gray10msble
+ gray12msbbe
+ gray12msble
p010be
p010le
p012be
--
2.49.1
>From 9dfbeb381318d9f918869a64b77bdab3e26cb61c Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 20:16:19 +0000
Subject: [PATCH 5/9] lavu/pixfmt: add 420 and 422, 10 and 12-bit MSB padded
variants
Vulkan has defined all its 3-plane formats as MSB padded.
---
libavutil/pixdesc.c | 48 ++++++++++++++++++++++++++++++++
libavutil/pixfmt.h | 12 ++++++++
tests/ref/fate/imgutils | 8 ++++++
tests/ref/fate/sws-pixdesc-query | 22 +++++++++++++++
4 files changed, 90 insertions(+)
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 9ea8fccb94..a16d6b170a 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -1503,6 +1503,30 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
},
+ [AV_PIX_FMT_YUV420P10MSBLE] = {
+ .name = "yuv420p10msble",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 1,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ { 1, 2, 0, 6, 10 }, /* U */
+ { 2, 2, 0, 6, 10 }, /* V */
+ },
+ .flags = AV_PIX_FMT_FLAG_PLANAR,
+ },
+ [AV_PIX_FMT_YUV420P10MSBBE] = {
+ .name = "yuv420p10msbbe",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 1,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ { 1, 2, 0, 6, 10 }, /* U */
+ { 2, 2, 0, 6, 10 }, /* V */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
+ },
[AV_PIX_FMT_YUV420P12LE] = {
.name = "yuv420p12le",
.nb_components = 3,
@@ -1623,6 +1647,30 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
},
+ [AV_PIX_FMT_YUV422P10MSBLE] = {
+ .name = "yuv422p10msble",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ { 1, 2, 0, 6, 10 }, /* U */
+ { 2, 2, 0, 6, 10 }, /* V */
+ },
+ .flags = AV_PIX_FMT_FLAG_PLANAR,
+ },
+ [AV_PIX_FMT_YUV422P10MSBBE] = {
+ .name = "yuv422p10msbbe",
+ .nb_components = 3,
+ .log2_chroma_w = 1,
+ .log2_chroma_h = 0,
+ .comp = {
+ { 0, 2, 0, 6, 10 }, /* Y */
+ { 1, 2, 0, 6, 10 }, /* U */
+ { 2, 2, 0, 6, 10 }, /* V */
+ },
+ .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
+ },
[AV_PIX_FMT_YUV422P12LE] = {
.name = "yuv422p12le",
.nb_components = 3,
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 82396563a8..d22c939ba9 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -503,6 +503,14 @@ enum AVPixelFormat {
AV_PIX_FMT_GRAY10MSBLE, ///< Y , 10bpp, little-endian
AV_PIX_FMT_GRAY12MSBBE, ///< Y , 12bpp, big-endian
AV_PIX_FMT_GRAY12MSBLE, ///< Y , 12bpp, little-endian
+ AV_PIX_FMT_YUV420P10MSBBE, ///< planar YUV 4:2:0, 30bpp, (1 Cr & Cb sample per 2x2 Y samples), lowest bits zero, big-endian
+ AV_PIX_FMT_YUV420P10MSBLE, ///< planar YUV 4:2:0, 30bpp, (1 Cr & Cb sample per 2x2 Y samples), lowest bits zero, little-endian
+ AV_PIX_FMT_YUV420P12MSBBE, ///< planar YUV 4:2:0, 30bpp, (1 Cr & Cb sample per 2x2 Y samples), lowest bits zero, big-endian
+ AV_PIX_FMT_YUV420P12MSBLE, ///< planar YUV 4:2:0, 30bpp, (1 Cr & Cb sample per 2x2 Y samples), lowest bits zero, little-endian
+ AV_PIX_FMT_YUV422P10MSBBE, ///< planar YUV 4:2:2, 30bpp, (1 Cr & Cb sample per 2x1 Y samples), lowest bits zero, big-endian
+ AV_PIX_FMT_YUV422P10MSBLE, ///< planar YUV 4:2:2, 30bpp, (1 Cr & Cb sample per 2x1 Y samples), lowest bits zero, little-endian
+ AV_PIX_FMT_YUV422P12MSBBE, ///< planar YUV 4:2:2, 30bpp, (1 Cr & Cb sample per 2x1 Y samples), lowest bits zero, big-endian
+ AV_PIX_FMT_YUV422P12MSBLE, ///< planar YUV 4:2:2, 30bpp, (1 Cr & Cb sample per 2x1 Y samples), lowest bits zero, 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
};
@@ -558,6 +566,10 @@ enum AVPixelFormat {
#define AV_PIX_FMT_GRAY10MSB AV_PIX_FMT_NE(GRAY10MSBBE, GRAY10MSBLE)
#define AV_PIX_FMT_GRAY12MSB AV_PIX_FMT_NE(GRAY12MSBBE, GRAY12MSBLE)
+#define AV_PIX_FMT_YUV420P10MSB AV_PIX_FMT_NE(YUV420P10MSBBE, YUV420P10MSBLE)
+#define AV_PIX_FMT_YUV420P12MSB AV_PIX_FMT_NE(YUV420P12MSBBE, YUV420P12MSBLE)
+#define AV_PIX_FMT_YUV422P10MSB AV_PIX_FMT_NE(YUV422P10MSBBE, YUV422P10MSBLE)
+#define AV_PIX_FMT_YUV422P12MSB AV_PIX_FMT_NE(YUV422P12MSBBE, YUV422P12MSBLE)
#define AV_PIX_FMT_YUV444P10MSB AV_PIX_FMT_NE(YUV444P10MSBBE, YUV444P10MSBLE)
#define AV_PIX_FMT_YUV444P12MSB AV_PIX_FMT_NE(YUV444P12MSBBE, YUV444P12MSBLE)
diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils
index 738ce0289c..2ef30e2bc1 100644
--- a/tests/ref/fate/imgutils
+++ b/tests/ref/fate/imgutils
@@ -310,6 +310,10 @@ gray10msbbe planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0
gray10msble planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
gray12msbbe planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
gray12msble planes: 1, linesizes: 128 0 0 0, plane_sizes: 6144 0 0 0, plane_offsets: 0 0 0, total_size: 6144
+yuv420p10msbbe planes: 3, linesizes: 128 64 64 0, plane_sizes: 6144 1536 1536 0, plane_offsets: 6144 1536 0, total_size: 9216
+yuv420p10msble planes: 3, linesizes: 128 64 64 0, plane_sizes: 6144 1536 1536 0, plane_offsets: 6144 1536 0, total_size: 9216
+yuv422p10msbbe planes: 3, linesizes: 128 64 64 0, plane_sizes: 6144 3072 3072 0, plane_offsets: 6144 3072 0, total_size: 12288
+yuv422p10msble planes: 3, linesizes: 128 64 64 0, plane_sizes: 6144 3072 3072 0, plane_offsets: 6144 3072 0, total_size: 12288
image_fill_black tests
yuv420p total_size: 4608, black_unknown_crc: 0xd00f6cc6, black_tv_crc: 0xd00f6cc6, black_pc_crc: 0x234969af
@@ -567,3 +571,7 @@ gray10msbbe total_size: 6144, black_unknown_crc: 0x02d4a26f, black_tv_cr
gray10msble total_size: 6144, black_unknown_crc: 0xb93165c3, black_tv_crc: 0xb93165c3, black_pc_crc: 0x00000000
gray12msbbe total_size: 6144, black_unknown_crc: 0x02d4a26f, black_tv_crc: 0x02d4a26f, black_pc_crc: 0x00000000
gray12msble total_size: 6144, black_unknown_crc: 0xb93165c3, black_tv_crc: 0xb93165c3, black_pc_crc: 0x00000000
+yuv420p10msbbe total_size: 9216, black_unknown_crc: 0x4d4d9903, black_tv_crc: 0x4d4d9903, black_pc_crc: 0x69c6fe01
+yuv420p10msble total_size: 9216, black_unknown_crc: 0xfff85b60, black_tv_crc: 0xfff85b60, black_pc_crc: 0xc03cff93
+yuv422p10msbbe total_size: 12288, black_unknown_crc: 0x0bbe5df7, black_tv_crc: 0x0bbe5df7, black_pc_crc: 0x16a51378
+yuv422p10msble total_size: 12288, black_unknown_crc: 0x6582d6cf, black_tv_crc: 0x6582d6cf, black_pc_crc: 0xc9dc3ddf
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index af421b4eee..baca687697 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -115,6 +115,8 @@ isNBPS:
y212le
yuv420p10be
yuv420p10le
+ yuv420p10msbbe
+ yuv420p10msble
yuv420p12be
yuv420p12le
yuv420p14be
@@ -123,6 +125,8 @@ isNBPS:
yuv420p9le
yuv422p10be
yuv422p10le
+ yuv422p10msbbe
+ yuv422p10msble
yuv422p12be
yuv422p12le
yuv422p14be
@@ -234,11 +238,13 @@ isBE:
yaf16be
yaf32be
yuv420p10be
+ yuv420p10msbbe
yuv420p12be
yuv420p14be
yuv420p16be
yuv420p9be
yuv422p10be
+ yuv422p10msbbe
yuv422p12be
yuv422p14be
yuv422p16be
@@ -327,6 +333,8 @@ isYUV:
yuv420p
yuv420p10be
yuv420p10le
+ yuv420p10msbbe
+ yuv420p10msble
yuv420p12be
yuv420p12le
yuv420p14be
@@ -338,6 +346,8 @@ isYUV:
yuv422p
yuv422p10be
yuv422p10le
+ yuv422p10msbbe
+ yuv422p10msble
yuv422p12be
yuv422p12le
yuv422p14be
@@ -430,6 +440,8 @@ isPlanarYUV:
yuv420p
yuv420p10be
yuv420p10le
+ yuv420p10msbbe
+ yuv420p10msble
yuv420p12be
yuv420p12le
yuv420p14be
@@ -441,6 +453,8 @@ isPlanarYUV:
yuv422p
yuv422p10be
yuv422p10le
+ yuv422p10msbbe
+ yuv422p10msble
yuv422p12be
yuv422p12le
yuv422p14be
@@ -1050,6 +1064,8 @@ Planar:
yuv420p
yuv420p10be
yuv420p10le
+ yuv420p10msbbe
+ yuv420p10msble
yuv420p12be
yuv420p12le
yuv420p14be
@@ -1061,6 +1077,8 @@ Planar:
yuv422p
yuv422p10be
yuv422p10le
+ yuv422p10msbbe
+ yuv422p10msble
yuv422p12be
yuv422p12le
yuv422p14be
@@ -1259,6 +1277,10 @@ DataInHighBits:
y210le
y212be
y212le
+ yuv420p10msbbe
+ yuv420p10msble
+ yuv422p10msbbe
+ yuv422p10msble
yuv444p10msbbe
yuv444p10msble
yuv444p12msbbe
--
2.49.1
>From 59794e001bf865713be66dd6aec880b8b4675303 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 21:51:51 +0100
Subject: [PATCH 6/9] hwcontext_vulkan: fix grayscale 10 and 12-bit formats
using the new MSB formats
---
libavcodec/vulkan_decode.c | 3 +++
libavutil/hwcontext_vulkan.c | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index d22ccc21aa..c2381155ab 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1113,6 +1113,9 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
hwfc->create_pnext = &prof->profile_list;
} else {
switch (frames_ctx->sw_format) {
+ /* Vulkan's formats are all LSB-padded */
+ case AV_PIX_FMT_GRAY10: frames_ctx->sw_format = AV_PIX_FMT_GRAY10MSB; break;
+ case AV_PIX_FMT_GRAY12: frames_ctx->sw_format = AV_PIX_FMT_GRAY12MSB; break;
case AV_PIX_FMT_GBRAP16:
/* This should be more efficient for downloading and using */
frames_ctx->sw_format = AV_PIX_FMT_RGBA64;
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 45ca628070..39ba8a4e5c 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -372,8 +372,8 @@ static const struct FFVkFormatEntry {
} vk_formats_list[] = {
/* Gray formats */
{ VK_FORMAT_R8_UNORM, AV_PIX_FMT_GRAY8, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY12, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_R10X6_UNORM_PACK16, AV_PIX_FMT_GRAY10MSB, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_R12X4_UNORM_PACK16, AV_PIX_FMT_GRAY12MSB, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY14, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY16, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R32_UINT, AV_PIX_FMT_GRAY32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32_UINT } },
--
2.49.1
>From fa936d465789983938a342d8f0acbb2f0df13bf6 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 20:12:15 +0000
Subject: [PATCH 7/9] hwcontext_vulkan: fix 3-plane 444 10 and 12-bit formats
using the new MSB formats
We previously tried to fudge this somehow, but the pixel formats
are simply broken and we cannot use them without declaring them as MSB.
---
libavcodec/vulkan_decode.c | 6 ++++++
libavutil/hwcontext_vulkan.c | 12 ++++++------
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index c2381155ab..a43f02f21e 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1116,6 +1116,12 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
/* Vulkan's formats are all LSB-padded */
case AV_PIX_FMT_GRAY10: frames_ctx->sw_format = AV_PIX_FMT_GRAY10MSB; break;
case AV_PIX_FMT_GRAY12: frames_ctx->sw_format = AV_PIX_FMT_GRAY12MSB; break;
+ case AV_PIX_FMT_YUV420P10: frames_ctx->sw_format = AV_PIX_FMT_YUV420P10MSB; break;
+ case AV_PIX_FMT_YUV420P12: frames_ctx->sw_format = AV_PIX_FMT_YUV420P12MSB; break;
+ case AV_PIX_FMT_YUV422P10: frames_ctx->sw_format = AV_PIX_FMT_YUV422P10MSB; break;
+ case AV_PIX_FMT_YUV422P12: frames_ctx->sw_format = AV_PIX_FMT_YUV422P12MSB; break;
+ case AV_PIX_FMT_YUV444P10: frames_ctx->sw_format = AV_PIX_FMT_YUV444P10MSB; break;
+ case AV_PIX_FMT_YUV444P12: frames_ctx->sw_format = AV_PIX_FMT_YUV444P12MSB; break;
case AV_PIX_FMT_GBRAP16:
/* This should be more efficient for downloading and using */
frames_ctx->sw_format = AV_PIX_FMT_RGBA64;
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 39ba8a4e5c..e02ddc5e1b 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -437,16 +437,16 @@ static const struct FFVkFormatEntry {
/* Three-plane 420, 422, 444 at 8, 10, 12 and 16 bits */
{ VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P10, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P12, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, AV_PIX_FMT_YUV420P10MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV420P12MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P16, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P10, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P12, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV422P10MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV422P12MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P16, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P10, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P12, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, AV_PIX_FMT_YUV444P10MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+ { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, AV_PIX_FMT_YUV444P12MSB, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P16, ASPECT_3PLANE, 3, 1, 3, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
/* Single plane 422 at 8, 10, 12 and 16 bits */
--
2.49.1
>From ee9b9c1141abdc6985fbb9d4184a20b17e6ede1d Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 22:01:37 +0100
Subject: [PATCH 8/9] hwcontext_vulkan: remove unsupported/broken pixel formats
We have no use for 14-bit pixel formats for now, so remove support for gray14,
which was broken due to the LSB padding issue.
Similarly YUVA at 10/12 bit was broken for the same reason.
---
libavutil/hwcontext_vulkan.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index e02ddc5e1b..040a8bd00c 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -374,7 +374,6 @@ static const struct FFVkFormatEntry {
{ VK_FORMAT_R8_UNORM, AV_PIX_FMT_GRAY8, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8_UNORM } },
{ VK_FORMAT_R10X6_UNORM_PACK16, AV_PIX_FMT_GRAY10MSB, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R12X4_UNORM_PACK16, AV_PIX_FMT_GRAY12MSB, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY14, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY16, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R32_UINT, AV_PIX_FMT_GRAY32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32_UINT } },
{ VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GRAYF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32_SFLOAT } },
@@ -458,19 +457,14 @@ static const struct FFVkFormatEntry {
/* Planar YUVA 420 at 8, 10 and 16 bits */
{ VK_FORMAT_R8_UNORM, AV_PIX_FMT_YUVA420P, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA420P10, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA420P16, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
/* Planar YUVA 422 at 8, 10, 12 and 16 bits */
{ VK_FORMAT_R8_UNORM, AV_PIX_FMT_YUVA422P, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA422P10, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA422P12, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA422P16, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
/* Planar YUVA 444 at 8, 10, 12 and 16 bits */
{ VK_FORMAT_R8_UNORM, AV_PIX_FMT_YUVA444P, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA444P10, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
- { VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA444P12, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
{ VK_FORMAT_R16_UNORM, AV_PIX_FMT_YUVA444P16, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
/* Single plane 444 at 8, 10, 12 and 16 bits */
--
2.49.1
>From ad3295204a285d07a080dff9666c4a051cf7fa78 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 22:36:33 +0100
Subject: [PATCH 9/9] lavu: bump minor and add APIchanges entry for the new
pixfmts
---
doc/APIchanges | 5 +++++
libavutil/version.h | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 3ec8e25f03..8d24f22473 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,11 @@ The last version increases of all libraries were on 2025-03-28
API changes, most recent first:
+2025-10-xx - xxxxxxxxxx - lavu 60.15.100 - pixfmt.h
+ Add AV_PIX_FMT_GRAY10MSB, AV_PIX_FMT_GRAY12MSB,
+ AV_PIX_FMT_YUV420P10MSB, AV_PIX_FMT_YUV420P12MSB,
+ AV_PIX_FMT_YUV422P10MSB, AV_PIX_FMT_YUV422P12MSB.
+
2025-10-xx - xxxxxxxxxx - lavu 60.14.100 - csp.h
Add av_csp_approximate_eotf_gamma().
diff --git a/libavutil/version.h b/libavutil/version.h
index 176b99aef3..f2c554a560 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 60
-#define LIBAVUTIL_VERSION_MINOR 14
+#define LIBAVUTIL_VERSION_MINOR 15
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
--
2.49.1
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-10-26 21:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-26 21:37 [FFmpeg-devel] [PATCH] pixfmt: add 10+12bit LSB-padded gray/420/444 pixel formats for Vulkan (PR #20756) Lynne via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git