From patchwork Sat Jun 15 09:57:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 49925 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9196:0:b0:460:55fa:d5ed with SMTP id s22csp873366vqg; Sat, 15 Jun 2024 02:58:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWSHfL7pZleqRK/Gj1L82+mmxjPnNCQXLiga86hZny2x+1YBX4Daepa35eezmnZmcWx+izS2IVxaZ2JAuQi9lWBQp1/3o6MRyyxfg== X-Google-Smtp-Source: AGHT+IGKgT3hLaSHNjnd6IqXOgTYTTpF5MWfF3jI2/3b4PbTovgp0lhAdagzk1hT6zyQR29vZjnq X-Received: by 2002:a50:cdd6:0:b0:57c:a8e5:35f0 with SMTP id 4fb4d7f45d1cf-57cbd696586mr3141606a12.2.1718445481504; Sat, 15 Jun 2024 02:58:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1718445481; cv=none; d=google.com; s=arc-20160816; b=DRxttzcRd0vZ6phNMYu8uGSucx7AOpTyZBdPlAdIY3hIJMvozngPCYh0jJTE/T+HX9 +6dJmrXOd1mluZzHdeFlItOw8lIRgIOyzUQCxVBTMTJS6/c+j/ysWSUmJw6Bbw1MoHGg 0ZjE0/WqgOKs/IwwN9T/q/lung5/G2w3QOiomdJlQLV1r2KlzMpqLUBxNQhk3NbVHu34 fEqB4pXObQvo/mwSFcZY8dV64uRACSYRhK4aYMMPD2T21yYGz2uPaXJyMWxn4q6ex+A9 joy8krXJLET+mp0wR8x7Y6kCkfgJK0djuIszrxvgoKjfFXGYx2qaEz/UzoSbMoIKw7nQ /X9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to:date :to:from:message-id:dkim-signature:delivered-to; bh=o7zRleDks32UEVA+FR71UZDmLofqPNXC/h17IpHQ6LU=; fh=HnHYuZ9XgUo86ZRXTLWWmQxhslYEI9B9taZ5X1DLFfc=; b=pa7/GuobaMjLripBwkMCT4wV5l4k+0Q7sEyztDq9v8b0Rlqd6SKkIv6zjMy5EDpGv4 nEtpcjUBFvP28NQYSoQXa8rdKjDe+CfckuPwKioYbRvOhWytps6x3cs61kh5tpTxK1Pz RvCC460XskWIFo+3Y9BB7GFXwzGpyxZuY+A6CN5xnMTFhoHR0jsvt+HrS7wds/dn/VOx EfOqBeIbaKPETslRo+nFbyBSYzWK3fC5kgSGzP+asN6syhVahayJqnMMHF1txhQ3fUvK /ACqiDwHqEVOxJbqFqhSUrMNcsHru6ntbaGbXo6SQinu8cok96mKwQjeUrn1RLFxnDkF Q/bg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=ljG0jH6P; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57cb72d619csi2572982a12.99.2024.06.15.02.58.01; Sat, 15 Jun 2024 02:58:01 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=ljG0jH6P; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1C76968D622; Sat, 15 Jun 2024 12:57:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-49.mail.qq.com (out162-62-57-49.mail.qq.com [162.62.57.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3D89A68D5E1 for ; Sat, 15 Jun 2024 12:57:36 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1718445447; bh=gmuOil/caHgfO2mh0wiMYavIGZ8C+RLQuFJmRtdit3U=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ljG0jH6Pcyhenrj9Pj6dvKWfRr+teYu86OGfkOIJoMYPARFJG0B7YVkncjB9lm8pk OjfHcQAAydCJUOJyug5kQfxFwqDYvhGlplgK1y2BPAlrWjx0leYEWQzFfGgB/DnPun vGfvCWLxvldhsvZf7XO6rApmcxm8czvetQWmE3uA= Received: from ZHILIZHAO-MB1.tencent.com ([240e:465:550:4d19:cf7:37fa:cde3:ea7d]) by newxmesmtplogicsvrszc19-0.qq.com (NewEsmtp) with SMTP id E57A84A4; Sat, 15 Jun 2024 17:57:23 +0800 X-QQ-mid: xmsmtpt1718445445tryiia39m Message-ID: X-QQ-XMAILINFO: NssJ/YX50roar6IMgTERB9/VaTU9QFFakinnRlNU60tcozApm3clVJKwFPgXjf qLxEshS22ce6YW/PTlorK2E7vCS2zSdH8aCYTDA3puRW4sztHV5PsB4u02nzp0JO3Q/cXGbnC37Z 93dMJiEnMz43ZmT+2glJ1wnosXn2EWiU5Y1wo2nJHm4awWGx97cV9ZCP4K897X5OOzCUvMLA/hgW PzPDB3rR6RFwuFq1t3aRMY2PafYGCBLvexgU/r0C+gcXy6ANottHmc98zmsvz8CaWloI56PQ+V5b KmnYLFLH19p2RasS7JOQVU/Oue07rQUi3nwDTX/eZyON1jHUhaikWALq//wwt3N+tOKFxBgPEn96 Fq/wToLPYnhETQE4NbJ2Vsd1LB5RvS7dddctzoGxrpAjF+LYIWw93eXegiP/S2e8DWmEJ4SBJ4dt rBHC9w8mMnHdRQwEmzSBP1CIJzCbXF5XGEDN3CEs/ZXvhEn3RSr5YQ79irjoigX/jgF5sPoX7S1P CXIPtSERQu+87Otl1FjRSF2BPKawcsj7FSuUCm2aOwa7nId9zrEmShH5JLkMZtct5E+dDFPvk5VR PdfbAXXlLppjlwmaQpqvuq98vpy4r2CUjFL47OtBHtwwTK87+xD9EqAuEUa3G1LseaqFLXuZtn41 lxFPXLlL4J6FRj1C7bd6Ali/ydOkfVHhZyGTJ2WMGTwo95DOtBfHYn4T9tdSIVFX61njPLCKWll/ pN+3yEUzHyu+wMIci70CATTRGccc7gHUyFu6FvDH35j4yzYElMmW+yupdsdqwlE3zwlgQfAXT0v4 kT6krnCs4gOCYRtRyGRzKm2SPugRSHPG1HD5jwVuHnhYLDAXQRAOsPuy53P0QLEUhhZjXWsEOP9m LoHzPEP/sRxZV8Aq6EbjsAgwlGE3asOTtUbabaff1uAOPbeI9fUrk64X1tRHsDG4GBumZ0VtPfRm xeAeeo9NxcAoFK8rTaxq5TnbeHO8XzdFkCVGXzaR5gwWZ98LZHIuhKRd/e40EK X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sat, 15 Jun 2024 17:57:18 +0800 X-OQ-MSGID: <20240615095718.37319-2-quinkblack@foxmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240615095718.37319-1-quinkblack@foxmail.com> References: <20240615095718.37319-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] swscale/aarch64: Add bgra/rgba to yuv X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: pKpcFBzUcSsz From: Zhao Zhili Test on Apple M1 with kperf bgra_to_uv_8_c: 13.4 bgra_to_uv_8_neon: 37.4 bgra_to_uv_128_c: 155.9 bgra_to_uv_128_neon: 91.7 bgra_to_uv_1080_c: 1173.2 bgra_to_uv_1080_neon: 822.7 bgra_to_uv_1920_c: 2078.2 bgra_to_uv_1920_neon: 1437.7 bgra_to_uv_half_8_c: 17.9 bgra_to_uv_half_8_neon: 37.4 bgra_to_uv_half_128_c: 103.9 bgra_to_uv_half_128_neon: 73.9 bgra_to_uv_half_1080_c: 850.2 bgra_to_uv_half_1080_neon: 484.2 bgra_to_uv_half_1920_c: 1479.2 bgra_to_uv_half_1920_neon: 824.2 bgra_to_y_8_c: 8.2 bgra_to_y_8_neon: 18.2 bgra_to_y_128_c: 101.4 bgra_to_y_128_neon: 74.9 bgra_to_y_1080_c: 739.4 bgra_to_y_1080_neon: 613.4 bgra_to_y_1920_c: 1298.7 bgra_to_y_1920_neon: 918.7 --- libswscale/aarch64/input.S | 81 +++++++++++++++++++++++++++++++----- libswscale/aarch64/swscale.c | 16 +++++++ 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 2b956fe5c2..37f1158504 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,7 @@ sqshrn2 \dst\().8h, \dst2\().4s, \right_shift // dst_higher_half = dst2 >> right_shift .endm -.macro rgbToY bgr +.macro rgbToY bgr, element=3 cmp w4, #0 // check width > 0 .if \bgr ldr w12, [x5] // w12: ry @@ -67,11 +71,15 @@ 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 + .if \element == 3 add x1, x1, #48 // src += 48 + .else + add x1, x1, #64 + .endif cmp w4, #16 // width >= 16 ? stp q16, q17, [x0], #32 // store to dst b.ge 1b @@ -86,7 +94,7 @@ 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: @@ -101,6 +109,14 @@ function ff_bgr24ToY_neon, export=1 rgbToY bgr=1 endfunc +function ff_rgba32ToY_neon, export=1 + rgbToY bgr=0, element=4 +endfunc + +function ff_bgra32ToY_neon, export=1 + rgbToY bgr=1, element=4 +endfunc + .macro rgb_load_uv_coeff half, bgr .if \bgr ldr w12, [x6, #12] @@ -130,7 +146,7 @@ endfunc dup v6.4s, w9 .endm -.macro rgbToUV_half bgr +.macro rgbToUV_half bgr, element=3 cmp w5, #0 // check width > 0 b.le 3f @@ -139,7 +155,11 @@ endfunc b.lt 2f // The following comments assume RGB order. The logic for RGB and BGR is the same. 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 @@ -147,7 +167,11 @@ endfunc 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 + .if \element == 3 + add x3, x3, #48 + .else + add x3, x3, #64 + .endif cmp w5, #8 // width >= 8 ? str q16, [x0], #16 // store dst_u str q17, [x1], #16 // store dst_v @@ -155,9 +179,10 @@ endfunc 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 @@ -165,6 +190,15 @@ endfunc 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 @@ -177,7 +211,12 @@ endfunc 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 + .if \element == 3 + add x3, x3, #6 + .else + add x3, x3, #8 + .endif strh w8, [x1], #2 // store dst_v cbnz w5, 2b 3: @@ -192,7 +231,15 @@ function ff_bgr24ToUV_half_neon, export=1 rgbToUV_half bgr=1 endfunc -.macro rgbToUV bgr +function ff_rgba32ToUV_half_neon, export=1 + rgbToUV_half bgr=0, element=4 +endfunc + +function ff_bgra32ToUV_half_neon, export=1 + rgbToUV_half bgr=1, element=4 +endfunc + +.macro rgbToUV bgr, element=3 cmp w5, #0 // check width > 0 b.le 3f @@ -201,13 +248,17 @@ endfunc b.lt 2f // The following comments assume RGB order. The logic for RGB and BGR is the same. 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 + .if \element == 3 add x3, x3, #48 // src += 48 + .else + add x3, x3, #64 + .endif cmp w5, #16 stp q16, q17, [x0], #32 // store to dst_u stp q18, q19, [x1], #32 // store to dst_v @@ -229,7 +280,7 @@ endfunc 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: @@ -243,3 +294,11 @@ endfunc function ff_bgr24ToUV_neon, export=1 rgbToUV bgr=1 endfunc + +function ff_rgba32ToUV_neon, export=1 + rgbToUV bgr=0, element=4 +endfunc + +function ff_bgra32ToUV_neon, export=1 + rgbToUV bgr=1, element=4 +endfunc diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index ce70dbedcc..8fe9fb11ac 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); av_cold void ff_sws_init_swscale_aarch64(SwsContext *c) { @@ -233,6 +235,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) @@ -240,6 +249,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; }