From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id AA1F440161 for ; Thu, 3 Nov 2022 14:08:07 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E473668BF29; Thu, 3 Nov 2022 16:08:04 +0200 (EET) Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EBDC968BF29 for ; Thu, 3 Nov 2022 16:07:58 +0200 (EET) Received: by mail-pj1-f43.google.com with SMTP id l6so1768237pjj.0 for ; Thu, 03 Nov 2022 07:07:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=8y+UCf6EZEoTt/riQSFOA5FdbDEWgxoAgBMojd7zq4Y=; b=JCVmC+1vqZxp09F1jXAWQNrErZ2dcoB37yIaLgKKancvumhrAzEsT0KqmihZIcAAsA hsbkXMyckEB9oyTfew/ZMaTSSNoWyde9VhS1KvjTRAq4rbzOFwndxlPUcltWO3R5PPIJ azoDnfFcbaKX8rWDezaJ4kixHQcOn8El/+jSSDTW7RyFRJDhycXtz9iBFl13BW2Kvu/K QPolhnQR0lOZIkLQTNgtYzZKRY6tU8Ll0+9BrLWjcKrJ6jDpAm9u4BeNEGFZzNsCwnBo 9N12vzxnJAYALZCHXyGO1903qPa2GqHmOztlx/e2V5CP5jzclkQ7C7z2HkBVX3bflrxK 8oPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8y+UCf6EZEoTt/riQSFOA5FdbDEWgxoAgBMojd7zq4Y=; b=NTS68VoOmEQj5KOL/gFU4rEMhfWNot4NiBMxa9aBHTuebgaNALX8a4A2PhJqlUqFhZ 5Zl84hU79Kft3yPsVS1ADkBjeiEcX8NgWjB/XhBv2FdQes6uw90vwY2yEbeTmopM4yBr vgHQMLI+wjDbGoGUtDONNbDgZ3Yhx+d3VACrBbHsC2G7aI0MNG9aV5Ye2YVoLBXYNzzH 0eTkvBz2ho9xee3lT1Xy6+R6Vp3MerKRB8swa6N8EAHZzVBmm1lez2r6+cqFUdVvpvxL RwZ4gnf0Yayt6odhICeCDAOZduTzTkAmPUE/Ju7/XQw90xupNTBPjba9DFVsnl7kIW3t SUWg== X-Gm-Message-State: ACrzQf3IcAx9rEp7R1jSSVC5NJCK5PWSTiDjtkNYu5639iA5GerozOwK Z8hm4aR5DptB/Sf/CyY77FoaH529WTos8BCqtXEqDDD+/fQ= X-Google-Smtp-Source: AMsMyM7bhLKSLfhxY6EAz0czthOztqWnFPEECa0isyEKqlmFCTjGH5LNG5kDFlq2VMf3YZgdf1YGjqVE6r6f/Y9zeIU= X-Received: by 2002:a17:902:988e:b0:186:907a:a029 with SMTP id s14-20020a170902988e00b00186907aa029mr30949886plp.97.1667484476340; Thu, 03 Nov 2022 07:07:56 -0700 (PDT) MIME-Version: 1.0 References: <20221102210239.1689-1-michael@niedermayer.cc> In-Reply-To: <20221102210239.1689-1-michael@niedermayer.cc> From: Drew Dunne Date: Thu, 3 Nov 2022 10:07:45 -0400 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH 1/2] swscale/output: Bias 16bps output calculations to improve non overflowing range 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 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: I verified this fixes the overflow I was encountering. On Wed, Nov 2, 2022 at 5:02 PM Michael Niedermayer wrote: > Fixes: integer overflow > Fixes: ./ffmpeg -f rawvideo -video_size 66x64 -pixel_format > yuva420p10le -i ~/videos/overflow_input_w66h64.yuva420p10le > -filter_complex > "scale=flags=bicubic+full_chroma_int+full_chroma_inp+bitexact+accurate_rnd:in_color_matrix=bt2020:out_color_matrix=bt2020:in_range=full:out_range=full,format=rgba64[out]" > -pixel_format rgba64 -map '[out]' -y overflow_w66h64.png > > Found-by: Drew Dunne > Signed-off-by: Michael Niedermayer > --- > libswscale/output.c | 120 ++++++++++++++++++++++---------------------- > 1 file changed, 60 insertions(+), 60 deletions(-) > > diff --git a/libswscale/output.c b/libswscale/output.c > index 0e1c1225a0..df4647adde 100644 > --- a/libswscale/output.c > +++ b/libswscale/output.c > @@ -1100,8 +1100,8 @@ yuv2rgba64_X_c_template(SwsContext *c, const int16_t > *lumFilter, > Y2 -= c->yuv2rgb_y_offset; > Y1 *= c->yuv2rgb_y_coeff; > Y2 *= c->yuv2rgb_y_coeff; > - Y1 += 1 << 13; // 21 > - Y2 += 1 << 13; > + Y1 += (1 << 13) - (1 << 29); // 21 > + Y2 += (1 << 13) - (1 << 29); > // 8 bits: 17 + 13 bits = 30 bits, 16 bits: 17 + 13 bits = 30 bits > > R = V * c->yuv2rgb_v2r_coeff; > @@ -1109,20 +1109,20 @@ yuv2rgba64_X_c_template(SwsContext *c, const > int16_t *lumFilter, > B = U * c->yuv2rgb_u2b_coeff; > > // 8 bits: 30 - 22 = 8 bits, 16 bits: 30 bits - 14 = 16 bits > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y1) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14); > - output_pixel(&dest[4], av_clip_uintp2(R_B + Y2, 30) >> 14); > - output_pixel(&dest[5], av_clip_uintp2( G + Y2, 30) >> 14); > - output_pixel(&dest[6], av_clip_uintp2(B_R + Y2, 30) >> 14); > + output_pixel(&dest[4], av_clip_uintp2(((R_B + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2((( G + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[6], av_clip_uintp2(((B_R + Y2) >> 14) + > (1<<15), 16)); > output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14); > dest += 8; > } else { > - output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14); > - output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14); > - output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14); > + output_pixel(&dest[3], av_clip_uintp2(((R_B + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[4], av_clip_uintp2((( G + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2(((B_R + Y2) >> 14) + > (1<<15), 16)); > dest += 6; > } > } > @@ -1160,8 +1160,8 @@ yuv2rgba64_2_c_template(SwsContext *c, const int32_t > *buf[2], > Y2 -= c->yuv2rgb_y_offset; > Y1 *= c->yuv2rgb_y_coeff; > Y2 *= c->yuv2rgb_y_coeff; > - Y1 += 1 << 13; > - Y2 += 1 << 13; > + Y1 += (1 << 13) - (1 << 29); > + Y2 += (1 << 13) - (1 << 29); > > R = V * c->yuv2rgb_v2r_coeff; > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > @@ -1175,20 +1175,20 @@ yuv2rgba64_2_c_template(SwsContext *c, const > int32_t *buf[2], > A2 += 1 << 13; > } > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y1) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14); > - output_pixel(&dest[4], av_clip_uintp2(R_B + Y2, 30) >> 14); > - output_pixel(&dest[5], av_clip_uintp2( G + Y2, 30) >> 14); > - output_pixel(&dest[6], av_clip_uintp2(B_R + Y2, 30) >> 14); > + output_pixel(&dest[4], av_clip_uintp2(((R_B + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2((( G + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[6], av_clip_uintp2(((B_R + Y2) >> 14) + > (1<<15), 16)); > output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14); > dest += 8; > } else { > - output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14); > - output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14); > - output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14); > + output_pixel(&dest[3], av_clip_uintp2(((R_B + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[4], av_clip_uintp2((( G + Y2) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2(((B_R + Y2) >> 14) + > (1<<15), 16)); > dest += 6; > } > } > @@ -1217,8 +1217,8 @@ yuv2rgba64_1_c_template(SwsContext *c, const int32_t > *buf0, > Y2 -= c->yuv2rgb_y_offset; > Y1 *= c->yuv2rgb_y_coeff; > Y2 *= c->yuv2rgb_y_coeff; > - Y1 += 1 << 13; > - Y2 += 1 << 13; > + Y1 += (1 << 13) - (1 << 29); > + Y2 += (1 << 13) - (1 << 29); > > if (hasAlpha) { > A1 = abuf0[i * 2 ] << 11; > @@ -1232,20 +1232,20 @@ yuv2rgba64_1_c_template(SwsContext *c, const > int32_t *buf0, > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > B = U * c->yuv2rgb_u2b_coeff; > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y1) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> > 14); > - output_pixel(&dest[4], av_clip_uintp2(R_B + Y2, 30) >> > 14); > - output_pixel(&dest[5], av_clip_uintp2( G + Y2, 30) >> > 14); > - output_pixel(&dest[6], av_clip_uintp2(B_R + Y2, 30) >> > 14); > + output_pixel(&dest[4], av_clip_uintp2(((R_B + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2((( G + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[6], av_clip_uintp2(((B_R + Y2) >> 14) > + (1<<15), 16)); > output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> > 14); > dest += 8; > } else { > - output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> > 14); > - output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> > 14); > - output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> > 14); > + output_pixel(&dest[3], av_clip_uintp2(((R_B + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[4], av_clip_uintp2((( G + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2(((B_R + Y2) >> 14) > + (1<<15), 16)); > dest += 6; > } > } > @@ -1263,8 +1263,8 @@ yuv2rgba64_1_c_template(SwsContext *c, const int32_t > *buf0, > Y2 -= c->yuv2rgb_y_offset; > Y1 *= c->yuv2rgb_y_coeff; > Y2 *= c->yuv2rgb_y_coeff; > - Y1 += 1 << 13; > - Y2 += 1 << 13; > + Y1 += (1 << 13) - (1 << 29); > + Y2 += (1 << 13) - (1 << 29); > > if (hasAlpha) { > A1 = abuf0[i * 2 ] << 11; > @@ -1278,20 +1278,20 @@ yuv2rgba64_1_c_template(SwsContext *c, const > int32_t *buf0, > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > B = U * c->yuv2rgb_u2b_coeff; > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y1) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y1) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> > 14); > - output_pixel(&dest[4], av_clip_uintp2(R_B + Y2, 30) >> > 14); > - output_pixel(&dest[5], av_clip_uintp2( G + Y2, 30) >> > 14); > - output_pixel(&dest[6], av_clip_uintp2(B_R + Y2, 30) >> > 14); > + output_pixel(&dest[4], av_clip_uintp2(((R_B + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2((( G + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[6], av_clip_uintp2(((B_R + Y2) >> 14) > + (1<<15), 16)); > output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> > 14); > dest += 8; > } else { > - output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> > 14); > - output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> > 14); > - output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> > 14); > + output_pixel(&dest[3], av_clip_uintp2(((R_B + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[4], av_clip_uintp2((( G + Y2) >> 14) > + (1<<15), 16)); > + output_pixel(&dest[5], av_clip_uintp2(((B_R + Y2) >> 14) > + (1<<15), 16)); > dest += 6; > } > } > @@ -1343,7 +1343,7 @@ yuv2rgba64_full_X_c_template(SwsContext *c, const > int16_t *lumFilter, > // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit > Y -= c->yuv2rgb_y_offset; > Y *= c->yuv2rgb_y_coeff; > - Y += 1 << 13; // 21 > + Y += (1 << 13) - (1<<29); // 21 > // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit > > R = V * c->yuv2rgb_v2r_coeff; > @@ -1351,9 +1351,9 @@ yuv2rgba64_full_X_c_template(SwsContext *c, const > int16_t *lumFilter, > B = U * c->yuv2rgb_u2b_coeff; > > // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y)>>14) + (1<<15), > 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y)>>14) + (1<<15), > 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y)>>14) + (1<<15), > 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14); > dest += 4; > @@ -1392,7 +1392,7 @@ yuv2rgba64_full_2_c_template(SwsContext *c, const > int32_t *buf[2], > > Y -= c->yuv2rgb_y_offset; > Y *= c->yuv2rgb_y_coeff; > - Y += 1 << 13; > + Y += (1 << 13) - (1 << 29); > > R = V * c->yuv2rgb_v2r_coeff; > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > @@ -1404,9 +1404,9 @@ yuv2rgba64_full_2_c_template(SwsContext *c, const > int32_t *buf[2], > A += 1 << 13; > } > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14); > dest += 4; > @@ -1436,7 +1436,7 @@ yuv2rgba64_full_1_c_template(SwsContext *c, const > int32_t *buf0, > > Y -= c->yuv2rgb_y_offset; > Y *= c->yuv2rgb_y_coeff; > - Y += 1 << 13; > + Y += (1 << 13) - (1 << 29); > > if (hasAlpha) { > A = abuf0[i] << 11; > @@ -1448,9 +1448,9 @@ yuv2rgba64_full_1_c_template(SwsContext *c, const > int32_t *buf0, > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > B = U * c->yuv2rgb_u2b_coeff; > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14); > dest += 4; > @@ -1469,7 +1469,7 @@ yuv2rgba64_full_1_c_template(SwsContext *c, const > int32_t *buf0, > > Y -= c->yuv2rgb_y_offset; > Y *= c->yuv2rgb_y_coeff; > - Y += 1 << 13; > + Y += (1 << 13) - (1 << 29); > > if (hasAlpha) { > A = abuf0[i] << 11; > @@ -1481,9 +1481,9 @@ yuv2rgba64_full_1_c_template(SwsContext *c, const > int32_t *buf0, > G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff; > B = U * c->yuv2rgb_u2b_coeff; > > - output_pixel(&dest[0], av_clip_uintp2(R_B + Y, 30) >> 14); > - output_pixel(&dest[1], av_clip_uintp2( G + Y, 30) >> 14); > - output_pixel(&dest[2], av_clip_uintp2(B_R + Y, 30) >> 14); > + output_pixel(&dest[0], av_clip_uintp2(((R_B + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[1], av_clip_uintp2((( G + Y) >> 14) + > (1<<15), 16)); > + output_pixel(&dest[2], av_clip_uintp2(((B_R + Y) >> 14) + > (1<<15), 16)); > if (eightbytes) { > output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14); > dest += 4; > -- > 2.17.1 > > _______________________________________________ > 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". > -- Drew Dunne asdunne@google.com _______________________________________________ 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".