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 98F0449024 for ; Wed, 31 Jan 2024 18:05:11 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C7ECE68D0A6; Wed, 31 Jan 2024 20:05:09 +0200 (EET) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2013.outbound.protection.outlook.com [40.92.74.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 89A8C68C2A8 for ; Wed, 31 Jan 2024 20:05:03 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XLCTWc+CRppNdUPMaxvHiAQ3upTK2tGnaY+vUbWiz1yLH7r3KW1cUoAg8pwdlpfDl8eZUG/7tIbxUV6xTPusXsWJZLGKs5L1ZsfqaWaYjz3QXWvLsYXgcU/JlHAkJ2YQLUaWkTerRGUN09unkLmxsjgr2BKFBMuQzDcXznTU+4U0VBnXkVLEV1NRwLvW/Kel0vzUtaZhM7+UiF0zI/A9Kd1JCNVFNcgO8Z1SZGcZJCA1B2KqD15TQ+BRDxTMHbbrA1flAeEFnvZ+9leFVULO8WiEHhqMA7zJUJFC9FRYLNgFl/bGzR1UUOtHU9Bui7J96TgxzJIW8MwRxMe+n+3kAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=XK7+WATQ282KJeZdN9FneqkEz46esdNpc/JkkNgTSB8=; b=NU8yGltmmKezhc8xBXNm+XWy2zjRAebHNdrxPKMaJtg2oaO3wZJtgwobP/wWOtCxaW7qk9JvK/2VhWPRhEaWXd8/Ua0n0KcTpqifxkQOS0pV1YKlJwauGgwYhC7zIferQGjNAWdNePMYBy0xxGiJ/u1AhUMlfNoWuqdZGna+ZMmvQzlWho3+6cvx8lIemgVFW6MgJDdauItKT2nRhmd1Jq+Ga4ENXnz8QkNY3IZyOElXHPqcvjxgYV62hRHpLiWKQHobxOs9Mkiob5njNcpolSoK8zRd0JD/j82MR5ptU3eWVkdMC8wg7MmbMBVPBqw4JDcQmed1vxt9bdC9J+oiIA== 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=XK7+WATQ282KJeZdN9FneqkEz46esdNpc/JkkNgTSB8=; b=PEvjiEvBgrqFn7nZTX/35qkYt8WB+eh5SIKOiVIdKRvbrTaewoq+d9LTBtivaPoeEIWy3BXjUpaQWa4U+9BaeUASsdZrA8xKJ3gez4+STUxNAhS3n9y8Cu+yfRDwUsiw33nxZDiS4FEGcbtAvzgCpAyrR2G3jbNEcH1BzjcmyKQ3piOq3hewOs58UqktT5YJNic0vDa74yyv8vETHW1wk87Q1JD/Ijw1Tu+Encz6e19zLPzguVTgro8lj51ZegSZJqbAJwXa9KOqZNpS6UscexEAcE0ML3H9FjI2PCaHN4XM6VufLkJr+clDfBS/DeDPGlb62f0806wN9cyu53b4aw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by PR3P250MB0151.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:176::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.23; Wed, 31 Jan 2024 18:04:53 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d%5]) with mapi id 15.20.7202.031; Wed, 31 Jan 2024 18:04:53 +0000 Message-ID: Date: Wed, 31 Jan 2024 19:06:46 +0100 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20240131174718.17829-1-jamrial@gmail.com> From: Andreas Rheinhardt In-Reply-To: <20240131174718.17829-1-jamrial@gmail.com> X-TMN: [3sDtV6WxVAVBD9WKNSqcZhoomOfaLREKBszAVV7VEpY=] X-ClientProxiedBy: ZR2P278CA0016.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:46::10) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <0bfd23c4-bcce-45c4-80db-a6b001d871ef@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|PR3P250MB0151:EE_ X-MS-Office365-Filtering-Correlation-Id: 0963b851-b1b0-4e69-9877-08dc22871fae X-MS-Exchange-SLBlob-MailProps: Cq7lScuPrnp0HDrO/Vxd+DZ9iBsgRg0H45QKqCXc9BLeDlnTaruwN0lCXR+rVNVYlysavy8ikECZ2IlVVkyzv74ScDc6l8LO2hdF2Bllrzvp4/hy1ytM8bPg5klYaC6nA5wehE4EbmCvRR1xzXmNfgiFL5aGFFcVgLvgp93ZMT7PfNkFHOFoISDvURtK+aY8fQVRCOYzZIIMiledSef9qa3eIyJ0Gg+mer5FIq5b1RLzAkOF9l4XG4FfGpr7S+N99tnuqXXXPAbUcOsgE54Tb/7/GyYNz0iBZWViPetbj0JW2nraAd+YTwsG9gji3W+98kE0vclhmViyF38a9pLEVXffaKcwNJVt1/qTKZO2w2V6XNcdQxOMlkfk6lOUPDbOG9O5BSDqqMweRo+pTxY/2pP9QkY16I7PP+qD6cr3oyLInbmZYIp2xltgxevFe+zj5I+YlGXvUvMIljblirA1EDaJ0l7fUzMidMbmOPrV86GDtYUjVMhxTB9ChOoh991SxEZh9Ky0EBH6nOJ+AiufR/pmOsAjQHmJPwIIzuqtzwQsZPz+t6rJFPOHtqDe6v55NdHp0laRuNesJkrmKKW5hV+IQH7q6DSlcraHeM60x1YKVspbSYSn3t1ScmZ0g9WAy5eBfF1/2AFfl7tx9D6clgATy0LH4DzbdSLpXviTFcgQGwwcEGi8RxHxvRWoLNbLIkzs7vC1mVnD97tg9bYV7dUSRdZTiRMwGUsfyWj/6Zvj59vNudUietb4Xzwno3NsNIWQt8X+tdw= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N3ykVpQQmhIbPdkta4hMWnlrTVt4axSYgBa5xZ+EIcWfHQL2OzfFRtvKwuNClK5Dvo9mvWOeI+LNFe/a5KUVfEQCiCSv13hMX30wi5i2vb60EnS/wu+7FAD46+UiEC2mxyXDwP1lALhgkxRShlR2DQUV3yBAOSW/8BriH9Degh66LboVELDMLW0jnywQV6Na6z5Hd40UHR1TVMqwuwWNAGbNznbnMOqlBrIwY0q9v9d1Rp1zG6v/fDyh7nTjNp4Nrg57C2knSfE4q+GsvIg1Pai3rTA4C3NrLojCed7vX+cslTtIRGzqtlaZZdLkTslt/DU0p9Il/Zuj0IqQOCm6Lv+WOOF7aP5yIlsrQJtlw1yecFHNICQRjsZc/VbbzWuvqiDzyXJRoBIFNWvdkce6DH+DZkTQgXNaOw+OnHLT4PscrHc3aOX+ErrzA9YwRnXG7C/2LCwstRR+38SIWr2MEExojLErXqfFNUn28hneJGr8I1HisT6RSAVY+90RxIN74weGFIS4H4kRMAp+Xxc+iMKTyvbxNeClKvziKV0peo9VqzfzlQEj3zKJCBr9OGOn X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MDh3NDVUWGV2QXlaTk9RZGdiTUs0TjAwS3Z5RVY2dEI1MFZUMXVlTUZkbkxP?= =?utf-8?B?OHpFUHNIdW02TUJzcDVETWlreXFkVk9raXVOY2t0ZlpweXBxUG5mUUtUZ3Vp?= =?utf-8?B?cy9wa1FzZyt0Rkh4cGpGRCszTVN4RVRKRHAybkptNkVmcW0xRHp1MXIwenFL?= =?utf-8?B?NmJET003V2VrczZRYW9raXhmS1JIcElMUnpnVTVPUWxpR1RHdEZBTTdQT3Bz?= =?utf-8?B?VWk4M1JhdDJjOW1kbS9NRzhkQ1pOWWxLYUFURVI0MzMxK0F0VEhGQThkaStD?= =?utf-8?B?Tm5Xa3hFV0dKeitxaW8wMElwZWt6ZytpcTlRTFcxK1RoRjlzb0hOYXF4d2l5?= =?utf-8?B?UHl2VkQyQXRTRkR5dUp4dW04Ujhnc0dMN2trcGxQUmF5Tmk4RVN5RHZGdll1?= =?utf-8?B?NWFick5icElpTkNyN3EzdndpWEJ4Nm94bnRZVzJ0VWY0aXRwdEdzbVRSa09k?= =?utf-8?B?YUlWbjZuVVJFbnhzUHFFRnc4Z3dPOEYxMUhlSVVnemVKcm50b3VPeElRRXFj?= =?utf-8?B?NTVSVnNrTVZSWVRhcEQ1dEY5QTNDWFFtanRtS3VGbGtlTEl0STl2SXg4L3Y4?= =?utf-8?B?QkNDY1piR1p4MnFGUit4bFF4aVIxTFdsNHlBdFJqQmJLOGJ1R2NEcHY0WWoz?= =?utf-8?B?dkZnSlNnOUhVSW1QYWpOcnh6eEJ5MmZBeXVaYkp2cGlEOVVDZ1NoSHdEbFR5?= =?utf-8?B?YThvRmMrWGZ3a3F0RXFabHQzRGRsdzUzWlRnUW1TeEtqUS9Oc2llSnZoRWJR?= =?utf-8?B?U0xwdndRYzdHSWZpVjBzYThEQ01ycGloVmhrWTNBQk9xYlVYSWVYam10WHlH?= =?utf-8?B?STNtMVVsNGhaL2ppM24wZkpKa0hDY0Ixcy9ZQUZSUWlRRUhnQTBRbEVCR0RS?= =?utf-8?B?d25JS1VxUTBLUGtRWUlqMVhSRElwVlI5Wmd0R09CS0FTSnFHRW95cUdONHJm?= =?utf-8?B?WlAxTko3QzU0c0JUNzZRdGozVWZ3VHN5VW5zNTNUOVlRM3ExTXZTMmdZRDg2?= =?utf-8?B?bEJabHpnenZkYW02d01uZnhQd214Mkg4NXV3V1EyTWFpNlo0cW95bEMrbXcx?= =?utf-8?B?dmpFbDhwbUxGNUJYZ3dPakhmNVZoRkhKQ3B4eFlsTlliTFNiTlFZcld1WGMw?= =?utf-8?B?djBtNnZ6KzN0MFJLdytXY3NmTmNUdSt5Qk5VNG5PSk94RmFLQ1lLVk1QM3dQ?= =?utf-8?B?cTZqWDRYeGxIMGtEdng3ZmJHTjViTzJlWWVnaTBJZndvMm9CaHNvZ1NBbEtX?= =?utf-8?B?Si94R2NNWUVqb3QvUTJkZzYwQ2lYdHpuejR2WE9TanQ2aTQrWUJGai9SKzM3?= =?utf-8?B?YXNMZDVoNlhZOHEzQzdqa0hEOWt4YVc4QWNvRzJaT0FGREFYaGtrdFY2ZTVE?= =?utf-8?B?SWErRnJMTXBVaDZKcmwyd24vZzdNOEpVSk00enprdmRia1pqVkJxd1pwOGpv?= =?utf-8?B?VDdadVRkOGYzcVpiZ1R3OHNpV1lXdXQ4bmJPOVJtNW55bkhzWFpQbnV0RjVP?= =?utf-8?B?Zno2S0NrbS9OOVVvSGRRdisvYmhuVE9HSlRvSnJvQUZTajdkWG9nQ2JCeDhT?= =?utf-8?B?NWx1bmpmK29uT21kV2tGaVhLTjRSTzJpeElmc0xtVWlrcTA3UU0yUlhIdDdz?= =?utf-8?B?V3VYUGx0cEtRTk5LdjVobERmaEJoM3F1U1Bkd2hUMjJLNUdzaUdtWFdpWnN3?= =?utf-8?Q?zpEn6kmPvv74nK+L5Aws?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0963b851-b1b0-4e69-9877-08dc22871fae X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2024 18:04:52.9551 (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: PR3P250MB0151 Subject: Re: [FFmpeg-devel] [PATCH 1/4 v3] avformat/mov: ignore item boxes for animated heif 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: James Almer: > Fixes a regression since d9fed9df2a, where the single animated stream would > be exported twice as two independent streams. > > Signed-off-by: James Almer > --- > libavformat/isom.h | 1 + > libavformat/mov.c | 147 ++++++++++++++++++++++++++++++--------------- > 2 files changed, 99 insertions(+), 49 deletions(-) > > diff --git a/libavformat/isom.h b/libavformat/isom.h > index 2cf456fee1..21caaac256 100644 > --- a/libavformat/isom.h > +++ b/libavformat/isom.h > @@ -280,6 +280,7 @@ typedef struct MOVContext { > int64_t duration; ///< duration of the longest track > int found_moov; ///< 'moov' atom has been found > int found_iloc; ///< 'iloc' atom has been found > + int found_iinf; ///< 'iinf' atom has been found > int found_mdat; ///< 'mdat' atom has been found > int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found > int trak_index; ///< Index of the current 'trak' > diff --git a/libavformat/mov.c b/libavformat/mov.c > index cf931d4594..af95e1f662 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -81,6 +81,7 @@ typedef struct MOVParseTableEntry { > > static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom); > static int mov_read_mfra(MOVContext *c, AVIOContext *f); > +static void mov_free_stream_context(AVFormatContext *s, AVStream *st); > static int64_t add_ctts_entry(MOVCtts** ctts_data, unsigned int* ctts_count, unsigned int* allocated_size, > int count, int duration); > > @@ -4644,6 +4645,23 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) > MOVStreamContext *sc; > int ret; > > + if (c->found_iinf) { > + // * For animated heif, if the iinf box showed up before the moov > + // box, we need to clear all the streams read in the former. > + for (int i = c->heif_info_size - 1; i >= 0; i--) { > + HEIFItem *item = &c->heif_info[i]; > + > + if (!item->st) > + continue; > + > + mov_free_stream_context(c->fc, item->st); > + ff_remove_stream(c->fc, item->st); > + } > + av_freep(&c->heif_info); > + c->heif_info_size = 0; > + c->found_iinf = c->found_iloc = 0; > + } > + > st = avformat_new_stream(c->fc, NULL); > if (!st) return AVERROR(ENOMEM); > st->id = -1; > @@ -7773,8 +7791,9 @@ static int mov_read_iloc(MOVContext *c, AVIOContext *pb, MOVAtom atom) > uint64_t base_offset, extent_offset, extent_length; > uint8_t value; > > - if (c->found_iloc) { > - av_log(c->fc, AV_LOG_INFO, "Duplicate iloc box found\n"); > + if (c->found_moov) { > + // * For animated heif, we don't care about the iloc box as all the > + // necessary information can be found in the moov box. > return 0; > } > > @@ -7896,6 +7915,16 @@ static int mov_read_iinf(MOVContext *c, AVIOContext *pb, MOVAtom atom) > int entry_count; > int version, ret; > > + if (c->found_iinf) { > + av_log(c->fc, AV_LOG_WARNING, "Duplicate iinf box found\n"); > + return 0; > + } > + if (c->found_moov) { > + // * For animated heif, we don't care about the iinf box as all the > + // necessary information can be found in the moov box. > + return 0; > + } > + > version = avio_r8(pb); > avio_rb24(pb); // flags. > entry_count = version ? avio_rb32(pb) : avio_rb16(pb); > @@ -7919,6 +7948,7 @@ static int mov_read_iinf(MOVContext *c, AVIOContext *pb, MOVAtom atom) > return ret; > } > > + c->found_iinf = 1; > return 0; > } > > @@ -7932,6 +7962,13 @@ static int mov_read_iref(MOVContext *c, AVIOContext *pb, MOVAtom atom) > static int mov_read_ispe(MOVContext *c, AVIOContext *pb, MOVAtom atom) > { > uint32_t width, height; > + > + if (c->found_moov) { > + // * For animated heif, we don't care about the ispe box as all the > + // necessary information can be found in the moov box. > + return 0; > + } > + > avio_r8(pb); /* version */ > avio_rb24(pb); /* flags */ > width = avio_rb32(pb); > @@ -7966,6 +8003,12 @@ static int mov_read_iprp(MOVContext *c, AVIOContext *pb, MOVAtom atom) > int version, flags; > int ret; > > + if (c->found_moov) { > + // * For animated heif, we don't care about the iprp box as all the > + // necessary information can be found in the moov box. > + return 0; > + } > + > a.size = avio_rb32(pb); > a.type = avio_rl32(pb); > > @@ -8587,6 +8630,58 @@ static void mov_free_encryption_index(MOVEncryptionIndex **index) { > av_freep(index); > } > > +static void mov_free_stream_context(AVFormatContext *s, AVStream *st) > +{ > + MOVStreamContext *sc = st->priv_data; > + > + if (!sc) > + return; > + > + av_freep(&sc->ctts_data); > + for (int i = 0; i < sc->drefs_count; i++) { > + av_freep(&sc->drefs[i].path); > + av_freep(&sc->drefs[i].dir); > + } > + av_freep(&sc->drefs); > + > + sc->drefs_count = 0; > + > + if (!sc->pb_is_copied) > + ff_format_io_close(s, &sc->pb); > + > + sc->pb = NULL; > + av_freep(&sc->chunk_offsets); > + av_freep(&sc->stsc_data); > + av_freep(&sc->sample_sizes); > + av_freep(&sc->keyframes); > + av_freep(&sc->stts_data); > + av_freep(&sc->sdtp_data); > + av_freep(&sc->stps_data); > + av_freep(&sc->elst_data); > + av_freep(&sc->rap_group); > + av_freep(&sc->sync_group); > + av_freep(&sc->sgpd_sync); > + av_freep(&sc->sample_offsets); > + av_freep(&sc->open_key_samples); > + av_freep(&sc->display_matrix); > + av_freep(&sc->index_ranges); > + > + if (sc->extradata) > + for (int i = 0; i < sc->stsd_count; i++) > + av_free(sc->extradata[i]); > + av_freep(&sc->extradata); > + av_freep(&sc->extradata_size); > + > + mov_free_encryption_index(&sc->cenc.encryption_index); > + av_encryption_info_free(sc->cenc.default_encrypted_sample); > + av_aes_ctr_free(sc->cenc.aes_ctr); > + > + av_freep(&sc->stereo3d); > + av_freep(&sc->spherical); > + av_freep(&sc->mastering); > + av_freep(&sc->coll); > +} > + > static int mov_read_close(AVFormatContext *s) > { > MOVContext *mov = s->priv_data; > @@ -8594,54 +8689,8 @@ static int mov_read_close(AVFormatContext *s) > > for (i = 0; i < s->nb_streams; i++) { > AVStream *st = s->streams[i]; > - MOVStreamContext *sc = st->priv_data; > - > - if (!sc) > - continue; > - > - av_freep(&sc->ctts_data); > - for (j = 0; j < sc->drefs_count; j++) { > - av_freep(&sc->drefs[j].path); > - av_freep(&sc->drefs[j].dir); > - } > - av_freep(&sc->drefs); > - > - sc->drefs_count = 0; > > - if (!sc->pb_is_copied) > - ff_format_io_close(s, &sc->pb); > - > - sc->pb = NULL; > - av_freep(&sc->chunk_offsets); > - av_freep(&sc->stsc_data); > - av_freep(&sc->sample_sizes); > - av_freep(&sc->keyframes); > - av_freep(&sc->stts_data); > - av_freep(&sc->sdtp_data); > - av_freep(&sc->stps_data); > - av_freep(&sc->elst_data); > - av_freep(&sc->rap_group); > - av_freep(&sc->sync_group); > - av_freep(&sc->sgpd_sync); > - av_freep(&sc->sample_offsets); > - av_freep(&sc->open_key_samples); > - av_freep(&sc->display_matrix); > - av_freep(&sc->index_ranges); > - > - if (sc->extradata) > - for (j = 0; j < sc->stsd_count; j++) > - av_free(sc->extradata[j]); > - av_freep(&sc->extradata); > - av_freep(&sc->extradata_size); > - > - mov_free_encryption_index(&sc->cenc.encryption_index); > - av_encryption_info_free(sc->cenc.default_encrypted_sample); > - av_aes_ctr_free(sc->cenc.aes_ctr); > - > - av_freep(&sc->stereo3d); > - av_freep(&sc->spherical); > - av_freep(&sc->mastering); > - av_freep(&sc->coll); > + mov_free_stream_context(s, st); Factoring this out does not belong in this patch. > } > > av_freep(&mov->dv_demux); _______________________________________________ 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".