Ticket #9421: 0001-avutil-swscale-kmsgrab-add-AV_PIX_FMT_X2BGR10-LE-BE.patch

File 0001-avutil-swscale-kmsgrab-add-AV_PIX_FMT_X2BGR10-LE-BE.patch, 9.3 KB (added by mstoeckl, 5 years ago)

A patch which worksforme; will send to ffmpeg-devel after cleanup

  • libavdevice/kmsgrab.c

    From 0daae690f5197b747f0c3590609ef1dc4d0c42de Mon Sep 17 00:00:00 2001
    From: Manuel Stoeckl <code@mstoeckl.com>
    Date: Tue, 14 Sep 2021 23:09:08 -0400
    Subject: [PATCH] avutil,swscale,kmsgrab: add AV_PIX_FMT_X2BGR10(LE|BE)
    
    Signed-off-by: Manuel Stoeckl <code@mstoeckl.com>
    ---
     libavdevice/kmsgrab.c        |  1 +
     libavutil/hwcontext_vulkan.c |  1 +
     libavutil/pixdesc.c          | 24 ++++++++++++++++++++++++
     libavutil/pixfmt.h           |  3 +++
     libswscale/input.c           | 15 +++++++++++++--
     libswscale/output.c          | 10 +++++++++-
     libswscale/utils.c           |  1 +
     libswscale/yuv2rgb.c         |  3 ++-
     8 files changed, 54 insertions(+), 4 deletions(-)
    
    diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c
    index ba9b306c65..36510cabda 100644
    a b static const struct {  
    397397    // 10-bit RGB.
    398398    { AV_PIX_FMT_X2RGB10LE, DRM_FORMAT_XRGB2101010 },
    399399    { AV_PIX_FMT_X2RGB10BE, DRM_FORMAT_XRGB2101010 | DRM_FORMAT_BIG_ENDIAN },
     400    { AV_PIX_FMT_X2BGR10LE, DRM_FORMAT_XBGR2101010 },
    400401    // 8-bit YUV 4:2:0.
    401402    { AV_PIX_FMT_NV12,     DRM_FORMAT_NV12     },
    402403    // 8-bit YUV 4:2:2.
  • libavutil/hwcontext_vulkan.c

    diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
    index 94fdad7f06..09af95d1f0 100644
    a b static const struct {  
    331331    { AV_PIX_FMT_0BGR32, { VK_FORMAT_A8B8G8R8_UNORM_PACK32 } },
    332332
    333333    { AV_PIX_FMT_X2RGB10, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } },
     334    { AV_PIX_FMT_X2BGR10, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } },
    334335
    335336    { AV_PIX_FMT_GBRAP, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
    336337    { AV_PIX_FMT_GBRAP16, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
  • libavutil/pixdesc.c

    diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
    index 2346138d04..69cb198646 100644
    a b static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {  
    272272        },
    273273        .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
    274274    },
     275    [AV_PIX_FMT_X2BGR10LE] = {
     276        .name = "x2bgr10le",
     277        .nb_components= 3,
     278        .log2_chroma_w= 0,
     279        .log2_chroma_h= 0,
     280        .comp = {
     281            { 0, 4, 0, 0, 10 },       /* R */
     282            { 0, 4, 1, 2, 10 },       /* G */
     283            { 0, 4, 2, 4, 10 },       /* B */
     284        },
     285        .flags = AV_PIX_FMT_FLAG_RGB,
     286    },
     287    [AV_PIX_FMT_X2BGR10BE] = {
     288        .name = "x2bgr10be",
     289        .nb_components= 3,
     290        .log2_chroma_w= 0,
     291        .log2_chroma_h= 0,
     292        .comp = {
     293            { 0, 4, 2, 0, 10 },       /* R */
     294            { 0, 4, 1, 2, 10 },       /* G */
     295            { 0, 4, 0, 4, 10 },       /* B */
     296        },
     297        .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE,
     298    },
    275299    [AV_PIX_FMT_YUV422P] = {
    276300        .name = "yuv422p",
    277301        .nb_components = 3,
  • libavutil/pixfmt.h

    diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
    index 5814f3f3da..53bdecfcb7 100644
    a b enum AVPixelFormat {  
    350350
    351351    AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
    352352    AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined
     353    AV_PIX_FMT_X2BGR10LE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
     354    AV_PIX_FMT_X2BGR10BE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), big-endian, X=unused/undefined
    353355    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
    354356};
    355357
    enum AVPixelFormat {  
    440442
    441443#define AV_PIX_FMT_Y210       AV_PIX_FMT_NE(Y210BE,  Y210LE)
    442444#define AV_PIX_FMT_X2RGB10    AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE)
     445#define AV_PIX_FMT_X2BGR10    AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE)
    443446
    444447/**
    445448  * Chromaticity coordinates of the source primaries.
  • libswscale/input.c

    diff --git a/libswscale/input.c b/libswscale/input.c
    index b65aaf7c06..d2cb9d0637 100644
    a b rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)  
    245245                         origin == AV_PIX_FMT_ARGB ||                      \
    246246                         origin == AV_PIX_FMT_ABGR)                        \
    247247                        ? AV_RN32A(&src[(i) * 4])                          \
    248                         : ((origin == AV_PIX_FMT_X2RGB10LE)                \
     248                        : ((origin == AV_PIX_FMT_X2RGB10LE ||              \
     249                            origin == AV_PIX_FMT_X2BGR10LE)                \
    249250                           ? AV_RL32(&src[(i) * 4])                        \
    250251                           : (isBE(origin) ? AV_RB16(&src[(i) * 2])        \
    251252                              : AV_RL16(&src[(i) * 2]))))
    rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0,  
    393394rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0,  0, 0,   0x7C00, 0x03E0,   0x001F,  0, 5, 10, RGB2YUV_SHIFT + 7)
    394395rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0,  0, 0,   0x0F00, 0x00F0,   0x000F,  0, 4,  8, RGB2YUV_SHIFT + 4)
    395396rgb16_32_wrapper(AV_PIX_FMT_X2RGB10LE, rgb30le, 16, 6, 0, 0, 0x3FF00000, 0xFFC00, 0x3FF, 0, 0, 4, RGB2YUV_SHIFT + 6)
     397rgb16_32_wrapper(AV_PIX_FMT_X2BGR10LE, bgr30le, 0, 6, 16, 0,  0x3FF, 0xFFC00, 0x3FF00000, 4, 0, 0, RGB2YUV_SHIFT + 6)
    396398
    397399static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
    398400                         const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
    av_cold void ff_sws_init_input_funcs(SwsContext *c)  
    13441346        case AV_PIX_FMT_X2RGB10LE:
    13451347            c->chrToYV12 = rgb30leToUV_half_c;
    13461348            break;
     1349        case AV_PIX_FMT_X2BGR10LE:
     1350            c->chrToYV12 = bgr30leToUV_half_c;
     1351            break;
    13471352        }
    13481353    } else {
    13491354        switch (srcFormat) {
    av_cold void ff_sws_init_input_funcs(SwsContext *c)  
    14281433        case AV_PIX_FMT_X2RGB10LE:
    14291434            c->chrToYV12 = rgb30leToUV_c;
    14301435            break;
     1436        case AV_PIX_FMT_X2BGR10LE:
     1437            c->chrToYV12 = bgr30leToUV_c;
     1438            break;
    14311439        }
    14321440    }
    14331441
    av_cold void ff_sws_init_input_funcs(SwsContext *c)  
    17081716        c->lumToYV12 = y210le_Y_c;
    17091717        break;
    17101718    case AV_PIX_FMT_X2RGB10LE:
    1711         c->lumToYV12 =rgb30leToY_c;
     1719        c->lumToYV12 = rgb30leToY_c;
     1720        break;
     1721    case AV_PIX_FMT_X2BGR10LE:
     1722        c->lumToYV12 = bgr30leToY_c;
    17121723        break;
    17131724    }
    17141725    if (c->needAlpha) {
  • libswscale/output.c

    diff --git a/libswscale/output.c b/libswscale/output.c
    index f1d9a61d53..cf09f1b34e 100644
    a b yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,  
    16031603
    16041604        dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
    16051605        dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
    1606     } else if (target == AV_PIX_FMT_X2RGB10) {
     1606    } else if (target == AV_PIX_FMT_X2RGB10 ||
     1607               target == AV_PIX_FMT_X2BGR10) {
    16071608        uint32_t *dest = (uint32_t *) _dest;
    16081609        const uint32_t *r = (const uint32_t *) _r;
    16091610        const uint32_t *g = (const uint32_t *) _g;
    YUV2RGBWRAPPER(yuv2rgb,, 8, AV_PIX_FMT_RGB8, 0)  
    18481849YUV2RGBWRAPPER(yuv2rgb,,   4,    AV_PIX_FMT_RGB4,      0)
    18491850YUV2RGBWRAPPER(yuv2rgb,,   4b,   AV_PIX_FMT_RGB4_BYTE, 0)
    18501851YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0)
     1852YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0)
    18511853
    18521854static av_always_inline void yuv2rgb_write_full(SwsContext *c,
    18531855    uint8_t *dest, int i, int Y, int A, int U, int V,
    av_cold void ff_sws_init_output_funcs(SwsContext *c,  
    30003002            *yuv2packed2 = yuv2x2rgb10_2_c;
    30013003            *yuv2packedX = yuv2x2rgb10_X_c;
    30023004            break;
     3005        case AV_PIX_FMT_X2BGR10LE:
     3006        case AV_PIX_FMT_X2BGR10BE:
     3007            *yuv2packed1 = yuv2x2bgr10_1_c;
     3008            *yuv2packed2 = yuv2x2bgr10_2_c;
     3009            *yuv2packedX = yuv2x2bgr10_X_c;
     3010            break;
    30033011        }
    30043012    }
    30053013    switch (dstFormat) {
  • libswscale/utils.c

    diff --git a/libswscale/utils.c b/libswscale/utils.c
    index 25051ead72..e65dba0f0b 100644
    a b static const FormatEntry format_entries[] = {  
    267267    [AV_PIX_FMT_NV42]        = { 1, 1 },
    268268    [AV_PIX_FMT_Y210LE]      = { 1, 0 },
    269269    [AV_PIX_FMT_X2RGB10LE]   = { 1, 1 },
     270    [AV_PIX_FMT_X2BGR10LE]   = { 1, 1 },
    270271};
    271272
    272273int sws_isSupportedInput(enum AVPixelFormat pix_fmt)
  • libswscale/yuv2rgb.c

    diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c
    index cac82f4c6f..13ceaec60e 100644
    a b av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],  
    793793                        c->dstFormat == AV_PIX_FMT_NE(BGR565LE, BGR565BE) ||
    794794                        c->dstFormat == AV_PIX_FMT_NE(BGR555LE, BGR555BE) ||
    795795                        c->dstFormat == AV_PIX_FMT_NE(BGR444LE, BGR444BE) ||
    796                         c->dstFormat == AV_PIX_FMT_NE(X2RGB10LE, X2RGB10BE);
     796                        c->dstFormat == AV_PIX_FMT_NE(X2RGB10LE, X2RGB10BE) ||
     797                        c->dstFormat == AV_PIX_FMT_NE(X2BGR10LE, X2BGR10BE);
    797798    const int bpp = c->dstFormatBpp;
    798799    uint8_t *y_table;
    799800    uint16_t *y_table16;