* [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv [not found] <20240624113701.94616-1-quinkblack@foxmail.com> @ 2024-06-24 11:37 ` Zhao Zhili 2024-06-24 11:55 ` Martin Storsjö 2024-06-24 11:37 ` [FFmpeg-devel] [PATCH v3 3/3] swscale/aarch64: Add argb/abgr " Zhao Zhili 1 sibling, 1 reply; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 11:37 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Zhao Zhili From: Zhao Zhili <zhilizhao@tencent.com> Test on Apple M1 with kperf : -O3 : -O3 -fno-vectorize bgra_to_uv_8_c : 13.4 : 27.5 bgra_to_uv_8_neon : 37.4 : 41.7 bgra_to_uv_128_c : 155.9 : 550.2 bgra_to_uv_128_neon : 91.7 : 92.7 bgra_to_uv_1080_c : 1173.2 : 4558.2 bgra_to_uv_1080_neon : 822.7 : 809.5 bgra_to_uv_1920_c : 2078.2 : 8115.2 bgra_to_uv_1920_neon : 1437.7 : 1438.7 bgra_to_uv_half_8_c : 17.9 : 14.2 bgra_to_uv_half_8_neon : 37.4 : 10.5 bgra_to_uv_half_128_c : 103.9 : 326.0 bgra_to_uv_half_128_neon : 73.9 : 68.7 bgra_to_uv_half_1080_c : 850.2 : 3732.0 bgra_to_uv_half_1080_neon : 484.2 : 490.0 bgra_to_uv_half_1920_c : 1479.2 : 4942.7 bgra_to_uv_half_1920_neon : 824.2 : 824.7 bgra_to_y_8_c : 8.2 : 29.5 bgra_to_y_8_neon : 18.2 : 32.7 bgra_to_y_128_c : 101.4 : 361.5 bgra_to_y_128_neon : 74.9 : 73.7 bgra_to_y_1080_c : 739.4 : 3018.0 bgra_to_y_1080_neon : 613.4 : 544.2 bgra_to_y_1920_c : 1298.7 : 5326.0 bgra_to_y_1920_neon : 918.7 : 934.2 --- libswscale/aarch64/input.S | 91 ++++++++++++++++++++++++++++++------ libswscale/aarch64/swscale.c | 16 +++++++ 2 files changed, 94 insertions(+), 13 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 2cfec4cb6a..6d2c6034bb 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -20,8 +20,12 @@ #include "libavutil/aarch64/asm.S" -.macro rgb_to_yuv_load_rgb src +.macro rgb_to_yuv_load_rgb src, element=3 + .if \element == 3 ld3 { v16.16b, v17.16b, v18.16b }, [\src] + .else + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] + .endif uxtl v19.8h, v16.8b // v19: r uxtl v20.8h, v17.8b // v20: g uxtl v21.8h, v18.8b // v21: b @@ -51,7 +55,8 @@ function ff_bgr24ToY_neon, export=1 ret endfunc -function ff_rgb24ToY_neon, export=1 +.macro rgbToY_neon fmt, element +function ff_\fmt\()ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w10, w11, [x5] // w10: ry, w11: gy ldr w12, [x5, #8] // w12: by @@ -67,11 +72,11 @@ function ff_rgb24ToY_neon, export=1 dup v2.8h, w12 b.lt 2f 1: - rgb_to_yuv_load_rgb x1 + rgb_to_yuv_load_rgb x1, \element rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 sub w4, w4, #16 // width -= 16 - add x1, x1, #48 // src += 48 + add x1, x1, #(16*\element) cmp w4, #16 // width >= 16 ? stp q16, q17, [x0], #32 // store to dst b.ge 1b @@ -86,12 +91,25 @@ function ff_rgb24ToY_neon, export=1 smaddl x13, w15, w12, x13 // x13 += by * b asr w13, w13, #9 // x13 >>= 9 sub w4, w4, #1 // width-- - add x1, x1, #3 // src += 3 + add x1, x1, #\element strh w13, [x0], #2 // store to dst cbnz w4, 2b 3: ret endfunc +.endm + +rgbToY_neon fmt=rgb24, element=3 + +function ff_bgra32ToY_neon, export=1 + cmp w4, #0 // check width > 0 + ldp w12, w11, [x5] // w12: ry, w11: gy + ldr w10, [x5, #8] // w10: by + b.gt 4f + ret +endfunc + +rgbToY_neon fmt=rgba32, element=4 .macro rgb_set_uv_coeff half .if \half @@ -120,7 +138,8 @@ function ff_bgr24ToUV_half_neon, export=1 b 4f endfunc -function ff_rgb24ToUV_half_neon, export=1 +.macro rgbToUV_half_neon fmt, element +function ff_\fmt\()ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -132,7 +151,11 @@ function ff_rgb24ToUV_half_neon, export=1 rgb_set_uv_coeff half=1 b.lt 2f 1: + .if \element == 3 ld3 { v16.16b, v17.16b, v18.16b }, [x3] + .else + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] + .endif uaddlp v19.8h, v16.16b // v19: r uaddlp v20.8h, v17.16b // v20: g uaddlp v21.8h, v18.16b // v21: b @@ -140,7 +163,7 @@ function ff_rgb24ToUV_half_neon, export=1 rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 sub w5, w5, #8 // width -= 8 - add x3, x3, #48 // src += 48 + add x3, x3, #(16*\element) cmp w5, #8 // width >= 8 ? str q16, [x0], #16 // store dst_u str q17, [x1], #16 // store dst_v @@ -148,9 +171,10 @@ function ff_rgb24ToUV_half_neon, export=1 cbz w5, 3f 2: ldrb w2, [x3] // w2: r1 - ldrb w4, [x3, #3] // w4: r2 + ldrb w4, [x3, #\element] // w4: r2 add w2, w2, w4 // w2 = r1 + r2 + .if \element == 3 ldrb w4, [x3, #1] // w4: g1 ldrb w7, [x3, #4] // w7: g2 add w4, w4, w7 // w4 = g1 + g2 @@ -158,6 +182,15 @@ function ff_rgb24ToUV_half_neon, export=1 ldrb w7, [x3, #2] // w7: b1 ldrb w8, [x3, #5] // w8: b2 add w7, w7, w8 // w7 = b1 + b2 + .else + ldrb w4, [x3, #1] // w4: g1 + ldrb w7, [x3, #5] // w7: g2 + add w4, w4, w7 // w4 = g1 + g2 + + ldrb w7, [x3, #2] // w7: b1 + ldrb w8, [x3, #6] // w8: b2 + add w7, w7, w8 // w7 = b1 + b2 + .endif smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset smaddl x8, w4, w11, x8 // dst_u += gu * g @@ -170,12 +203,28 @@ function ff_rgb24ToUV_half_neon, export=1 smaddl x8, w7, w15, x8 // dst_v += bv * b asr x8, x8, #10 // dst_v >>= 10 sub w5, w5, #1 - add x3, x3, #6 // src += 6 + ldrb w4, [x3, #1] // w4: g1 + add x3, x3, #(2*\element) strh w8, [x1], #2 // store dst_v cbnz w5, 2b 3: ret endfunc +.endm + +rgbToUV_half_neon fmt=rgb24, element=3 + +function ff_bgra32ToUV_half_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + +rgbToUV_half_neon fmt=rgba32, element=4 function ff_bgr24ToUV_neon, export=1 cmp w5, #0 // check width > 0 @@ -187,7 +236,8 @@ function ff_bgr24ToUV_neon, export=1 b 4f endfunc -function ff_rgb24ToUV_neon, export=1 +.macro rgbToUV_neon fmt, element +function ff_\fmt\()ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -199,13 +249,13 @@ function ff_rgb24ToUV_neon, export=1 rgb_set_uv_coeff half=0 b.lt 2f 1: - rgb_to_yuv_load_rgb x3 + rgb_to_yuv_load_rgb x3, \element rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 rgb_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v19, v3, v4, v5, #9 sub w5, w5, #16 - add x3, x3, #48 // src += 48 + add x3, x3, #(16*\element) cmp w5, #16 stp q16, q17, [x0], #32 // store to dst_u stp q18, q19, [x1], #32 // store to dst_v @@ -227,9 +277,24 @@ function ff_rgb24ToUV_neon, export=1 smaddl x8, w4, w15, x8 // x8 += bv * b asr w8, w8, #9 // x8 >>= 9 sub w5, w5, #1 // width-- - add x3, x3, #3 // src += 3 + add x3, x3, #\element strh w8, [x1], #2 // store to dst_v cbnz w5, 2b 3: ret endfunc +.endm + +rgbToUV_neon fmt=rgb24, element=3 + +function ff_bgra32ToUV_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + +rgbToUV_neon fmt=rgba32, element=4 diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index c6594944c3..92af662014 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -212,7 +212,9 @@ void ff_##name##ToUV_half_neon(uint8_t *, uint8_t *, const uint8_t *, \ uint32_t *coeffs, void *) NEON_INPUT(bgr24); +NEON_INPUT(bgra32); NEON_INPUT(rgb24); +NEON_INPUT(rgba32); void ff_lumRangeFromJpeg_neon(int16_t *dst, int width); void ff_chrRangeFromJpeg_neon(int16_t *dstU, int16_t *dstV, int width); @@ -253,6 +255,13 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) else c->chrToYV12 = ff_bgr24ToUV_neon; break; + case AV_PIX_FMT_BGRA: + c->lumToYV12 = ff_bgra32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_bgra32ToUV_half_neon; + else + c->chrToYV12 = ff_bgra32ToUV_neon; + break; case AV_PIX_FMT_RGB24: c->lumToYV12 = ff_rgb24ToY_neon; if (c->chrSrcHSubSample) @@ -260,6 +269,13 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) else c->chrToYV12 = ff_rgb24ToUV_neon; break; + case AV_PIX_FMT_RGBA: + c->lumToYV12 = ff_rgba32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_rgba32ToUV_half_neon; + else + c->chrToYV12 = ff_rgba32ToUV_neon; + break; default: break; } -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv 2024-06-24 11:37 ` [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv Zhao Zhili @ 2024-06-24 11:55 ` Martin Storsjö 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 1/3] swscale/aarch64: Add bgr24 " Zhao Zhili ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Martin Storsjö @ 2024-06-24 11:55 UTC (permalink / raw) To: FFmpeg development discussions and patches; +Cc: Zhao Zhili On Mon, 24 Jun 2024, Zhao Zhili wrote: > From: Zhao Zhili <zhilizhao@tencent.com> > > Test on Apple M1 with kperf > : -O3 : -O3 -fno-vectorize > bgra_to_uv_8_c : 13.4 : 27.5 > bgra_to_uv_8_neon : 37.4 : 41.7 > bgra_to_uv_128_c : 155.9 : 550.2 > bgra_to_uv_128_neon : 91.7 : 92.7 > bgra_to_uv_1080_c : 1173.2 : 4558.2 > bgra_to_uv_1080_neon : 822.7 : 809.5 > bgra_to_uv_1920_c : 2078.2 : 8115.2 > bgra_to_uv_1920_neon : 1437.7 : 1438.7 > bgra_to_uv_half_8_c : 17.9 : 14.2 > bgra_to_uv_half_8_neon : 37.4 : 10.5 > bgra_to_uv_half_128_c : 103.9 : 326.0 > bgra_to_uv_half_128_neon : 73.9 : 68.7 > bgra_to_uv_half_1080_c : 850.2 : 3732.0 > bgra_to_uv_half_1080_neon : 484.2 : 490.0 > bgra_to_uv_half_1920_c : 1479.2 : 4942.7 > bgra_to_uv_half_1920_neon : 824.2 : 824.7 > bgra_to_y_8_c : 8.2 : 29.5 > bgra_to_y_8_neon : 18.2 : 32.7 > bgra_to_y_128_c : 101.4 : 361.5 > bgra_to_y_128_neon : 74.9 : 73.7 > bgra_to_y_1080_c : 739.4 : 3018.0 > bgra_to_y_1080_neon : 613.4 : 544.2 > bgra_to_y_1920_c : 1298.7 : 5326.0 > bgra_to_y_1920_neon : 918.7 : 934.2 > --- > libswscale/aarch64/input.S | 91 ++++++++++++++++++++++++++++++------ > libswscale/aarch64/swscale.c | 16 +++++++ > 2 files changed, 94 insertions(+), 13 deletions(-) > > diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S > index 2cfec4cb6a..6d2c6034bb 100644 > --- a/libswscale/aarch64/input.S > +++ b/libswscale/aarch64/input.S > @@ -20,8 +20,12 @@ > > #include "libavutil/aarch64/asm.S" > > -.macro rgb_to_yuv_load_rgb src > +.macro rgb_to_yuv_load_rgb src, element=3 > + .if \element == 3 > ld3 { v16.16b, v17.16b, v18.16b }, [\src] > + .else > + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] > + .endif > uxtl v19.8h, v16.8b // v19: r > uxtl v20.8h, v17.8b // v20: g > uxtl v21.8h, v18.8b // v21: b > @@ -51,7 +55,8 @@ function ff_bgr24ToY_neon, export=1 > ret > endfunc > > -function ff_rgb24ToY_neon, export=1 > +.macro rgbToY_neon fmt, element > +function ff_\fmt\()ToY_neon, export=1 > cmp w4, #0 // check width > 0 > ldp w10, w11, [x5] // w10: ry, w11: gy > ldr w12, [x5, #8] // w12: by > @@ -67,11 +72,11 @@ function ff_rgb24ToY_neon, export=1 > dup v2.8h, w12 > b.lt 2f > 1: > - rgb_to_yuv_load_rgb x1 > + rgb_to_yuv_load_rgb x1, \element > rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 > rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 > sub w4, w4, #16 // width -= 16 > - add x1, x1, #48 // src += 48 > + add x1, x1, #(16*\element) > cmp w4, #16 // width >= 16 ? > stp q16, q17, [x0], #32 // store to dst > b.ge 1b > @@ -86,12 +91,25 @@ function ff_rgb24ToY_neon, export=1 > smaddl x13, w15, w12, x13 // x13 += by * b > asr w13, w13, #9 // x13 >>= 9 > sub w4, w4, #1 // width-- > - add x1, x1, #3 // src += 3 > + add x1, x1, #\element > strh w13, [x0], #2 // store to dst > cbnz w4, 2b > 3: > ret > endfunc > +.endm > + > +rgbToY_neon fmt=rgb24, element=3 > + > +function ff_bgra32ToY_neon, export=1 > + cmp w4, #0 // check width > 0 > + ldp w12, w11, [x5] // w12: ry, w11: gy > + ldr w10, [x5, #8] // w10: by > + b.gt 4f > + ret > +endfunc > + > +rgbToY_neon fmt=rgba32, element=4 It is extremely obscure to jump to a local label (4f) that is defined by the following macro. I think this would be much more readable if you'd include the bgr(a) version in the macro, so the reference to 4f is near to the actual label it refers to. > .macro rgb_set_uv_coeff half > .if \half > @@ -120,7 +138,8 @@ function ff_bgr24ToUV_half_neon, export=1 > b 4f > endfunc > > -function ff_rgb24ToUV_half_neon, export=1 > +.macro rgbToUV_half_neon fmt, element > +function ff_\fmt\()ToUV_half_neon, export=1 > cmp w5, #0 // check width > 0 > b.le 3f > > @@ -132,7 +151,11 @@ function ff_rgb24ToUV_half_neon, export=1 > rgb_set_uv_coeff half=1 > b.lt 2f > 1: > + .if \element == 3 > ld3 { v16.16b, v17.16b, v18.16b }, [x3] > + .else > + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] > + .endif > uaddlp v19.8h, v16.16b // v19: r > uaddlp v20.8h, v17.16b // v20: g > uaddlp v21.8h, v18.16b // v21: b > @@ -140,7 +163,7 @@ function ff_rgb24ToUV_half_neon, export=1 > rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 > rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 > sub w5, w5, #8 // width -= 8 > - add x3, x3, #48 // src += 48 > + add x3, x3, #(16*\element) > cmp w5, #8 // width >= 8 ? > str q16, [x0], #16 // store dst_u > str q17, [x1], #16 // store dst_v > @@ -148,9 +171,10 @@ function ff_rgb24ToUV_half_neon, export=1 > cbz w5, 3f > 2: > ldrb w2, [x3] // w2: r1 > - ldrb w4, [x3, #3] // w4: r2 > + ldrb w4, [x3, #\element] // w4: r2 > add w2, w2, w4 // w2 = r1 + r2 > > + .if \element == 3 > ldrb w4, [x3, #1] // w4: g1 > ldrb w7, [x3, #4] // w7: g2 > add w4, w4, w7 // w4 = g1 + g2 > @@ -158,6 +182,15 @@ function ff_rgb24ToUV_half_neon, export=1 > ldrb w7, [x3, #2] // w7: b1 > ldrb w8, [x3, #5] // w8: b2 > add w7, w7, w8 // w7 = b1 + b2 > + .else > + ldrb w4, [x3, #1] // w4: g1 > + ldrb w7, [x3, #5] // w7: g2 > + add w4, w4, w7 // w4 = g1 + g2 > + > + ldrb w7, [x3, #2] // w7: b1 > + ldrb w8, [x3, #6] // w8: b2 > + add w7, w7, w8 // w7 = b1 + b2 > + .endif > > smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset > smaddl x8, w4, w11, x8 // dst_u += gu * g > @@ -170,12 +203,28 @@ function ff_rgb24ToUV_half_neon, export=1 > smaddl x8, w7, w15, x8 // dst_v += bv * b > asr x8, x8, #10 // dst_v >>= 10 > sub w5, w5, #1 > - add x3, x3, #6 // src += 6 > + ldrb w4, [x3, #1] // w4: g1 > + add x3, x3, #(2*\element) Is the new ldrb a typo/copypaste mistake here? // Martin _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* [FFmpeg-devel] [PATCH v4 1/3] swscale/aarch64: Add bgr24 to yuv 2024-06-24 11:55 ` Martin Storsjö @ 2024-06-24 13:02 ` Zhao Zhili [not found] ` <20240624130213.71634-1-quinkblack@foxmail.com> 2024-06-24 13:04 ` [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba " Zhao Zhili 2 siblings, 0 replies; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 13:02 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Zhao Zhili From: Zhao Zhili <zhilizhao@tencent.com> Test on Apple M1 with kperf : -O3 : -O3 -fno-vectorize bgr24_to_uv_8_c : 28.5 : 52.5 bgr24_to_uv_8_neon : 54.5 : 59.7 bgr24_to_uv_128_c : 294.0 : 830.7 bgr24_to_uv_128_neon : 99.7 : 112.0 bgr24_to_uv_1080_c : 965.0 : 6624.0 bgr24_to_uv_1080_neon : 751.5 : 754.7 bgr24_to_uv_1920_c : 1693.2 : 11554.5 bgr24_to_uv_1920_neon : 1292.5 : 1307.5 bgr24_to_uv_half_8_c : 54.2 : 37.0 bgr24_to_uv_half_8_neon : 27.2 : 22.5 bgr24_to_uv_half_128_c : 127.2 : 392.5 bgr24_to_uv_half_128_neon : 63.0 : 52.0 bgr24_to_uv_half_1080_c : 880.2 : 3329.0 bgr24_to_uv_half_1080_neon : 401.5 : 390.7 bgr24_to_uv_half_1920_c : 1585.7 : 6390.7 bgr24_to_uv_half_1920_neon : 694.7 : 698.7 bgr24_to_y_8_c : 21.7 : 22.5 bgr24_to_y_8_neon : 797.2 : 25.5 bgr24_to_y_128_c : 88.0 : 280.5 bgr24_to_y_128_neon : 63.7 : 55.0 bgr24_to_y_1080_c : 616.7 : 2208.7 bgr24_to_y_1080_neon : 900.0 : 452.0 bgr24_to_y_1920_c : 1093.2 : 3894.7 bgr24_to_y_1920_neon : 777.2 : 767.5 --- libswscale/aarch64/input.S | 71 ++++++++++++++++++++++++++---------- libswscale/aarch64/swscale.c | 32 +++++++++------- 2 files changed, 71 insertions(+), 32 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 33afa34111..2cfec4cb6a 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -20,7 +20,7 @@ #include "libavutil/aarch64/asm.S" -.macro rgb24_to_yuv_load_rgb, src +.macro rgb_to_yuv_load_rgb src ld3 { v16.16b, v17.16b, v18.16b }, [\src] uxtl v19.8h, v16.8b // v19: r uxtl v20.8h, v17.8b // v20: g @@ -30,7 +30,7 @@ uxtl2 v24.8h, v18.16b // v24: b .endm -.macro rgb24_to_yuv_product, r, g, b, dst1, dst2, dst, coef0, coef1, coef2, right_shift +.macro rgb_to_yuv_product r, g, b, dst1, dst2, dst, coef0, coef1, coef2, right_shift mov \dst1\().16b, v6.16b // dst1 = const_offset mov \dst2\().16b, v6.16b // dst2 = const_offset smlal \dst1\().4s, \coef0\().4h, \r\().4h // dst1 += rx * r @@ -43,12 +43,20 @@ sqshrn2 \dst\().8h, \dst2\().4s, \right_shift // dst_higher_half = dst2 >> right_shift .endm +function ff_bgr24ToY_neon, export=1 + cmp w4, #0 // check width > 0 + ldp w12, w11, [x5] // w12: ry, w11: gy + ldr w10, [x5, #8] // w10: by + b.gt 4f + ret +endfunc + function ff_rgb24ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w10, w11, [x5] // w10: ry, w11: gy ldr w12, [x5, #8] // w12: by b.le 3f - +4: mov w9, #256 // w9 = 1 << (RGB2YUV_SHIFT - 7) movk w9, #8, lsl #16 // w9 += 32 << (RGB2YUV_SHIFT - 1) dup v6.4s, w9 // w9: const_offset @@ -59,9 +67,9 @@ function ff_rgb24ToY_neon, export=1 dup v2.8h, w12 b.lt 2f 1: - rgb24_to_yuv_load_rgb x1 - rgb24_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 - rgb24_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 + rgb_to_yuv_load_rgb x1 + rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 + rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 sub w4, w4, #16 // width -= 16 add x1, x1, #48 // src += 48 cmp w4, #16 // width >= 16 ? @@ -85,10 +93,7 @@ function ff_rgb24ToY_neon, export=1 ret endfunc -.macro rgb24_load_uv_coeff half - ldp w10, w11, [x6, #12] // w10: ru, w11: gu - ldp w12, w13, [x6, #20] // w12: bu, w13: rv - ldp w14, w15, [x6, #28] // w14: gv, w15: bv +.macro rgb_set_uv_coeff half .if \half mov w9, #512 movk w9, #128, lsl #16 // w9: const_offset @@ -105,12 +110,26 @@ endfunc dup v6.4s, w9 .endm +function ff_bgr24ToUV_half_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + function ff_rgb24ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f + ldp w10, w11, [x6, #12] // w10: ru, w11: gu + ldp w12, w13, [x6, #20] // w12: bu, w13: rv + ldp w14, w15, [x6, #28] // w14: gv, w15: bv +4: cmp w5, #8 - rgb24_load_uv_coeff half=1 + rgb_set_uv_coeff half=1 b.lt 2f 1: ld3 { v16.16b, v17.16b, v18.16b }, [x3] @@ -118,8 +137,8 @@ function ff_rgb24ToUV_half_neon, export=1 uaddlp v20.8h, v17.16b // v20: g uaddlp v21.8h, v18.16b // v21: b - rgb24_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 - rgb24_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 + rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 + rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 sub w5, w5, #8 // width -= 8 add x3, x3, #48 // src += 48 cmp w5, #8 // width >= 8 ? @@ -158,19 +177,33 @@ function ff_rgb24ToUV_half_neon, export=1 ret endfunc +function ff_bgr24ToUV_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + function ff_rgb24ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f + ldp w10, w11, [x6, #12] // w10: ru, w11: gu + ldp w12, w13, [x6, #20] // w12: bu, w13: rv + ldp w14, w15, [x6, #28] // w14: gv, w15: bv +4: cmp w5, #16 - rgb24_load_uv_coeff half=0 + rgb_set_uv_coeff half=0 b.lt 2f 1: - rgb24_to_yuv_load_rgb x3 - rgb24_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 - rgb24_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 - rgb24_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 - rgb24_to_yuv_product v22, v23, v24, v27, v28, v19, v3, v4, v5, #9 + rgb_to_yuv_load_rgb x3 + rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 + rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 + rgb_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 + rgb_to_yuv_product v22, v23, v24, v27, v28, v19, v3, v4, v5, #9 sub w5, w5, #16 add x3, x3, #48 // src += 48 cmp w5, #16 diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index e4ea3309ba..c6594944c3 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -201,19 +201,18 @@ void ff_yuv2plane1_8_neon( default: break; \ } -void ff_rgb24ToY_neon(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, - const uint8_t *unused2, int width, - uint32_t *rgb2yuv, void *opq); - -void ff_rgb24ToUV_neon(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, - const uint8_t *src1, - const uint8_t *src2, int width, uint32_t *rgb2yuv, - void *opq); - -void ff_rgb24ToUV_half_neon(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, - const uint8_t *src1, - const uint8_t *src2, int width, uint32_t *rgb2yuv, - void *opq); +#define NEON_INPUT(name) \ +void ff_##name##ToY_neon(uint8_t *dst, const uint8_t *src, const uint8_t *, \ + const uint8_t *, int w, uint32_t *coeffs, void *); \ +void ff_##name##ToUV_neon(uint8_t *, uint8_t *, const uint8_t *, \ + const uint8_t *, const uint8_t *, int w, \ + uint32_t *coeffs, void *); \ +void ff_##name##ToUV_half_neon(uint8_t *, uint8_t *, const uint8_t *, \ + const uint8_t *, const uint8_t *, int w, \ + uint32_t *coeffs, void *) + +NEON_INPUT(bgr24); +NEON_INPUT(rgb24); void ff_lumRangeFromJpeg_neon(int16_t *dst, int width); void ff_chrRangeFromJpeg_neon(int16_t *dstU, int16_t *dstV, int width); @@ -247,6 +246,13 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) c->yuv2planeX = ff_yuv2planeX_8_neon; } switch (c->srcFormat) { + case AV_PIX_FMT_BGR24: + c->lumToYV12 = ff_bgr24ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_bgr24ToUV_half_neon; + else + c->chrToYV12 = ff_bgr24ToUV_neon; + break; case AV_PIX_FMT_RGB24: c->lumToYV12 = ff_rgb24ToY_neon; if (c->chrSrcHSubSample) -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <20240624130213.71634-1-quinkblack@foxmail.com>]
* [FFmpeg-devel] [PATCH v4 2/3] swscale/aarch64: Add bgra/rgba to yuv [not found] ` <20240624130213.71634-1-quinkblack@foxmail.com> @ 2024-06-24 13:02 ` Zhao Zhili 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 3/3] swscale/aarch64: Add argb/abgr " Zhao Zhili 1 sibling, 0 replies; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 13:02 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Zhao Zhili From: Zhao Zhili <zhilizhao@tencent.com> Test on Apple M1 with kperf : -O3 : -O3 -fno-vectorize bgra_to_uv_8_c : 13.4 : 27.5 bgra_to_uv_8_neon : 37.4 : 41.7 bgra_to_uv_128_c : 155.9 : 550.2 bgra_to_uv_128_neon : 91.7 : 92.7 bgra_to_uv_1080_c : 1173.2 : 4558.2 bgra_to_uv_1080_neon : 822.7 : 809.5 bgra_to_uv_1920_c : 2078.2 : 8115.2 bgra_to_uv_1920_neon : 1437.7 : 1438.7 bgra_to_uv_half_8_c : 17.9 : 14.2 bgra_to_uv_half_8_neon : 37.4 : 10.5 bgra_to_uv_half_128_c : 103.9 : 326.0 bgra_to_uv_half_128_neon : 73.9 : 68.7 bgra_to_uv_half_1080_c : 850.2 : 3732.0 bgra_to_uv_half_1080_neon : 484.2 : 490.0 bgra_to_uv_half_1920_c : 1479.2 : 4942.7 bgra_to_uv_half_1920_neon : 824.2 : 824.7 bgra_to_y_8_c : 8.2 : 29.5 bgra_to_y_8_neon : 18.2 : 32.7 bgra_to_y_128_c : 101.4 : 361.5 bgra_to_y_128_neon : 74.9 : 73.7 bgra_to_y_1080_c : 739.4 : 3018.0 bgra_to_y_1080_neon : 613.4 : 544.2 bgra_to_y_1920_c : 1298.7 : 5326.0 bgra_to_y_1920_neon : 918.7 : 934.2 --- libswscale/aarch64/input.S | 68 +++++++++++++++++++++++++++--------- libswscale/aarch64/swscale.c | 16 +++++++++ 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 2cfec4cb6a..ce5b042371 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -20,8 +20,12 @@ #include "libavutil/aarch64/asm.S" -.macro rgb_to_yuv_load_rgb src +.macro rgb_to_yuv_load_rgb src, element=3 + .if \element == 3 ld3 { v16.16b, v17.16b, v18.16b }, [\src] + .else + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] + .endif uxtl v19.8h, v16.8b // v19: r uxtl v20.8h, v17.8b // v20: g uxtl v21.8h, v18.8b // v21: b @@ -43,7 +47,8 @@ sqshrn2 \dst\().8h, \dst2\().4s, \right_shift // dst_higher_half = dst2 >> right_shift .endm -function ff_bgr24ToY_neon, export=1 +.macro rgbToY_neon fmt_bgr, fmt_rgb, element +function ff_\fmt_bgr\()ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w12, w11, [x5] // w12: ry, w11: gy ldr w10, [x5, #8] // w10: by @@ -51,7 +56,7 @@ function ff_bgr24ToY_neon, export=1 ret endfunc -function ff_rgb24ToY_neon, export=1 +function ff_\fmt_rgb\()ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w10, w11, [x5] // w10: ry, w11: gy ldr w12, [x5, #8] // w12: by @@ -67,11 +72,11 @@ function ff_rgb24ToY_neon, export=1 dup v2.8h, w12 b.lt 2f 1: - rgb_to_yuv_load_rgb x1 + rgb_to_yuv_load_rgb x1, \element rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 sub w4, w4, #16 // width -= 16 - add x1, x1, #48 // src += 48 + add x1, x1, #(16*\element) cmp w4, #16 // width >= 16 ? stp q16, q17, [x0], #32 // store to dst b.ge 1b @@ -86,12 +91,17 @@ function ff_rgb24ToY_neon, export=1 smaddl x13, w15, w12, x13 // x13 += by * b asr w13, w13, #9 // x13 >>= 9 sub w4, w4, #1 // width-- - add x1, x1, #3 // src += 3 + add x1, x1, #\element strh w13, [x0], #2 // store to dst cbnz w4, 2b 3: ret endfunc +.endm + +rgbToY_neon bgr24, rgb24, element=3 + +rgbToY_neon bgra32, rgba32, element=4 .macro rgb_set_uv_coeff half .if \half @@ -110,7 +120,8 @@ endfunc dup v6.4s, w9 .endm -function ff_bgr24ToUV_half_neon, export=1 +.macro rgbToUV_half_neon fmt_bgr, fmt_rgb, element +function ff_\fmt_bgr\()ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -120,7 +131,7 @@ function ff_bgr24ToUV_half_neon, export=1 b 4f endfunc -function ff_rgb24ToUV_half_neon, export=1 +function ff_\fmt_rgb\()ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -132,7 +143,11 @@ function ff_rgb24ToUV_half_neon, export=1 rgb_set_uv_coeff half=1 b.lt 2f 1: + .if \element == 3 ld3 { v16.16b, v17.16b, v18.16b }, [x3] + .else + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] + .endif uaddlp v19.8h, v16.16b // v19: r uaddlp v20.8h, v17.16b // v20: g uaddlp v21.8h, v18.16b // v21: b @@ -140,7 +155,7 @@ function ff_rgb24ToUV_half_neon, export=1 rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 sub w5, w5, #8 // width -= 8 - add x3, x3, #48 // src += 48 + add x3, x3, #(16*\element) cmp w5, #8 // width >= 8 ? str q16, [x0], #16 // store dst_u str q17, [x1], #16 // store dst_v @@ -148,9 +163,10 @@ function ff_rgb24ToUV_half_neon, export=1 cbz w5, 3f 2: ldrb w2, [x3] // w2: r1 - ldrb w4, [x3, #3] // w4: r2 + ldrb w4, [x3, #\element] // w4: r2 add w2, w2, w4 // w2 = r1 + r2 + .if \element == 3 ldrb w4, [x3, #1] // w4: g1 ldrb w7, [x3, #4] // w7: g2 add w4, w4, w7 // w4 = g1 + g2 @@ -158,6 +174,15 @@ function ff_rgb24ToUV_half_neon, export=1 ldrb w7, [x3, #2] // w7: b1 ldrb w8, [x3, #5] // w8: b2 add w7, w7, w8 // w7 = b1 + b2 + .else + ldrb w4, [x3, #1] // w4: g1 + ldrb w7, [x3, #5] // w7: g2 + add w4, w4, w7 // w4 = g1 + g2 + + ldrb w7, [x3, #2] // w7: b1 + ldrb w8, [x3, #6] // w8: b2 + add w7, w7, w8 // w7 = b1 + b2 + .endif smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset smaddl x8, w4, w11, x8 // dst_u += gu * g @@ -170,14 +195,20 @@ function ff_rgb24ToUV_half_neon, export=1 smaddl x8, w7, w15, x8 // dst_v += bv * b asr x8, x8, #10 // dst_v >>= 10 sub w5, w5, #1 - add x3, x3, #6 // src += 6 + add x3, x3, #(2*\element) strh w8, [x1], #2 // store dst_v cbnz w5, 2b 3: ret endfunc +.endm -function ff_bgr24ToUV_neon, export=1 +rgbToUV_half_neon bgr24, rgb24, element=3 + +rgbToUV_half_neon bgra32, rgba32, element=4 + +.macro rgbToUV_neon fmt_bgr, fmt_rgb, element +function ff_\fmt_bgr\()ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -187,7 +218,7 @@ function ff_bgr24ToUV_neon, export=1 b 4f endfunc -function ff_rgb24ToUV_neon, export=1 +function ff_\fmt_rgb\()ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -199,13 +230,13 @@ function ff_rgb24ToUV_neon, export=1 rgb_set_uv_coeff half=0 b.lt 2f 1: - rgb_to_yuv_load_rgb x3 + rgb_to_yuv_load_rgb x3, \element rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 rgb_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v19, v3, v4, v5, #9 sub w5, w5, #16 - add x3, x3, #48 // src += 48 + add x3, x3, #(16*\element) cmp w5, #16 stp q16, q17, [x0], #32 // store to dst_u stp q18, q19, [x1], #32 // store to dst_v @@ -227,9 +258,14 @@ function ff_rgb24ToUV_neon, export=1 smaddl x8, w4, w15, x8 // x8 += bv * b asr w8, w8, #9 // x8 >>= 9 sub w5, w5, #1 // width-- - add x3, x3, #3 // src += 3 + add x3, x3, #\element strh w8, [x1], #2 // store to dst_v cbnz w5, 2b 3: ret endfunc +.endm + +rgbToUV_neon bgr24, rgb24, element=3 + +rgbToUV_neon bgra32, rgba32, element=4 diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index c6594944c3..92af662014 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -212,7 +212,9 @@ void ff_##name##ToUV_half_neon(uint8_t *, uint8_t *, const uint8_t *, \ uint32_t *coeffs, void *) NEON_INPUT(bgr24); +NEON_INPUT(bgra32); NEON_INPUT(rgb24); +NEON_INPUT(rgba32); void ff_lumRangeFromJpeg_neon(int16_t *dst, int width); void ff_chrRangeFromJpeg_neon(int16_t *dstU, int16_t *dstV, int width); @@ -253,6 +255,13 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) else c->chrToYV12 = ff_bgr24ToUV_neon; break; + case AV_PIX_FMT_BGRA: + c->lumToYV12 = ff_bgra32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_bgra32ToUV_half_neon; + else + c->chrToYV12 = ff_bgra32ToUV_neon; + break; case AV_PIX_FMT_RGB24: c->lumToYV12 = ff_rgb24ToY_neon; if (c->chrSrcHSubSample) @@ -260,6 +269,13 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) else c->chrToYV12 = ff_rgb24ToUV_neon; break; + case AV_PIX_FMT_RGBA: + c->lumToYV12 = ff_rgba32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_rgba32ToUV_half_neon; + else + c->chrToYV12 = ff_rgba32ToUV_neon; + break; default: break; } -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* [FFmpeg-devel] [PATCH v4 3/3] swscale/aarch64: Add argb/abgr to yuv [not found] ` <20240624130213.71634-1-quinkblack@foxmail.com> 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 2/3] swscale/aarch64: Add bgra/rgba " Zhao Zhili @ 2024-06-24 13:02 ` Zhao Zhili 2024-06-24 13:10 ` Martin Storsjö 1 sibling, 1 reply; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 13:02 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Zhao Zhili From: Zhao Zhili <zhilizhao@tencent.com> Test on Apple M1 with kperf: : -O3 : -O3 -fno-vectorize abgr_to_uv_8_c : 19.4 : 26.1 abgr_to_uv_8_neon : 29.9 : 51.1 abgr_to_uv_128_c : 146.4 : 558.9 abgr_to_uv_128_neon : 85.1 : 83.4 abgr_to_uv_1080_c : 1162.6 : 4786.4 abgr_to_uv_1080_neon : 819.6 : 826.6 abgr_to_uv_1920_c : 2063.6 : 8492.1 abgr_to_uv_1920_neon : 1435.1 : 1447.1 abgr_to_uv_half_8_c : 16.4 : 11.4 abgr_to_uv_half_8_neon : 35.6 : 20.4 abgr_to_uv_half_128_c : 108.6 : 359.4 abgr_to_uv_half_128_neon : 75.4 : 42.6 abgr_to_uv_half_1080_c : 883.4 : 2885.6 abgr_to_uv_half_1080_neon : 460.6 : 481.1 abgr_to_uv_half_1920_c : 1553.6 : 5106.9 abgr_to_uv_half_1920_neon : 817.6 : 820.4 abgr_to_y_8_c : 6.1 : 26.4 abgr_to_y_8_neon : 40.6 : 6.4 abgr_to_y_128_c : 99.9 : 390.1 abgr_to_y_128_neon : 67.4 : 55.9 abgr_to_y_1080_c : 735.9 : 3170.4 abgr_to_y_1080_neon : 534.6 : 536.6 abgr_to_y_1920_c : 1279.4 : 6016.4 abgr_to_y_1920_neon : 932.6 : 927.6 --- libswscale/aarch64/input.S | 86 +++++++++++++++++++++++++++--------- libswscale/aarch64/swscale.c | 17 +++++++ 2 files changed, 82 insertions(+), 21 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index ce5b042371..5cb18711fb 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -34,6 +34,16 @@ uxtl2 v24.8h, v18.16b // v24: b .endm +.macro argb_to_yuv_load_rgb src + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] + uxtl v21.8h, v19.8b // v21: b + uxtl2 v24.8h, v19.16b // v24: b + uxtl v19.8h, v17.8b // v19: r + uxtl v20.8h, v18.8b // v20: g + uxtl2 v22.8h, v17.16b // v22: r + uxtl2 v23.8h, v18.16b // v23: g +.endm + .macro rgb_to_yuv_product r, g, b, dst1, dst2, dst, coef0, coef1, coef2, right_shift mov \dst1\().16b, v6.16b // dst1 = const_offset mov \dst2\().16b, v6.16b // dst2 = const_offset @@ -47,7 +57,7 @@ sqshrn2 \dst\().8h, \dst2\().4s, \right_shift // dst_higher_half = dst2 >> right_shift .endm -.macro rgbToY_neon fmt_bgr, fmt_rgb, element +.macro rgbToY_neon fmt_bgr, fmt_rgb, element, alpha_first=0 function ff_\fmt_bgr\()ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w12, w11, [x5] // w12: ry, w11: gy @@ -72,7 +82,11 @@ function ff_\fmt_rgb\()ToY_neon, export=1 dup v2.8h, w12 b.lt 2f 1: + .if \alpha_first + argb_to_yuv_load_rgb x1 + .else rgb_to_yuv_load_rgb x1, \element + .endif rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 sub w4, w4, #16 // width -= 16 @@ -82,9 +96,15 @@ function ff_\fmt_rgb\()ToY_neon, export=1 b.ge 1b cbz x4, 3f 2: + .if \alpha_first + ldrb w13, [x1, #1] // w13: r + ldrb w14, [x1, #2] // w14: g + ldrb w15, [x1, #3] // w15: b + .else ldrb w13, [x1] // w13: r ldrb w14, [x1, #1] // w14: g ldrb w15, [x1, #2] // w15: b + .endif smaddl x13, w13, w10, x9 // x13 = ry * r + const_offset smaddl x13, w14, w11, x13 // x13 += gy * g @@ -103,6 +123,8 @@ rgbToY_neon bgr24, rgb24, element=3 rgbToY_neon bgra32, rgba32, element=4 +rgbToY_neon abgr32, argb32, element=4, alpha_first=1 + .macro rgb_set_uv_coeff half .if \half mov w9, #512 @@ -120,7 +142,21 @@ rgbToY_neon bgra32, rgba32, element=4 dup v6.4s, w9 .endm -.macro rgbToUV_half_neon fmt_bgr, fmt_rgb, element +.macro rgb_load_add_half off_r1, off_r2, off_g1, off_g2, off_b1, off_b2 + ldrb w2, [x3, #\off_r1] // w2: r1 + ldrb w4, [x3, #\off_r2] // w4: r2 + add w2, w2, w4 // w2 = r1 + r2 + + ldrb w4, [x3, #\off_g1] // w4: g1 + ldrb w7, [x3, #\off_g2] // w7: g2 + add w4, w4, w7 // w4 = g1 + g2 + + ldrb w7, [x3, #\off_b1] // w7: b1 + ldrb w8, [x3, #\off_b2] // w8: b2 + add w7, w7, w8 // w7 = b1 + b2 +.endm + +.macro rgbToUV_half_neon fmt_bgr, fmt_rgb, element, alpha_first=0 function ff_\fmt_bgr\()ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -148,9 +184,15 @@ function ff_\fmt_rgb\()ToUV_half_neon, export=1 .else ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] .endif + .if \alpha_first + uaddlp v21.8h, v19.16b + uaddlp v20.8h, v18.16b + uaddlp v19.8h, v17.16b + .else uaddlp v19.8h, v16.16b // v19: r uaddlp v20.8h, v17.16b // v20: g uaddlp v21.8h, v18.16b // v21: b + .endif rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 @@ -162,27 +204,15 @@ function ff_\fmt_rgb\()ToUV_half_neon, export=1 b.ge 1b cbz w5, 3f 2: - ldrb w2, [x3] // w2: r1 - ldrb w4, [x3, #\element] // w4: r2 - add w2, w2, w4 // w2 = r1 + r2 - +.if \alpha_first + rgb_load_add_half 1, 5, 2, 6, 3, 7 +.else .if \element == 3 - ldrb w4, [x3, #1] // w4: g1 - ldrb w7, [x3, #4] // w7: g2 - add w4, w4, w7 // w4 = g1 + g2 - - ldrb w7, [x3, #2] // w7: b1 - ldrb w8, [x3, #5] // w8: b2 - add w7, w7, w8 // w7 = b1 + b2 + rgb_load_add_half 0, 3, 1, 4, 2, 5 .else - ldrb w4, [x3, #1] // w4: g1 - ldrb w7, [x3, #5] // w7: g2 - add w4, w4, w7 // w4 = g1 + g2 - - ldrb w7, [x3, #2] // w7: b1 - ldrb w8, [x3, #6] // w8: b2 - add w7, w7, w8 // w7 = b1 + b2 + rgb_load_add_half 0, 4, 1, 5, 2, 6 .endif +.endif smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset smaddl x8, w4, w11, x8 // dst_u += gu * g @@ -207,7 +237,9 @@ rgbToUV_half_neon bgr24, rgb24, element=3 rgbToUV_half_neon bgra32, rgba32, element=4 -.macro rgbToUV_neon fmt_bgr, fmt_rgb, element +rgbToUV_half_neon abgr32, argb32, element=4, alpha_first=1 + +.macro rgbToUV_neon fmt_bgr, fmt_rgb, element, alpha_first=0 function ff_\fmt_bgr\()ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -230,7 +262,11 @@ function ff_\fmt_rgb\()ToUV_neon, export=1 rgb_set_uv_coeff half=0 b.lt 2f 1: + .if \alpha_first + argb_to_yuv_load_rgb x3 + .else rgb_to_yuv_load_rgb x3, \element + .endif rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 rgb_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 @@ -243,9 +279,15 @@ function ff_\fmt_rgb\()ToUV_neon, export=1 b.ge 1b cbz w5, 3f 2: + .if \alpha_first + ldrb w16, [x3, #1] // w16: r + ldrb w17, [x3, #2] // w17: g + ldrb w4, [x3, #3] // w4: b + .else ldrb w16, [x3] // w16: r ldrb w17, [x3, #1] // w17: g ldrb w4, [x3, #2] // w4: b + .endif smaddl x8, w16, w10, x9 // x8 = ru * r + const_offset smaddl x8, w17, w11, x8 // x8 += gu * g @@ -269,3 +311,5 @@ endfunc rgbToUV_neon bgr24, rgb24, element=3 rgbToUV_neon bgra32, rgba32, element=4 + +rgbToUV_neon abgr32, argb32, element=4, alpha_first=1 diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index 92af662014..eb907284e7 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -211,6 +211,8 @@ void ff_##name##ToUV_half_neon(uint8_t *, uint8_t *, const uint8_t *, \ const uint8_t *, const uint8_t *, int w, \ uint32_t *coeffs, void *) +NEON_INPUT(abgr32); +NEON_INPUT(argb32); NEON_INPUT(bgr24); NEON_INPUT(bgra32); NEON_INPUT(rgb24); @@ -248,6 +250,21 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) c->yuv2planeX = ff_yuv2planeX_8_neon; } switch (c->srcFormat) { + case AV_PIX_FMT_ABGR: + c->lumToYV12 = ff_abgr32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_abgr32ToUV_half_neon; + else + c->chrToYV12 = ff_abgr32ToUV_neon; + break; + + case AV_PIX_FMT_ARGB: + c->lumToYV12 = ff_argb32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_argb32ToUV_half_neon; + else + c->chrToYV12 = ff_argb32ToUV_neon; + break; case AV_PIX_FMT_BGR24: c->lumToYV12 = ff_bgr24ToY_neon; if (c->chrSrcHSubSample) -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 3/3] swscale/aarch64: Add argb/abgr to yuv 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 3/3] swscale/aarch64: Add argb/abgr " Zhao Zhili @ 2024-06-24 13:10 ` Martin Storsjö 0 siblings, 0 replies; 8+ messages in thread From: Martin Storsjö @ 2024-06-24 13:10 UTC (permalink / raw) To: FFmpeg development discussions and patches; +Cc: Zhao Zhili On Mon, 24 Jun 2024, Zhao Zhili wrote: > From: Zhao Zhili <zhilizhao@tencent.com> > > Test on Apple M1 with kperf: > : -O3 : -O3 -fno-vectorize > abgr_to_uv_8_c : 19.4 : 26.1 > abgr_to_uv_8_neon : 29.9 : 51.1 > abgr_to_uv_128_c : 146.4 : 558.9 > abgr_to_uv_128_neon : 85.1 : 83.4 > abgr_to_uv_1080_c : 1162.6 : 4786.4 > abgr_to_uv_1080_neon : 819.6 : 826.6 > abgr_to_uv_1920_c : 2063.6 : 8492.1 > abgr_to_uv_1920_neon : 1435.1 : 1447.1 > abgr_to_uv_half_8_c : 16.4 : 11.4 > abgr_to_uv_half_8_neon : 35.6 : 20.4 > abgr_to_uv_half_128_c : 108.6 : 359.4 > abgr_to_uv_half_128_neon : 75.4 : 42.6 > abgr_to_uv_half_1080_c : 883.4 : 2885.6 > abgr_to_uv_half_1080_neon : 460.6 : 481.1 > abgr_to_uv_half_1920_c : 1553.6 : 5106.9 > abgr_to_uv_half_1920_neon : 817.6 : 820.4 > abgr_to_y_8_c : 6.1 : 26.4 > abgr_to_y_8_neon : 40.6 : 6.4 > abgr_to_y_128_c : 99.9 : 390.1 > abgr_to_y_128_neon : 67.4 : 55.9 > abgr_to_y_1080_c : 735.9 : 3170.4 > abgr_to_y_1080_neon : 534.6 : 536.6 > abgr_to_y_1920_c : 1279.4 : 6016.4 > abgr_to_y_1920_neon : 932.6 : 927.6 > --- > libswscale/aarch64/input.S | 86 +++++++++++++++++++++++++++--------- > libswscale/aarch64/swscale.c | 17 +++++++ > 2 files changed, 82 insertions(+), 21 deletions(-) This patchset looks ok to me (but wait a little bit in case someone else has further opinions on it). // Martin _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv 2024-06-24 11:55 ` Martin Storsjö 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 1/3] swscale/aarch64: Add bgr24 " Zhao Zhili [not found] ` <20240624130213.71634-1-quinkblack@foxmail.com> @ 2024-06-24 13:04 ` Zhao Zhili 2 siblings, 0 replies; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 13:04 UTC (permalink / raw) To: FFmpeg development discussions and patches > On Jun 24, 2024, at 19:55, Martin Storsjö <martin@martin.st> wrote: > > On Mon, 24 Jun 2024, Zhao Zhili wrote: > >> From: Zhao Zhili <zhilizhao@tencent.com> >> >> Test on Apple M1 with kperf >> : -O3 : -O3 -fno-vectorize >> bgra_to_uv_8_c : 13.4 : 27.5 >> bgra_to_uv_8_neon : 37.4 : 41.7 >> bgra_to_uv_128_c : 155.9 : 550.2 >> bgra_to_uv_128_neon : 91.7 : 92.7 >> bgra_to_uv_1080_c : 1173.2 : 4558.2 >> bgra_to_uv_1080_neon : 822.7 : 809.5 >> bgra_to_uv_1920_c : 2078.2 : 8115.2 >> bgra_to_uv_1920_neon : 1437.7 : 1438.7 >> bgra_to_uv_half_8_c : 17.9 : 14.2 >> bgra_to_uv_half_8_neon : 37.4 : 10.5 >> bgra_to_uv_half_128_c : 103.9 : 326.0 >> bgra_to_uv_half_128_neon : 73.9 : 68.7 >> bgra_to_uv_half_1080_c : 850.2 : 3732.0 >> bgra_to_uv_half_1080_neon : 484.2 : 490.0 >> bgra_to_uv_half_1920_c : 1479.2 : 4942.7 >> bgra_to_uv_half_1920_neon : 824.2 : 824.7 >> bgra_to_y_8_c : 8.2 : 29.5 >> bgra_to_y_8_neon : 18.2 : 32.7 >> bgra_to_y_128_c : 101.4 : 361.5 >> bgra_to_y_128_neon : 74.9 : 73.7 >> bgra_to_y_1080_c : 739.4 : 3018.0 >> bgra_to_y_1080_neon : 613.4 : 544.2 >> bgra_to_y_1920_c : 1298.7 : 5326.0 >> bgra_to_y_1920_neon : 918.7 : 934.2 >> --- >> libswscale/aarch64/input.S | 91 ++++++++++++++++++++++++++++++------ >> libswscale/aarch64/swscale.c | 16 +++++++ >> 2 files changed, 94 insertions(+), 13 deletions(-) >> >> diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S >> index 2cfec4cb6a..6d2c6034bb 100644 >> --- a/libswscale/aarch64/input.S >> +++ b/libswscale/aarch64/input.S >> @@ -20,8 +20,12 @@ >> >> #include "libavutil/aarch64/asm.S" >> >> -.macro rgb_to_yuv_load_rgb src >> +.macro rgb_to_yuv_load_rgb src, element=3 >> + .if \element == 3 >> ld3 { v16.16b, v17.16b, v18.16b }, [\src] >> + .else >> + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] >> + .endif >> uxtl v19.8h, v16.8b // v19: r >> uxtl v20.8h, v17.8b // v20: g >> uxtl v21.8h, v18.8b // v21: b >> @@ -51,7 +55,8 @@ function ff_bgr24ToY_neon, export=1 >> ret >> endfunc >> >> -function ff_rgb24ToY_neon, export=1 >> +.macro rgbToY_neon fmt, element >> +function ff_\fmt\()ToY_neon, export=1 >> cmp w4, #0 // check width > 0 >> ldp w10, w11, [x5] // w10: ry, w11: gy >> ldr w12, [x5, #8] // w12: by >> @@ -67,11 +72,11 @@ function ff_rgb24ToY_neon, export=1 >> dup v2.8h, w12 >> b.lt 2f >> 1: >> - rgb_to_yuv_load_rgb x1 >> + rgb_to_yuv_load_rgb x1, \element >> rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 >> rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 >> sub w4, w4, #16 // width -= 16 >> - add x1, x1, #48 // src += 48 >> + add x1, x1, #(16*\element) >> cmp w4, #16 // width >= 16 ? >> stp q16, q17, [x0], #32 // store to dst >> b.ge 1b >> @@ -86,12 +91,25 @@ function ff_rgb24ToY_neon, export=1 >> smaddl x13, w15, w12, x13 // x13 += by * b >> asr w13, w13, #9 // x13 >>= 9 >> sub w4, w4, #1 // width-- >> - add x1, x1, #3 // src += 3 >> + add x1, x1, #\element >> strh w13, [x0], #2 // store to dst >> cbnz w4, 2b >> 3: >> ret >> endfunc >> +.endm >> + >> +rgbToY_neon fmt=rgb24, element=3 >> + >> +function ff_bgra32ToY_neon, export=1 >> + cmp w4, #0 // check width > 0 >> + ldp w12, w11, [x5] // w12: ry, w11: gy >> + ldr w10, [x5, #8] // w10: by >> + b.gt 4f >> + ret >> +endfunc >> + >> +rgbToY_neon fmt=rgba32, element=4 > > It is extremely obscure to jump to a local label (4f) that is defined by the following macro. I think this would be much more readable if you'd include the bgr(a) version in the macro, so the reference to 4f is near to the actual label it refers to. Good idea, it saved a lot of typing. Fixed in v4. > >> .macro rgb_set_uv_coeff half >> .if \half >> @@ -120,7 +138,8 @@ function ff_bgr24ToUV_half_neon, export=1 >> b 4f >> endfunc >> >> -function ff_rgb24ToUV_half_neon, export=1 >> +.macro rgbToUV_half_neon fmt, element >> +function ff_\fmt\()ToUV_half_neon, export=1 >> cmp w5, #0 // check width > 0 >> b.le 3f >> >> @@ -132,7 +151,11 @@ function ff_rgb24ToUV_half_neon, export=1 >> rgb_set_uv_coeff half=1 >> b.lt 2f >> 1: >> + .if \element == 3 >> ld3 { v16.16b, v17.16b, v18.16b }, [x3] >> + .else >> + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] >> + .endif >> uaddlp v19.8h, v16.16b // v19: r >> uaddlp v20.8h, v17.16b // v20: g >> uaddlp v21.8h, v18.16b // v21: b >> @@ -140,7 +163,7 @@ function ff_rgb24ToUV_half_neon, export=1 >> rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 >> rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 >> sub w5, w5, #8 // width -= 8 >> - add x3, x3, #48 // src += 48 >> + add x3, x3, #(16*\element) >> cmp w5, #8 // width >= 8 ? >> str q16, [x0], #16 // store dst_u >> str q17, [x1], #16 // store dst_v >> @@ -148,9 +171,10 @@ function ff_rgb24ToUV_half_neon, export=1 >> cbz w5, 3f >> 2: >> ldrb w2, [x3] // w2: r1 >> - ldrb w4, [x3, #3] // w4: r2 >> + ldrb w4, [x3, #\element] // w4: r2 >> add w2, w2, w4 // w2 = r1 + r2 >> >> + .if \element == 3 >> ldrb w4, [x3, #1] // w4: g1 >> ldrb w7, [x3, #4] // w7: g2 >> add w4, w4, w7 // w4 = g1 + g2 >> @@ -158,6 +182,15 @@ function ff_rgb24ToUV_half_neon, export=1 >> ldrb w7, [x3, #2] // w7: b1 >> ldrb w8, [x3, #5] // w8: b2 >> add w7, w7, w8 // w7 = b1 + b2 >> + .else >> + ldrb w4, [x3, #1] // w4: g1 >> + ldrb w7, [x3, #5] // w7: g2 >> + add w4, w4, w7 // w4 = g1 + g2 >> + >> + ldrb w7, [x3, #2] // w7: b1 >> + ldrb w8, [x3, #6] // w8: b2 >> + add w7, w7, w8 // w7 = b1 + b2 >> + .endif >> >> smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset >> smaddl x8, w4, w11, x8 // dst_u += gu * g >> @@ -170,12 +203,28 @@ function ff_rgb24ToUV_half_neon, export=1 >> smaddl x8, w7, w15, x8 // dst_v += bv * b >> asr x8, x8, #10 // dst_v >>= 10 >> sub w5, w5, #1 >> - add x3, x3, #6 // src += 6 >> + ldrb w4, [x3, #1] // w4: g1 >> + add x3, x3, #(2*\element) > > Is the new ldrb a typo/copypaste mistake here? Yes, it’s a copypaste mistake. Fixed in v4. > > // Martin > > _______________________________________________ > 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". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
* [FFmpeg-devel] [PATCH v3 3/3] swscale/aarch64: Add argb/abgr to yuv [not found] <20240624113701.94616-1-quinkblack@foxmail.com> 2024-06-24 11:37 ` [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv Zhao Zhili @ 2024-06-24 11:37 ` Zhao Zhili 1 sibling, 0 replies; 8+ messages in thread From: Zhao Zhili @ 2024-06-24 11:37 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Zhao Zhili From: Zhao Zhili <zhilizhao@tencent.com> Test on Apple M1 with kperf: : -O3 : -O3 -fno-vectorize abgr_to_uv_8_c : 19.4 : 26.1 abgr_to_uv_8_neon : 29.9 : 51.1 abgr_to_uv_128_c : 146.4 : 558.9 abgr_to_uv_128_neon : 85.1 : 83.4 abgr_to_uv_1080_c : 1162.6 : 4786.4 abgr_to_uv_1080_neon : 819.6 : 826.6 abgr_to_uv_1920_c : 2063.6 : 8492.1 abgr_to_uv_1920_neon : 1435.1 : 1447.1 abgr_to_uv_half_8_c : 16.4 : 11.4 abgr_to_uv_half_8_neon : 35.6 : 20.4 abgr_to_uv_half_128_c : 108.6 : 359.4 abgr_to_uv_half_128_neon : 75.4 : 42.6 abgr_to_uv_half_1080_c : 883.4 : 2885.6 abgr_to_uv_half_1080_neon : 460.6 : 481.1 abgr_to_uv_half_1920_c : 1553.6 : 5106.9 abgr_to_uv_half_1920_neon : 817.6 : 820.4 abgr_to_y_8_c : 6.1 : 26.4 abgr_to_y_8_neon : 40.6 : 6.4 abgr_to_y_128_c : 99.9 : 390.1 abgr_to_y_128_neon : 67.4 : 55.9 abgr_to_y_1080_c : 735.9 : 3170.4 abgr_to_y_1080_neon : 534.6 : 536.6 abgr_to_y_1920_c : 1279.4 : 6016.4 abgr_to_y_1920_neon : 932.6 : 927.6 --- libswscale/aarch64/input.S | 114 ++++++++++++++++++++++++++++------- libswscale/aarch64/swscale.c | 17 ++++++ 2 files changed, 110 insertions(+), 21 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 6d2c6034bb..f4d587fed0 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -34,6 +34,16 @@ uxtl2 v24.8h, v18.16b // v24: b .endm +.macro argb_to_yuv_load_rgb src + ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [\src] + uxtl v21.8h, v19.8b // v21: b + uxtl2 v24.8h, v19.16b // v24: b + uxtl v19.8h, v17.8b // v19: r + uxtl v20.8h, v18.8b // v20: g + uxtl2 v22.8h, v17.16b // v22: r + uxtl2 v23.8h, v18.16b // v23: g +.endm + .macro rgb_to_yuv_product r, g, b, dst1, dst2, dst, coef0, coef1, coef2, right_shift mov \dst1\().16b, v6.16b // dst1 = const_offset mov \dst2\().16b, v6.16b // dst2 = const_offset @@ -55,7 +65,7 @@ function ff_bgr24ToY_neon, export=1 ret endfunc -.macro rgbToY_neon fmt, element +.macro rgbToY_neon fmt, element, alpha_first=0 function ff_\fmt\()ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w10, w11, [x5] // w10: ry, w11: gy @@ -72,7 +82,11 @@ function ff_\fmt\()ToY_neon, export=1 dup v2.8h, w12 b.lt 2f 1: + .if \alpha_first + argb_to_yuv_load_rgb x1 + .else rgb_to_yuv_load_rgb x1, \element + .endif rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 sub w4, w4, #16 // width -= 16 @@ -82,9 +96,15 @@ function ff_\fmt\()ToY_neon, export=1 b.ge 1b cbz x4, 3f 2: + .if \alpha_first + ldrb w13, [x1, #1] // w13: r + ldrb w14, [x1, #2] // w14: g + ldrb w15, [x1, #3] // w15: b + .else ldrb w13, [x1] // w13: r ldrb w14, [x1, #1] // w14: g ldrb w15, [x1, #2] // w15: b + .endif smaddl x13, w13, w10, x9 // x13 = ry * r + const_offset smaddl x13, w14, w11, x13 // x13 += gy * g @@ -101,6 +121,16 @@ endfunc rgbToY_neon fmt=rgb24, element=3 +function ff_abgr32ToY_neon, export=1 + cmp w4, #0 // check width > 0 + ldp w12, w11, [x5] // w12: ry, w11: gy + ldr w10, [x5, #8] // w10: by + b.gt 4f + ret +endfunc + +rgbToY_neon fmt=argb32, element=4, alpha_first=1 + function ff_bgra32ToY_neon, export=1 cmp w4, #0 // check width > 0 ldp w12, w11, [x5] // w12: ry, w11: gy @@ -138,7 +168,21 @@ function ff_bgr24ToUV_half_neon, export=1 b 4f endfunc -.macro rgbToUV_half_neon fmt, element +.macro rgb_load_add_half off_r1, off_r2, off_g1, off_g2, off_b1, off_b2 + ldrb w2, [x3, #\off_r1] // w2: r1 + ldrb w4, [x3, #\off_r2] // w4: r2 + add w2, w2, w4 // w2 = r1 + r2 + + ldrb w4, [x3, #\off_g1] // w4: g1 + ldrb w7, [x3, #\off_g2] // w7: g2 + add w4, w4, w7 // w4 = g1 + g2 + + ldrb w7, [x3, #\off_b1] // w7: b1 + ldrb w8, [x3, #\off_b2] // w8: b2 + add w7, w7, w8 // w7 = b1 + b2 +.endm + +.macro rgbToUV_half_neon fmt, element, alpha_first=0 function ff_\fmt\()ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -156,9 +200,15 @@ function ff_\fmt\()ToUV_half_neon, export=1 .else ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3] .endif + .if \alpha_first + uaddlp v21.8h, v19.16b + uaddlp v20.8h, v18.16b + uaddlp v19.8h, v17.16b + .else uaddlp v19.8h, v16.16b // v19: r uaddlp v20.8h, v17.16b // v20: g uaddlp v21.8h, v18.16b // v21: b + .endif rgb_to_yuv_product v19, v20, v21, v22, v23, v16, v0, v1, v2, #10 rgb_to_yuv_product v19, v20, v21, v24, v25, v17, v3, v4, v5, #10 @@ -170,27 +220,15 @@ function ff_\fmt\()ToUV_half_neon, export=1 b.ge 1b cbz w5, 3f 2: - ldrb w2, [x3] // w2: r1 - ldrb w4, [x3, #\element] // w4: r2 - add w2, w2, w4 // w2 = r1 + r2 - +.if \alpha_first + rgb_load_add_half 1, 5, 2, 6, 3, 7 +.else .if \element == 3 - ldrb w4, [x3, #1] // w4: g1 - ldrb w7, [x3, #4] // w7: g2 - add w4, w4, w7 // w4 = g1 + g2 - - ldrb w7, [x3, #2] // w7: b1 - ldrb w8, [x3, #5] // w8: b2 - add w7, w7, w8 // w7 = b1 + b2 + rgb_load_add_half 0, 3, 1, 4, 2, 5 .else - ldrb w4, [x3, #1] // w4: g1 - ldrb w7, [x3, #5] // w7: g2 - add w4, w4, w7 // w4 = g1 + g2 - - ldrb w7, [x3, #2] // w7: b1 - ldrb w8, [x3, #6] // w8: b2 - add w7, w7, w8 // w7 = b1 + b2 + rgb_load_add_half 0, 4, 1, 5, 2, 6 .endif +.endif smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset smaddl x8, w4, w11, x8 // dst_u += gu * g @@ -214,6 +252,18 @@ endfunc rgbToUV_half_neon fmt=rgb24, element=3 +function ff_abgr32ToUV_half_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + +rgbToUV_half_neon fmt=argb32, element=4, alpha_first=1 + function ff_bgra32ToUV_half_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -236,7 +286,7 @@ function ff_bgr24ToUV_neon, export=1 b 4f endfunc -.macro rgbToUV_neon fmt, element +.macro rgbToUV_neon fmt, element, alpha_first=0 function ff_\fmt\()ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f @@ -249,7 +299,11 @@ function ff_\fmt\()ToUV_neon, export=1 rgb_set_uv_coeff half=0 b.lt 2f 1: + .if \alpha_first + argb_to_yuv_load_rgb x3 + .else rgb_to_yuv_load_rgb x3, \element + .endif rgb_to_yuv_product v19, v20, v21, v25, v26, v16, v0, v1, v2, #9 rgb_to_yuv_product v22, v23, v24, v27, v28, v17, v0, v1, v2, #9 rgb_to_yuv_product v19, v20, v21, v25, v26, v18, v3, v4, v5, #9 @@ -262,9 +316,15 @@ function ff_\fmt\()ToUV_neon, export=1 b.ge 1b cbz w5, 3f 2: + .if \alpha_first + ldrb w16, [x3, #1] // w16: r + ldrb w17, [x3, #2] // w17: g + ldrb w4, [x3, #3] // w4: b + .else ldrb w16, [x3] // w16: r ldrb w17, [x3, #1] // w17: g ldrb w4, [x3, #2] // w4: b + .endif smaddl x8, w16, w10, x9 // x8 = ru * r + const_offset smaddl x8, w17, w11, x8 // x8 += gu * g @@ -287,6 +347,18 @@ endfunc rgbToUV_neon fmt=rgb24, element=3 +function ff_abgr32ToUV_neon, export=1 + cmp w5, #0 // check width > 0 + b.le 3f + + ldp w12, w11, [x6, #12] + ldp w10, w15, [x6, #20] + ldp w14, w13, [x6, #28] + b 4f +endfunc + +rgbToUV_neon fmt=argb32, element=4, alpha_first=1 + function ff_bgra32ToUV_neon, export=1 cmp w5, #0 // check width > 0 b.le 3f diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index 92af662014..eb907284e7 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -211,6 +211,8 @@ void ff_##name##ToUV_half_neon(uint8_t *, uint8_t *, const uint8_t *, \ const uint8_t *, const uint8_t *, int w, \ uint32_t *coeffs, void *) +NEON_INPUT(abgr32); +NEON_INPUT(argb32); NEON_INPUT(bgr24); NEON_INPUT(bgra32); NEON_INPUT(rgb24); @@ -248,6 +250,21 @@ av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) c->yuv2planeX = ff_yuv2planeX_8_neon; } switch (c->srcFormat) { + case AV_PIX_FMT_ABGR: + c->lumToYV12 = ff_abgr32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_abgr32ToUV_half_neon; + else + c->chrToYV12 = ff_abgr32ToUV_neon; + break; + + case AV_PIX_FMT_ARGB: + c->lumToYV12 = ff_argb32ToY_neon; + if (c->chrSrcHSubSample) + c->chrToYV12 = ff_argb32ToUV_half_neon; + else + c->chrToYV12 = ff_argb32ToUV_neon; + break; case AV_PIX_FMT_BGR24: c->lumToYV12 = ff_bgr24ToY_neon; if (c->chrSrcHSubSample) -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-06-24 13:11 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20240624113701.94616-1-quinkblack@foxmail.com> 2024-06-24 11:37 ` [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba to yuv Zhao Zhili 2024-06-24 11:55 ` Martin Storsjö 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 1/3] swscale/aarch64: Add bgr24 " Zhao Zhili [not found] ` <20240624130213.71634-1-quinkblack@foxmail.com> 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 2/3] swscale/aarch64: Add bgra/rgba " Zhao Zhili 2024-06-24 13:02 ` [FFmpeg-devel] [PATCH v4 3/3] swscale/aarch64: Add argb/abgr " Zhao Zhili 2024-06-24 13:10 ` Martin Storsjö 2024-06-24 13:04 ` [FFmpeg-devel] [PATCH v3 2/3] swscale/aarch64: Add bgra/rgba " Zhao Zhili 2024-06-24 11:37 ` [FFmpeg-devel] [PATCH v3 3/3] swscale/aarch64: Add argb/abgr " Zhao Zhili
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