From 529fe6e12e821ffa95f5c3102bc453516212ce50 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Wed, 27 Dec 2023 22:52:46 +0800 Subject: [PATCH] lsws/input: add NV15 and NV20 formats support Signed-off-by: nyanmisaka --- libswscale/input.c | 41 ++++++++++++++++++++++++++++++++ libswscale/utils.c | 2 ++ tests/ref/fate/imgutils | 1 + tests/ref/fate/sws-pixdesc-query | 5 ++++ 4 files changed, 49 insertions(+) diff --git a/libswscale/input.c b/libswscale/input.c index d171394bb2..c3b21bc980 100644 --- a/libswscale/input.c +++ b/libswscale/input.c @@ -793,6 +793,39 @@ static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV, nvXXtoUV_c(dstV, dstU, src1, width); } +static av_always_inline void nv15_20ToYUV_c(uint16_t *dst, const uint8_t *src, + int dst_pos, int src_pos) +{ + int shift = (src_pos << 1) & 7; + src_pos = (src_pos * 10) >> 3; + AV_WN16(dst + dst_pos, + ((AV_RL16(src + src_pos) >> shift) | + (AV_RL16(src + src_pos + 1) << (8 - shift))) & 0x3FF); +} + +static void nv15_20ToY_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; + const uint8_t *src = (const uint8_t *)_src; + uint16_t *dst = (uint16_t *)_dst; + for (i = 0; i < width; i++) + nv15_20ToYUV_c(dst, src, i, i); +} + +static void nv15_20ToUV_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; + const uint8_t *src1 = (const uint8_t *)_src1; + uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV; + for (i = 0; i < width; i++) { + nv15_20ToYUV_c(dstU, src1, i, 2 * i); + nv15_20ToYUV_c(dstV, src1, i, 2 * i + 1); + } +} + #define p01x_uv_wrapper(bits, shift) \ static void p0 ## bits ## LEToUV_c(uint8_t *dstU, uint8_t *dstV, \ const uint8_t *unused0, \ @@ -1444,6 +1477,10 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_XV36LE: c->chrToYV12 = read_xv36le_UV_c; break; + case AV_PIX_FMT_NV15: + case AV_PIX_FMT_NV20: + c->chrToYV12 = nv15_20ToUV_c; + break; case AV_PIX_FMT_P010LE: case AV_PIX_FMT_P210LE: case AV_PIX_FMT_P410LE: @@ -1944,6 +1981,10 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_BGRA64LE: c->lumToYV12 = bgr64LEToY_c; break; + case AV_PIX_FMT_NV15: + case AV_PIX_FMT_NV20: + c->lumToYV12 = nv15_20ToY_c; + break; case AV_PIX_FMT_P010LE: case AV_PIX_FMT_P210LE: case AV_PIX_FMT_P410LE: diff --git a/libswscale/utils.c b/libswscale/utils.c index e1ad685972..61efe702bd 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -230,6 +230,8 @@ static const FormatEntry format_entries[] = { [AV_PIX_FMT_XYZ12BE] = { 1, 1, 1 }, [AV_PIX_FMT_XYZ12LE] = { 1, 1, 1 }, [AV_PIX_FMT_AYUV64LE] = { 1, 1}, + [AV_PIX_FMT_NV15] = { 1, 0 }, + [AV_PIX_FMT_NV20] = { 1, 0 }, [AV_PIX_FMT_P010LE] = { 1, 1 }, [AV_PIX_FMT_P010BE] = { 1, 1 }, [AV_PIX_FMT_P012LE] = { 1, 1 }, diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils index f166cb67fb..62de71ddb9 100644 --- a/tests/ref/fate/imgutils +++ b/tests/ref/fate/imgutils @@ -268,3 +268,4 @@ p412be planes: 2, linesizes: 128 256 0 0, plane_sizes: 6144 12288 p412le planes: 2, linesizes: 128 256 0 0, plane_sizes: 6144 12288 0 0, plane_offsets: 6144 0 0, total_size: 18432 gbrap14be planes: 4, linesizes: 128 128 128 128, plane_sizes: 6144 6144 6144 6144, plane_offsets: 6144 6144 6144, total_size: 24576 gbrap14le planes: 4, linesizes: 128 128 128 128, plane_sizes: 6144 6144 6144 6144, plane_offsets: 6144 6144 6144, total_size: 24576 +nv15 planes: 2, linesizes: 80 80 0 0, plane_sizes: 3840 1920 0 0, plane_offsets: 3840 0 0, total_size: 5760 diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query index fff93bbf0e..c89434fc0b 100644 --- a/tests/ref/fate/sws-pixdesc-query +++ b/tests/ref/fate/sws-pixdesc-query @@ -61,6 +61,7 @@ isNBPS: gray14le gray9be gray9le + nv15 nv20be nv20le p010be @@ -221,6 +222,7 @@ isYUV: ayuv64be ayuv64le nv12 + nv15 nv16 nv20be nv20le @@ -337,6 +339,7 @@ isYUV: isPlanarYUV: nv12 + nv15 nv16 nv20be nv20le @@ -434,6 +437,7 @@ isPlanarYUV: isSemiPlanarYUV: nv12 + nv15 nv16 nv20be nv20le @@ -868,6 +872,7 @@ Planar: gbrpf32be gbrpf32le nv12 + nv15 nv16 nv20be nv20le