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 #20771)
@ 2025-10-27 20:15 Lynne via ffmpeg-devel
  0 siblings, 0 replies; only message in thread
From: Lynne via ffmpeg-devel @ 2025-10-27 20:15 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Lynne

PR #20771 opened by Lynne
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20771
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20771.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 6cd5aab456949ec15449b959865f5cb779da7360 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 21:51:40 +0100
Subject: [PATCH 1/9] lavu/pixfmt: add grayscale 10 and 12-bit MSB padded
 variants

---
 libavutil/pixdesc.c                       | 42 +++++++++++++++++++++++
 libavutil/pixfmt.h                        |  7 ++++
 tests/ref/fate/filter-pixdesc-gray10msbbe |  1 +
 tests/ref/fate/filter-pixdesc-gray10msble |  1 +
 tests/ref/fate/filter-pixdesc-gray12msbbe |  1 +
 tests/ref/fate/filter-pixdesc-gray12msble |  1 +
 tests/ref/fate/filter-pixfmts-copy        |  4 +++
 tests/ref/fate/filter-pixfmts-crop        |  4 +++
 tests/ref/fate/filter-pixfmts-field       |  4 +++
 tests/ref/fate/filter-pixfmts-fieldorder  |  4 +++
 tests/ref/fate/filter-pixfmts-hflip       |  4 +++
 tests/ref/fate/filter-pixfmts-il          |  4 +++
 tests/ref/fate/filter-pixfmts-null        |  4 +++
 tests/ref/fate/filter-pixfmts-pad         |  2 ++
 tests/ref/fate/filter-pixfmts-scale       |  4 +++
 tests/ref/fate/filter-pixfmts-transpose   |  4 +++
 tests/ref/fate/filter-pixfmts-vflip       |  4 +++
 tests/ref/fate/imgutils                   |  8 +++++
 tests/ref/fate/sws-pixdesc-query          | 14 ++++++++
 19 files changed, 117 insertions(+)
 create mode 100644 tests/ref/fate/filter-pixdesc-gray10msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-gray10msble
 create mode 100644 tests/ref/fate/filter-pixdesc-gray12msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-gray12msble

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/filter-pixdesc-gray10msbbe b/tests/ref/fate/filter-pixdesc-gray10msbbe
new file mode 100644
index 0000000000..c5a3c0a5ca
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray10msbbe
@@ -0,0 +1 @@
+pixdesc-gray10msbbe 30925ffca4894232df5b2b7d96dcfe54
diff --git a/tests/ref/fate/filter-pixdesc-gray10msble b/tests/ref/fate/filter-pixdesc-gray10msble
new file mode 100644
index 0000000000..be3e7b04d8
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray10msble
@@ -0,0 +1 @@
+pixdesc-gray10msble 93c7eb73cc0021262ab6fb984789a358
diff --git a/tests/ref/fate/filter-pixdesc-gray12msbbe b/tests/ref/fate/filter-pixdesc-gray12msbbe
new file mode 100644
index 0000000000..828ba56e25
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray12msbbe
@@ -0,0 +1 @@
+pixdesc-gray12msbbe 7b74d4e211ec8ff87c94c4a7576dc652
diff --git a/tests/ref/fate/filter-pixdesc-gray12msble b/tests/ref/fate/filter-pixdesc-gray12msble
new file mode 100644
index 0000000000..8fa84b4e3f
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gray12msble
@@ -0,0 +1 @@
+pixdesc-gray12msble abc39dc30e8c9f2161e238e85f0db801
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index d42e2f6b33..1e08ee60b1 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -51,8 +51,12 @@ gbrpf32le           f3aff67024db002d8d985c775ec8c235
 gray                188590b1231afd231ea910815aef2b25
 gray10be            0804e8620fcd78599e3df33cb83652aa
 gray10le            705e51fb783ae8167498d09748e44bd2
+gray10msbbe         a4eddf6055d0507c6bc411a788e28c1d
+gray10msble         19c68a45da74b833993a3120fda93ca0
 gray12be            2163197b5975c0c2900ac7c3f56f45f1
 gray12le            5bf2ca7795dd0524b253aee20f660e73
+gray12msbbe         b6a952019c10cc6bd655850c4d226d77
+gray12msble         b46e317ee809b44a25707cea426f2e8e
 gray14be            dccc8bde352b6c8ae65ca2832a383381
 gray14le            56c9e613b09f00a5940c0bf2e938c02e
 gray16be            47a6889ea2dcff9164888a94cccff4de
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index a86113c631..ca2e4a45cf 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -51,8 +51,12 @@ gbrpf32le           b930a6185e3ffb23785d57ab1f519bc3
 gray                0d70b54b4b888ec4dbd89713620ac1ee
 gray10be            a97f60928c553b9d0e8e44b69ec2970d
 gray10le            bff59b6df8751b5e958d0cd8deb3c31a
+gray10msbbe         ceedda0baebcc04f3614aa73bddaef89
+gray10msble         a06031ad148e90b144438ec2bb287f5e
 gray12be            5080520ac513da1be65b353a3c208a99
 gray12le            016877eaccd8490fd281b08b582bd832
+gray12msbbe         08e6bcc90b08022fae116286a9dde008
+gray12msble         1c5c7e0cc20c622ed7c241cbc4612527
 gray14be            c0a8c2f0937438d8a54625d90cc44a12
 gray14le            222c5d59a7482e060f0fa117e658c239
 gray16be            a134e7154d1ee810e50ea5887f784cf0
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index c05dba55f6..00ba61e49a 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -51,8 +51,12 @@ gbrpf32le           64722b723252d359858136cb00079636
 gray                57fd8e6e00f6be8752726005974cce1b
 gray10be            083a7931fea847a4d8b23d38f989a836
 gray10le            1b08650e7c44f8517dd3f37044930729
+gray10msbbe         7d02d13a358e7fc2a8960a9eb43dccb7
+gray10msble         93fb6bd19152b7ea2cb1e3d023807382
 gray12be            c02b7fef120c03bf0fddadb5b63a1373
 gray12le            ac129433ead39c0c9f881979345a434d
+gray12msbbe         583163bfeab26b8a85525113e1e07884
+gray12msble         239e90619f531766ee8c3f9bd1ff892b
 gray14be            a5c8b034a5867ba91691fbd68cea2864
 gray14le            39c6b08bd0d934005ace54a2e5821e8e
 gray16be            3f446db33f6dea74ac1d9d6962511c4e
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index 4c8cffca08..2cdfa25236 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -51,8 +51,12 @@ gbrpf32le           070140993c538b996890b983c0a010be
 gray                d96e0f1c73d3f0b9506d691b5cd36c73
 gray10be            3ccbda141912b7cace81b2145005032e
 gray10le            e27718bf9caa54b7b3313c15cec88f20
+gray10msbbe         d6c231b3e0440fc15aaca387db37568a
+gray10msble         fcc78b29afede484ee5bd3db6557be6c
 gray12be            c892966f917891dbe2badf8281486710
 gray12le            48b193c9afe677304c027aca3b431411
+gray12msbbe         61c0ccc1954071e8feaab067aa77b7ea
+gray12msble         30d1377c54652c274e8fb79361da23ef
 gray14be            ea1ea4bece62708ba47a7ebbfdd4437e
 gray14le            beb4536b196e50a6fb5deb07580a803c
 gray16be            28b2b79919be3a0b65c0825eb3e98d92
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index b47087d1f6..c65d926b76 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -51,8 +51,12 @@ gbrpf32le           cbb650b78c412b10a1070840fefd6d59
 gray                8bd4ece1dbf89b20ee785e0515356e07
 gray10be            1daf5c1face37d8724a65e905941dcb8
 gray10le            07c5139f97db9d49729f2ea6e77dcedf
+gray10msbbe         7211b8202caf246d835e894b4304ec24
+gray10msble         1acb45f2119e6be4226f9a1803da37b1
 gray12be            2ba74a3890309bb111045e2aedcd2e07
 gray12le            81af0124c72271fd316564d86fcd3f2b
+gray12msbbe         48df956f353587c9f0dd779e16ff1f97
+gray12msble         5ba2750ac3d4f3ad2b87695f4a21c3ae
 gray14be            87981e992522a611b28ab5a0ba0ddcb1
 gray14le            95313b7de3f1f2a1471447e57932ada1
 gray16be            4b87b19d657cb45de7f2fe3143d79235
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index 490995bbf0..268593a54d 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -51,8 +51,12 @@ gbrpf32le           6514fcf1804c375f4d560d4f08dbacb7
 gray                52ae18648161ac43144f5c9cd2127786
 gray10be            b2c861887056fe39d2fe90379d80e535
 gray10le            f7022c60ad8cb9a9d5f556ad7c7fadaf
+gray10msbbe         3055f2b1079ebfa36bdd89644c19c40f
+gray10msble         5b26d8f9ef1e2ad62520e33c6eeda05b
 gray12be            c733c108acee8389ae9dfc6262c2bd8b
 gray12le            870d5c2b37d13c25689e1e268749f7a9
+gray12msbbe         63d3eef70eb6cfa6af65449b1da8d44d
+gray12msble         c57839969fb73d6e30e7e486f1f2f2be
 gray14be            230bc18fa759c249573c3dbda2d27173
 gray14le            9dc39323146761e60f5517405e5e40b3
 gray16be            c31bde624d1a2e46eda99a1b982de7aa
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index d42e2f6b33..1e08ee60b1 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -51,8 +51,12 @@ gbrpf32le           f3aff67024db002d8d985c775ec8c235
 gray                188590b1231afd231ea910815aef2b25
 gray10be            0804e8620fcd78599e3df33cb83652aa
 gray10le            705e51fb783ae8167498d09748e44bd2
+gray10msbbe         a4eddf6055d0507c6bc411a788e28c1d
+gray10msble         19c68a45da74b833993a3120fda93ca0
 gray12be            2163197b5975c0c2900ac7c3f56f45f1
 gray12le            5bf2ca7795dd0524b253aee20f660e73
+gray12msbbe         b6a952019c10cc6bd655850c4d226d77
+gray12msble         b46e317ee809b44a25707cea426f2e8e
 gray14be            dccc8bde352b6c8ae65ca2832a383381
 gray14le            56c9e613b09f00a5940c0bf2e938c02e
 gray16be            47a6889ea2dcff9164888a94cccff4de
diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad
index 3c9fe6746e..a57069f61f 100644
--- a/tests/ref/fate/filter-pixfmts-pad
+++ b/tests/ref/fate/filter-pixfmts-pad
@@ -22,7 +22,9 @@ gbrp16le            a6156d1a37e05ee621b2a343fb158bd6
 gbrp9le             9e827f438e081d334a6cae7e282698b0
 gray                2b9652a8b136316fada371d03ee252bc
 gray10le            47fb6bf7784e8bd70b49f417b2fa28b0
+gray10msble         925e45f177945f1e899ef3a3d90675bd
 gray12le            3bf76ed4fa5ba0955ab1157e20b26ef4
+gray12msble         7f949f0284ebc73ff33319cd692276dc
 gray14le            c3750188ede607e733065b7f3b17f548
 gray16le            4347c5ca559a06948c1e7e7c2f06657d
 gray9le             99f825e62d5786901dba9abc88878ffb
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 66d22e0484..87752c6c4f 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -51,8 +51,12 @@ gbrpf32le           f6fcfa78926bc1acdf40675e015491fd
 gray                221201cc7cfc4964eacd8b3e426fd276
 gray10be            d16a05571246e94b5117004c5276cb7a
 gray10le            0ef4a201ffc7197b316ad47dd81dff45
+gray10msbbe         29277ef1cad2b4db2cb386dee7c49ba9
+gray10msble         0b43ba1306bf01a4446df1035f634b21
 gray12be            369e362ecb31db507309589ca4f51d8c
 gray12le            c463d00d75bf491f641aee07c8fefd0e
+gray12msbbe         a1a078cb0fd5d48378544e74a426915d
+gray12msble         093ac5db3e7e4d809cadece81d77f916
 gray14be            4756e24785dc8c04017a847abb95e6a9
 gray14le            9df39c65e85228c479766427db23609f
 gray16be            386ac06726336ff35876cb84152dcea1
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index 80b05dbb05..8f36938517 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -51,8 +51,12 @@ gbrpf32le           3daead396f5bbd6dc3e9d729f6dd7e4a
 gray                c5f8bc6636fd15dbc57deb4bba1e7379
 gray10be            502e8c53160bb81e319f7f03f3d7fba7
 gray10le            0fe4b6d29e7602bb9e49a1cd6c32cf86
+gray10msbbe         b193a8420edd276201554d37ba101149
+gray10msble         3a557b1e464bf8bd6dfa45e005af4f3c
 gray12be            c7d7eac33931374348a0337d324c3128
 gray12le            eebfb191ab4ba2a967e8bed120402b09
+gray12msbbe         9fa97b40c7f892bb0424db85f14a36b8
+gray12msble         e56b3d5fda4ca8cddd492ec3d0a40af1
 gray14be            009e0b4b4e9451b965fccfe5e7cd6538
 gray14le            8a6ca251b3508829bdd8471f05fb3e77
 gray16be            b1810df6c6d9503c4c3199f11329498d
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 6b8c888b9a..2984864e91 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -51,8 +51,12 @@ gbrpf32le           a60eadee900a27d4e1fb5d7ac0b0e901
 gray                41811422d5819ed69389357294384c10
 gray10be            8a49315bcba5cdaffe7ef55cdb5f5148
 gray10le            dd71c7da4d205a081f54e46e76b6a1ed
+gray10msbbe         1071c0fc427e36d7c268ed3804854433
+gray10msble         2d21481e526c8a849d9158f4946ab927
 gray12be            ca43b3f79c517a41c19164c417baa28d
 gray12le            86166fd2485f65867eb8be3b5447e921
+gray12msbbe         e95a661293e4d549e1f2c77d38a0a09a
+gray12msble         40ebc0d5e1572bfe3f77ac4c66858394
 gray14be            57bde02df9aa6156f973c9e0ab60663a
 gray14le            2b76ab2c6de4a9a1b4e5d49e8b537a6d
 gray16be            8e0f23aa0e5736f4ae8e08273201c854
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 20b477f0417ec0a1020e3f57aa6068d5b67be9c6 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 20:16:19 +0000
Subject: [PATCH 2/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                          | 96 ++++++++++++++++++++
 libavutil/pixfmt.h                           | 12 +++
 tests/ref/fate/filter-pixdesc-yuv420p10msbbe |  1 +
 tests/ref/fate/filter-pixdesc-yuv420p10msble |  1 +
 tests/ref/fate/filter-pixdesc-yuv420p12msbbe |  1 +
 tests/ref/fate/filter-pixdesc-yuv420p12msble |  1 +
 tests/ref/fate/filter-pixdesc-yuv422p10msbbe |  1 +
 tests/ref/fate/filter-pixdesc-yuv422p10msble |  1 +
 tests/ref/fate/filter-pixdesc-yuv422p12msbbe |  1 +
 tests/ref/fate/filter-pixdesc-yuv422p12msble |  1 +
 tests/ref/fate/filter-pixfmts-copy           |  8 ++
 tests/ref/fate/filter-pixfmts-crop           |  8 ++
 tests/ref/fate/filter-pixfmts-field          |  8 ++
 tests/ref/fate/filter-pixfmts-fieldorder     |  4 +
 tests/ref/fate/filter-pixfmts-hflip          |  8 ++
 tests/ref/fate/filter-pixfmts-il             |  8 ++
 tests/ref/fate/filter-pixfmts-null           |  8 ++
 tests/ref/fate/filter-pixfmts-pad            |  4 +
 tests/ref/fate/filter-pixfmts-scale          |  8 ++
 tests/ref/fate/filter-pixfmts-transpose      |  4 +
 tests/ref/fate/filter-pixfmts-vflip          |  8 ++
 tests/ref/fate/imgutils                      | 16 ++++
 tests/ref/fate/sws-pixdesc-query             | 22 +++++
 23 files changed, 230 insertions(+)
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv420p10msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv420p10msble
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv420p12msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv420p12msble
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv422p10msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv422p10msble
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv422p12msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv422p12msble

diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 9ea8fccb94..fbd8666863 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,
@@ -1527,6 +1551,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_YUV420P12MSBLE] = {
+        .name = "yuv420p12msble",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 1,
+        .comp = {
+            { 0, 2, 0, 4, 12 },        /* Y */
+            { 1, 2, 0, 4, 12 },        /* U */
+            { 2, 2, 0, 4, 12 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_YUV420P12MSBBE] = {
+        .name = "yuv420p12msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 1,
+        .comp = {
+            { 0, 2, 0, 4, 12 },        /* Y */
+            { 1, 2, 0, 4, 12 },        /* U */
+            { 2, 2, 0, 4, 12 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
+    },
     [AV_PIX_FMT_YUV420P14LE] = {
         .name = "yuv420p14le",
         .nb_components = 3,
@@ -1623,6 +1671,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,
@@ -1647,6 +1719,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_YUV422P12MSBLE] = {
+        .name = "yuv422p12msble",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 4, 12 },        /* Y */
+            { 1, 2, 0, 4, 12 },        /* U */
+            { 2, 2, 0, 4, 12 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_YUV422P12MSBBE] = {
+        .name = "yuv422p12msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 4, 12 },        /* Y */
+            { 1, 2, 0, 4, 12 },        /* U */
+            { 2, 2, 0, 4, 12 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR,
+    },
     [AV_PIX_FMT_YUV422P14LE] = {
         .name = "yuv422p14le",
         .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/filter-pixdesc-yuv420p10msbbe b/tests/ref/fate/filter-pixdesc-yuv420p10msbbe
new file mode 100644
index 0000000000..d265f604e2
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv420p10msbbe
@@ -0,0 +1 @@
+pixdesc-yuv420p10msbbe714c32421334acd21547fdd818c38fc4
diff --git a/tests/ref/fate/filter-pixdesc-yuv420p10msble b/tests/ref/fate/filter-pixdesc-yuv420p10msble
new file mode 100644
index 0000000000..dbca9bf909
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv420p10msble
@@ -0,0 +1 @@
+pixdesc-yuv420p10msble018bce154495538cf61ce565c8bcce78
diff --git a/tests/ref/fate/filter-pixdesc-yuv420p12msbbe b/tests/ref/fate/filter-pixdesc-yuv420p12msbbe
new file mode 100644
index 0000000000..96f2878d22
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv420p12msbbe
@@ -0,0 +1 @@
+pixdesc-yuv420p12msbbe714c32421334acd21547fdd818c38fc4
diff --git a/tests/ref/fate/filter-pixdesc-yuv420p12msble b/tests/ref/fate/filter-pixdesc-yuv420p12msble
new file mode 100644
index 0000000000..24d0c943ff
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv420p12msble
@@ -0,0 +1 @@
+pixdesc-yuv420p12msble018bce154495538cf61ce565c8bcce78
diff --git a/tests/ref/fate/filter-pixdesc-yuv422p10msbbe b/tests/ref/fate/filter-pixdesc-yuv422p10msbbe
new file mode 100644
index 0000000000..3cef106ee0
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv422p10msbbe
@@ -0,0 +1 @@
+pixdesc-yuv422p10msbbe2c04d978af86e47cc29cc16d6b97d9aa
diff --git a/tests/ref/fate/filter-pixdesc-yuv422p10msble b/tests/ref/fate/filter-pixdesc-yuv422p10msble
new file mode 100644
index 0000000000..9ddb4fc2aa
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv422p10msble
@@ -0,0 +1 @@
+pixdesc-yuv422p10msble1ebb8eb68a5757b098d6d262e28ff56c
diff --git a/tests/ref/fate/filter-pixdesc-yuv422p12msbbe b/tests/ref/fate/filter-pixdesc-yuv422p12msbbe
new file mode 100644
index 0000000000..85c667e583
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv422p12msbbe
@@ -0,0 +1 @@
+pixdesc-yuv422p12msbbecfa0d2a7711c0b6b4a74ea7a26c155dc
diff --git a/tests/ref/fate/filter-pixdesc-yuv422p12msble b/tests/ref/fate/filter-pixdesc-yuv422p12msble
new file mode 100644
index 0000000000..509e871a11
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv422p12msble
@@ -0,0 +1 @@
+pixdesc-yuv422p12msble38043e9e40a19b61bcfff334fbc64422
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index 1e08ee60b1..63a26d1385 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -134,8 +134,12 @@ yuv411p             7e1300e89f5bc07939e2c4a6acbdf267
 yuv420p             a014c7eb7a8385d1dd092b7a583f1bff
 yuv420p10be         f9b154364efaa1af376fa6d8eeae6955
 yuv420p10le         15c83294ef560d57f25d16ae6e0fc70c
+yuv420p10msbbe      13a35f032d8b27fbe86be8581f0ec0b3
+yuv420p10msble      01400270da5519f681b48ab8212205c7
 yuv420p12be         34da9c4e289124122ba36a9d4fb133fa
 yuv420p12le         c19a477a07fcf88e37ab37b416d064c0
+yuv420p12msbbe      13a35f032d8b27fbe86be8581f0ec0b3
+yuv420p12msble      01400270da5519f681b48ab8212205c7
 yuv420p14be         64779858686946fc0e780baf7c1391b6
 yuv420p14le         c1d012a4f9d54fbc8b04fea96d85e903
 yuv420p16be         268b07358d8dc733ee81d0b87990d5af
@@ -145,8 +149,12 @@ yuv420p9le          83a6d32c91c15a3bc334bb9abf920654
 yuv422p             74f8006b4482db104f1986f49807a0af
 yuv422p10be         7291903c3c0cf4e5456dd9673a619f1d
 yuv422p10le         14cbaa728e888534359b9dddc5430f08
+yuv422p10msbbe      84584da376799390599031f77fbd0aee
+yuv422p10msble      06d4727c5c4d178736445bddcd9b03a0
 yuv422p12be         e9bc7f2da217fade40feb6960dcd894e
 yuv422p12le         8d8184e4d0f1eb50e1834ac0c4af8c33
+yuv422p12msbbe      bdf57a55ed1957997671d42535a1156f
+yuv422p12msble      fa213f34ebb3042349b3b8b88070f132
 yuv422p14be         2617c569ae9659d8fe6a01f96e2c9657
 yuv422p14le         7d01363cf090306cf93337c474cd8827
 yuv422p16be         86147d8bfb795ab1873c899611e2a361
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index ca2e4a45cf..21c7c8d46b 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -128,8 +128,12 @@ yuv411p             693e4afe96998e6dd91734037d75d887
 yuv420p             510d36163e4d3710988c23c2240ca6dc
 yuv420p10be         ce9af476d924b463b0f68579f30a6463
 yuv420p10le         65214f2af95e816bbe303fa0649ecc84
+yuv420p10msbbe      1a4692f3d0d38516452fc984f91b7ad7
+yuv420p10msble      45f2034adb4616958f17a83aec581276
 yuv420p12be         f86f763eb2ae76d12226009e5f9595d7
 yuv420p12le         3741f6a4ccd368d0e9d00ecdebdde0c9
+yuv420p12msbbe      1a4692f3d0d38516452fc984f91b7ad7
+yuv420p12msble      45f2034adb4616958f17a83aec581276
 yuv420p14be         5544e5fc40e718e608c0bd8c7b1d0812
 yuv420p14le         2c763a71c7c4650b91b405634556e21c
 yuv420p16be         c22f72b460beef22b0bf80806c43b25f
@@ -139,8 +143,12 @@ yuv420p9le          fe0215f5683437bd5a10b6255344109e
 yuv422p             42ea5e9a22df5913b2ec75512162e533
 yuv422p10be         3956017f5023ff5d56b4f814422dd711
 yuv422p10le         a5fa7cb6a21bcbb60ae3ba4a9f4e60e0
+yuv422p10msbbe      d4267abe90750908e7b0cf35a7967770
+yuv422p10msble      478f06c71824c538f0018913753ed21f
 yuv422p12be         3a7cdaa7671394aae514d60c529e099d
 yuv422p12le         3369b2b6eed18a450ab0a5581335e375
+yuv422p12msbbe      25cdfe8bfdae924f96a350f1bc58633a
+yuv422p12msble      2d8905cbcb9eaf0d1084a59515fd22c7
 yuv422p14be         845c42b333e331a556008ef0a16afc85
 yuv422p14le         abcdaccf8d01a9133daca94383d27db7
 yuv422p16be         565299a5d6265c77d00fd1a1d0173834
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 00ba61e49a..5b80ffb0de 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -134,8 +134,12 @@ yuv411p             9106e283d5dbcfba01c611886d58871a
 yuv420p             9ea8ed3c22c31c0354b7face540bb280
 yuv420p10be         c6e76d651b991c0814a3047b2b3a517c
 yuv420p10le         3bf226b758c0b53b893729d97e7bc602
+yuv420p10msbbe      1f810646bef6018891f613cd8e33d839
+yuv420p10msble      a124c0b77e8b219da307439bcfb090a0
 yuv420p12be         8d63ddea0b9a886e859fec778d72a1ef
 yuv420p12le         f5b6dd8cd8b62fce64deac95aae916ef
+yuv420p12msbbe      1f810646bef6018891f613cd8e33d839
+yuv420p12msble      a124c0b77e8b219da307439bcfb090a0
 yuv420p14be         dda2c5c09b72b41a19943b3832ddd2d5
 yuv420p14le         e79f827393fb9344190bacacffe9978e
 yuv420p16be         62d08d547f857b254c1d31b5c40b20a6
@@ -145,8 +149,12 @@ yuv420p9le          e9d061aad8e0d07226d41421797e6cbf
 yuv422p             9bd12ab1efe6c3fe6d9f639b97b79c7e
 yuv422p10be         6dd930ff81b89b71f6cadf757e0e8b3e
 yuv422p10le         5e314f06833b5016cc5cd76c611f7a48
+yuv422p10msbbe      59c40eae138ddd69ac7c9b1479e35a53
+yuv422p10msble      bcb5e9da16ce5a910cead2e8bc3aee3e
 yuv422p12be         71c75f56a518f07be9946cbdb38b1d45
 yuv422p12le         1351d615ca6a97f206d04b9c4bb2d130
+yuv422p12msbbe      4d2de6dedd0edf0c52704acad43758a9
+yuv422p12msble      e7e7f4c7a00fc175e9e8a0ade99efa8a
 yuv422p14be         d3d1d29966b9737dc8bbc31c6d215c9e
 yuv422p14le         3ba9d5d2a32dc3e0ec025100621e20f9
 yuv422p16be         ed49651e67f96c34649762f4678091de
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index 2cdfa25236..aebcb2d26e 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -122,8 +122,12 @@ yuv411p             e4a040e0e786c4dae07d9d3f90a54905
 yuv422p             16ce67249c6ce7ef57a433646ad6dfc1
 yuv422p10be         62ae323dcc41aabf8ff6ecc53b119ce8
 yuv422p10le         60b20ad8c01ad7ea774ce1d74d8932ba
+yuv422p10msbbe      7b79dbcb696575ab55717e2a5d2eb223
+yuv422p10msble      b182fe96adaa08f5b1fa55a0efea76fe
 yuv422p12be         7bcb3e28323dbf566512b5b8a1d33380
 yuv422p12le         5877624df10122dd51c173f814bd5414
+yuv422p12msbbe      478e1a8ef5703e1a1eca438a9387446e
+yuv422p12msble      3000948ea9fe3975f21108b3effef999
 yuv422p14be         8bd7bfb0b35d68000ba57af66958ef2d
 yuv422p14le         471c7528e3da240d0a40f33548cbfbab
 yuv422p16be         8c193a8b6064e2379b2fb211cd2e6e37
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index c65d926b76..fe6299d558 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -128,8 +128,12 @@ yuv411p             c416371077dce13d31bf1dc706111ae7
 yuv420p             eb8d9f02db98e10400781428c43e9438
 yuv420p10be         5cd5c8181248b2dbdc7a8669caca3ed7
 yuv420p10le         95a92ee031fdb8812661c019d925fad0
+yuv420p10msbbe      1328786116716a03e66f7a219e79157e
+yuv420p10msble      8a65eaccf8e9be58d29a5c6cdbb85eb6
 yuv420p12be         8fe5d344a1576aba7892e855d2790df9
 yuv420p12le         c0897e2b53c1417fcf0cfbdbf9f54163
+yuv420p12msbbe      1328786116716a03e66f7a219e79157e
+yuv420p12msble      8a65eaccf8e9be58d29a5c6cdbb85eb6
 yuv420p14be         c5758d8062c61248110485243a75b712
 yuv420p14le         e283871dec73c853421d3aa098f071a7
 yuv420p16be         da4f5b6e537edf9cdea48a60defe520e
@@ -139,8 +143,12 @@ yuv420p9le          49eac58088b3e1cac170911382e2bb9d
 yuv422p             5aade4d118cd7243800a08d300033748
 yuv422p10be         a12d0957b703bd54cd569664b821ca3e
 yuv422p10le         8b6ac98276b10b7e540a5f689e5453fa
+yuv422p10msbbe      00637422bfaee1098b25568f3445cfd8
+yuv422p10msble      4fb8abce8d4220dc760e9e771ef99b4b
 yuv422p12be         b5d2142e6ccd9f69dee2c0643b14a741
 yuv422p12le         da75ea80662636c698986cdeab334669
+yuv422p12msbbe      46fde81861485aff4c0a4b408452f6ee
+yuv422p12msble      c388a19ec53170c5d4a4fd6aeb52126c
 yuv422p14be         027a593f148a96ff9e37a35e55608818
 yuv422p14le         4c1de1ce4f199ab8e94a28bf79ecedb6
 yuv422p16be         3d4b525c8056b740a4afa5b86cd79cd3
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index 268593a54d..092bc73211 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -133,8 +133,12 @@ yuv411p             8bf73777a5ff43c126be274245aceff1
 yuv420p             f1f4e7e94a76d5320049464bdeac24ed
 yuv420p10be         f7839393b65972595bdcb2485c6bf2a1
 yuv420p10le         cb00b1fc299baff8bc31086d8571fed6
+yuv420p10msbbe      b2224a3253b2b1ceacd61579ba56bc5c
+yuv420p10msble      47a88651e0b53d19c76f7276985aea8b
 yuv420p12be         e5bba4d9f2299e98e69c9347234545c8
 yuv420p12le         7110d2862c1da19e0298029383d31dab
+yuv420p12msbbe      b2224a3253b2b1ceacd61579ba56bc5c
+yuv420p12msble      47a88651e0b53d19c76f7276985aea8b
 yuv420p14be         240357c01079020ccc3d9287b5821a1b
 yuv420p14le         f7d0f5f5e72455b238897ed87cf67b3c
 yuv420p16be         8195046b708c613b3ca521c95db529ab
@@ -144,8 +148,12 @@ yuv420p9le          f8a4a93f98743cdd8d0ebadba2f8028a
 yuv422p             da122be331a53ec389ab6b2064488beb
 yuv422p10be         956f3c496807e62a288501e183fafad0
 yuv422p10le         43f99eb0d8abd1754572f77e430d4c41
+yuv422p10msbbe      025aa280d71a15d70d7f648a2a9ac534
+yuv422p10msble      eb095cbae2c81047b81b6304f1ed5d02
 yuv422p12be         9e8e40a95c4c762274e22026d16a4157
 yuv422p12le         28a5b358a919297c005bc491c91b2b15
+yuv422p12msbbe      32545dac0863e386726dd252f42f009e
+yuv422p12msble      e18a87e59ef68b2b12045b333076efa3
 yuv422p14be         ccff1e00f5d3adb899f1c266b22c9628
 yuv422p14le         f8a3bcbf8c55b1f570c078ff2f436b1f
 yuv422p16be         7f2363ccb6e69241c70411b6d063a2fe
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index 1e08ee60b1..63a26d1385 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -134,8 +134,12 @@ yuv411p             7e1300e89f5bc07939e2c4a6acbdf267
 yuv420p             a014c7eb7a8385d1dd092b7a583f1bff
 yuv420p10be         f9b154364efaa1af376fa6d8eeae6955
 yuv420p10le         15c83294ef560d57f25d16ae6e0fc70c
+yuv420p10msbbe      13a35f032d8b27fbe86be8581f0ec0b3
+yuv420p10msble      01400270da5519f681b48ab8212205c7
 yuv420p12be         34da9c4e289124122ba36a9d4fb133fa
 yuv420p12le         c19a477a07fcf88e37ab37b416d064c0
+yuv420p12msbbe      13a35f032d8b27fbe86be8581f0ec0b3
+yuv420p12msble      01400270da5519f681b48ab8212205c7
 yuv420p14be         64779858686946fc0e780baf7c1391b6
 yuv420p14le         c1d012a4f9d54fbc8b04fea96d85e903
 yuv420p16be         268b07358d8dc733ee81d0b87990d5af
@@ -145,8 +149,12 @@ yuv420p9le          83a6d32c91c15a3bc334bb9abf920654
 yuv422p             74f8006b4482db104f1986f49807a0af
 yuv422p10be         7291903c3c0cf4e5456dd9673a619f1d
 yuv422p10le         14cbaa728e888534359b9dddc5430f08
+yuv422p10msbbe      84584da376799390599031f77fbd0aee
+yuv422p10msble      06d4727c5c4d178736445bddcd9b03a0
 yuv422p12be         e9bc7f2da217fade40feb6960dcd894e
 yuv422p12le         8d8184e4d0f1eb50e1834ac0c4af8c33
+yuv422p12msbbe      bdf57a55ed1957997671d42535a1156f
+yuv422p12msble      fa213f34ebb3042349b3b8b88070f132
 yuv422p14be         2617c569ae9659d8fe6a01f96e2c9657
 yuv422p14le         7d01363cf090306cf93337c474cd8827
 yuv422p16be         86147d8bfb795ab1873c899611e2a361
diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad
index a57069f61f..acd893add5 100644
--- a/tests/ref/fate/filter-pixfmts-pad
+++ b/tests/ref/fate/filter-pixfmts-pad
@@ -57,13 +57,17 @@ yuv410p             cb871dcc1e84a7ef1d21f9237b88cf6e
 yuv411p             aec2c1740de9a62db0d41f4dda9121b0
 yuv420p             4398e408fc35436ce4b20468946f58b6
 yuv420p10le         a7d29bbe4e103fc0fb62b465f9540efa
+yuv420p10msble      c2811b855eccc728160bd4881708186f
 yuv420p12le         dafaf94e8d16cd846623dcaba0bc81b3
+yuv420p12msble      c2811b855eccc728160bd4881708186f
 yuv420p14le         ec80062819bc67f8866ba5105d8378ad
 yuv420p16le         83e437e3d6b7418c4163c24d41e199fa
 yuv420p9le          98a3bede99321386b9abab7926a9f553
 yuv422p             e43d68568d9f782908ba56bf1e09d5d5
 yuv422p10le         e3ec30aacff6c8abf6fe035a195ccd26
+yuv422p10msble      c5e38f841a7c5e4483f8eec19065574f
 yuv422p12le         921b8d532cf5d0eca4ab0fe9c6d4fef5
+yuv422p12msble      4bcd7f0ab997b8300a01d06b31eba0db
 yuv422p14le         dc41548f336883e9fd9664f329bd2a0c
 yuv422p16le         04c87d2fd42cba290a4d4099760e3ee4
 yuv422p9le          994a41c11610075c7b0c466f738f49e7
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 87752c6c4f..dbd0f9ac28 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -134,8 +134,12 @@ yuv411p             5af32557c93beb482e26e7af693104c6
 yuv420p             5d3ac239c3712143560b1dfbd48a7ddd
 yuv420p10be         95256d0cefca26429b2f41aabc9bee04
 yuv420p10le         1aae90a2cff18e516f004dae77ac78f7
+yuv420p10msbbe      1bba3bf10a2ececfdcbbf50173667cdd
+yuv420p10msble      8c01be0bf01d17ef0390163c9c2f37d9
 yuv420p12be         25a6da0f8045bc7bdeda544e1cf2387b
 yuv420p12le         c6e40a0851e1237281cd6500bef7a1fa
+yuv420p12msbbe      70ece70c1e117c4666b63e8d44321f13
+yuv420p12msble      d216ed2391bc99dcefe2ade54abfac9c
 yuv420p14be         b202fde5a53d529ddaa35c9467ff0b61
 yuv420p14le         36cac5d88b0d566cf835e84da6513e5a
 yuv420p16be         6f307c5b1a5941023f9029cb3a616f5c
@@ -145,8 +149,12 @@ yuv420p9le          0e6ade4219bdcbce32eceafc80d995d7
 yuv422p             9823e4d6bd1482b0cab3c44dab67f0a7
 yuv422p10be         42b9b936392b4a6a678028ace2cdcd20
 yuv422p10le         4bdc5e9ab3a16409600887335dbb1a66
+yuv422p10msbbe      b3c067b20202c4e892630cd72743d909
+yuv422p10msble      d84eb3f8f33e9dc6b753d3b12033771b
 yuv422p12be         af6ec8146dd7860b510017c22e8d0c80
 yuv422p12le         d69676f61d2693cfd163b3ce3f79fb56
+yuv422p12msbbe      54b08dcf6c243aee5f50ecd795c80a29
+yuv422p12msble      39ed974d5f1ceb28b56e298b81a08463
 yuv422p14be         2a005a86b80b947c953d11ae170551c7
 yuv422p14le         dcbde0634eb70bed62dde097c80a1643
 yuv422p16be         a772b46454e415ce454c0999ebb71486
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index 8f36938517..d5554e6c1b 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -117,8 +117,12 @@ yuv410p             4c0143429edd30aa01493447c90132ea
 yuv420p             2fa5b2201c75034206cc20e2c6134aed
 yuv420p10be         0931660f930d9be8aea9d0c76b406055
 yuv420p10le         9ce12b168c49db871836c979b526c1f1
+yuv420p10msbbe      c3ba380ff4a14b651c05d4c863c897c2
+yuv420p10msble      62b90f6ee22bbcb17ee6bb879a292600
 yuv420p12be         73d6be4230b6f4e4e269977afab56323
 yuv420p12le         6938815c8acd690138506cbb5f005fb8
+yuv420p12msbbe      c3ba380ff4a14b651c05d4c863c897c2
+yuv420p12msble      62b90f6ee22bbcb17ee6bb879a292600
 yuv420p14be         bf76a805b9c2f9808c73492d3b8da268
 yuv420p14le         5df47483b89ffe6ef4bbf14058d7d3b3
 yuv420p16be         3a64132681656be6db635f4e6a282dc9
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 2984864e91..5a9453eb37 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -134,8 +134,12 @@ yuv411p             3fce29db403a25f81be39e01aaf6ff3a
 yuv420p             d64fae96fac22aefa8fbcf45a09f37c1
 yuv420p10be         63f545453139f38883cfa1210f7b6ac5
 yuv420p10le         925de8b0bf9519c4b841afab4dd6bb25
+yuv420p10msbbe      04cce3d17a60b419cfb4e914f9b80809
+yuv420p10msble      7ccfb29763104c20a2e391b91a8cc07b
 yuv420p12be         619425168c3b8bb9da68e7810bf5eacf
 yuv420p12le         403d7d96939fa538b04f7b7b26ac6868
+yuv420p12msbbe      04cce3d17a60b419cfb4e914f9b80809
+yuv420p12msble      7ccfb29763104c20a2e391b91a8cc07b
 yuv420p14be         22d2d9fb5883410807ede4066e735426
 yuv420p14le         5cace6a24a1ff5d2a41a3c909c4bc41f
 yuv420p16be         0a6499a1b22230ad030448d3ac95b5c1
@@ -145,8 +149,12 @@ yuv420p9le          c3ec4bffc19c49edafd769a7dfccd9c1
 yuv422p             54f608c9d8bc56979aeaa7863820f5d3
 yuv422p10be         fbd6329d2decbe318be4d89dc8ade3a3
 yuv422p10le         7d7bdf4f68d8a7698e92722625c59c53
+yuv422p10msbbe      c76f9021a6efd9d354de1ce265d9924d
+yuv422p10msble      6af065da37a04ad1db95d4061f129d41
 yuv422p12be         d6ca250820312bab977ce88d2ef65c13
 yuv422p12le         3185b59dddc7ee67251d9829a977130b
+yuv422p12msbbe      2a31770a165d72be6fc2f6a16337c297
+yuv422p12msble      661b82b6a48938b64c39abb1328b5b13
 yuv422p14be         3bc3a72c7cf995981bd8eb45f23705b3
 yuv422p14le         5987087bbc03d8cbff4c41bce03451d9
 yuv422p16be         97d95a9cfe8f67fb20a4c983c7fdc215
diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils
index 738ce0289c..c4ad705b3d 100644
--- a/tests/ref/fate/imgutils
+++ b/tests/ref/fate/imgutils
@@ -310,6 +310,14 @@ 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
+yuv420p12msbbe  planes: 3, linesizes: 128  64  64   0, plane_sizes:  6144  1536  1536     0, plane_offsets:  6144  1536     0, total_size: 9216
+yuv420p12msble  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
+yuv422p12msbbe  planes: 3, linesizes: 128  64  64   0, plane_sizes:  6144  3072  3072     0, plane_offsets:  6144  3072     0, total_size: 12288
+yuv422p12msble  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 +575,11 @@ 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
+yuv420p12msbbe  total_size:   9216,  black_unknown_crc: 0x4d4d9903,  black_tv_crc: 0x4d4d9903,  black_pc_crc: 0x69c6fe01
+yuv420p12msble  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
+yuv422p12msbbe  total_size:  12288,  black_unknown_crc: 0x0bbe5df7,  black_tv_crc: 0x0bbe5df7,  black_pc_crc: 0x16a51378
+yuv422p12msble  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 13940c10ca45f9bae9b35ef8d585db7433f45286 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 23:36:33 +0100
Subject: [PATCH 3/9] swscale: add support for 10/12-bit grayscale MSB pixfmts

---
 libswscale/format.c           | 8 ++++++++
 libswscale/input.c            | 4 ++++
 libswscale/swscale_unscaled.c | 2 ++
 3 files changed, 14 insertions(+)

diff --git a/libswscale/format.c b/libswscale/format.c
index 9741688e98..d2befcf55f 100644
--- a/libswscale/format.c
+++ b/libswscale/format.c
@@ -91,6 +91,10 @@ static const LegacyFormatEntry legacy_format_entries[] = {
     [AV_PIX_FMT_GRAY14LE]       = { 1, 1 },
     [AV_PIX_FMT_GRAY16BE]       = { 1, 1 },
     [AV_PIX_FMT_GRAY16LE]       = { 1, 1 },
+    [AV_PIX_FMT_GRAY10MSBBE]    = { 1, 1 },
+    [AV_PIX_FMT_GRAY10MSBLE]    = { 1, 1 },
+    [AV_PIX_FMT_GRAY12MSBBE]    = { 1, 1 },
+    [AV_PIX_FMT_GRAY12MSBLE]    = { 1, 1 },
     [AV_PIX_FMT_YUV440P]        = { 1, 1 },
     [AV_PIX_FMT_YUVJ440P]       = { 1, 1 },
     [AV_PIX_FMT_YUV440P10LE]    = { 1, 1 },
@@ -979,6 +983,10 @@ static int fmt_read_write(enum AVPixelFormat fmt, SwsReadWriteOp *rw_op,
     case AV_PIX_FMT_GRAY14LE:
     case AV_PIX_FMT_GRAY16BE:
     case AV_PIX_FMT_GRAY16LE:
+    case AV_PIX_FMT_GRAY10MSBBE:
+    case AV_PIX_FMT_GRAY10MSBLE:
+    case AV_PIX_FMT_GRAY12MSBBE:
+    case AV_PIX_FMT_GRAY12MSBLE:
     //case AV_PIX_FMT_GRAYF16BE: TODO
     //case AV_PIX_FMT_GRAYF16LE:
     //case AV_PIX_FMT_YAF16BE:
diff --git a/libswscale/input.c b/libswscale/input.c
index eb4eb3101e..fd19d1a257 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -2469,15 +2469,19 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
         *alpToYV12 = bswap16Y_c;
         break;
 #endif
+    case AV_PIX_FMT_GRAY10MSBLE:
     case AV_PIX_FMT_YUV444P10MSBLE:
         *lumToYV12 = shf16_10LEToY_c;
         break;
+    case AV_PIX_FMT_GRAY12MSBLE:
     case AV_PIX_FMT_YUV444P12MSBLE:
         *lumToYV12 = shf16_12LEToY_c;
         break;
+    case AV_PIX_FMT_GRAY10MSBBE:
     case AV_PIX_FMT_YUV444P10MSBBE:
         *lumToYV12 = shf16_10BEToY_c;
         break;
+    case AV_PIX_FMT_GRAY12MSBBE:
     case AV_PIX_FMT_YUV444P12MSBBE:
         *lumToYV12 = shf16_12BEToY_c;
         break;
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 2c791e89fe..3f9a83dd60 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -2560,6 +2560,8 @@ void ff_get_unscaled_swscale(SwsInternal *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY10MSB) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY12MSB) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YA16)   ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_AYUV64) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP9)  ||
-- 
2.49.1


>From cae2a475553355cf7d13f77c5a158872485573b1 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 23:24:08 +0100
Subject: [PATCH 4/9] swscale: add support for 10/12-bit 422 and 444 MSB
 pixfmts

---
 libswscale/format.c              | 16 ++++++++++++++++
 libswscale/input.c               | 16 ++++++++++++++++
 libswscale/swscale_unscaled.c    |  4 ++++
 tests/ref/fate/sws-pixdesc-query | 22 ++++++++++++++++++++++
 4 files changed, 58 insertions(+)

diff --git a/libswscale/format.c b/libswscale/format.c
index d2befcf55f..d57f6fee62 100644
--- a/libswscale/format.c
+++ b/libswscale/format.c
@@ -159,6 +159,10 @@ static const LegacyFormatEntry legacy_format_entries[] = {
     [AV_PIX_FMT_YUV420P12LE]    = { 1, 1 },
     [AV_PIX_FMT_YUV420P14BE]    = { 1, 1 },
     [AV_PIX_FMT_YUV420P14LE]    = { 1, 1 },
+    [AV_PIX_FMT_YUV420P10MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV420P10MSBLE] = { 1, 1 },
+    [AV_PIX_FMT_YUV420P12MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV420P12MSBLE] = { 1, 1 },
     [AV_PIX_FMT_YUV422P9BE]     = { 1, 1 },
     [AV_PIX_FMT_YUV422P9LE]     = { 1, 1 },
     [AV_PIX_FMT_YUV422P10BE]    = { 1, 1 },
@@ -167,6 +171,10 @@ static const LegacyFormatEntry legacy_format_entries[] = {
     [AV_PIX_FMT_YUV422P12LE]    = { 1, 1 },
     [AV_PIX_FMT_YUV422P14BE]    = { 1, 1 },
     [AV_PIX_FMT_YUV422P14LE]    = { 1, 1 },
+    [AV_PIX_FMT_YUV422P10MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV422P10MSBLE] = { 1, 1 },
+    [AV_PIX_FMT_YUV422P12MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV422P12MSBLE] = { 1, 1 },
     [AV_PIX_FMT_YUV444P9BE]     = { 1, 1 },
     [AV_PIX_FMT_YUV444P9LE]     = { 1, 1 },
     [AV_PIX_FMT_YUV444P10BE]    = { 1, 1 },
@@ -741,6 +749,10 @@ static int fmt_shift(enum AVPixelFormat fmt)
     case AV_PIX_FMT_P210LE:
     case AV_PIX_FMT_Y210BE:
     case AV_PIX_FMT_Y210LE:
+    case AV_PIX_FMT_YUV420P10MSBBE:
+    case AV_PIX_FMT_YUV420P10MSBLE:
+    case AV_PIX_FMT_YUV422P10MSBBE:
+    case AV_PIX_FMT_YUV422P10MSBLE:
     case AV_PIX_FMT_YUV444P10MSBBE:
     case AV_PIX_FMT_YUV444P10MSBLE:
     case AV_PIX_FMT_GBRP10MSBBE:
@@ -756,6 +768,10 @@ static int fmt_shift(enum AVPixelFormat fmt)
     case AV_PIX_FMT_XV36LE:
     case AV_PIX_FMT_XYZ12BE:
     case AV_PIX_FMT_XYZ12LE:
+    case AV_PIX_FMT_YUV420P12MSBBE:
+    case AV_PIX_FMT_YUV420P12MSBLE:
+    case AV_PIX_FMT_YUV422P12MSBBE:
+    case AV_PIX_FMT_YUV422P12MSBLE:
     case AV_PIX_FMT_YUV444P12MSBBE:
     case AV_PIX_FMT_YUV444P12MSBLE:
     case AV_PIX_FMT_GBRP12MSBBE:
diff --git a/libswscale/input.c b/libswscale/input.c
index fd19d1a257..8efc42b57b 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -1992,15 +1992,23 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
         *chrToYV12 = bswap16UV_c;
         break;
 #endif
+    case AV_PIX_FMT_YUV420P10MSBLE:
+    case AV_PIX_FMT_YUV422P10MSBLE:
     case AV_PIX_FMT_YUV444P10MSBLE:
         *chrToYV12 = shf16_10LEToUV_c;
         break;
+    case AV_PIX_FMT_YUV420P12MSBLE:
+    case AV_PIX_FMT_YUV422P12MSBLE:
     case AV_PIX_FMT_YUV444P12MSBLE:
         *chrToYV12 = shf16_12LEToUV_c;
         break;
+    case AV_PIX_FMT_YUV420P10MSBBE:
+    case AV_PIX_FMT_YUV422P10MSBBE:
     case AV_PIX_FMT_YUV444P10MSBBE:
         *chrToYV12 = shf16_10BEToUV_c;
         break;
+    case AV_PIX_FMT_YUV420P12MSBBE:
+    case AV_PIX_FMT_YUV422P12MSBBE:
     case AV_PIX_FMT_YUV444P12MSBBE:
         *chrToYV12 = shf16_12BEToUV_c;
         break;
@@ -2470,18 +2478,26 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
         break;
 #endif
     case AV_PIX_FMT_GRAY10MSBLE:
+    case AV_PIX_FMT_YUV420P10MSBLE:
+    case AV_PIX_FMT_YUV422P10MSBLE:
     case AV_PIX_FMT_YUV444P10MSBLE:
         *lumToYV12 = shf16_10LEToY_c;
         break;
     case AV_PIX_FMT_GRAY12MSBLE:
+    case AV_PIX_FMT_YUV420P12MSBLE:
+    case AV_PIX_FMT_YUV422P12MSBLE:
     case AV_PIX_FMT_YUV444P12MSBLE:
         *lumToYV12 = shf16_12LEToY_c;
         break;
     case AV_PIX_FMT_GRAY10MSBBE:
+    case AV_PIX_FMT_YUV420P10MSBBE:
+    case AV_PIX_FMT_YUV422P10MSBBE:
     case AV_PIX_FMT_YUV444P10MSBBE:
         *lumToYV12 = shf16_10BEToY_c;
         break;
     case AV_PIX_FMT_GRAY12MSBBE:
+    case AV_PIX_FMT_YUV420P12MSBBE:
+    case AV_PIX_FMT_YUV422P12MSBBE:
     case AV_PIX_FMT_YUV444P12MSBBE:
         *lumToYV12 = shf16_12BEToY_c;
         break;
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 3f9a83dd60..d169a3b498 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -2588,11 +2588,15 @@ void ff_get_unscaled_swscale(SwsInternal *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P10MSB) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P12MSB) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P9)  ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P10) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P10MSB) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P12MSB) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV440P10) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV440P12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P9)  ||
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index baca687697..bee2c65b9d 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -119,6 +119,8 @@ isNBPS:
   yuv420p10msble
   yuv420p12be
   yuv420p12le
+  yuv420p12msbbe
+  yuv420p12msble
   yuv420p14be
   yuv420p14le
   yuv420p9be
@@ -129,6 +131,8 @@ isNBPS:
   yuv422p10msble
   yuv422p12be
   yuv422p12le
+  yuv422p12msbbe
+  yuv422p12msble
   yuv422p14be
   yuv422p14le
   yuv422p9be
@@ -240,12 +244,14 @@ isBE:
   yuv420p10be
   yuv420p10msbbe
   yuv420p12be
+  yuv420p12msbbe
   yuv420p14be
   yuv420p16be
   yuv420p9be
   yuv422p10be
   yuv422p10msbbe
   yuv422p12be
+  yuv422p12msbbe
   yuv422p14be
   yuv422p16be
   yuv422p9be
@@ -337,6 +343,8 @@ isYUV:
   yuv420p10msble
   yuv420p12be
   yuv420p12le
+  yuv420p12msbbe
+  yuv420p12msble
   yuv420p14be
   yuv420p14le
   yuv420p16be
@@ -350,6 +358,8 @@ isYUV:
   yuv422p10msble
   yuv422p12be
   yuv422p12le
+  yuv422p12msbbe
+  yuv422p12msble
   yuv422p14be
   yuv422p14le
   yuv422p16be
@@ -444,6 +454,8 @@ isPlanarYUV:
   yuv420p10msble
   yuv420p12be
   yuv420p12le
+  yuv420p12msbbe
+  yuv420p12msble
   yuv420p14be
   yuv420p14le
   yuv420p16be
@@ -457,6 +469,8 @@ isPlanarYUV:
   yuv422p10msble
   yuv422p12be
   yuv422p12le
+  yuv422p12msbbe
+  yuv422p12msble
   yuv422p14be
   yuv422p14le
   yuv422p16be
@@ -1068,6 +1082,8 @@ Planar:
   yuv420p10msble
   yuv420p12be
   yuv420p12le
+  yuv420p12msbbe
+  yuv420p12msble
   yuv420p14be
   yuv420p14le
   yuv420p16be
@@ -1081,6 +1097,8 @@ Planar:
   yuv422p10msble
   yuv422p12be
   yuv422p12le
+  yuv422p12msbbe
+  yuv422p12msble
   yuv422p14be
   yuv422p14le
   yuv422p16be
@@ -1279,8 +1297,12 @@ DataInHighBits:
   y212le
   yuv420p10msbbe
   yuv420p10msble
+  yuv420p12msbbe
+  yuv420p12msble
   yuv422p10msbbe
   yuv422p10msble
+  yuv422p12msbbe
+  yuv422p12msble
   yuv444p10msbbe
   yuv444p10msble
   yuv444p12msbbe
-- 
2.49.1


>From 9a2b1421ae4c870bf9c811ff4170789c63e944d1 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 22:36:33 +0100
Subject: [PATCH 5/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


>From 0c45cf6ba511fbdb286ea6e08d139b8f7343bc7a 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 +++
 libavcodec/vulkan_video.c    | 2 ++
 libavutil/hwcontext_vulkan.c | 4 ++--
 libavutil/vulkan.c           | 4 ++--
 4 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index cbf2ab8194..0e03df1ccb 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/libavcodec/vulkan_video.c b/libavcodec/vulkan_video.c
index 819940460f..471cfd5ad5 100644
--- a/libavcodec/vulkan_video.c
+++ b/libavcodec/vulkan_video.c
@@ -29,6 +29,8 @@ static const struct FFVkFormatMapEntry {
 } vk_format_map[] = {
     /* Gray formats */
     { VK_FORMAT_R8_UNORM,   AV_PIX_FMT_GRAY8,   VK_IMAGE_ASPECT_COLOR_BIT },
+    { VK_FORMAT_R10X6_UNORM_PACK16,  AV_PIX_FMT_GRAY10MSB,  VK_IMAGE_ASPECT_COLOR_BIT },
+    { VK_FORMAT_R12X4_UNORM_PACK16,  AV_PIX_FMT_GRAY12MSB,  VK_IMAGE_ASPECT_COLOR_BIT },
     { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GRAY16,  VK_IMAGE_ASPECT_COLOR_BIT },
     { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GRAYF32, VK_IMAGE_ASPECT_COLOR_BIT },
 
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index ae4b07c698..8af99fda54 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -359,8 +359,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   } },
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index ef755ad6f7..8a14f8a6c3 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -1672,8 +1672,8 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
         };
         return rep_tab[rep_fmt];
     };
-    case AV_PIX_FMT_GRAY10:
-    case AV_PIX_FMT_GRAY12:
+    case AV_PIX_FMT_GRAY10MSB:
+    case AV_PIX_FMT_GRAY12MSB:
     case AV_PIX_FMT_GRAY14:
     case AV_PIX_FMT_GRAY16:
     case AV_PIX_FMT_GBRAP10:
-- 
2.49.1


>From be971104cbe30b3d2ee494e06021d5f350f4b42a 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 ++++++
 libavcodec/vulkan_video.c    | 12 ++++++------
 libavutil/hwcontext_vulkan.c | 12 ++++++------
 libavutil/vulkan.c           | 12 ++++++------
 4 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index 0e03df1ccb..760913b0e5 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/libavcodec/vulkan_video.c b/libavcodec/vulkan_video.c
index 471cfd5ad5..8c86882a55 100644
--- a/libavcodec/vulkan_video.c
+++ b/libavcodec/vulkan_video.c
@@ -73,16 +73,16 @@ static const struct FFVkFormatMapEntry {
 
     /* 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 },
-    { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P10, ASPECT_3PLANE },
-    { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P12, ASPECT_3PLANE },
+    { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, AV_PIX_FMT_YUV420P10MSB, ASPECT_3PLANE },
+    { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV420P12MSB, ASPECT_3PLANE },
     { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P16, ASPECT_3PLANE },
     { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,    AV_PIX_FMT_YUV422P,   ASPECT_3PLANE },
-    { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P10, ASPECT_3PLANE },
-    { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P12, ASPECT_3PLANE },
+    { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV422P10MSB, ASPECT_3PLANE },
+    { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, AV_PIX_FMT_YUV422P12MSB, ASPECT_3PLANE },
     { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P16, ASPECT_3PLANE },
     { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,    AV_PIX_FMT_YUV444P,   ASPECT_3PLANE },
-    { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P10, ASPECT_3PLANE },
-    { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P12, ASPECT_3PLANE },
+    { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, AV_PIX_FMT_YUV444P10MSB, ASPECT_3PLANE },
+    { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, AV_PIX_FMT_YUV444P12MSB, ASPECT_3PLANE },
     { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P16, ASPECT_3PLANE },
 
     /* Single plane 422 at 8, 10, 12 and 16 bits */
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 8af99fda54..519dea379b 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -424,16 +424,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 */
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 8a14f8a6c3..7975ed27d2 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -1684,14 +1684,14 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
     case AV_PIX_FMT_GBRP12:
     case AV_PIX_FMT_GBRP14:
     case AV_PIX_FMT_GBRP16:
-    case AV_PIX_FMT_YUV420P10:
-    case AV_PIX_FMT_YUV420P12:
+    case AV_PIX_FMT_YUV420P10MSB:
+    case AV_PIX_FMT_YUV420P12MSB:
     case AV_PIX_FMT_YUV420P16:
-    case AV_PIX_FMT_YUV422P10:
-    case AV_PIX_FMT_YUV422P12:
+    case AV_PIX_FMT_YUV422P10MSB:
+    case AV_PIX_FMT_YUV422P12MSB:
     case AV_PIX_FMT_YUV422P16:
-    case AV_PIX_FMT_YUV444P10:
-    case AV_PIX_FMT_YUV444P12:
+    case AV_PIX_FMT_YUV444P10MSB:
+    case AV_PIX_FMT_YUV444P12MSB:
     case AV_PIX_FMT_YUV444P16:
     case AV_PIX_FMT_YUVA420P10:
     case AV_PIX_FMT_YUVA420P16:
-- 
2.49.1


>From ce7fde4d5df243ce6fbde1b098da42f8fab2af53 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Mon, 27 Oct 2025 20:24:00 +0100
Subject: [PATCH 8/9] hwcontext_vulkan: fix planar 10 and 12-bit RGB formats
 using the new MSB formats

---
 libavcodec/ffv1enc_vulkan.c  |  8 ++++----
 libavcodec/vulkan_decode.c   |  1 +
 libavcodec/vulkan_ffv1.c     |  2 +-
 libavutil/hwcontext_vulkan.c |  4 ++--
 libavutil/vulkan.c           | 10 +++++-----
 5 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index a54180a98b..3d16eeac83 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -242,8 +242,8 @@ static int run_rct_search(AVCodecContext *avctx, FFVkExecContext *exec,
         .micro_version = f->micro_version,
     };
 
-    if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10 ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12 ||
+    if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10MSB ||
+        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB ||
         avctx->sw_pix_fmt == AV_PIX_FMT_GBRP14)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else
@@ -503,8 +503,8 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx,
     };
 
     /* For some reason the C FFv1 encoder/decoder treats these differently */
-    if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10 ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12 ||
+    if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10MSB ||
+        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB ||
         avctx->sw_pix_fmt == AV_PIX_FMT_GBRP14)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else
diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index 760913b0e5..11b4b32d5d 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1116,6 +1116,7 @@ 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_GBRP12: frames_ctx->sw_format = AV_PIX_FMT_GBRP12MSB; 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;
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index b02bc71683..3eb0484629 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -447,7 +447,7 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
 
 
     /* For some reason the C FFv1 encoder/decoder treats these differently */
-    if (sw_format == AV_PIX_FMT_GBRP10 || sw_format == AV_PIX_FMT_GBRP12 ||
+    if (sw_format == AV_PIX_FMT_GBRP10MSB || sw_format == AV_PIX_FMT_GBRP12MSB ||
         sw_format == AV_PIX_FMT_GBRP14)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else if (sw_format == AV_PIX_FMT_X2BGR10)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 519dea379b..65e545521a 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -386,8 +386,8 @@ static const struct FFVkFormatEntry {
 
     /* Planar RGB */
     { VK_FORMAT_R8_UNORM,   AV_PIX_FMT_GBRP,     VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
-    { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP10,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
-    { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP12,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
+    { VK_FORMAT_R10X6_UNORM_PACK16,  AV_PIX_FMT_GBRP10MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
+    { VK_FORMAT_R12X4_UNORM_PACK16,  AV_PIX_FMT_GBRP12MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP14,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP16,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GBRPF32,  VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT } },
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 7975ed27d2..3e3a15b5e5 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -1534,7 +1534,7 @@ int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
         pix_fmt == AV_PIX_FMT_RGBA64 || pix_fmt == AV_PIX_FMT_RGB565 ||
         pix_fmt == AV_PIX_FMT_BGR565 || pix_fmt == AV_PIX_FMT_BGR0   ||
         pix_fmt == AV_PIX_FMT_0BGR   || pix_fmt == AV_PIX_FMT_RGB0   ||
-        pix_fmt == AV_PIX_FMT_GBRP10  || pix_fmt == AV_PIX_FMT_GBRP12 ||
+        pix_fmt == AV_PIX_FMT_GBRP10MSB  || pix_fmt == AV_PIX_FMT_GBRP12MSB ||
         pix_fmt == AV_PIX_FMT_GBRP14  || pix_fmt == AV_PIX_FMT_GBRP16 ||
         pix_fmt == AV_PIX_FMT_GBRAP   || pix_fmt == AV_PIX_FMT_GBRAP10 ||
         pix_fmt == AV_PIX_FMT_GBRAP12 || pix_fmt == AV_PIX_FMT_GBRAP14 ||
@@ -1557,8 +1557,8 @@ void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
     case AV_PIX_FMT_GBRAP12:
     case AV_PIX_FMT_GBRAP14:
     case AV_PIX_FMT_GBRAP16:
-    case AV_PIX_FMT_GBRP10:
-    case AV_PIX_FMT_GBRP12:
+    case AV_PIX_FMT_GBRP10MSB:
+    case AV_PIX_FMT_GBRP12MSB:
     case AV_PIX_FMT_GBRP14:
     case AV_PIX_FMT_GBRP16:
     case AV_PIX_FMT_GBRPF32:
@@ -1680,8 +1680,8 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
     case AV_PIX_FMT_GBRAP12:
     case AV_PIX_FMT_GBRAP14:
     case AV_PIX_FMT_GBRAP16:
-    case AV_PIX_FMT_GBRP10:
-    case AV_PIX_FMT_GBRP12:
+    case AV_PIX_FMT_GBRP10MSB:
+    case AV_PIX_FMT_GBRP12MSB:
     case AV_PIX_FMT_GBRP14:
     case AV_PIX_FMT_GBRP16:
     case AV_PIX_FMT_YUV420P10MSB:
-- 
2.49.1


>From 9de6a426b7bc934ee93f248ff810fabd0566b5a8 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Sun, 26 Oct 2025 22:01:37 +0100
Subject: [PATCH 9/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.
---
 libavcodec/ffv1enc_vulkan.c  |  6 ++----
 libavcodec/vulkan_ffv1.c     |  3 +--
 libavutil/hwcontext_vulkan.c |  7 -------
 libavutil/vulkan.c           | 10 +---------
 4 files changed, 4 insertions(+), 22 deletions(-)

diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index 3d16eeac83..0baeabd588 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -243,8 +243,7 @@ static int run_rct_search(AVCodecContext *avctx, FFVkExecContext *exec,
     };
 
     if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10MSB ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP14)
+        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else
         ff_vk_set_perm(avctx->sw_pix_fmt, pd.fmt_lut, 1);
@@ -504,8 +503,7 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx,
 
     /* For some reason the C FFv1 encoder/decoder treats these differently */
     if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10MSB ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB ||
-        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP14)
+        avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12MSB)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else
         ff_vk_set_perm(avctx->sw_pix_fmt, pd.fmt_lut, 1);
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index 3eb0484629..4428d65373 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -447,8 +447,7 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
 
 
     /* For some reason the C FFv1 encoder/decoder treats these differently */
-    if (sw_format == AV_PIX_FMT_GBRP10MSB || sw_format == AV_PIX_FMT_GBRP12MSB ||
-        sw_format == AV_PIX_FMT_GBRP14)
+    if (sw_format == AV_PIX_FMT_GBRP10MSB || sw_format == AV_PIX_FMT_GBRP12MSB)
         memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
     else if (sw_format == AV_PIX_FMT_X2BGR10)
         memcpy(pd.fmt_lut, (int [4]) { 0, 2, 1, 3 }, 4*sizeof(int));
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 65e545521a..a8f0177519 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -361,7 +361,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 } },
@@ -388,7 +387,6 @@ static const struct FFVkFormatEntry {
     { VK_FORMAT_R8_UNORM,   AV_PIX_FMT_GBRP,     VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
     { VK_FORMAT_R10X6_UNORM_PACK16,  AV_PIX_FMT_GBRP10MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R12X4_UNORM_PACK16,  AV_PIX_FMT_GBRP12MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
-    { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP14,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R16_UNORM,  AV_PIX_FMT_GBRP16,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
     { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GBRPF32,  VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT } },
 
@@ -445,19 +443,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 */
diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c
index 3e3a15b5e5..c7d06238c5 100644
--- a/libavutil/vulkan.c
+++ b/libavutil/vulkan.c
@@ -1535,7 +1535,7 @@ int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
         pix_fmt == AV_PIX_FMT_BGR565 || pix_fmt == AV_PIX_FMT_BGR0   ||
         pix_fmt == AV_PIX_FMT_0BGR   || pix_fmt == AV_PIX_FMT_RGB0   ||
         pix_fmt == AV_PIX_FMT_GBRP10MSB  || pix_fmt == AV_PIX_FMT_GBRP12MSB ||
-        pix_fmt == AV_PIX_FMT_GBRP14  || pix_fmt == AV_PIX_FMT_GBRP16 ||
+        pix_fmt == AV_PIX_FMT_GBRP16 ||
         pix_fmt == AV_PIX_FMT_GBRAP   || pix_fmt == AV_PIX_FMT_GBRAP10 ||
         pix_fmt == AV_PIX_FMT_GBRAP12 || pix_fmt == AV_PIX_FMT_GBRAP14 ||
         pix_fmt == AV_PIX_FMT_GBRAP16 || pix_fmt == AV_PIX_FMT_GBRAP32 ||
@@ -1559,7 +1559,6 @@ void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
     case AV_PIX_FMT_GBRAP16:
     case AV_PIX_FMT_GBRP10MSB:
     case AV_PIX_FMT_GBRP12MSB:
-    case AV_PIX_FMT_GBRP14:
     case AV_PIX_FMT_GBRP16:
     case AV_PIX_FMT_GBRPF32:
     case AV_PIX_FMT_GBRAP32:
@@ -1674,7 +1673,6 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
     };
     case AV_PIX_FMT_GRAY10MSB:
     case AV_PIX_FMT_GRAY12MSB:
-    case AV_PIX_FMT_GRAY14:
     case AV_PIX_FMT_GRAY16:
     case AV_PIX_FMT_GBRAP10:
     case AV_PIX_FMT_GBRAP12:
@@ -1682,7 +1680,6 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
     case AV_PIX_FMT_GBRAP16:
     case AV_PIX_FMT_GBRP10MSB:
     case AV_PIX_FMT_GBRP12MSB:
-    case AV_PIX_FMT_GBRP14:
     case AV_PIX_FMT_GBRP16:
     case AV_PIX_FMT_YUV420P10MSB:
     case AV_PIX_FMT_YUV420P12MSB:
@@ -1693,13 +1690,8 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt,
     case AV_PIX_FMT_YUV444P10MSB:
     case AV_PIX_FMT_YUV444P12MSB:
     case AV_PIX_FMT_YUV444P16:
-    case AV_PIX_FMT_YUVA420P10:
     case AV_PIX_FMT_YUVA420P16:
-    case AV_PIX_FMT_YUVA422P10:
-    case AV_PIX_FMT_YUVA422P12:
     case AV_PIX_FMT_YUVA422P16:
-    case AV_PIX_FMT_YUVA444P10:
-    case AV_PIX_FMT_YUVA444P12:
     case AV_PIX_FMT_YUVA444P16:
     case AV_PIX_FMT_BAYER_RGGB16: {
         const char *rep_tab[] = {
-- 
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-27 20:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-27 20:15 [FFmpeg-devel] [PATCH] pixfmt: add 10+12bit LSB-padded gray/420/444 pixel formats for Vulkan (PR #20771) 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