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 {
|
| 397 | 397 | // 10-bit RGB. |
| 398 | 398 | { AV_PIX_FMT_X2RGB10LE, DRM_FORMAT_XRGB2101010 }, |
| 399 | 399 | { AV_PIX_FMT_X2RGB10BE, DRM_FORMAT_XRGB2101010 | DRM_FORMAT_BIG_ENDIAN }, |
| | 400 | { AV_PIX_FMT_X2BGR10LE, DRM_FORMAT_XBGR2101010 }, |
| 400 | 401 | // 8-bit YUV 4:2:0. |
| 401 | 402 | { AV_PIX_FMT_NV12, DRM_FORMAT_NV12 }, |
| 402 | 403 | // 8-bit YUV 4:2:2. |
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 94fdad7f06..09af95d1f0 100644
|
a
|
b
|
static const struct {
|
| 331 | 331 | { AV_PIX_FMT_0BGR32, { VK_FORMAT_A8B8G8R8_UNORM_PACK32 } }, |
| 332 | 332 | |
| 333 | 333 | { AV_PIX_FMT_X2RGB10, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } }, |
| | 334 | { AV_PIX_FMT_X2BGR10, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } }, |
| 334 | 335 | |
| 335 | 336 | { AV_PIX_FMT_GBRAP, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } }, |
| 336 | 337 | { AV_PIX_FMT_GBRAP16, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } }, |
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] = {
|
| 272 | 272 | }, |
| 273 | 273 | .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_BE, |
| 274 | 274 | }, |
| | 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 | }, |
| 275 | 299 | [AV_PIX_FMT_YUV422P] = { |
| 276 | 300 | .name = "yuv422p", |
| 277 | 301 | .nb_components = 3, |
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 5814f3f3da..53bdecfcb7 100644
|
a
|
b
|
enum AVPixelFormat {
|
| 350 | 350 | |
| 351 | 351 | AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined |
| 352 | 352 | 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 |
| 353 | 355 | 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 |
| 354 | 356 | }; |
| 355 | 357 | |
| … |
… |
enum AVPixelFormat {
|
| 440 | 442 | |
| 441 | 443 | #define AV_PIX_FMT_Y210 AV_PIX_FMT_NE(Y210BE, Y210LE) |
| 442 | 444 | #define AV_PIX_FMT_X2RGB10 AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE) |
| | 445 | #define AV_PIX_FMT_X2BGR10 AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE) |
| 443 | 446 | |
| 444 | 447 | /** |
| 445 | 448 | * Chromaticity coordinates of the source primaries. |
diff --git a/libswscale/input.c b/libswscale/input.c
index b65aaf7c06..d2cb9d0637 100644
|
a
|
b
|
rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)
|
| 245 | 245 | origin == AV_PIX_FMT_ARGB || \ |
| 246 | 246 | origin == AV_PIX_FMT_ABGR) \ |
| 247 | 247 | ? AV_RN32A(&src[(i) * 4]) \ |
| 248 | | : ((origin == AV_PIX_FMT_X2RGB10LE) \ |
| | 248 | : ((origin == AV_PIX_FMT_X2RGB10LE || \ |
| | 249 | origin == AV_PIX_FMT_X2BGR10LE) \ |
| 249 | 250 | ? AV_RL32(&src[(i) * 4]) \ |
| 250 | 251 | : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \ |
| 251 | 252 | : AV_RL16(&src[(i) * 2])))) |
| … |
… |
rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0,
|
| 393 | 394 | rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7) |
| 394 | 395 | rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4) |
| 395 | 396 | rgb16_32_wrapper(AV_PIX_FMT_X2RGB10LE, rgb30le, 16, 6, 0, 0, 0x3FF00000, 0xFFC00, 0x3FF, 0, 0, 4, RGB2YUV_SHIFT + 6) |
| | 397 | rgb16_32_wrapper(AV_PIX_FMT_X2BGR10LE, bgr30le, 0, 6, 16, 0, 0x3FF, 0xFFC00, 0x3FF00000, 4, 0, 0, RGB2YUV_SHIFT + 6) |
| 396 | 398 | |
| 397 | 399 | static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, |
| 398 | 400 | const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc, |
| … |
… |
av_cold void ff_sws_init_input_funcs(SwsContext *c)
|
| 1344 | 1346 | case AV_PIX_FMT_X2RGB10LE: |
| 1345 | 1347 | c->chrToYV12 = rgb30leToUV_half_c; |
| 1346 | 1348 | break; |
| | 1349 | case AV_PIX_FMT_X2BGR10LE: |
| | 1350 | c->chrToYV12 = bgr30leToUV_half_c; |
| | 1351 | break; |
| 1347 | 1352 | } |
| 1348 | 1353 | } else { |
| 1349 | 1354 | switch (srcFormat) { |
| … |
… |
av_cold void ff_sws_init_input_funcs(SwsContext *c)
|
| 1428 | 1433 | case AV_PIX_FMT_X2RGB10LE: |
| 1429 | 1434 | c->chrToYV12 = rgb30leToUV_c; |
| 1430 | 1435 | break; |
| | 1436 | case AV_PIX_FMT_X2BGR10LE: |
| | 1437 | c->chrToYV12 = bgr30leToUV_c; |
| | 1438 | break; |
| 1431 | 1439 | } |
| 1432 | 1440 | } |
| 1433 | 1441 | |
| … |
… |
av_cold void ff_sws_init_input_funcs(SwsContext *c)
|
| 1708 | 1716 | c->lumToYV12 = y210le_Y_c; |
| 1709 | 1717 | break; |
| 1710 | 1718 | 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; |
| 1712 | 1723 | break; |
| 1713 | 1724 | } |
| 1714 | 1725 | if (c->needAlpha) { |
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,
|
| 1603 | 1603 | |
| 1604 | 1604 | dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1]; |
| 1605 | 1605 | 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) { |
| 1607 | 1608 | uint32_t *dest = (uint32_t *) _dest; |
| 1608 | 1609 | const uint32_t *r = (const uint32_t *) _r; |
| 1609 | 1610 | const uint32_t *g = (const uint32_t *) _g; |
| … |
… |
YUV2RGBWRAPPER(yuv2rgb,, 8, AV_PIX_FMT_RGB8, 0)
|
| 1848 | 1849 | YUV2RGBWRAPPER(yuv2rgb,, 4, AV_PIX_FMT_RGB4, 0) |
| 1849 | 1850 | YUV2RGBWRAPPER(yuv2rgb,, 4b, AV_PIX_FMT_RGB4_BYTE, 0) |
| 1850 | 1851 | YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0) |
| | 1852 | YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0) |
| 1851 | 1853 | |
| 1852 | 1854 | static av_always_inline void yuv2rgb_write_full(SwsContext *c, |
| 1853 | 1855 | uint8_t *dest, int i, int Y, int A, int U, int V, |
| … |
… |
av_cold void ff_sws_init_output_funcs(SwsContext *c,
|
| 3000 | 3002 | *yuv2packed2 = yuv2x2rgb10_2_c; |
| 3001 | 3003 | *yuv2packedX = yuv2x2rgb10_X_c; |
| 3002 | 3004 | 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; |
| 3003 | 3011 | } |
| 3004 | 3012 | } |
| 3005 | 3013 | switch (dstFormat) { |
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 25051ead72..e65dba0f0b 100644
|
a
|
b
|
static const FormatEntry format_entries[] = {
|
| 267 | 267 | [AV_PIX_FMT_NV42] = { 1, 1 }, |
| 268 | 268 | [AV_PIX_FMT_Y210LE] = { 1, 0 }, |
| 269 | 269 | [AV_PIX_FMT_X2RGB10LE] = { 1, 1 }, |
| | 270 | [AV_PIX_FMT_X2BGR10LE] = { 1, 1 }, |
| 270 | 271 | }; |
| 271 | 272 | |
| 272 | 273 | int sws_isSupportedInput(enum AVPixelFormat pix_fmt) |
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],
|
| 793 | 793 | c->dstFormat == AV_PIX_FMT_NE(BGR565LE, BGR565BE) || |
| 794 | 794 | c->dstFormat == AV_PIX_FMT_NE(BGR555LE, BGR555BE) || |
| 795 | 795 | 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); |
| 797 | 798 | const int bpp = c->dstFormatBpp; |
| 798 | 799 | uint8_t *y_table; |
| 799 | 800 | uint16_t *y_table16; |