From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 54EDC4E8B3 for ; Thu, 12 Jun 2025 06:05:15 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id F155E687DF6; Thu, 12 Jun 2025 09:05:10 +0300 (EEST) Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazon11020135.outbound.protection.outlook.com [52.101.227.135]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 7E887687DC8 for ; Thu, 12 Jun 2025 09:05:03 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JA7pIgMVStOKPcIRTzq808ZSM4opdJDlaaSvTTqpy2iR26tjNfvTXhf7qnUbitqZxEHtgZQYMqnN5Pw+fR/LImgH/AdsZoFIal18zlmZeSSADJ8wg46vK98j63LnpifOByqo2iYziKhCtSDHoKIoQIJRIr7Gsv9EiiKNXghwQRhjjqkodCZPDSa3genC89bBQbhR94lZwFlII/2aPH0Usfld3RVKhp8faOboMFFLqPPW9Zh7zuGNrLi2LGlOtma49XxWoj8Ml2+Qplwo8/Gxv7OrY731tjAA8yxH3pBhaJkXF//TarnKNvdetCJOZwI8S+rKBA1xaZGhEoPbsKZSvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1b5QSnqhehr/Kjbdpcrft+e49832neMIp9HcBeJcOG4=; b=QLxsJNLUyps5oHnMwhDVDZShoAjXo+Xrkh9E69svXtFsr5HrV4ZsJYZwodHQb5T4ji1zqPLyNfRPJR/qPoHigGkKXtE/dnmCIO183pdrD1P2RwrSLhsCZIvB5eZTmaqSpZsWpbWjHOmdkPzv6xQI95xSi+bQw8mlvssSAuN0/tOuqZPdEe9yVMfL8WBRFeSXGnHlzjYQcHi+euk0nguemqchsY7OqXZc7Jdix4mlyUprvbX/45gvkh0LhLON3ZElpJ+ve49KLG8ZO/s4rtZxrzSf+X83cFFnQtfIT2KoX7eRc5Pe77d8VXqwBxsKkXQhSLYt5xMyFyqyVr1khy7Zpw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=multicorewareinc.com; dmarc=pass action=none header.from=multicorewareinc.com; dkim=pass header.d=multicorewareinc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=multicorewareinc.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1b5QSnqhehr/Kjbdpcrft+e49832neMIp9HcBeJcOG4=; b=iow656Xyc1T35p3HYuDsSNhldILi13GsdACvt9wIN4dwr4eeuXV9NBywcepeFLzZK/ym2o/u1eXjHReVUiO00DiZ7lAEpwBZ/8aPozhP+92ikaiNGE6FeWRDEzGM9tV2LiTY4FVWGnjo2plJNzccstHao2qbA2MnADoYHUz8l/XZN2V/48VhQx7TSa/Z6BJu7iZuWe02gqISTvynBw8hoVcV36D7mLANJgGIeQHxMzBdwFxs6U7QBqHCZzLRu4wRG7KcWWc2PFBN9JpOMMkhGWtqg85g+fRseZshMC53XMAtotgRH7zCnQeGVue2cuPcdqIGf45nE9WEyQlZ/2W4zQ== Received: from MA0P287MB1158.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:e5::5) by PN2P287MB1612.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1ac::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.23; Thu, 12 Jun 2025 06:04:55 +0000 Received: from MA0P287MB1158.INDP287.PROD.OUTLOOK.COM ([fe80::d173:abc7:2297:fdc8]) by MA0P287MB1158.INDP287.PROD.OUTLOOK.COM ([fe80::d173:abc7:2297:fdc8%6]) with mapi id 15.20.8835.018; Thu, 12 Jun 2025 06:04:54 +0000 From: Harshitha Sarangu Suresh To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] [PATCH] swscale/aarch64/output: Implement neon assembly for yuv2nv12cX_c() [v2] Thread-Index: AQHb2VA+kwiCw0uxjUevoD1+l9jA9LP/DRHQ Date: Thu, 12 Jun 2025 06:04:54 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-IN, en-US Content-Language: en-IN X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: x-ms-reactions: allow authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=multicorewareinc.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MA0P287MB1158:EE_|PN2P287MB1612:EE_ x-ms-office365-filtering-correlation-id: eb6195ee-adf5-42c0-b8c6-08dda9770d7e x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|366016|1800799024|376014|38070700018|8096899003|7053199007; x-microsoft-antispam-message-info: =?us-ascii?Q?wSlw5otVSTYaaGjUjDyw2M+gULRTkgQSBKYfl5WY2s04YoluboEPYzMCn6Ws?= =?us-ascii?Q?BOYSceJFydDkK3ExnBdA929z8em3frs+3Siy5qkWeZm7UqkcqqFOjwG69l3G?= =?us-ascii?Q?kN9AdmmeG4Lu6Pkwup8cHof5P+V4q8yK1oj9ldbCiKX6sACpKKki5PTI6OEq?= =?us-ascii?Q?nV9za0i8HzJc0TEG+uuL9hQZsAmRJmgcLH0Bu71FKrngRThYxIlryfcqeDz/?= =?us-ascii?Q?Tday0+ZAuqYcCAb7ozJCjDLU2OxsEX8SxQeMyAnIYARTCx9xThYUcMfoVZj8?= =?us-ascii?Q?+gjWD///R/WDPKq0wWSVFJw7jPhDfiFoZ4AFhdPQOHYbvFlDNH4SvKg4Dkk0?= =?us-ascii?Q?ZOucefD0cSVM8KqOfuvf//4YtGM4hESKkUVsSOsmyy8a+y1wIXDV1tN5hpus?= =?us-ascii?Q?X7EEXW+9KcF7rGzfvRt6mlqSxx9D4Yp00d/hSVQ0AS3jtvnUBSC0Eo4BdcC6?= =?us-ascii?Q?mWSQQWZ43F6MmMexr1TRpKEPaHQBVKHrNSaEKW8zkQGczm8vvTjNBeAxa3vq?= =?us-ascii?Q?Wi4ksd7IJ0+TU/JmUXqYxWeQt9EL4fXyyZ1YE2cmUwzIz6V1eGDiQRy3aa1v?= =?us-ascii?Q?MLORpHqYe0pKaBGyGelNMUnaJ8se7zSFKJwoL/11jywz6mIW5nm6ahZUTLhc?= =?us-ascii?Q?gGbS5ki6vaznG4uN32z88knfJyycgXfz62eqCs7bq+6AUwVxra45a32IboNH?= =?us-ascii?Q?8zMv5oe8nl6u4nOSDk8TW+YHSRbkyTAvbdxZ4aeOxC/pi1M4aY4+Zw3AP/aV?= =?us-ascii?Q?LbzO0vP7kgJ+D7eKqQ+KOvkg4kqSqeuPspX5c5cKaCT4cfXqSCiG9yVLErds?= =?us-ascii?Q?ERbQ+Lm8gakb3+/EZtlUOJKgD2Ws0sswmq+8swYaEMT59X0AkrAO59afrlfb?= =?us-ascii?Q?FV7Oef1FEhpQVHWaXAGjYTGL24EroRWdI5cF0rOB0tazNX1r4Iw0R/syhgIs?= =?us-ascii?Q?gsykPm6zi6iUmJwv3jSZXSMyd3ITWmWWpkd8Z/iq7gM90eoCmPEMDqHqxiBC?= =?us-ascii?Q?4o7b5E+5sCJFXnhQ82uKP46z7gAZSNdBE5rz9LuG0fElVyAaqkh4WnE2DnCz?= =?us-ascii?Q?ni5j16KDsSXByIta//54gcyU3PGgtJVlb4HRh8QKvw62frQhDCUMNvqsed/2?= =?us-ascii?Q?5HE12tUbrmMDaI56WGwjxpYbesMXsxJxjXv4E8nQoHkpOLWavgT1wigiFCjb?= =?us-ascii?Q?KoZBZFtF8LcMlI90o1R76Smz0vUo6cZmJHENpn71UJU39fFhqTJlpS4GRW+U?= =?us-ascii?Q?i1owaZJ6VXmsdF+3V/Q3x2kiYOmTg/3VNuBCBwBjVpqLjdahP76e7y4bJErv?= =?us-ascii?Q?9GgCWeoW6hrimWvLz+A5Bd0Lg3w7lhfQYjlXMgsh5hSeGXNdRdwhj7MfkROC?= =?us-ascii?Q?bsi5Vire/F2EG5QBkJJScSbGbV3NOFI1FdOLLyBfRKrcv1gxGfNMX4CvwwZK?= =?us-ascii?Q?M5Kujl7NxGc=3D?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MA0P287MB1158.INDP287.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230040)(366016)(1800799024)(376014)(38070700018)(8096899003)(7053199007); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?X1h/fHmduBANFVjb4DvyjSVGfl0paEb6xzxQImUOnUb7PT5GhPi/SqrCqK8S?= =?us-ascii?Q?NyJlCiBxvx2x/FsWmQwVx0EwG7KlBP/Pj/WpHlHXzVLKHa1IJ+etnSOTqZSC?= =?us-ascii?Q?v7hZZiM7f+7bvDDNNKB58ilio4z9izqOcC6k7dZ4UOjOF5DM2nUEwyvQRdkj?= =?us-ascii?Q?JbYphi62P4GgAY+Qbt7IU8/ZqjzW9hurqh74o2K7A5azNQEOJrsH6kq2YCTK?= =?us-ascii?Q?xhjJmOLdTsgReV6XVcW/xcBX0wRW1E/QglcmMjTtKNiCAPUMfXND3naJOlhv?= =?us-ascii?Q?M86oE5fGOmm4HI+Wa+t4IELzEaUxFXkSB8Ko7OM/Laqy5tGLQJwnvLjKUMM3?= =?us-ascii?Q?MBL/D/bCMd1iJG8Qw27zrWlLBuosva3S5Cjx8F5wF3Frb7MFGQASff7h0jZJ?= =?us-ascii?Q?QJ6rp7/4L71p4BZTPRF0JqU+xDIhlKI1gZwlkQtH/MDgSe9k6kDIaHqwGkQ4?= =?us-ascii?Q?+3s0kyVJI945dPJnjmxQMPphctxuXeXJCE/742Ifs+lk+ecXqHvcj0YvZNeC?= =?us-ascii?Q?K9947HYSdvJ6i3W76WqXDnxZA7lu+V2fffZpjIpO1JRHu+biy1XXnATEDZhv?= =?us-ascii?Q?sCU/xgwioneT8iu1bmLHR/9QXOPdvyvYC1PQKCWtxdVKI/vUGACdxN+Ke4Sm?= =?us-ascii?Q?AHFhlo2AwaZ2hD1qad6WhIeGDi+p86kBaoRLrMGQbbeQFDfKmugCctivyf5X?= =?us-ascii?Q?e/BS3R22A01QWI6aYhnb+4++ktbuNvTFSVYW4cWU4IBJbbseKHts/XpObEAa?= =?us-ascii?Q?t2G12+COwPfIdZCWA/6IbZ/L2O4LQ1agPAb6Axo00KBucohtA9be7+7fCxi0?= =?us-ascii?Q?QAluwn/gItLNpK7oltkLc7+XB4lzCvf2+7mkAcwejJt6Fkhk+osBlvno5lfs?= =?us-ascii?Q?Rob7z2QdeLl3dEY2It8SIkxKDPTqP6KQGPN1nldcviThbTOVzuKBeUZUxrwY?= =?us-ascii?Q?+7nawcCiTTy+HRn8rXHvV0MTi+MWeqqGd6wXa+qJm8RVrnynDPEY5K7sWGn2?= =?us-ascii?Q?F2S3ucY8AHrss78jTCs/Bokmlyf54XTibfqPJxeuL8m+jlE6KDnBUfJkZU/G?= =?us-ascii?Q?lGUXJauK1ArTXLxCvJSWpeZvHR5SQNKTcW+xAZmhbn4QFGoxF97C7Qvkrw1a?= =?us-ascii?Q?mdU0xNU1REsq2/twUOCgRvzxHbcWAS+vpJLHoSMyzNXq7dH0PqKii0bAw54W?= =?us-ascii?Q?lLHEqWPEuQv2/W3tMsvZgaRhjbv+fwtPonj8NOaDjYgXMtp41bxSUDwb2D03?= =?us-ascii?Q?RUWt9qgZDvOa6EMCf+qGCZOpfIsQskhp1psjIfOo8yR3b7y7nbEJEXIwlNZR?= =?us-ascii?Q?cuouxY1vSjQV/rqomAg/hPSlK64YDQ/cxe2p/C4AI6MDVTAfLAb4SVVVqOKU?= =?us-ascii?Q?Be07imicpd1K6UJSozmC37NjKE+oJuSfwomXe2IN8352byXcHOs1e2cGU3Ts?= =?us-ascii?Q?oKtX+8icnOiURWr0ce5H7MV9DgbfRE5prt1Zte0NczOdwKtduYDvJ+sSaUoo?= =?us-ascii?Q?X9WI38ygH4Z3C0IW2eMTjiPK64lRmGj9NXvD+8CdXvIrW1L5op4qYEfz9xUv?= =?us-ascii?Q?1+RP34tWv3x6FK/77Y9lU3z8oGF+IFoPcsTEBUvCkI7CAI3h/r1bkjUgBAgw?= =?us-ascii?Q?uEhoJ9s3DAd2uU8K/5qtdOw=3D?= MIME-Version: 1.0 X-OriginatorOrg: multicorewareinc.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MA0P287MB1158.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: eb6195ee-adf5-42c0-b8c6-08dda9770d7e X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Jun 2025 06:04:54.8945 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: ffc5e88b-3fa2-4d69-a468-344b6b766e7d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ToLDMYfTncbMkfukAGFDqs54sUauMeUrhelEZtT7W3YIiYzJ1TnNqEdKu1fZObntmtSDmXMgkadPFhNudhNH2rg1Sn9BtA0ZL6iOuhAaMRM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN2P287MB1612 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH] swscale/aarch64/output: Implement neon assembly for yuv2nv12cX_c() [v2] 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: Dash Santosh Sathyanarayanan , Logaprakash Ramajayam Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Hi, Can you please review the patch? Thanks. Get Outlook for Android ________________________________ From: Harshitha Sarangu Suresh Sent: Monday, June 9, 2025 8:41:39 PM To: FFmpeg development discussions and patches Cc: Dash Santosh Sathyanarayanan ; Logaprakash Ramajayam Subject: [FFmpeg-devel] [PATCH] swscale/aarch64/output: Implement neon assembly for yuv2nv12cX_c() [v2] >From 4ca5eae1e7164f78296719f19aef97239e5b046a Mon Sep 17 00:00:00 2001 From: Harshitha Suresh Date: Mon, 19 May 2025 22:37:20 +0530 Subject: [PATCH] swscale/aarch64/output: Implement neon assembly for yuv2nv12cX_c(). yuv2nv12cX_2_512_accurate_c: 3508.8 ( 1.00x) yuv2nv12cX_2_512_accurate_neon: 369.2 ( 9.50x) yuv2nv12cX_2_512_approximate_c: 3499.0 ( 1.00x) yuv2nv12cX_2_512_approximate_neon: 370.2 ( 9.45x) yuv2nv12cX_4_512_accurate_c: 4683.0 ( 1.00x) yuv2nv12cX_4_512_accurate_neon: 568.8 ( 8.23x) yuv2nv12cX_4_512_approximate_c: 4682.6 ( 1.00x) yuv2nv12cX_4_512_approximate_neon: 569.9 ( 8.22x) yuv2nv12cX_8_512_accurate_c: 7243.0 ( 1.00x) yuv2nv12cX_8_512_accurate_neon: 937.6 ( 7.72x) yuv2nv12cX_8_512_approximate_c: 7235.9 ( 1.00x) yuv2nv12cX_8_512_approximate_neon: 938.3 ( 7.71x) yuv2nv12cX_16_512_accurate_c: 13749.7 ( 1.00x) yuv2nv12cX_16_512_accurate_neon: 1708.1 ( 8.05x) yuv2nv12cX_16_512_approximate_c: 13750.0 ( 1.00x) yuv2nv12cX_16_512_approximate_neon: 1708.6 ( 8.05x) --- libswscale/aarch64/output.S | 306 +++++++++++++++++++++++++++++++++++ libswscale/aarch64/swscale.c | 19 +++ 2 files changed, 325 insertions(+) diff --git a/libswscale/aarch64/output.S b/libswscale/aarch64/output.S index 190c438870..2d87cc6a5e 100644 --- a/libswscale/aarch64/output.S +++ b/libswscale/aarch64/output.S @@ -226,3 +226,309 @@ function ff_yuv2plane1_8_neon, export=1 b.gt 2b // loop until width consumed ret endfunc + +function ff_yuv2nv12cX_notswapped_neon, export=1 +// x0 - dstFormat (unused) +// x1 - uint8_t *chrDither +// x2 - int16_t *chrFilter +// x3 - int chrFilterSize +// x4 - int16_t **chrUSrc +// x5 - int16_t **chrVSrc +// x6 - uint8_t *dest +// x7 - int chrDstW + + // Load dither pattern and compute U and V dither vectors + ld1 {v0.8b}, [x1] // chrDither[0..7] + ext v1.8b, v0.8b, v0.8b, #3 // Rotate for V: (i+3)&7 + + uxtl v0.8h, v0.8b + uxtl v1.8h, v1.8b + + ushll v2.4s, v0.4h, #12 // U dither low + ushll2 v3.4s, v0.8h, #12 // U dither high + ushll v4.4s, v1.4h, #12 // V dither low + ushll2 v5.4s, v1.8h, #12 // V dither high + + // Check if we can process 16 pixels at a time + tst w7, #15 // Check if chrDstW % 16 == 0 + b.ne .Lprocess_8_pixels // If not, use 8-pixel version + + // ============================================= + // 16-pixel processing path + // ============================================= + mov x8, #0 // i = 0 +.Lloop_16_pixels: + + mov v16.16b, v2.16b // U acc low + mov v17.16b, v3.16b // U acc high + mov v18.16b, v4.16b // V acc low + mov v19.16b, v5.16b // V acc high + + mov v20.16b, v2.16b + mov v21.16b, v3.16b + mov v22.16b, v4.16b + mov v23.16b, v5.16b + + mov w9, w3 // chrFilterSize counter + mov x10, x2 // chrFilter pointer + mov x11, x4 // chrUSrc base + mov x12, x5 // chrVSrc base + +.Lfilter_loop_16: + ldr h6, [x10], #2 // Load filter coefficient + + ldr x13, [x11], #8 // chrUSrc[j] + ldr x14, [x12], #8 // chrVSrc[j] + add x13, x13, x8, lsl #1 // &chrUSrc[j][i] + add x14, x14, x8, lsl #1 // &chrVSrc[j][i] + add x15, x13, #16 // x15 = &chrUSrc[j][i+8] (8 samples * 2 bytes) + add x16, x14, #16 + + ld1 {v24.8h}, [x13] // U samples 0-7 + ld1 {v25.8h}, [x14] // V samples 0-7 + + ld1 {v26.8h}, [x15] // U samples 8-15 + ld1 {v27.8h}, [x16] // V samples 8-15 + + smlal v16.4s, v24.4h, v6.h[0] + smlal2 v17.4s, v24.8h, v6.h[0] + smlal v18.4s, v25.4h, v6.h[0] + smlal2 v19.4s, v25.8h, v6.h[0] + + smlal v20.4s, v26.4h, v6.h[0] + smlal2 v21.4s, v26.8h, v6.h[0] + smlal v22.4s, v27.4h, v6.h[0] + smlal2 v23.4s, v27.8h, v6.h[0] + + subs w9, w9, #1 + b.gt .Lfilter_loop_16 + + // Process and store first 8 pixels + sqshrun v28.4h, v16.4s, #16 + sqshrun2 v28.8h, v17.4s, #16 + sqshrun v29.4h, v18.4s, #16 + sqshrun2 v29.8h, v19.4s, #16 + uqshrn v30.8b, v28.8h, #3 // U + uqshrn v31.8b, v29.8h, #3 // V + + // Process and store next 8 pixels + sqshrun v28.4h, v20.4s, #16 + sqshrun2 v28.8h, v21.4s, #16 + sqshrun v29.4h, v22.4s, #16 + sqshrun2 v29.8h, v23.4s, #16 + uqshrn v24.8b, v28.8h, #3 // U + uqshrn v25.8b, v29.8h, #3 // V + + // Store both 8-pixel blocks + st2 {v30.8b, v31.8b}, [x6], #16 + st2 {v24.8b, v25.8b}, [x6], #16 + + subs w7, w7, #16 + add x8, x8, #16 + b.gt .Lloop_16_pixels + ret + + // ============================================= + // 8-pixel processing path (original code) + // ============================================= +.Lprocess_8_pixels: + mov x8, #0 // i = 0 +.Lloop_8_pixels: + // Initialize accumulators with dither + mov v16.16b, v2.16b // U acc low + mov v17.16b, v3.16b // U acc high + mov v18.16b, v4.16b // V acc low + mov v19.16b, v5.16b // V acc high + + mov w9, w3 // chrFilterSize counter + mov x10, x2 // chrFilter pointer + mov x11, x4 // chrUSrc base + mov x12, x5 // chrVSrc base + +.Lfilter_loop_8: + ldr h6, [x10], #2 // Load filter coefficient + + ldr x13, [x11], #8 // chrUSrc[j] + ldr x14, [x12], #8 // chrVSrc[j] + add x13, x13, x8, lsl #1 // &chrUSrc[j][i] + add x14, x14, x8, lsl #1 // &chrVSrc[j][i] + + ld1 {v20.8h}, [x13] // U samples + ld1 {v21.8h}, [x14] // V samples + + smlal v16.4s, v20.4h, v6.h[0] + smlal2 v17.4s, v20.8h, v6.h[0] + smlal v18.4s, v21.4h, v6.h[0] + smlal2 v19.4s, v21.8h, v6.h[0] + + subs w9, w9, #1 + b.gt .Lfilter_loop_8 + + // Final processing and store + sqshrun v26.4h, v16.4s, #16 + sqshrun2 v26.8h, v17.4s, #16 + sqshrun v27.4h, v18.4s, #16 + sqshrun2 v27.8h, v19.4s, #16 + uqshrn v28.8b, v26.8h, #3 // U + uqshrn v29.8b, v27.8h, #3 // V + + st2 {v28.8b, v29.8b}, [x6], #16 + + subs w7, w7, #8 + add x8, x8, #8 + b.gt .Lloop_8_pixels + ret +endfunc + +function ff_yuv2nv12cX_swapped_neon, export=1 +// x0 - dstFormat (unused) +// x1 - uint8_t *chrDither +// x2 - int16_t *chrFilter +// x3 - int chrFilterSize +// x4 - int16_t **chrUSrc +// x5 - int16_t **chrVSrc +// x6 - uint8_t *dest +// x7 - int chrDstW + + // Load dither pattern and compute U and V dither vectors + ld1 {v0.8b}, [x1] // chrDither[0..7] + ext v1.8b, v0.8b, v0.8b, #3 // Rotate for V: (i+3)&7 + + uxtl v0.8h, v0.8b + uxtl v1.8h, v1.8b + + ushll v2.4s, v0.4h, #12 // U dither low + ushll2 v3.4s, v0.8h, #12 // U dither high + ushll v4.4s, v1.4h, #12 // V dither low + ushll2 v5.4s, v1.8h, #12 // V dither high + + // Check if we can process 16 pixels at a time + tst w7, #15 // Check if chrDstW % 16 == 0 + b.ne .Lprocess_swapped_8_pixels // If not, use 8-pixel version + + // ============================================= + // 16-pixel processing path + // ============================================= + mov x8, #0 // i = 0 +.Lloop_swapped_16_pixels: + + mov v16.16b, v2.16b // U acc low + mov v17.16b, v3.16b // U acc high + mov v18.16b, v4.16b // V acc low + mov v19.16b, v5.16b // V acc high + + mov v20.16b, v2.16b + mov v21.16b, v3.16b + mov v22.16b, v4.16b + mov v23.16b, v5.16b + + mov w9, w3 // chrFilterSize counter + mov x10, x2 // chrFilter pointer + mov x11, x4 // chrUSrc base + mov x12, x5 // chrVSrc base + +.Lfilter_swapped_loop_16: + ldr h6, [x10], #2 // Load filter coefficient + + ldr x13, [x11], #8 // chrUSrc[j] + ldr x14, [x12], #8 // chrVSrc[j] + add x13, x13, x8, lsl #1 // &chrUSrc[j][i] + add x14, x14, x8, lsl #1 // &chrVSrc[j][i] + add x15, x13, #16 // x15 = &chrUSrc[j][i+8] (8 samples * 2 bytes) + add x16, x14, #16 + + ld1 {v24.8h}, [x13] // U samples 0-7 + ld1 {v25.8h}, [x14] // V samples 0-7 + + ld1 {v26.8h}, [x15] // U samples 8-15 + ld1 {v27.8h}, [x16] // V samples 8-15 + + smlal v16.4s, v24.4h, v6.h[0] + smlal2 v17.4s, v24.8h, v6.h[0] + smlal v18.4s, v25.4h, v6.h[0] + smlal2 v19.4s, v25.8h, v6.h[0] + + smlal v20.4s, v26.4h, v6.h[0] + smlal2 v21.4s, v26.8h, v6.h[0] + smlal v22.4s, v27.4h, v6.h[0] + smlal2 v23.4s, v27.8h, v6.h[0] + + subs w9, w9, #1 + b.gt .Lfilter_swapped_loop_16 + + // Process and store first 8 pixels + sqshrun v28.4h, v16.4s, #16 + sqshrun2 v28.8h, v17.4s, #16 + sqshrun v29.4h, v18.4s, #16 + sqshrun2 v29.8h, v19.4s, #16 + uqshrn v30.8b, v29.8h, #3 // V + uqshrn v31.8b, v28.8h, #3 // U + + // Process and store next 8 pixels + sqshrun v28.4h, v20.4s, #16 + sqshrun2 v28.8h, v21.4s, #16 + sqshrun v29.4h, v22.4s, #16 + sqshrun2 v29.8h, v23.4s, #16 + uqshrn v24.8b, v29.8h, #3 // V + uqshrn v25.8b, v28.8h, #3 // U + + // Store both 8-pixel blocks + st2 {v30.8b, v31.8b}, [x6], #16 + st2 {v24.8b, v25.8b}, [x6], #16 + + subs w7, w7, #16 + add x8, x8, #16 + b.gt .Lloop_swapped_16_pixels + ret + + // ============================================= + // 8-pixel processing path (original code) + // ============================================= +.Lprocess_swapped_8_pixels: + mov x8, #0 // i = 0 +.Lloop_swapped_8_pixels: + // Initialize accumulators with dither + mov v16.16b, v2.16b // U acc low + mov v17.16b, v3.16b // U acc high + mov v18.16b, v4.16b // V acc low + mov v19.16b, v5.16b // V acc high + + mov w9, w3 // chrFilterSize counter + mov x10, x2 // chrFilter pointer + mov x11, x4 // chrUSrc base + mov x12, x5 // chrVSrc base + +.Lfilter_swapped_loop_8: + ldr h6, [x10], #2 // Load filter coefficient + + ldr x13, [x11], #8 // chrUSrc[j] + ldr x14, [x12], #8 // chrVSrc[j] + add x13, x13, x8, lsl #1 // &chrUSrc[j][i] + add x14, x14, x8, lsl #1 // &chrVSrc[j][i] + + ld1 {v20.8h}, [x13] // U samples + ld1 {v21.8h}, [x14] // V samples + + smlal v16.4s, v20.4h, v6.h[0] + smlal2 v17.4s, v20.8h, v6.h[0] + smlal v18.4s, v21.4h, v6.h[0] + smlal2 v19.4s, v21.8h, v6.h[0] + + subs w9, w9, #1 + b.gt .Lfilter_swapped_loop_8 + + // Final processing and store + sqshrun v26.4h, v16.4s, #16 + sqshrun2 v26.8h, v17.4s, #16 + sqshrun v27.4h, v18.4s, #16 + sqshrun2 v27.8h, v19.4s, #16 + uqshrn v28.8b, v27.8h, #3 // V + uqshrn v29.8b, v26.8h, #3 // U + + st2 {v28.8b, v29.8b}, [x6], #16 + + subs w7, w7, #8 + add x8, x8, #8 + b.gt .Lloop_swapped_8_pixels + ret +endfunc diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index 6e5a721c1f..5246d53a16 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -168,6 +168,16 @@ void ff_yuv2plane1_8_neon( const uint8_t *dither, int offset); +void ff_yuv2nv12cX_notswapped_neon(enum AVPixelFormat dstFormat, const uint8_t *chrDither, + const int16_t *chrFilter, int chrFilterSize, + const int16_t **chrUSrc, const int16_t **chrVSrc, + uint8_t *dest, int chrDstW); + +void ff_yuv2nv12cX_swapped_neon(enum AVPixelFormat dstFormat, const uint8_t *chrDither, + const int16_t *chrFilter, int chrFilterSize, + const int16_t **chrUSrc, const int16_t **chrVSrc, + uint8_t *dest, int chrDstW); + #define ASSIGN_SCALE_FUNC2(hscalefn, filtersize, opt) do { \ if (c->srcBpc == 8) { \ if(c->dstBpc <= 14) { \ @@ -201,6 +211,12 @@ void ff_yuv2plane1_8_neon( default: break; \ } +#define ASSIGN_YUV2NV12_FUNC(yuv2nv12fn, opt, dstFormat) \ + if(!isSwappedChroma(dstFormat)) \ + yuv2nv12fn = ff_yuv2nv12cX_notswapped_ ## opt; \ + else \ + yuv2nv12fn = ff_yuv2nv12cX_swapped_ ## opt; + #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 *); \ @@ -275,7 +291,10 @@ av_cold void ff_sws_init_swscale_aarch64(SwsInternal *c) ASSIGN_VSCALE_FUNC(c->yuv2plane1, neon); if (c->dstBpc == 8) { c->yuv2planeX = ff_yuv2planeX_8_neon; + if(isSemiPlanarYUV(c->opts.dst_format)) + ASSIGN_YUV2NV12_FUNC(c->yuv2nv12cX, neon, c->opts.dst_format); } + switch (c->opts.src_format) { case AV_PIX_FMT_ABGR: c->lumToYV12 = ff_abgr32ToY_neon; -- 2.34.1 2.3 _______________________________________________ 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".