Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [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