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 E4F5D4D277 for ; Sat, 31 May 2025 09:17:13 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id E182968DAF9; Sat, 31 May 2025 12:16:56 +0300 (EEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2026.outbound.protection.outlook.com [40.92.89.26]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 897FF68DAF9 for ; Sat, 31 May 2025 12:16:51 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Idrk1k/UNsAxOQ2Td+627RF09RXdQOfdr7a/SYMxRRn2O8GY378QNGnGvZxQnJpIAZ0bqsVW0sYbdfZW24DO0Uyz0oJkbveMN+FOdqF6x//JKG4DZy3XiIawtPfFlnQazCJ/FZDS5xxJnt8JOggWCBrZoJGQh0jjKHkF5bzj5QeJi9HFfrOgYwBRDWABWZjw1QMHb9X4j2v6sqR1s4lTohpDoLoxNbp1yaNe8FzjK+fGLUZ3mAqNWmLLYnQtYsTaw86VVWvyaULyEMXCouUpIz/XrArDkz3qv8hF+6WQi6D5HY14dYeE2NaoXc8YlEDMMqDdxIxgXB0pGdctMhCkFg== 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=DtppACEq9kYpyT1tV3B1XG7PS7EVrTLo8NoHpDbsl9o=; b=gfqkVBIZITeukdpQVBX5oQHFnJiLdgnZsk3Fu0gZvb1ZkTP6AmrfuL+kkao8ai/8cuD5zRJ4FVc84EQqinb0ZkALpCFIVcfOa9g3HWAty/ckWfiogZqzK/yKV4BbhPeiBbtkU3rxeK25avn0VeRSU5bLezwwr87r3x5lIb1ZxAThAy/xQsPgjn7ihUI1vSeGQ8aqW/jvMKvIkdCa+TffQdtJsiKvyE+95wDpBaL9ZyzK6oqsyqR7GoRY7oebbxlyVvwWkpCF8oXf5kj3MosfuAW89VqxxUmiz7CJltI7TwClQAWBqaYZJ4i2qTxw7q1G80llbzqgT2O6uAzrKGBecA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DtppACEq9kYpyT1tV3B1XG7PS7EVrTLo8NoHpDbsl9o=; b=f8Xd3GZM6UV8ISEXAW2P7n7g6zvLzszWuh0lcyAD3mruD+40YPZxvRdLQf8mDBS5z3ZaiSkV4dmm4uKwP9/kYQacpO19T39jxnXjEI0r16BLhQ8jUV5rn/3tVtBmoDuORSj6b8seFkgsYvIQl19kQzPCzx0tcUkWvYs4bunJ/OKTVdlptuYxXzuavGxuaPqhIxI+b4h3FIudDDG/MPAhJ5mp6qRLaa0xt+9Zrt3mujRwv6tXVG90KZ2R50hDhvIQNbsML6T0n9od/NtSr2wj8C/Rl287xJGvByo8qFWqR9PLEbeGCqVCaMB1NywTLg7Hemz+2qlW89TN5ZIQR/LK5A== Received: from DBAP193MB0956.EURP193.PROD.OUTLOOK.COM (2603:10a6:10:1c5::19) by PAXP193MB2106.EURP193.PROD.OUTLOOK.COM (2603:10a6:102:228::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.31; Sat, 31 May 2025 09:16:44 +0000 Received: from DBAP193MB0956.EURP193.PROD.OUTLOOK.COM ([fe80::ed13:9f9d:e088:ae31]) by DBAP193MB0956.EURP193.PROD.OUTLOOK.COM ([fe80::ed13:9f9d:e088:ae31%3]) with mapi id 15.20.8769.022; Sat, 31 May 2025 09:16:44 +0000 From: Dmitriy Kovalenko To: ffmpeg-devel@ffmpeg.org Date: Sat, 31 May 2025 11:11:45 +0200 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250531091631.45342-1-dmtr.kovalenko@outlook.com> References: <20250531091631.45342-1-dmtr.kovalenko@outlook.com> X-ClientProxiedBy: AM0PR07CA0018.eurprd07.prod.outlook.com (2603:10a6:208:ac::31) To DBAP193MB0956.EURP193.PROD.OUTLOOK.COM (2603:10a6:10:1c5::19) X-Microsoft-Original-Message-ID: <20250531091631.45342-3-dmtr.kovalenko@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DBAP193MB0956:EE_|PAXP193MB2106:EE_ X-MS-Office365-Filtering-Correlation-Id: b6b997b6-4819-43f2-0bf7-08dda023dc66 X-MS-Exchange-SLBlob-MailProps: Cq7lScuPrnoSu68Y5FdRDlCPOBk43FEt8Sf8vUV0+YPnd+wVeAiFhmKV/zMd+W7A0rPYFgo1NtP7hfX9T/adH8qHobPTvsUeY79VWFZFhgeAF2LzfGJKP1XythpHkw5UPBxCrk/vgbmtjZ4fZ31IbugPGQEiGcAfNFpUAsqcLEKx2pFMft3oJSKHwfNregqzei4/nIMTTiCawuuA7I80iEyQHnaG1PwLL5aEbeTfasACR9ruDEgmjL3AACqCVl6sTxMFQjK619yThjF9AkQlbTytCplXUVCj32HYdAvFHmwL2Oj0rx6qT4o65NARhxtsCbQMA6+8yEBC9+YGKkAvFczshGflONB26nlgJ9mS4B7JNDMVxCOrX4O8zATu0Z/Zjov2XzYg+LaSpQZ7wQ15galdFI9REeJCns1cc6mmory8OUBXAsgIsWrLIQjTciy9LxMU0Gf5ayMpkK2E1mqaaMxhPCcH0Doad/Aug0Wvc7N6z3V6AO7BAiYMKVcGi6tTxc60YsbIupDuI1cdn0lzynqDNgqJSBh9zYBASYb1JeH49BLqE11dq9f5EfS/OqEDtwGhIcfcOiUKtPve9gL0p7aHFBUeavG894y6NxM4mzJXkwcSEGGDu5MZi/3PoZtSfir956yeNP02AqJSnLkHNBy+biHs6iVq9nhCTjNPHR8AixquAXvCqYgFITyYMHwdOCtQCllfXZtKTxS/3JFRQpGRewGrBq1bLa8EUJx41/lFLFfKqH+kPvmjED9OWLsbKCQQtza4e7w= X-Microsoft-Antispam: BCL:0; ARA:14566002|461199028|8060799009|7092599006|15080799009|19110799006|5072599009|440099028|3412199025|1710799026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?gvBxabW2xpi9z2KO96vGq4Vl2QQXxT8zZrm57/xkGi282syvoDSJ+dkkflCE?= =?us-ascii?Q?o9r8twEXupd3JnNhNCzwa4UD/9mxAGROZqB8cfnual1P2S/wLfeXV6yU3V/m?= =?us-ascii?Q?yFG2Zoi8uvRWECV6rR6HfgHqUb0VvyVFVftmGerBhzs7C6I6L1UoKfmW/gZz?= =?us-ascii?Q?5ohwfCdkedYZkwL9BxFi5oEE9kcVE4UAVxkeK2bBG4IiOw/D1YfDFPLwwROQ?= =?us-ascii?Q?rx6yI1MJQ39xt9XDV+e6zOriEBjzB4x8hCdL/cIzyHdIAgZiKTw/BJapwRTl?= =?us-ascii?Q?a7oKqwb7trzv1CgeFbPfdmJYVDY4Nm2HXvNskO8EZc6fNJI+aDrhO3nXiEwU?= =?us-ascii?Q?DdB0s6g4sM0V6GmM/6ufTgOF8C1kD81apdgIWjYTS35jyPqKgYedTTgwjhmV?= =?us-ascii?Q?zf7ErEVInsOmsw9+Li7XJIeDf+W9B9P/32qD1Wk21voMK7rEL/wXOT4cEsPn?= =?us-ascii?Q?esPTL4jL2DZHhahYydYCqncyY7KbNqgw63U56F9XTYaMOJo9fbHZe+54QJ/C?= =?us-ascii?Q?XlVG6PYAOmURXTQ2/zQgAv2u/EvxKNdRuRd1wpNaQztxcs7T4jJSgEE3EvnU?= =?us-ascii?Q?CX4ZTbMH/je1EikYrQ47EvWX7kc+A34l/Sxu2E/943Stn3f4qbZFRO5crtcZ?= =?us-ascii?Q?fh/BCQSC+KyvLo+HsUCJHRG5UaVS4yHWier9Hqm5kjWjKKvWVD8QEiriyTtC?= =?us-ascii?Q?jhA9mtq5AMnhGkOCr3ZnCb+Nwx5xPXM9qU3hc5DVFNAKK1NywPfHgivARB8M?= =?us-ascii?Q?QcqLdxntGi7euveN2KIsPqyuyjRCP7HlJhRXcY8gddB40El1d48xpW4K+fkp?= =?us-ascii?Q?B+8VaADNFA1c4mhIl5POZRVM8cKMiAw68tFH2KsDKG1jHJ+aGu/yDXi/97UW?= =?us-ascii?Q?gDahmVRgsq40QGFXcgxveRmkrN6+1/m1nhOZgKaraefvH/yW2HGhfyGgcuK/?= =?us-ascii?Q?3FJwEUMv9jIvnIcwUBA4hAzfisVGb/rKc/n7Yx1kaw1uElvBengLqekTgxib?= =?us-ascii?Q?V3DrDxqavrmgP3kNCnCFrQ2SJEbI1VfCjT6m+1gapkQjTLoHpZCRvHlPOGSV?= =?us-ascii?Q?u93qt7X0LonXiT4tAqaqt+Z5QdizeeDLu0oI7fbvXQbVXN+Pd90TKLjF+gWq?= =?us-ascii?Q?8WFZJW/mkvfjbL0O+YH11GqvmFNXwe7Cxw=3D=3D?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?tkmrZfHTUKoov6ctxzabf/JRVrUmFZ+WmJU26kuLXBk/H3SFGmlhneuBelxz?= =?us-ascii?Q?GCTyeemsXw0fZPp17yFWOe4HwadqZj8MP6696MF82MR46nt8E5g/8pTIJpVW?= =?us-ascii?Q?jMPWD/vr3uNIaGoL1kbT1gB6tYwmwYMMYpREeP8c5cRpPbAoLlBAUwxltySQ?= =?us-ascii?Q?Z4s+pTDlFww9VZsKgR3mbqetCEA2GyHM5nPZyqaMtc1GPr2Sh2VQCcoqKaVf?= =?us-ascii?Q?I6s9us3VABwnugjwG/KxPWSOorBDZIZSFgidkjsVFhr5cGMITPeExYdIpv6N?= =?us-ascii?Q?a0DT79Uo+8XQA148wQPHLao21lYTzMlc5mPynD3vTC+K52PqG1Wvs9IQUyyJ?= =?us-ascii?Q?9VFjEIQR2ZkXEjGdMoctl/JVNpk6cnfeUMLvXPyCwAkKSFxrlcwMkzGZSGeh?= =?us-ascii?Q?kTvuJCcawPFY3vwz+gfCAzpOH719glYO8If/woNguBD4YGSR56Cgpm3enEJb?= =?us-ascii?Q?yG7nHaRGBr02xn2l7g46s9mWRQFE2GmW6wSpzo48ryc3LbaQhw6CYD2liaRp?= =?us-ascii?Q?FXvyD4fHGfmlU3+PObtpKmxXCw47Vft1DxgUXUVOcLljuhu/Fs2FyAN4jJy2?= =?us-ascii?Q?px+kUewnZQ7xjcmnWTUbAovP9dRVEKwjDpDY+FqWG4miiHSyMIubIUP8GIdA?= =?us-ascii?Q?DaZVA6pK891chBvIOl/ps0kmpD3yCmoIijm5DSNMgIZQ52cMflb2KxWJJYLK?= =?us-ascii?Q?hu2Aa/nfyRmAGsBbn2kFF9ldk+qMo/r33uEGtYlFnhrXsID3Lu8TbbhH7NhH?= =?us-ascii?Q?Hau79vwtUTepeN25eatWgRZa7HCNwC67dgvKInWQAqVjybw7w5lVTwKxX6S5?= =?us-ascii?Q?QL1EQQQlRmgmfHdpo2K6yQDFpIjsUX+pyThZeME9j1nJPrFEiFJlVxpK+8ZI?= =?us-ascii?Q?P47AFfwdgXUpvPh/988ynEymu5bBTR/XOZ+68sHZ15BLA07uW3GojDgic9lR?= =?us-ascii?Q?Z7+i0REQ7zRX2XP0P/rfnqkY/r0wWDHAiFv6nWjOu2w1imFdyY1RaCeeKaii?= =?us-ascii?Q?K+a2WPA1trhv0C63f2ZXAzF8HM6MDATa5FpJ6ZnwAWUQGX8KSCtSy6uQ+M6U?= =?us-ascii?Q?ng5gEPEk+Y+9oaoEWT85ACoy3fS/ZiODFwDNyQM2D31RytwL603kGKeSWipa?= =?us-ascii?Q?6bVL5lsM2zUM3RkBUPBnRdPUO5ClHViDGw6e/xZsEnVVd1uAcmxk2X+kImrx?= =?us-ascii?Q?A9mWjSAZycK5t/AripJfIlxIEiYH9LZjEsrWaLK41MzIaAO1ZPBTnz9GYRAY?= =?us-ascii?Q?/s1eWx4de9IIYq9S4MGT?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b6b997b6-4819-43f2-0bf7-08dda023dc66 X-MS-Exchange-CrossTenant-AuthSource: DBAP193MB0956.EURP193.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 May 2025 09:16:44.1465 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXP193MB2106 Subject: [FFmpeg-devel] [PATCH 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time 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: Dmitriy Kovalenko 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: This patch integrates so called double bufferring when we are loading 2 batch of elements at a time and then processing them in parallel. On the moden arm processors especially Apple Silicon it gives a visible benefit, for subsampled pixel processing it is especially nice because it allows to read elements w/ 2 instructions and write with a single one (especially visible on a platforms with slower memory like ios). Including the previous patch in a stack on macbook pro m4 max rgb_to_yuv_half in checkasm goes up 2x of the c version --- libswscale/aarch64/input.S | 130 ++++++++++++++++++++++++++----------- 1 file changed, 91 insertions(+), 39 deletions(-) diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S index 260a26e965..b90ca05996 100644 --- a/libswscale/aarch64/input.S +++ b/libswscale/aarch64/input.S @@ -178,7 +178,7 @@ rgbToY_neon abgr32, argb32, element=4, alpha_first=1 .macro rgbToUV_half_neon fmt_bgr, fmt_rgb, element, alpha_first=0 function ff_\fmt_bgr\()ToUV_half_neon, export=1 - cbz w5, 3f // check width > 0 + cbz w5, 3f ldp w12, w11, [x6, #12] ldp w10, w15, [x6, #20] @@ -187,49 +187,101 @@ function ff_\fmt_bgr\()ToUV_half_neon, export=1 endfunc function ff_\fmt_rgb\()ToUV_half_neon, export=1 - cmp w5, #0 // check width > 0 + cmp w5, #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 + ldp w10, w11, [x6, #12] + ldp w12, w13, [x6, #20] + ldp w14, w15, [x6, #28] 4: - cmp w5, #8 rgb_set_uv_coeff half=1 + + cmp w5, #16 b.lt 2f -1: // load 16 pixels + +1: .if \element == 3 ld3 { v16.16b, v17.16b, v18.16b }, [x3], #48 + ld3 { v26.16b, v27.16b, v28.16b }, [x3], #48 .else ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3], #64 + ld4 { v26.16b, v27.16b, v28.16b, v29.16b }, [x3], #64 .endif .if \alpha_first - uaddlp v21.8h, v19.16b // v21: summed b pairs - uaddlp v20.8h, v18.16b // v20: summed g pairs - uaddlp v19.8h, v17.16b // v19: summed r pairs + uaddlp v21.8h, v19.16b + uaddlp v20.8h, v18.16b + uaddlp v19.8h, v17.16b + uaddlp v31.8h, v29.16b + uaddlp v30.8h, v28.16b + uaddlp v29.8h, v27.16b .else - uaddlp v19.8h, v16.16b // v19: summed r pairs - uaddlp v20.8h, v17.16b // v20: summed g pairs - uaddlp v21.8h, v18.16b // v21: summed b pairs + uaddlp v19.8h, v16.16b + uaddlp v20.8h, v17.16b + uaddlp v21.8h, v18.16b + uaddlp v29.8h, v26.16b + uaddlp v30.8h, v27.16b + uaddlp v31.8h, v28.16b .endif - mov v22.16b, v6.16b // U first half - mov v23.16b, v6.16b // U second half - mov v24.16b, v6.16b // V first half - mov v25.16b, v6.16b // V second half - - rgb_to_uv_interleaved_product v19, v20, v21, v0, v1, v2, v3, v4, v5, v22, v23, v24, v25, v16, v17, #10 - - str q16, [x0], #16 // store dst_u - str q17, [x1], #16 // store dst_v + mov v7.16b, v6.16b + mov v16.16b, v6.16b + mov v17.16b, v6.16b + mov v18.16b, v6.16b + mov v26.16b, v6.16b + mov v27.16b, v6.16b + mov v28.16b, v6.16b + mov v25.16b, v6.16b - sub w5, w5, #8 // width -= 8 - cmp w5, #8 // width >= 8 ? + smlal v7.4s, v0.4h, v19.4h + smlal v17.4s, v3.4h, v19.4h + smlal v26.4s, v0.4h, v29.4h + smlal v28.4s, v3.4h, v29.4h + + smlal2 v16.4s, v0.8h, v19.8h + smlal2 v18.4s, v3.8h, v19.8h + smlal2 v27.4s, v0.8h, v29.8h + smlal2 v25.4s, v3.8h, v29.8h + + smlal v7.4s, v1.4h, v20.4h + smlal v17.4s, v4.4h, v20.4h + smlal v26.4s, v1.4h, v30.4h + smlal v28.4s, v4.4h, v30.4h + + smlal2 v16.4s, v1.8h, v20.8h + smlal2 v18.4s, v4.8h, v20.8h + smlal2 v27.4s, v1.8h, v30.8h + smlal2 v25.4s, v4.8h, v30.8h + + smlal v7.4s, v2.4h, v21.4h + smlal v17.4s, v5.4h, v21.4h + smlal v26.4s, v2.4h, v31.4h + smlal v28.4s, v5.4h, v31.4h + + smlal2 v16.4s, v2.8h, v21.8h + smlal2 v18.4s, v5.8h, v21.8h + smlal2 v27.4s, v2.8h, v31.8h + smlal2 v25.4s, v5.8h, v31.8h + + sqshrn v19.4h, v7.4s, #10 + sqshrn v20.4h, v17.4s, #10 + sqshrn v22.4h, v26.4s, #10 + sqshrn v23.4h, v28.4s, #10 + + sqshrn2 v19.8h, v16.4s, #10 + sqshrn2 v20.8h, v18.4s, #10 + sqshrn2 v22.8h, v27.4s, #10 + sqshrn2 v23.8h, v25.4s, #10 + + stp q19, q22, [x0], #32 + stp q20, q23, [x1], #32 + + sub w5, w5, #16 + cmp w5, #16 b.ge 1b - cbz w5, 3f // No pixels left? Exit + cbz w5, 3f -2: // Scalar fallback for remaining pixels +2: .if \alpha_first rgb_load_add_half 1, 5, 2, 6, 3, 7 .else @@ -239,24 +291,24 @@ function ff_\fmt_rgb\()ToUV_half_neon, export=1 rgb_load_add_half 0, 4, 1, 5, 2, 6 .endif .endif - smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset - smaddl x16, w2, w13, x9 // dst_v = rv * r + const_offset (parallel) + smaddl x8, w2, w10, x9 + smaddl x16, w2, w13, x9 - smaddl x8, w4, w11, x8 // dst_u += gu * g - smaddl x16, w4, w14, x16 // dst_v += gv * g (parallel) + smaddl x8, w4, w11, x8 + smaddl x16, w4, w14, x16 - smaddl x8, w7, w12, x8 // dst_u += bu * b - smaddl x16, w7, w15, x16 // dst_v += bv * b (parallel) + smaddl x8, w7, w12, x8 + smaddl x16, w7, w15, x16 - asr w8, w8, #10 // dst_u >>= 10 - asr w16, w16, #10 // dst_v >>= 10 + asr w8, w8, #10 + asr w16, w16, #10 - strh w8, [x0], #2 // store dst_u - strh w16, [x1], #2 // store dst_v + strh w8, [x0], #2 + strh w16, [x1], #2 - sub w5, w5, #1 // width-- - add x3, x3, #(2*\element) // Advance source pointer - cbnz w5, 2b // Process next pixel if any left + sub w5, w5, #1 + add x3, x3, #(2*\element) + cbnz w5, 2b 3: ret endfunc -- 2.49.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".