Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Timo Rothenpieler <timo@rothenpieler.org>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 bit MSB formats
Date: Wed, 9 Jul 2025 14:12:09 +0200
Message-ID: <ab8f0d2d-c065-4fdb-9cba-c4020ce7f6c1@rothenpieler.org> (raw)
In-Reply-To: <20250704221811.754517-2-timo@rothenpieler.org>

On 05/07/2025 00:17, Timo Rothenpieler wrote:
> ---
>   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

Any comments? Would specially like for someone to have a look at the 
swscale changes who is more familiar with the code, since I'm not 
entirely confident I did all the changes correctly.
_______________________________________________
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".

  reply	other threads:[~2025-07-09 12:11 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-04 22:17 [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 " Timo Rothenpieler
2025-07-04 22:17 ` [FFmpeg-devel] [PATCH 2/2] swscale: add support for new 10/12 " Timo Rothenpieler
2025-07-09 12:12   ` Timo Rothenpieler [this message]
2025-07-04 22:26 ` [FFmpeg-devel] [PATCH 1/2] avutils/pixfmt: add YUV444/GBRP 10 and 12 " Timo Rothenpieler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ab8f0d2d-c065-4fdb-9cba-c4020ce7f6c1@rothenpieler.org \
    --to=timo@rothenpieler.org \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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