Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [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

* [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

* 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

* [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 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

* 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

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