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 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 bit MSB formats
@ 2025-07-04 22:17 Timo Rothenpieler
  2025-07-04 22:17 ` [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 " Timo Rothenpieler
  2025-07-04 22:26 ` [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 " Timo Rothenpieler
  0 siblings, 2 replies; 3+ messages in thread
From: Timo Rothenpieler @ 2025-07-04 22:17 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Timo Rothenpieler

---
 libavutil/pixdesc.c | 96 +++++++++++++++++++++++++++++++++++++++++++++
 libavutil/pixfmt.h  | 15 +++++++
 2 files changed, 111 insertions(+)

diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 53adde5aba..8eb04d1f12 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -1701,6 +1701,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_YUV444P10MSBLE] = {
+        .name = "yuv444p10msble",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .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_YUV444P10MSBBE] = {
+        .name = "yuv444p10msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .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_YUV444P9LE] = {
         .name = "yuv444p9le",
         .nb_components = 3,
@@ -1749,6 +1773,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_YUV444P12MSBLE] = {
+        .name = "yuv444p12msble",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .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_YUV444P12MSBBE] = {
+        .name = "yuv444p12msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .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_YUV444P14LE] = {
         .name = "yuv444p14le",
         .nb_components = 3,
@@ -1877,6 +1925,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_FLAG_RGB,
     },
+    [AV_PIX_FMT_GBRP10MSBLE] = {
+        .name = "gbrp10msble",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 2, 2, 0, 6, 10 },        /* R */
+            { 0, 2, 0, 6, 10 },        /* G */
+            { 1, 2, 0, 6, 10 },        /* B */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
+    },
+    [AV_PIX_FMT_GBRP10MSBBE] = {
+        .name = "gbrp10msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 2, 2, 0, 6, 10 },        /* R */
+            { 0, 2, 0, 6, 10 },        /* G */
+            { 1, 2, 0, 6, 10 },        /* B */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
+    },
     [AV_PIX_FMT_GBRP12LE] = {
         .name = "gbrp12le",
         .nb_components = 3,
@@ -1901,6 +1973,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_FLAG_RGB,
     },
+    [AV_PIX_FMT_GBRP12MSBLE] = {
+        .name = "gbrp12msble",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 2, 2, 0, 4, 12 },        /* R */
+            { 0, 2, 0, 4, 12 },        /* G */
+            { 1, 2, 0, 4, 12 },        /* B */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
+    },
+    [AV_PIX_FMT_GBRP12MSBBE] = {
+        .name = "gbrp12msbbe",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 2, 2, 0, 4, 12 },        /* R */
+            { 0, 2, 0, 4, 12 },        /* G */
+            { 1, 2, 0, 4, 12 },        /* B */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB,
+    },
     [AV_PIX_FMT_GBRP14LE] = {
         .name = "gbrp14le",
         .nb_components = 3,
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index bf1b8ed008..9024850207 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -488,6 +488,15 @@ enum AVPixelFormat {
     AV_PIX_FMT_GBRAP32BE,   ///< planar GBRA 4:4:4:4 128bpp, big-endian
     AV_PIX_FMT_GBRAP32LE,   ///< planar GBRA 4:4:4:4 128bpp, little-endian
 
+    AV_PIX_FMT_YUV444P10MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
+    AV_PIX_FMT_YUV444P10MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
+    AV_PIX_FMT_YUV444P12MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
+    AV_PIX_FMT_YUV444P12MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
+    AV_PIX_FMT_GBRP10MSBBE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, big-endian
+    AV_PIX_FMT_GBRP10MSBLE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, little-endian
+    AV_PIX_FMT_GBRP12MSBBE,    ///< planar GBR 4:4:4 36bpp, lowest bits zero, big-endian
+    AV_PIX_FMT_GBRP12MSBLE,    ///< planar GBR 4:4:4 36bpp, 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
 };
 
@@ -540,6 +549,9 @@ 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_YUV444P10MSB AV_PIX_FMT_NE(YUV444P10MSBBE, YUV444P10MSBLE)
+#define AV_PIX_FMT_YUV444P12MSB AV_PIX_FMT_NE(YUV444P12MSBBE, YUV444P12MSBLE)
+
 #define AV_PIX_FMT_GBRP9     AV_PIX_FMT_NE(GBRP9BE ,    GBRP9LE)
 #define AV_PIX_FMT_GBRP10    AV_PIX_FMT_NE(GBRP10BE,    GBRP10LE)
 #define AV_PIX_FMT_GBRP12    AV_PIX_FMT_NE(GBRP12BE,    GBRP12LE)
@@ -551,6 +563,9 @@ enum AVPixelFormat {
 #define AV_PIX_FMT_GBRAP16   AV_PIX_FMT_NE(GBRAP16BE,   GBRAP16LE)
 #define AV_PIX_FMT_GBRAP32   AV_PIX_FMT_NE(GBRAP32BE,   GBRAP32LE)
 
+#define AV_PIX_FMT_GBRP10MSB AV_PIX_FMT_NE(GBRP10MSBBE, GBRP10MSBLE)
+#define AV_PIX_FMT_GBRP12MSB AV_PIX_FMT_NE(GBRP12MSBBE, GBRP12MSBLE)
+
 #define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE,    BAYER_BGGR16LE)
 #define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE,    BAYER_RGGB16LE)
 #define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE,    BAYER_GBRG16LE)
-- 
2.49.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 bit MSB formats
  2025-07-04 22:17 [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 bit MSB formats Timo Rothenpieler
@ 2025-07-04 22:17 ` Timo Rothenpieler
  2025-07-04 22:26 ` [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 " Timo Rothenpieler
  1 sibling, 0 replies; 3+ messages in thread
From: Timo Rothenpieler @ 2025-07-04 22:17 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Timo Rothenpieler

---
 libswscale/format.c                          |   8 +
 libswscale/input.c                           | 240 +++++++++++++++----
 libswscale/loongarch/output_lasx.c           |   1 +
 libswscale/loongarch/output_lsx.c            |   1 +
 libswscale/output.c                          | 117 +++++++++
 libswscale/ppc/swscale_altivec.c             |   2 +-
 libswscale/ppc/swscale_vsx.c                 |   2 +-
 libswscale/swscale_unscaled.c                |   6 +-
 libswscale/tests/floatimg_cmp.c              |   2 +
 libswscale/utils.c                           |   2 +
 libswscale/x86/swscale.c                     |   4 +-
 tests/ref/fate/filter-pixdesc-gbrp10msbbe    |   1 +
 tests/ref/fate/filter-pixdesc-gbrp10msble    |   1 +
 tests/ref/fate/filter-pixdesc-gbrp12msbbe    |   1 +
 tests/ref/fate/filter-pixdesc-gbrp12msble    |   1 +
 tests/ref/fate/filter-pixdesc-yuv444p10msbbe |   1 +
 tests/ref/fate/filter-pixdesc-yuv444p10msble |   1 +
 tests/ref/fate/filter-pixdesc-yuv444p12msbbe |   1 +
 tests/ref/fate/filter-pixdesc-yuv444p12msble |   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     |   8 +
 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      |   8 +
 tests/ref/fate/filter-pixfmts-vflip          |   8 +
 tests/ref/fate/imgutils                      |  16 ++
 tests/ref/fate/sws-floatimg-cmp              |  16 ++
 tests/ref/fate/sws-pixdesc-query             |  48 ++++
 33 files changed, 500 insertions(+), 57 deletions(-)
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrp10msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrp10msble
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrp12msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrp12msble
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv444p10msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv444p10msble
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv444p12msbbe
 create mode 100644 tests/ref/fate/filter-pixdesc-yuv444p12msble

diff --git a/libswscale/format.c b/libswscale/format.c
index e4c1348b90..53162f8756 100644
--- a/libswscale/format.c
+++ b/libswscale/format.c
@@ -157,6 +157,10 @@ static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_YUV444P12LE]    = { 1, 1 },
     [AV_PIX_FMT_YUV444P14BE]    = { 1, 1 },
     [AV_PIX_FMT_YUV444P14LE]    = { 1, 1 },
+    [AV_PIX_FMT_YUV444P10MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV444P10MSBLE] = { 1, 1 },
+    [AV_PIX_FMT_YUV444P12MSBBE] = { 1, 1 },
+    [AV_PIX_FMT_YUV444P12MSBLE] = { 1, 1 },
     [AV_PIX_FMT_GBRP]           = { 1, 1 },
     [AV_PIX_FMT_GBRP9LE]        = { 1, 1 },
     [AV_PIX_FMT_GBRP9BE]        = { 1, 1 },
@@ -164,8 +168,12 @@ static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_GBRP10BE]       = { 1, 1 },
     [AV_PIX_FMT_GBRAP10LE]      = { 1, 1 },
     [AV_PIX_FMT_GBRAP10BE]      = { 1, 1 },
+    [AV_PIX_FMT_GBRP10MSBLE]    = { 1, 1 },
+    [AV_PIX_FMT_GBRP10MSBBE]    = { 1, 1 },
     [AV_PIX_FMT_GBRP12LE]       = { 1, 1 },
     [AV_PIX_FMT_GBRP12BE]       = { 1, 1 },
+    [AV_PIX_FMT_GBRP12MSBLE]    = { 1, 1 },
+    [AV_PIX_FMT_GBRP12MSBBE]    = { 1, 1 },
     [AV_PIX_FMT_GBRAP12LE]      = { 1, 1 },
     [AV_PIX_FMT_GBRAP12BE]      = { 1, 1 },
     [AV_PIX_FMT_GBRP14LE]       = { 1, 1 },
diff --git a/libswscale/input.c b/libswscale/input.c
index 119e490cd3..32a0214ddf 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -1006,6 +1006,64 @@ p01x_wrapper(p010, 6)
 p01x_wrapper(p012, 4)
 p01x_uv_wrapper(p016, 0)
 
+#define shf16_uv_wrapper(shift) \
+    static void shf16_ ## shift ## LEToUV_c(uint8_t *dstU,                \
+                                         uint8_t *dstV,                   \
+                                         const uint8_t *unused0,          \
+                                         const uint8_t *src1,             \
+                                         const uint8_t *src2, int width,  \
+                                         uint32_t *unused, void *opq)     \
+    {                                                                     \
+        int i;                                                            \
+        for (i = 0; i < width; i++) {                                     \
+            AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 2) >> (16 - shift)); \
+            AV_WN16(dstV + i * 2, AV_RL16(src2 + i * 2) >> (16 - shift)); \
+        }                                                                 \
+    }                                                                     \
+                                                                          \
+    static void shf16_ ## shift ## BEToUV_c(uint8_t *dstU,                \
+                                         uint8_t *dstV,                   \
+                                         const uint8_t *unused0,          \
+                                         const uint8_t *src1,             \
+                                         const uint8_t *src2, int width,  \
+                                         uint32_t *unused, void *opq)     \
+    {                                                                     \
+        int i;                                                            \
+        for (i = 0; i < width; i++) {                                     \
+            AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 2) >> (16 - shift)); \
+            AV_WN16(dstV + i * 2, AV_RB16(src2 + i * 2) >> (16 - shift)); \
+        }                                                                 \
+    }
+
+#define shf16_wrapper(shift) \
+    static void shf16_ ## shift ## LEToY_c(uint8_t *dst,                      \
+                                           const uint8_t *src,                \
+                                           const uint8_t *unused1,            \
+                                           const uint8_t *unused2, int width, \
+                                           uint32_t *unused, void *opq)       \
+    {                                                                         \
+        int i;                                                                \
+        for (i = 0; i < width; i++) {                                         \
+            AV_WN16(dst + i * 2, AV_RL16(src + i * 2) >> (16 - shift));       \
+        }                                                                     \
+    }                                                                         \
+                                                                              \
+    static void shf16_ ## shift ## BEToY_c(uint8_t *dst,                      \
+                                           const uint8_t *src,                \
+                                           const uint8_t *unused1,            \
+                                           const uint8_t *unused2, int width, \
+                                           uint32_t *unused, void *opq)       \
+    {                                                                         \
+        int i;                                                                \
+        for (i = 0; i < width; i++) {                                         \
+            AV_WN16(dst + i * 2, AV_RB16(src + i * 2) >> (16 - shift));       \
+        }                                                                     \
+    }                                                                         \
+    shf16_uv_wrapper(shift)
+
+shf16_wrapper(10)
+shf16_wrapper(12)
+
 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
                        int width, uint32_t *rgb2yuv, void *opq)
 {
@@ -1153,56 +1211,66 @@ static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[
 
 #define rdpx(src) \
     (is_be ? AV_RB16(src) : AV_RL16(src))
-static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
-                                               int width, int bpc, int is_be, int32_t *rgb2yuv)
-{
-    int i;
-    const uint16_t **src = (const uint16_t **)_src;
-    uint16_t *dst        = (uint16_t *)_dst;
-    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
-    int shift = bpc < 16 ? bpc : 14;
-    for (i = 0; i < width; i++) {
-        int g = rdpx(src[0] + i);
-        int b = rdpx(src[1] + i);
-        int r = rdpx(src[2] + i);
 
-        dst[i] = (ry*r + gy*g + by*b + (16 << (RGB2YUV_SHIFT + bpc - 8)) + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);
-    }
-}
-
-static av_always_inline void planar_rgb16_to_a(uint8_t *_dst, const uint8_t *_src[4],
-                                               int width, int bpc, int is_be, int32_t *rgb2yuv)
-{
-    int i;
-    const uint16_t **src = (const uint16_t **)_src;
-    uint16_t *dst        = (uint16_t *)_dst;
-    int shift = bpc < 16 ? bpc : 14;
-
-    for (i = 0; i < width; i++) {
-        dst[i] = rdpx(src[3] + i) << (14 - shift);
-    }
-}
-
-static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
-                                                const uint8_t *_src[4], int width,
-                                                int bpc, int is_be, int32_t *rgb2yuv)
-{
-    int i;
-    const uint16_t **src = (const uint16_t **)_src;
-    uint16_t *dstU       = (uint16_t *)_dstU;
-    uint16_t *dstV       = (uint16_t *)_dstV;
-    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
-    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
-    int shift = bpc < 16 ? bpc : 14;
-    for (i = 0; i < width; i++) {
-        int g = rdpx(src[0] + i);
-        int b = rdpx(src[1] + i);
-        int r = rdpx(src[2] + i);
+#define shifted_planar_rgb16(rdpx_shift)                                                                       \
+    static av_always_inline void planar_rgb16_s ## rdpx_shift ## _to_y(uint8_t *_dst, const uint8_t *_src[4],  \
+                                                   int width, int bpc, int is_be, int32_t *rgb2yuv)            \
+    {                                                                                                          \
+        int i;                                                                                                 \
+        const uint16_t **src = (const uint16_t **)_src;                                                        \
+        uint16_t *dst        = (uint16_t *)_dst;                                                               \
+        int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];                              \
+        int shift = bpc < 16 ? bpc : 14;                                                                       \
+        for (i = 0; i < width; i++) {                                                                          \
+            int g = rdpx(src[0] + i) >> (16 - rdpx_shift);                                                     \
+            int b = rdpx(src[1] + i) >> (16 - rdpx_shift);                                                     \
+            int r = rdpx(src[2] + i) >> (16 - rdpx_shift);                                                     \
+                                                                                                               \
+            dst[i] = (ry*r + gy*g + by*b + (16 << (RGB2YUV_SHIFT + bpc - 8))                                   \
+                     + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);                   \
+        }                                                                                                      \
+    }                                                                                                          \
+                                                                                                               \
+    static av_always_inline void planar_rgb16_s ## rdpx_shift ## _to_a(uint8_t *_dst, const uint8_t *_src[4],  \
+                                                   int width, int bpc, int is_be, int32_t *rgb2yuv)            \
+    {                                                                                                          \
+        int i;                                                                                                 \
+        const uint16_t **src = (const uint16_t **)_src;                                                        \
+        uint16_t *dst        = (uint16_t *)_dst;                                                               \
+        int shift = (bpc < 16 ? bpc : 14) + 16 - rdpx_shift;                                                   \
+                                                                                                               \
+        for (i = 0; i < width; i++) {                                                                          \
+            dst[i] = rdpx(src[3] + i) << (14 - shift);                                                         \
+        }                                                                                                      \
+    }                                                                                                          \
+                                                                                                               \
+    static av_always_inline void planar_rgb16_s ## rdpx_shift ## _to_uv(uint8_t *_dstU, uint8_t *_dstV,        \
+                                                    const uint8_t *_src[4], int width,                         \
+                                                    int bpc, int is_be, int32_t *rgb2yuv)                      \
+    {                                                                                                          \
+        int i;                                                                                                 \
+        const uint16_t **src = (const uint16_t **)_src;                                                        \
+        uint16_t *dstU       = (uint16_t *)_dstU;                                                              \
+        uint16_t *dstV       = (uint16_t *)_dstV;                                                              \
+        int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];                              \
+        int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];                              \
+        int shift = bpc < 16 ? bpc : 14;                                                                       \
+        for (i = 0; i < width; i++) {                                                                          \
+            int g = rdpx(src[0] + i) >> (16 - rdpx_shift);                                                     \
+            int b = rdpx(src[1] + i) >> (16 - rdpx_shift);                                                     \
+            int r = rdpx(src[2] + i) >> (16 - rdpx_shift);                                                     \
+                                                                                                               \
+            dstU[i] = (ru*r + gu*g + bu*b + (128 << (RGB2YUV_SHIFT + bpc - 8))                                 \
+                      + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);                  \
+            dstV[i] = (rv*r + gv*g + bv*b + (128 << (RGB2YUV_SHIFT + bpc - 8))                                 \
+                      + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);                  \
+        }                                                                                                      \
+    }
+
+shifted_planar_rgb16(16)
+shifted_planar_rgb16(12)
+shifted_planar_rgb16(10)
 
-        dstU[i] = (ru*r + gu*g + bu*b + (128 << (RGB2YUV_SHIFT + bpc - 8)) + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);
-        dstV[i] = (rv*r + gv*g + bv*b + (128 << (RGB2YUV_SHIFT + bpc - 8)) + (1 << (RGB2YUV_SHIFT + shift - 15))) >> (RGB2YUV_SHIFT + shift - 14);
-    }
-}
 #undef rdpx
 
 #define rdpx(src) (is_be ? av_int2float(AV_RB32(src)): av_int2float(AV_RL32(src)))
@@ -1334,13 +1402,13 @@ static av_always_inline void read_yaf32_alpha_c(uint8_t *_dst, const uint8_t *_s
 static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],              \
                                                   int w, int32_t *rgb2yuv, void *opq)               \
 {                                                                                                   \
-    planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv);                                         \
+    planar_rgb16_s16_to_y(dst, src, w, nbits, endian, rgb2yuv);                                     \
 }                                                                                                   \
 static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                    \
                                                    const uint8_t *src[4], int w, int32_t *rgb2yuv,  \
                                                    void *opq)                                       \
 {                                                                                                   \
-    planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                                 \
+    planar_rgb16_s16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                             \
 }                                                                                                   \
 
 #define rgb9plus_planar_transparency_funcs(nbits)                           \
@@ -1348,19 +1416,36 @@ static void planar_rgb##nbits##le_to_a(uint8_t *dst, const uint8_t *src[4], \
                                        int w, int32_t *rgb2yuv,             \
                                        void *opq)                           \
 {                                                                           \
-    planar_rgb16_to_a(dst, src, w, nbits, 0, rgb2yuv);                      \
+    planar_rgb16_s16_to_a(dst, src, w, nbits, 0, rgb2yuv);                  \
 }                                                                           \
 static void planar_rgb##nbits##be_to_a(uint8_t *dst, const uint8_t *src[4], \
                                        int w, int32_t *rgb2yuv,             \
                                        void *opq)                           \
 {                                                                           \
-    planar_rgb16_to_a(dst, src, w, nbits, 1, rgb2yuv);                      \
+    planar_rgb16_s16_to_a(dst, src, w, nbits, 1, rgb2yuv);                  \
+}
+
+#define rgb9plus_msb_planar_funcs_endian(nbits, endian_name, endian)                                   \
+static void msb_planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],             \
+                                                      int w, int32_t *rgb2yuv, void *opq)              \
+{                                                                                                      \
+    planar_rgb16_s##nbits##_to_y(dst, src, w, nbits, endian, rgb2yuv);                                 \
+}                                                                                                      \
+static void msb_planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                   \
+                                                       const uint8_t *src[4], int w, int32_t *rgb2yuv, \
+                                                       void *opq)                                      \
+{                                                                                                      \
+    planar_rgb16_s##nbits##_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                         \
 }
 
 #define rgb9plus_planar_funcs(nbits)            \
     rgb9plus_planar_funcs_endian(nbits, le, 0)  \
     rgb9plus_planar_funcs_endian(nbits, be, 1)
 
+#define rgb9plus_msb_planar_funcs(nbits)           \
+    rgb9plus_msb_planar_funcs_endian(nbits, le, 0) \
+    rgb9plus_msb_planar_funcs_endian(nbits, be, 1)
+
 rgb9plus_planar_funcs(9)
 rgb9plus_planar_funcs(10)
 rgb9plus_planar_funcs(12)
@@ -1372,6 +1457,9 @@ rgb9plus_planar_transparency_funcs(12)
 rgb9plus_planar_transparency_funcs(14)
 rgb9plus_planar_transparency_funcs(16)
 
+rgb9plus_msb_planar_funcs(10)
+rgb9plus_msb_planar_funcs(12)
+
 #define rgbf32_funcs_endian(endian_name, endian)                                                    \
 static void planar_rgbf32##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],                  \
                                                   int w, int32_t *rgb2yuv, void *opq)               \
@@ -1786,6 +1874,12 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
     case AV_PIX_FMT_GBRPF16LE:
         *readChrPlanar = planar_rgbf16le_to_uv;
         break;
+    case AV_PIX_FMT_GBRP10MSBLE:
+        *readChrPlanar = msb_planar_rgb10le_to_uv;
+        break;
+    case AV_PIX_FMT_GBRP12MSBLE:
+        *readChrPlanar = msb_planar_rgb12le_to_uv;
+        break;
     case AV_PIX_FMT_GBRP9BE:
         *readChrPlanar = planar_rgb9be_to_uv;
         break;
@@ -1813,6 +1907,12 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
     case AV_PIX_FMT_GBRPF16BE:
         *readChrPlanar = planar_rgbf16be_to_uv;
         break;
+    case AV_PIX_FMT_GBRP10MSBBE:
+        *readChrPlanar = msb_planar_rgb10be_to_uv;
+        break;
+    case AV_PIX_FMT_GBRP12MSBBE:
+        *readChrPlanar = msb_planar_rgb12be_to_uv;
+        break;
     case AV_PIX_FMT_GBRAP:
     case AV_PIX_FMT_GBRP:
         *readChrPlanar = planar_rgb_to_uv;
@@ -1882,6 +1982,18 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
         *chrToYV12 = bswap16UV_c;
         break;
 #endif
+    case AV_PIX_FMT_YUV444P10MSBLE:
+        *chrToYV12 = shf16_10LEToUV_c;
+        break;
+    case AV_PIX_FMT_YUV444P12MSBLE:
+        *chrToYV12 = shf16_12LEToUV_c;
+        break;
+    case AV_PIX_FMT_YUV444P10MSBBE:
+        *chrToYV12 = shf16_10BEToUV_c;
+        break;
+    case AV_PIX_FMT_YUV444P12MSBBE:
+        *chrToYV12 = shf16_12BEToUV_c;
+        break;
     case AV_PIX_FMT_VUYA:
     case AV_PIX_FMT_VUYX:
         *chrToYV12 = read_vuyx_UV_c;
@@ -2208,6 +2320,12 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
     case AV_PIX_FMT_GBRPF16LE:
         *readLumPlanar = planar_rgbf16le_to_y;
         break;
+    case AV_PIX_FMT_GBRP10MSBLE:
+        *readLumPlanar = msb_planar_rgb10le_to_y;
+        break;
+    case AV_PIX_FMT_GBRP12MSBLE:
+        *readLumPlanar = msb_planar_rgb12le_to_y;
+        break;
     case AV_PIX_FMT_GBRP9BE:
         *readLumPlanar = planar_rgb9be_to_y;
         break;
@@ -2241,6 +2359,12 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
     case AV_PIX_FMT_GBRPF16BE:
         *readLumPlanar = planar_rgbf16be_to_y;
         break;
+    case AV_PIX_FMT_GBRP10MSBBE:
+        *readLumPlanar = msb_planar_rgb10be_to_y;
+        break;
+    case AV_PIX_FMT_GBRP12MSBBE:
+        *readLumPlanar = msb_planar_rgb12be_to_y;
+        break;
     case AV_PIX_FMT_GBRAP:
         *readAlpPlanar = planar_rgb_to_a;
     case AV_PIX_FMT_GBRP:
@@ -2335,6 +2459,18 @@ av_cold void ff_sws_init_input_funcs(SwsInternal *c,
         *alpToYV12 = bswap16Y_c;
         break;
 #endif
+    case AV_PIX_FMT_YUV444P10MSBLE:
+        *lumToYV12 = shf16_10LEToY_c;
+        break;
+    case AV_PIX_FMT_YUV444P12MSBLE:
+        *lumToYV12 = shf16_12LEToY_c;
+        break;
+    case AV_PIX_FMT_YUV444P10MSBBE:
+        *lumToYV12 = shf16_10BEToY_c;
+        break;
+    case AV_PIX_FMT_YUV444P12MSBBE:
+        *lumToYV12 = shf16_12BEToY_c;
+        break;
     case AV_PIX_FMT_YA16LE:
         *lumToYV12 = read_ya16le_gray_c;
         break;
diff --git a/libswscale/loongarch/output_lasx.c b/libswscale/loongarch/output_lasx.c
index 801cc70bd2..9c2f400a78 100644
--- a/libswscale/loongarch/output_lasx.c
+++ b/libswscale/loongarch/output_lasx.c
@@ -1768,6 +1768,7 @@ av_cold void ff_sws_init_output_lasx(SwsInternal *c,
     /* Add initialization once optimized */
     if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
     } else if (is16BPS(dstFormat)) {
+    } else if (isNBPS(dstFormat) && isDataInHighBits(dstFormat)) {
     } else if (isNBPS(dstFormat)) {
     } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
     } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
diff --git a/libswscale/loongarch/output_lsx.c b/libswscale/loongarch/output_lsx.c
index 6c8e0c816c..1caa64c5d4 100644
--- a/libswscale/loongarch/output_lsx.c
+++ b/libswscale/loongarch/output_lsx.c
@@ -1623,6 +1623,7 @@ av_cold void ff_sws_init_output_lsx(SwsInternal *c,
     /* Add initialization once optimized */
     if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
     } else if (is16BPS(dstFormat)) {
+    } else if (isNBPS(dstFormat) && isDataInHighBits(dstFormat)) {
     } else if (isNBPS(dstFormat)) {
     } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
     } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
diff --git a/libswscale/output.c b/libswscale/output.c
index c37649e7ce..123e6964e0 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -386,6 +386,68 @@ yuv2NBPS(14, LE, 0, 10, int16_t)
 yuv2NBPS(16, BE, 1, 16, int32_t)
 yuv2NBPS(16, LE, 0, 16, int32_t)
 
+#define output_pixel(pos, val) \
+    if (big_endian) { \
+        AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
+    } else { \
+        AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
+    }
+
+static av_always_inline void
+yuv2msbplane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
+                            int big_endian, int output_bits)
+{
+    int i;
+    int shift = 15 - output_bits;
+
+    for (i = 0; i < dstW; i++) {
+        int val = src[i] + (1 << (shift - 1));
+        output_pixel(&dest[i], val);
+    }
+}
+
+static av_always_inline void
+yuv2msbplaneX_10_c_template(const int16_t *filter, int filterSize,
+                            const int16_t **src, uint16_t *dest, int dstW,
+                            int big_endian, int output_bits)
+{
+    int i;
+    int shift = 11 + 16 - output_bits;
+
+    for (i = 0; i < dstW; i++) {
+        int val = 1 << (shift - 1);
+        int j;
+
+        for (j = 0; j < filterSize; j++)
+            val += src[j][i] * filter[j];
+
+        output_pixel(&dest[i], val);
+    }
+}
+
+#define yuv2MSBNBPS(bits, BE_LE, is_be, template_size, typeX_t) \
+static void yuv2msbplane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
+                              uint8_t *dest, int dstW, \
+                              const uint8_t *dither, int offset)\
+{ \
+    yuv2msbplane1_ ## template_size ## _c_template((const typeX_t *) src, \
+                         (uint16_t *) dest, dstW, is_be, bits); \
+}\
+static void yuv2msbplaneX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
+                              const int16_t **src, uint8_t *dest, int dstW, \
+                              const uint8_t *dither, int offset)\
+{ \
+    yuv2msbplaneX_## template_size ## _c_template(filter, \
+                         filterSize, (const typeX_t **) src, \
+                         (uint16_t *) dest, dstW, is_be, bits); \
+}
+
+yuv2MSBNBPS(10, BE, 1, 10, int16_t)
+yuv2MSBNBPS(10, LE, 0, 10, int16_t)
+yuv2MSBNBPS(12, BE, 1, 10, int16_t)
+yuv2MSBNBPS(12, LE, 0, 10, int16_t)
+
+#undef output_pixel
 
 static void yuv2nv12cX_16LE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
                               const int16_t *chrFilter, int chrFilterSize,
@@ -2352,6 +2414,46 @@ yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
     }
 }
 
+static void
+yuv2gbrpmsb_full_X_c(SwsInternal *c, const int16_t *lumFilter,
+                     const int16_t **lumSrc, int lumFilterSize,
+                     const int16_t *chrFilter, const int16_t **chrUSrc,
+                     const int16_t **chrVSrc, int chrFilterSize,
+                     const int16_t **alpSrc, uint8_t **dest,
+                     int dstW, int y)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
+    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
+    uint16_t **dest16 = (uint16_t**)dest;
+    int shift = 16 - desc->comp[0].depth;
+    int i;
+
+    yuv2gbrp_full_X_c(c, lumFilter, lumSrc, lumFilterSize,
+                      chrFilter, chrUSrc, chrVSrc, chrFilterSize,
+                      alpSrc, dest, dstW, y);
+
+    if (desc->comp[0].depth <= 8)
+        return;
+
+    if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
+        for (i = 0; i < dstW; i++) {
+            dest16[0][i] = av_bswap16(av_bswap16(dest16[0][i]) << shift);
+            dest16[1][i] = av_bswap16(av_bswap16(dest16[1][i]) << shift);
+            dest16[2][i] = av_bswap16(av_bswap16(dest16[2][i]) << shift);
+            if (hasAlpha)
+                dest16[3][i] = av_bswap16(av_bswap16(dest16[3][i]) << shift);
+        }
+    } else {
+        for (i = 0; i < dstW; i++) {
+            dest16[0][i] = dest16[0][i] << shift;
+            dest16[1][i] = dest16[1][i] << shift;
+            dest16[2][i] = dest16[2][i] << shift;
+            if (hasAlpha)
+                dest16[3][i] = dest16[3][i] << shift;
+        }
+    }
+}
+
 static void
 yuv2gbrp16_full_X_c(SwsInternal *c, const int16_t *lumFilter,
                     const int16_t **lumSrcx, int lumFilterSize,
@@ -3215,6 +3317,15 @@ av_cold void ff_sws_init_output_funcs(SwsInternal *c,
         if (isSemiPlanarYUV(dstFormat)) {
           *yuv2nv12cX = isBE(dstFormat) ? yuv2nv12cX_16BE_c : yuv2nv12cX_16LE_c;
         }
+    } else if (isDataInHighBits(dstFormat) && isNBPS(dstFormat)) {
+        if (desc->comp[0].depth == 10) {
+            *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_10BE_c  : yuv2msbplaneX_10LE_c;
+            *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_10BE_c  : yuv2msbplane1_10LE_c;
+        } else if (desc->comp[0].depth == 12) {
+            *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_12BE_c  : yuv2msbplaneX_12LE_c;
+            *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_12BE_c  : yuv2msbplane1_12LE_c;
+        } else
+            av_assert0(0);
     } else if (isNBPS(dstFormat)) {
         if (desc->comp[0].depth == 9) {
             *yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_c  : yuv2planeX_9LE_c;
@@ -3460,6 +3571,12 @@ av_cold void ff_sws_init_output_funcs(SwsInternal *c,
         case AV_PIX_FMT_GBRAP14LE:
             *yuv2anyX = yuv2gbrp_full_X_c;
             break;
+        case AV_PIX_FMT_GBRP10MSBBE:
+        case AV_PIX_FMT_GBRP10MSBLE:
+        case AV_PIX_FMT_GBRP12MSBBE:
+        case AV_PIX_FMT_GBRP12MSBLE:
+            *yuv2anyX = yuv2gbrpmsb_full_X_c;
+            break;
         case AV_PIX_FMT_GBRP16BE:
         case AV_PIX_FMT_GBRP16LE:
         case AV_PIX_FMT_GBRAP16BE:
diff --git a/libswscale/ppc/swscale_altivec.c b/libswscale/ppc/swscale_altivec.c
index a74c0a4b3f..3112c6cb71 100644
--- a/libswscale/ppc/swscale_altivec.c
+++ b/libswscale/ppc/swscale_altivec.c
@@ -242,7 +242,7 @@ av_cold void ff_sws_init_swscale_ppc(SwsInternal *c)
     if (c->srcBpc == 8 && c->dstBpc <= 14) {
         c->hyScale = c->hcScale = hScale_real_altivec;
     }
-    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) &&
+    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) && !isDataInHighBits(dstFormat) &&
         dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE &&
         !c->needAlpha) {
         c->yuv2planeX = yuv2planeX_altivec;
diff --git a/libswscale/ppc/swscale_vsx.c b/libswscale/ppc/swscale_vsx.c
index 5ea3407644..c6948546d5 100644
--- a/libswscale/ppc/swscale_vsx.c
+++ b/libswscale/ppc/swscale_vsx.c
@@ -2041,7 +2041,7 @@ av_cold void ff_sws_init_swscale_vsx(SwsInternal *c)
                                                      : hScale16To15_vsx;
         }
     }
-    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) &&
+    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) && !isDataInHighBits(dstFormat) &&
         dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE &&
         !c->needAlpha) {
         c->yuv2planeX = yuv2planeX_vsx;
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 61073c6c0a..6d8d277582 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -2567,6 +2567,8 @@ void ff_get_unscaled_swscale(SwsInternal *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP10MSB) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP12MSB) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP10) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP14) ||
@@ -2595,7 +2597,9 @@ void ff_get_unscaled_swscale(SwsInternal *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P10) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P14) ||
-        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P10MSB) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P12MSB))
         c->convert_unscaled = bswap_16bpc;
 
     /* bswap 32 bits per pixel/component formats */
diff --git a/libswscale/tests/floatimg_cmp.c b/libswscale/tests/floatimg_cmp.c
index 0744e64f8e..45b875c79f 100644
--- a/libswscale/tests/floatimg_cmp.c
+++ b/libswscale/tests/floatimg_cmp.c
@@ -42,6 +42,7 @@ static const enum AVPixelFormat pix_fmts[] = {
     AV_PIX_FMT_YUV444P,
     AV_PIX_FMT_YUV444P9LE, AV_PIX_FMT_YUV444P10LE,
     AV_PIX_FMT_YUV444P12LE, AV_PIX_FMT_YUV444P14LE,
+    AV_PIX_FMT_YUV444P10MSBLE, AV_PIX_FMT_YUV444P12MSBLE,
     AV_PIX_FMT_RGB24,  AV_PIX_FMT_BGR24,
     AV_PIX_FMT_RGBA,   AV_PIX_FMT_BGRA,
     AV_PIX_FMT_ARGB,   AV_PIX_FMT_ABGR,
@@ -52,6 +53,7 @@ static const enum AVPixelFormat pix_fmts[] = {
     AV_PIX_FMT_GBRP,   AV_PIX_FMT_GBRAP,
     AV_PIX_FMT_GBRP9LE,
     AV_PIX_FMT_GBRP10LE, AV_PIX_FMT_GBRAP10LE,
+    AV_PIX_FMT_GBRP10MSBLE, AV_PIX_FMT_GBRP12MSBLE,
     AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRAP12LE,
     AV_PIX_FMT_GBRP14LE,
     AV_PIX_FMT_GBRP16LE,  AV_PIX_FMT_GBRAP16LE
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 94a47ea5d0..a13d8df7e8 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -1334,8 +1334,10 @@ av_cold int ff_sws_init_single_context(SwsContext *sws, SwsFilter *srcFilter,
         srcFormat != AV_PIX_FMT_RGB4_BYTE && srcFormat != AV_PIX_FMT_BGR4_BYTE &&
         srcFormat != AV_PIX_FMT_GBRP9BE   && srcFormat != AV_PIX_FMT_GBRP9LE  &&
         srcFormat != AV_PIX_FMT_GBRP10BE  && srcFormat != AV_PIX_FMT_GBRP10LE &&
+        srcFormat != AV_PIX_FMT_GBRP10MSBBE  && srcFormat != AV_PIX_FMT_GBRP10MSBLE &&
         srcFormat != AV_PIX_FMT_GBRAP10BE && srcFormat != AV_PIX_FMT_GBRAP10LE &&
         srcFormat != AV_PIX_FMT_GBRP12BE  && srcFormat != AV_PIX_FMT_GBRP12LE &&
+        srcFormat != AV_PIX_FMT_GBRP12MSBBE && srcFormat != AV_PIX_FMT_GBRP12MSBLE &&
         srcFormat != AV_PIX_FMT_GBRAP12BE && srcFormat != AV_PIX_FMT_GBRAP12LE &&
         srcFormat != AV_PIX_FMT_GBRAP14BE && srcFormat != AV_PIX_FMT_GBRAP14LE &&
         srcFormat != AV_PIX_FMT_GBRP14BE  && srcFormat != AV_PIX_FMT_GBRP14LE &&
diff --git a/libswscale/x86/swscale.c b/libswscale/x86/swscale.c
index e9ad2a1e95..8b6f9bd58a 100644
--- a/libswscale/x86/swscale.c
+++ b/libswscale/x86/swscale.c
@@ -543,14 +543,14 @@ av_cold void ff_sws_init_swscale_x86(SwsInternal *c)
 #define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case, condition_8bit) \
 switch(c->dstBpc){ \
     case 16:                          do_16_case;                          break; \
-    case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \
+    case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format) && !isDataInHighBits(c->opts.dst_format)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \
     case 9:  if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2planeX_9_  ## opt; break; \
     case 8: if ((condition_8bit) && !c->use_mmx_vfilter) vscalefn = ff_yuv2planeX_8_  ## opt; break; \
     }
 #define ASSIGN_VSCALE_FUNC(vscalefn, opt) \
     switch(c->dstBpc){ \
     case 16: if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2plane1_16_ ## opt; break; \
-    case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format)) vscalefn = ff_yuv2plane1_10_ ## opt; break; \
+    case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format) && !isDataInHighBits(c->opts.dst_format)) vscalefn = ff_yuv2plane1_10_ ## opt; break; \
     case 9:  if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2plane1_9_  ## opt;  break; \
     case 8:                           vscalefn = ff_yuv2plane1_8_  ## opt;  break; \
     default: av_assert0(c->dstBpc>8); \
diff --git a/tests/ref/fate/filter-pixdesc-gbrp10msbbe b/tests/ref/fate/filter-pixdesc-gbrp10msbbe
new file mode 100644
index 0000000000..a38b3d890c
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrp10msbbe
@@ -0,0 +1 @@
+pixdesc-gbrp10msbbe fc1a397ca61a80383b134d902cd4ae24
diff --git a/tests/ref/fate/filter-pixdesc-gbrp10msble b/tests/ref/fate/filter-pixdesc-gbrp10msble
new file mode 100644
index 0000000000..c1546fe18a
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrp10msble
@@ -0,0 +1 @@
+pixdesc-gbrp10msble 1acc24b493137f465be216a4d3eee77a
diff --git a/tests/ref/fate/filter-pixdesc-gbrp12msbbe b/tests/ref/fate/filter-pixdesc-gbrp12msbbe
new file mode 100644
index 0000000000..1aed2e7e2d
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrp12msbbe
@@ -0,0 +1 @@
+pixdesc-gbrp12msbbe 6bd47ffb08879dcd69c0ee86bee3600a
diff --git a/tests/ref/fate/filter-pixdesc-gbrp12msble b/tests/ref/fate/filter-pixdesc-gbrp12msble
new file mode 100644
index 0000000000..a3038d7b88
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrp12msble
@@ -0,0 +1 @@
+pixdesc-gbrp12msble 9ba8fe8131c643f49c5522a56449a40b
diff --git a/tests/ref/fate/filter-pixdesc-yuv444p10msbbe b/tests/ref/fate/filter-pixdesc-yuv444p10msbbe
new file mode 100644
index 0000000000..2c5328619a
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv444p10msbbe
@@ -0,0 +1 @@
+pixdesc-yuv444p10msbbeff1c8fa25341156ee539790dc8c34efd
diff --git a/tests/ref/fate/filter-pixdesc-yuv444p10msble b/tests/ref/fate/filter-pixdesc-yuv444p10msble
new file mode 100644
index 0000000000..f782cfb11a
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv444p10msble
@@ -0,0 +1 @@
+pixdesc-yuv444p10msbled250ae9fc413980fbbd846460bb8d616
diff --git a/tests/ref/fate/filter-pixdesc-yuv444p12msbbe b/tests/ref/fate/filter-pixdesc-yuv444p12msbbe
new file mode 100644
index 0000000000..c64b8dbe2e
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv444p12msbbe
@@ -0,0 +1 @@
+pixdesc-yuv444p12msbbe7a306f73ba8c35c04405c5568219e87b
diff --git a/tests/ref/fate/filter-pixdesc-yuv444p12msble b/tests/ref/fate/filter-pixdesc-yuv444p12msble
new file mode 100644
index 0000000000..c06cce5184
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuv444p12msble
@@ -0,0 +1 @@
+pixdesc-yuv444p12msble618b9bafd6bf66ffd1265b1d611380b7
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index cbedb4d894..84a407c8fa 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -34,8 +34,12 @@ gbrapf32le          1ac76b9418062a95e5c62da3ba1c8c5a
 gbrp                5fbc319e30110d19d539f5b274eddb6d
 gbrp10be            703a17591a2a5c236675c5101c349bcc
 gbrp10le            ee014153f55c011918df5b2394815780
+gbrp10msbbe         2fcce5d0a33eb93bc1065a46b77696ee
+gbrp10msble         eb68e8a797a8aa8d69d3b896013e1290
 gbrp12be            527d337eb5813ebba7cf969ee660d423
 gbrp12le            fd192920b171a0cf88d61e8310e95d81
+gbrp12msbbe         73ea99e86472f0c047dce85fa76dd428
+gbrp12msble         102df5b20bb722c391dd1ab6ec9953a3
 gbrp14be            46d502db6dc5eb7e9da3c60016b2df91
 gbrp14le            1607f5c8f13360b53b8186f523996b1b
 gbrp16be            7b6764a504c853b09f5c7d0b2223c5a4
@@ -153,8 +157,12 @@ yuv440p12le         2fff7746ae7c07d407075c0e372baf46
 yuv444p             8f90fb3a757878c545a8bfe5d19a9bab
 yuv444p10be         6683d5cb82c708d5f3a2a89d0311f7a4
 yuv444p10le         6d736fa464ff2de2b07e0a56af8444b7
+yuv444p10msbbe      9542f394ed36ff084bbcc09883d24cac
+yuv444p10msble      bf8b831e6d6bf8bc5c2e9609fa98b01e
 yuv444p12be         04320ad158450ee158f84a27c6325702
 yuv444p12le         08a81b2ea9c7c8b447e40ef8f4a46a4a
+yuv444p12msbbe      5bd7623158e0bc62edb900821ce2df72
+yuv444p12msble      425731663df58c875319a0b02f4ab4cc
 yuv444p14be         ea3057d469d0c49c24e844256ef7871e
 yuv444p14le         940f5908ccf06e01411f0a7bddb45c6a
 yuv444p16be         aee24ab2e9a4656f889399f1b0d98639
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index d4bffda7dc..05bb5b1b19 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -34,8 +34,12 @@ gbrapf32le          34875869f093bddf94f14c8542eca9f0
 gbrp                ec671f573c2105072ab68a1933c58fee
 gbrp10be            6f0130a41f01e58593d3840446dd94b7
 gbrp10le            9c152b7dfb7ad7bc477518d97316d04f
+gbrp10msbbe         2bdde24ebec8d80aafa08352965cdf6d
+gbrp10msble         f500f798cc5469b9ba30fb48e584b51a
 gbrp12be            561516202a6e37dd19543f9bb3af339f
 gbrp12le            3e7f87d834748844ab326e22eb2b7487
+gbrp12msbbe         1fe5466eb3de5186d5cad87a30666dbf
+gbrp12msble         2c0d510341e757861f3a85899f04e52c
 gbrp14be            057232bca98c472a003cc46b3fd939e4
 gbrp14le            d4764dba3c3efd1263c2c8e0f5ac9f6a
 gbrp16be            59e4c27ee33520e23dbceafbec27aa9b
@@ -147,8 +151,12 @@ yuv440p12le         33c5cae9acde262b194efdf78ad44258
 yuv444p             28166fdead6f87f57f4c77156dce0466
 yuv444p10be         2c9b7f39c006b68d6b53791472ade1d5
 yuv444p10le         8427e65a1608ff8c5c88492f4926f6c1
+yuv444p10msbbe      bc2c25584af692ea8a43a931bb1afddb
+yuv444p10msble      6ec78c600f77619c2b9c3b5ab365be26
 yuv444p12be         6e1f91ed1c6fc42fbc912d7d3aed0aca
 yuv444p12le         6a674498003ca57c8c2700b7d0ecb290
+yuv444p12msbbe      96df9462a4b5ac0c9d428f3be4932723
+yuv444p12msble      65cbf6aae7b3124643655e2305150b08
 yuv444p14be         bb07382a868b35875b771b37dd234605
 yuv444p14le         f8f6e6124bae7e95d0061b95bd64be66
 yuv444p16be         25b9244db531ccab7095a44b3115032d
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 146ceab9c7..d8a0d5234a 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -34,8 +34,12 @@ gbrapf32le          401239fe76ef69d945f1d2c8efd116e9
 gbrp                838025a3062f7f31e99196ce66961ad7
 gbrp10be            f63c2555ea19fc78b00fd5b3e2b48e8c
 gbrp10le            be64c374ab318235d912372e99a0516a
+gbrp10msbbe         e7a069412732d633b104b6c2d93469f9
+gbrp10msble         36f3476db6bb05fd8cdce9ef84a2f58c
 gbrp12be            ef164a1c062dc3572c61b9ef10897ca1
 gbrp12le            0527fdb6f75b1cb0d380809eb7a7589a
+gbrp12msbbe         1e92a3cbeec6bd487a7d7577baf36756
+gbrp12msble         38762c94d7e55c6010e93794f14ff332
 gbrp14be            6aff3ad388e2ed97d59b71a75029746d
 gbrp14le            ed9ccbc7a4f3e269a2ec37d210359fd8
 gbrp16be            020eff1626415ea726c55b23162ce59a
@@ -153,8 +157,12 @@ yuv440p12le         a529385f94a4d46fa339746693975d99
 yuv444p             389eda40a7a3bd5d3b280b448e99f27e
 yuv444p10be         80b1cf057149a1f7dfae1da061e00523
 yuv444p10le         cdd8ba90dfc7689e0771dc36a70db433
+yuv444p10msbbe      b0a75c6c59d96707a41ce4990314f36f
+yuv444p10msble      e306771f12f7885907689e63ba29a5c2
 yuv444p12be         caaa959ed39a74dcec478f23690f5ffc
 yuv444p12le         a7965a51a2e45723f650d1313f2aa356
+yuv444p12msbbe      31ec6c32401562a8c9aaf168a6b37e1b
+yuv444p12msble      d947a1e44481ea0ce7be8b30ae653497
 yuv444p14be         18a46dde1fafcc7bbc6ebb3fd6681e7c
 yuv444p14le         90058811cf9c35a4ddfab367bea40c51
 yuv444p16be         1ff6ee64bcc33be585712e86359430d5
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index 63c82907ef..df48d3af34 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -34,8 +34,12 @@ gbrapf32le          f1c3079716d6ce7b629511ec1fcb98ad
 gbrp                506dea2fe492e985a396d1b11ccd8db3
 gbrp10be            55bbfe2d472780dcbadf3027778caa0e
 gbrp10le            13a39077ab1b2c3b49afd3e250b84a77
+gbrp10msbbe         04a34ae25a510f4fcbd4aac80d332928
+gbrp10msble         fe465d4e28c90f7bcf9670dbeec1be1f
 gbrp12be            f1b59334c687a39ba076fe47e6ee9515
 gbrp12le            e64ab4d290eb10476db165054720173f
+gbrp12msbbe         c68b09fd30cb609750c4f269bbd14433
+gbrp12msble         176a3655df3fd7cd7b4b89d579eaaee4
 gbrp14be            b3806ade527ef7452c29106054946cd1
 gbrp14le            b01b1a05d8de36f51a133d25102fe1f3
 gbrp16be            f82e4bda468275f51becf70f3880be52
@@ -125,8 +129,12 @@ yuv422p9le          c9faffe2fcb2e30be5d792412b3550b0
 yuv444p             1483374f69c4bbaf9252ce255fc84feb
 yuv444p10be         2e5caee508692869141bd9649cc17f64
 yuv444p10le         c0ceb41ad4c2ddc454f3fdb9cda2d8ad
+yuv444p10msbbe      9517db7eca363b4cfe19010026e9aca4
+yuv444p10msble      b9fabe62f70e204da80ad182a6571b08
 yuv444p12be         8729565c21a9d8f1e7a87d81d0aa4a54
 yuv444p12le         d4786cb4b1e79b2af1493e01d685282f
+yuv444p12msbbe      ab6d3fe75b4bebb61ef8b3ee98e4c928
+yuv444p12msble      6db968972c964ad59e18572f1f983fdf
 yuv444p14be         33f1cf5233f57582618390ea337e83c6
 yuv444p14le         7d9fc358232488f671d663d27875f3c1
 yuv444p16be         779ea70979e735d3074fef0466792681
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index 0ece4ea134..cd5dda5ccf 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -34,8 +34,12 @@ gbrapf32le          7312701852fbceaeb53efce523bc75c0
 gbrp                0ecfeca171ba3a1a2ff4e92f572b71cf
 gbrp10be            774398c2f81757a536c094f16cfc541a
 gbrp10le            e9a6434d691be541f789f850963da181
+gbrp10msbbe         e47a8437b5e8f706a0c3cb466ff6c514
+gbrp10msble         0238594ce7f88b52fc8e44af623269e9
 gbrp12be            13d819d869f8e84aadca57e21883030e
 gbrp12le            22046339442c155fbb9b02ceff5e1c15
+gbrp12msbbe         275a9cb088db06bb0446891d5bc1bc80
+gbrp12msble         cd0b0fe250e9555e42ac00b94eda58c2
 gbrp14be            7e1d2f9d9bb7cc90d88540f36998acd6
 gbrp14le            91bb636f4e1f5d50312b136c185542e9
 gbrp16be            46cf9473646a4b9dbcb05661ade658ec
@@ -147,8 +151,12 @@ yuv440p12le         7aecbe06b7cd8c84d98af8cf3bb971e8
 yuv444p             0bd726440d90438ad357172fe1fac9b3
 yuv444p10be         c2e452fbe45f23c70525919154f4b81f
 yuv444p10le         90140d5f930fb2ff750fe18df990d0f3
+yuv444p10msbbe      f0f0e5ce513a34ff231b1a1607206ea5
+yuv444p10msble      ceebcb2a4299b26b3518d2bdee2028ed
 yuv444p12be         f858a8f0c55192ab69d356b97e0449bb
 yuv444p12le         22f099dbae63e6564f06e1cc32683a4e
+yuv444p12msbbe      0f0acd39267d784e8a020886ac152369
+yuv444p12msble      d9edd2a6b6ed3f5b8aba985eee895d09
 yuv444p14be         be4727c283bb3af3327f7b9dc57e51b8
 yuv444p14le         289f4d6a3d60ba654e8280683825ee9a
 yuv444p16be         acb6b001d445a628d1d0a2dfbeed078c
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index ce707f9c8b..768bf8c06c 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -34,8 +34,12 @@ gbrapf32le          a606da084e300d0e827a4d24ce18567b
 gbrp                dc06edb62e70024a216c8e303b79b328
 gbrp10be            321e7f061d8b9b5801221b6cf3c99666
 gbrp10le            799ed3afca01076439a0b6785b3dc4bb
+gbrp10msbbe         0855479c918946f8755f25593612a74d
+gbrp10msble         92db82d585eb495d4cabc033ffdd2a59
 gbrp12be            7ca179ad8f7b018de48a48bdb0776965
 gbrp12le            c69843651e7e60e85c5e8a2fe4ecb290
+gbrp12msbbe         f499ec2f96f5d0d271371d4d2a94e3d8
+gbrp12msble         7e9f8e72a773c9098e6019f8bcd22e36
 gbrp14be            5dc5e8131c25125347758e03d15b69e6
 gbrp14le            bf3d5dec9b58cecd4ca1c5d3a4d57c31
 gbrp16be            c8c95027703c680ed8f8f91c725db40a
@@ -152,8 +156,12 @@ yuv440p12le         6f47a23742f5763f3240982e1892e4dc
 yuv444p             bbd70cde098f24097c4cdcd3ad22d9ce
 yuv444p10be         b0de51e143a5bd490c424dc836becfa8
 yuv444p10le         4435dca19253b88dc7cd553928467e79
+yuv444p10msbbe      a59dd07cb8a2785d2c92778ed12b1467
+yuv444p10msble      4212954799563435093093dcc68c97e4
 yuv444p12be         23f0ce3a810138df7849d4f6b5e50211
 yuv444p12le         0394aeef391e2cc09722ee8e7244f1c3
+yuv444p12msbbe      a8aa386b03e70ef376700a0e564be018
+yuv444p12msble      c5cbe5f8ff3cc7b354d1c47e51716de9
 yuv444p14be         c712cf9dbf8571fbd31fa747e58993ec
 yuv444p14le         3a0e361e5998f8590dd8ca8ce896cea1
 yuv444p16be         929c50756bfe8cab7c416f56095fbb82
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index cbedb4d894..84a407c8fa 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -34,8 +34,12 @@ gbrapf32le          1ac76b9418062a95e5c62da3ba1c8c5a
 gbrp                5fbc319e30110d19d539f5b274eddb6d
 gbrp10be            703a17591a2a5c236675c5101c349bcc
 gbrp10le            ee014153f55c011918df5b2394815780
+gbrp10msbbe         2fcce5d0a33eb93bc1065a46b77696ee
+gbrp10msble         eb68e8a797a8aa8d69d3b896013e1290
 gbrp12be            527d337eb5813ebba7cf969ee660d423
 gbrp12le            fd192920b171a0cf88d61e8310e95d81
+gbrp12msbbe         73ea99e86472f0c047dce85fa76dd428
+gbrp12msble         102df5b20bb722c391dd1ab6ec9953a3
 gbrp14be            46d502db6dc5eb7e9da3c60016b2df91
 gbrp14le            1607f5c8f13360b53b8186f523996b1b
 gbrp16be            7b6764a504c853b09f5c7d0b2223c5a4
@@ -153,8 +157,12 @@ yuv440p12le         2fff7746ae7c07d407075c0e372baf46
 yuv444p             8f90fb3a757878c545a8bfe5d19a9bab
 yuv444p10be         6683d5cb82c708d5f3a2a89d0311f7a4
 yuv444p10le         6d736fa464ff2de2b07e0a56af8444b7
+yuv444p10msbbe      9542f394ed36ff084bbcc09883d24cac
+yuv444p10msble      bf8b831e6d6bf8bc5c2e9609fa98b01e
 yuv444p12be         04320ad158450ee158f84a27c6325702
 yuv444p12le         08a81b2ea9c7c8b447e40ef8f4a46a4a
+yuv444p12msbbe      5bd7623158e0bc62edb900821ce2df72
+yuv444p12msble      425731663df58c875319a0b02f4ab4cc
 yuv444p14be         ea3057d469d0c49c24e844256ef7871e
 yuv444p14le         940f5908ccf06e01411f0a7bddb45c6a
 yuv444p16be         aee24ab2e9a4656f889399f1b0d98639
diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad
index 9370ca2cb3..3c9fe6746e 100644
--- a/tests/ref/fate/filter-pixfmts-pad
+++ b/tests/ref/fate/filter-pixfmts-pad
@@ -14,7 +14,9 @@ gbrap14le           4c8b549942e66f442de0f5c1d21e9b8e
 gbrap16le           d0f6fc33cb75588327aec1b5ad6ab4f0
 gbrp                3c94d39256db2409015df913fd330a90
 gbrp10le            5b356737cd8a396f39bbdadb7cb35e06
+gbrp10msble         1eaff99273dcf52c7329b50dc3ef2d5a
 gbrp12le            91fdad0d1edf7bfa2805e2041e8da3cd
+gbrp12msble         c91d235f99d54bdd819e1e9218287ae3
 gbrp14le            deb2c3af6b48faa52f6a1f6590a0cdf7
 gbrp16le            a6156d1a37e05ee621b2a343fb158bd6
 gbrp9le             9e827f438e081d334a6cae7e282698b0
@@ -68,7 +70,9 @@ yuv440p10le         55787c7260462e50e96f316856adf9dc
 yuv440p12le         869d3d9e0e12df253b79949d2b2c0561
 yuv444p             6bfd89286dc36f2789b77d747ed8fa22
 yuv444p10le         ac3142be3d7b0ec4c1e4450cb8c376ef
+yuv444p10msble      438ae33282dca61f5bab0386271519fb
 yuv444p12le         4c7f29501e46f4d041222536697941d0
+yuv444p12msble      0de8b60a01aeee8df55ec3f0f4285219
 yuv444p14le         13631aa3ecc332aee3b3360db45011c9
 yuv444p16le         613ec343b593dda43af15f015c193d0a
 yuv444p9le          96fa344943468b5cd36be92b1c05f17f
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 67de3d414d..e4ab07104c 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -34,8 +34,12 @@ gbrapf32le          9e32cc5fc7b487ea94b9f440d645040d
 gbrp                dc3387f925f972c61aae7eb23cdc19f0
 gbrp10be            a318ea42e53a7b80a55aa7c19c9a0ab5
 gbrp10le            994e8fc6a1e5b230f4c55893fd7618d6
+gbrp10msbbe         045c5f8af6dafc1ceb06cfe3181c3ee9
+gbrp10msble         8c74e50b03a0cb475145e83d0d15110b
 gbrp12be            bfbd419dd18c0a5677d4bce55ab24e2e
 gbrp12le            95af1f8495b2a7a7ad67802e3e8bca01
+gbrp12msbbe         69c01758aa175918b27e3de5b488b2ee
+gbrp12msble         907712bd8af9e3e39b1881b26273b7d1
 gbrp14be            9d8113c9a5182c02dbe4576509f59a96
 gbrp14le            952f39881e500ed684c8b216185f4b80
 gbrp16be            5241eee3465096efa111b86b30c3aaaa
@@ -153,8 +157,12 @@ yuv440p12le         bb9ffc3033fe32b9ce3233524ed5ab70
 yuv444p             098f01e6790e1e6beff8d604120c2664
 yuv444p10be         024ee33cac7b5b7b225d7acb9dc59da3
 yuv444p10le         a085fff2fb81d76753da689aee365b55
+yuv444p10msbbe      39e20d08b28c3c3a63978e427d7567fe
+yuv444p10msble      e49af28d1827e757d725433c4c8bf571
 yuv444p12be         a181627b93bd9c4c384b83e17d373a7c
 yuv444p12le         97e47326ff0efe89c295fd9ddb0ca854
+yuv444p12msbbe      0fa425c7d9f5a7f7fe4933f4fe89dd6b
+yuv444p12msble      9439ab6089e6ad3102b878124f1de98e
 yuv444p14be         3eac31f0d4969210640de74914faf86d
 yuv444p14le         2c362c4cf167b7e2d83f4eb0dfaeb2b9
 yuv444p16be         a60c674411d64cc4b9fbf17039afffb3
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index 3064f2b180..64b45945c7 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -34,8 +34,12 @@ gbrapf32le          d6589fe7935cbb69d8253f8b8c4ffba8
 gbrp                7b4b6a2f1cdc51455b25515c3ecea944
 gbrp10be            d7401725699b2ddf954caa16a0878a1e
 gbrp10le            6036711969eae1979be6358f688bd9c8
+gbrp10msbbe         7190df78d1e5e6566e2a74c079b01166
+gbrp10msble         449752ca51481baf440e425b1f0d3b63
 gbrp12be            ec7d6e69fc579619b53d57a76c20480d
 gbrp12le            bf7478185274486c3f7dd4db1da8f7d0
+gbrp12msbbe         592e689e057d8cdc3c628fd4242dc8e7
+gbrp12msble         51b3ebaed490b7fafdcc7801854d05e5
 gbrp14be            9b66f22e4315aaa878a430ae3f44ab57
 gbrp14le            16f30349b42dca007b37b8522d3018df
 gbrp16be            0d003b88d4f446ae9ba12cab1cbb359a
@@ -120,8 +124,12 @@ yuv420p9le          c735c3c8424c70d822ab4a1fe1f504e2
 yuv444p             eb755977ca464baac5f03771858080ae
 yuv444p10be         866b59a23dff3dc1cb6bf7bd7da26da4
 yuv444p10le         417d62f15abf4777c4ec5e0d00796a9e
+yuv444p10msbbe      4a6927682c82ccfeca7110b844b71dbd
+yuv444p10msble      c408c6cfbd6426e048a2cd07376667d8
 yuv444p12be         c1da110f0ee898fbcd4b45afb5aed58b
 yuv444p12le         dc18bddd7b6bb9fdb2e0c7e7476375fa
+yuv444p12msbbe      5344c6d57563cec818fd5219c6867393
+yuv444p12msble      b63edb22546b649550ae5cfd99a0acaf
 yuv444p14be         2f181fa3403e7911b233d3d976abea73
 yuv444p14le         ac718343878786a25b9a50924f9aabca
 yuv444p16be         128214efef6fffe3293db513ae700d4a
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index a36d957443..590717399d 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -34,8 +34,12 @@ gbrapf32le          463ffd7ce416d476816e080f971c42ba
 gbrp                413b0f6ea51588d4be5f0c76d43d8796
 gbrp10be            d02bd50db83213667808f5bacefe667c
 gbrp10le            2d4a5ebc773ffc3d857a6ef24afbe10e
+gbrp10msbbe         362763bdeea3eafbbc82c3ded025f7fd
+gbrp10msble         46917c0a92e63c39f1d6b17622c0fcc3
 gbrp12be            a668b7dba68817736501386ffe9f3adc
 gbrp12le            299695016c22a4947d94b16f0975536b
+gbrp12msbbe         458871692a07fd2df3b6213fd2c7dced
+gbrp12msble         b1dae2c7003d628deb1cc988090a0686
 gbrp14be            eeebacfb19c970dd76ad044ef85e8fe5
 gbrp14le            6e93b87047e433995111eb5397751c3f
 gbrp16be            3fef87fe67bf1fd0e2f5056dc0db2ef4
@@ -153,8 +157,12 @@ yuv440p12le         2a3adb4692391171c506cc0899d27511
 yuv444p             7c8c5d138d732f4ca7d864b9ffef3047
 yuv444p10be         faa81f737d465afcacef351818d34772
 yuv444p10le         bfc5036e4ab0ab6da1416df4a462db74
+yuv444p10msbbe      730ba8d36068b509b32df698c1344aa0
+yuv444p10msble      89d73ff2b95deea904fc1de5884869d7
 yuv444p12be         6706d8807b9dd14d331a7e9572fd9c5d
 yuv444p12le         9bba33b2c0dd09f653a4c22d201142c5
+yuv444p12msbbe      01f581dcf9b97f67cf8ea177e27eaf48
+yuv444p12msble      5dafe4e293007c2721ad107edc1dbf96
 yuv444p14be         cf181f44988d3ddf4cc32b87ca473251
 yuv444p14le         086322cb9a98eb91825c9bb2ad00eac7
 yuv444p16be         ee0721d7fda4a67bc6270a78fa361140
diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils
index c67ac35f44..ccd1522ef2 100644
--- a/tests/ref/fate/imgutils
+++ b/tests/ref/fate/imgutils
@@ -298,6 +298,14 @@ yaf16be         planes: 1, linesizes: 256   0   0   0, plane_sizes: 12288     0
 yaf16le         planes: 1, linesizes: 256   0   0   0, plane_sizes: 12288     0     0     0, plane_offsets:     0     0     0, total_size: 12288
 gbrap32be       planes: 4, linesizes: 256 256 256 256, plane_sizes: 12288 12288 12288 12288, plane_offsets: 12288 12288 12288, total_size: 49152
 gbrap32le       planes: 4, linesizes: 256 256 256 256, plane_sizes: 12288 12288 12288 12288, plane_offsets: 12288 12288 12288, total_size: 49152
+yuv444p10msbbe  planes: 3, linesizes: 128 128 128   0, plane_sizes:  6144  6144  6144     0, plane_offsets:  6144  6144     0, total_size: 18432
+yuv444p10msble  planes: 3, linesizes: 128 128 128   0, plane_sizes:  6144  6144  6144     0, plane_offsets:  6144  6144     0, total_size: 18432
+yuv444p12msbbe  planes: 3, linesizes: 128 128 128   0, plane_sizes:  6144  6144  6144     0, plane_offsets:  6144  6144     0, total_size: 18432
+yuv444p12msble  planes: 3, linesizes: 128 128 128   0, plane_sizes:  6144  6144  6144     0, plane_offsets:  6144  6144     0, total_size: 18432
+gbrp10msbbe     planes: 3, linesizes: 128 128 128   0, plane_sizes:  6144  6144  6144     0, plane_offsets:  6144  6144     0, total_size: 18432
+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
 
 image_fill_black tests
 yuv420p         total_size:   4608,  black_unknown_crc: 0xd00f6cc6,  black_tv_crc: 0xd00f6cc6,  black_pc_crc: 0x234969af
@@ -543,3 +551,11 @@ yaf16be         total_size:  12288,  black_unknown_crc: 0x7afe9aae,  black_tv_cr
 yaf16le         total_size:  12288,  black_unknown_crc: 0x94c0068b,  black_tv_crc: 0x94c0068b,  black_pc_crc: 0xc05ce449
 gbrap32be       total_size:  49152,  black_unknown_crc: 0x7bd30c95,  black_tv_crc: 0x7bd30c95,  black_pc_crc: 0x7bd30c95
 gbrap32le       total_size:  49152,  black_unknown_crc: 0x7bd30c95,  black_tv_crc: 0x7bd30c95,  black_pc_crc: 0x7bd30c95
+yuv444p10msbbe  total_size:  18432,  black_unknown_crc: 0x26991800,  black_tv_crc: 0x26991800,  black_pc_crc: 0xfe7f6700
+yuv444p10msble  total_size:  18432,  black_unknown_crc: 0x4028ac30,  black_tv_crc: 0x4028ac30,  black_pc_crc: 0xab7c7698
+yuv444p12msbbe  total_size:  18432,  black_unknown_crc: 0x26991800,  black_tv_crc: 0x26991800,  black_pc_crc: 0xfe7f6700
+yuv444p12msble  total_size:  18432,  black_unknown_crc: 0x4028ac30,  black_tv_crc: 0x4028ac30,  black_pc_crc: 0xab7c7698
+gbrp10msbbe     total_size:  18432,  black_unknown_crc: 0x00000000,  black_tv_crc: 0x00000000,  black_pc_crc: 0x00000000
+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
diff --git a/tests/ref/fate/sws-floatimg-cmp b/tests/ref/fate/sws-floatimg-cmp
index 251042f1c3..c7b7a3f8c1 100644
--- a/tests/ref/fate/sws-floatimg-cmp
+++ b/tests/ref/fate/sws-floatimg-cmp
@@ -22,6 +22,14 @@ gbrpf32le -> yuv444p14le -> gbrpf32le
 avg diff: 0.000127
 min diff: 0.000000
 max diff: 0.000524
+gbrpf32le -> yuv444p10msble -> gbrpf32le
+avg diff: 0.000467
+min diff: 0.000000
+max diff: 0.001912
+gbrpf32le -> yuv444p12msble -> gbrpf32le
+avg diff: 0.000166
+min diff: 0.000000
+max diff: 0.000802
 gbrpf32le -> rgb24 -> gbrpf32le
 avg diff: 0.001011
 min diff: 0.000000
@@ -98,6 +106,14 @@ gbrpf32le -> gbrap10le -> gbrpf32le
 avg diff: 0.000350
 min diff: 0.000000
 max diff: 0.001475
+gbrpf32le -> gbrp10msble -> gbrpf32le
+avg diff: 0.000350
+min diff: 0.000000
+max diff: 0.001475
+gbrpf32le -> gbrp12msble -> gbrpf32le
+avg diff: 0.000260
+min diff: 0.000000
+max diff: 0.001135
 gbrpf32le -> gbrp12le -> gbrpf32le
 avg diff: 0.000260
 min diff: 0.000000
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index 6b1a97ec00..a062088d54 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -61,8 +61,12 @@ isNBPS:
   gbrap14le
   gbrp10be
   gbrp10le
+  gbrp10msbbe
+  gbrp10msble
   gbrp12be
   gbrp12le
+  gbrp12msbbe
+  gbrp12msble
   gbrp14be
   gbrp14le
   gbrp9be
@@ -127,8 +131,12 @@ isNBPS:
   yuv440p12le
   yuv444p10be
   yuv444p10le
+  yuv444p10msbbe
+  yuv444p10msble
   yuv444p12be
   yuv444p12le
+  yuv444p12msbbe
+  yuv444p12msble
   yuv444p14be
   yuv444p14le
   yuv444p9be
@@ -169,7 +177,9 @@ isBE:
   gbrapf16be
   gbrapf32be
   gbrp10be
+  gbrp10msbbe
   gbrp12be
+  gbrp12msbbe
   gbrp14be
   gbrp16be
   gbrp9be
@@ -230,7 +240,9 @@ isBE:
   yuv440p10be
   yuv440p12be
   yuv444p10be
+  yuv444p10msbbe
   yuv444p12be
+  yuv444p12msbbe
   yuv444p14be
   yuv444p16be
   yuv444p9be
@@ -336,8 +348,12 @@ isYUV:
   yuv444p
   yuv444p10be
   yuv444p10le
+  yuv444p10msbbe
+  yuv444p10msble
   yuv444p12be
   yuv444p12le
+  yuv444p12msbbe
+  yuv444p12msble
   yuv444p14be
   yuv444p14le
   yuv444p16be
@@ -435,8 +451,12 @@ isPlanarYUV:
   yuv444p
   yuv444p10be
   yuv444p10le
+  yuv444p10msbbe
+  yuv444p10msble
   yuv444p12be
   yuv444p12le
+  yuv444p12msbbe
+  yuv444p12msble
   yuv444p14be
   yuv444p14le
   yuv444p16be
@@ -551,8 +571,12 @@ isRGB:
   gbrp
   gbrp10be
   gbrp10le
+  gbrp10msbbe
+  gbrp10msble
   gbrp12be
   gbrp12le
+  gbrp12msbbe
+  gbrp12msble
   gbrp14be
   gbrp14le
   gbrp16be
@@ -727,8 +751,12 @@ AnyRGB:
   gbrp
   gbrp10be
   gbrp10le
+  gbrp10msbbe
+  gbrp10msble
   gbrp12be
   gbrp12le
+  gbrp12msbbe
+  gbrp12msble
   gbrp14be
   gbrp14le
   gbrp16be
@@ -966,8 +994,12 @@ Planar:
   gbrp
   gbrp10be
   gbrp10le
+  gbrp10msbbe
+  gbrp10msble
   gbrp12be
   gbrp12le
+  gbrp12msbbe
+  gbrp12msble
   gbrp14be
   gbrp14le
   gbrp16be
@@ -1035,8 +1067,12 @@ Planar:
   yuv444p
   yuv444p10be
   yuv444p10le
+  yuv444p10msbbe
+  yuv444p10msble
   yuv444p12be
   yuv444p12le
+  yuv444p12msbbe
+  yuv444p12msble
   yuv444p14be
   yuv444p14le
   yuv444p16be
@@ -1159,8 +1195,12 @@ PlanarRGB:
   gbrp
   gbrp10be
   gbrp10le
+  gbrp10msbbe
+  gbrp10msble
   gbrp12be
   gbrp12le
+  gbrp12msbbe
+  gbrp12msble
   gbrp14be
   gbrp14le
   gbrp16be
@@ -1181,6 +1221,10 @@ usePal:
   rgb8
 
 DataInHighBits:
+  gbrp10msbbe
+  gbrp10msble
+  gbrp12msbbe
+  gbrp12msble
   p010be
   p010le
   p012be
@@ -1201,6 +1245,10 @@ DataInHighBits:
   y210le
   y212be
   y212le
+  yuv444p10msbbe
+  yuv444p10msble
+  yuv444p12msbbe
+  yuv444p12msble
 
 SwappedChroma:
   nv21
-- 
2.49.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 bit MSB formats
  2025-07-04 22:17 [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 bit MSB formats Timo Rothenpieler
  2025-07-04 22:17 ` [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 " Timo Rothenpieler
@ 2025-07-04 22:26 ` Timo Rothenpieler
  1 sibling, 0 replies; 3+ messages in thread
From: Timo Rothenpieler @ 2025-07-04 22:26 UTC (permalink / raw)
  To: ffmpeg-devel

I forgot to include the description of what this is.
cuvid/nvdec/nvenc have for some reason decided to invent a new format 
(at least I have not ever seen this exist anywhere else) for dealing 
with 10 and 12 bit YUV444 input/output.

While nvenc does support ingesting normal formats, nvdec exclusively 
outputs 4:4:4 content as YUV444P10/12, but with the data sitting in the 
MSB, not LSB.
All 4:2:0 and 4:2:2 use P012/P010/P212/P210 respectively, but for 4:4:4 
it does something weird.
The data kept being in the MSB, like with the Pxxx family of formats, 
but it's fully planar.

This patch series adds those MSB formats, and their GBRP counterparts, 
plus support for them to swscale.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-07-04 22:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-07-04 22:17 [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 bit MSB formats Timo Rothenpieler
2025-07-04 22:17 ` [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 " Timo Rothenpieler
2025-07-04 22:26 ` [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 " Timo Rothenpieler

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