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 663FE422AE for ; Sun, 16 Jan 2022 23:05:01 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8AAD168AECE; Mon, 17 Jan 2022 01:04:47 +0200 (EET) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073056.outbound.protection.outlook.com [40.92.73.56]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7947E68AE7A for ; Mon, 17 Jan 2022 01:04:45 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JV/nhS1z6SCdOoqIXH7Ekjn6ybgaqXda56KmAGdfPukzRIGcwbKfA9IHHp6hJOSZ4WwzJV1rnbmHc5jI8sFbsbU5+FOy/0EUpvtKlYt3xYk8TaASr+VbE5UfrCceX2RS1JX8rBqiRoexcvX90kNMxBaoSVsip0baMqPk7OQS8bGipLqCFXrbDGlkmBdJNPUcgPkxZeGuuD9nIWgFeHC92v/DyQySJSXSKvCdRGUIfBnNJ4ha0Wf42E43vGAGAXRXX2eWVuNmpLcUXHOV6oklyw5EajzQoz6Sw415LKTB7UNR9TFag7KPIpBCxdAuaHXte7roPFFjXd2thEmsetbuFw== 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=NOwRvdmFm/lxM1DwQnsI/ZUj0XoMtYSO3wcyVyIeb8M=; b=KES835kSbCcRZKwneRIFIUlyHa9O01ACZlzxmYrrPorxZDzVGpfPn6nOw75RYPLYLutPRssL0yuj+fJa8Y6Lmxy9GT/73pw8mVIDt/J/lwBwMvlNPjzfD332P59vMqNf6ZR8zHgSQkvkSFv++Pfe8SAfLz//APQXXDJiN/h9btkHzIJ7IrSbwumM8RdpfKseUZyIX3mDJ4rcpnX2N8lcgTY/susPq0SIccVwzU1V9RE4HwOlXKrjDzVFX+N3e/ArfdRpvrgdsVqGZK1DuRiyyMsxup+L4xDAv82iVieWKECcsbuGx8ZyLo5vqVZERwYN+CuP6H5nEgxj78h4FmFFMg== 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=NOwRvdmFm/lxM1DwQnsI/ZUj0XoMtYSO3wcyVyIeb8M=; b=eNgHsXTPJSRLMM4NCFGP5vqkXWTEAxXpigSgFO09fb15ER8/OkDFDPHqiaS06sFRp59VhGkXjf2XZFg0uLwXYTyZwLy76VollVEIaYAkYNIMD3+3QnotIfO2dN9/HlACkZwOKdQZExCehJMM7wAZO+vMMdogmne/AJOQvXpye11+QoJ2q7OmGi4NxEIcZqFQrMxygC0TmkWR6FWGgxxFSD4CJhMaT+YY3BLz8JmQfXicRY8ASdEdUvYKuwK1s+QfonDvKG6Hvks/hKCLJVd/yaje5p0GVCky8ptQdNNPlCwrNmOyyXx14Y+3phY4oBmGuuaSS8Do+fR3hdB89WmNQg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AS8PR03MB7704.eurprd03.prod.outlook.com (2603:10a6:20b:403::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4888.10; Sun, 16 Jan 2022 23:04:44 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%9]) with mapi id 15.20.4888.013; Sun, 16 Jan 2022 23:04:44 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:03:46 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [suSIsriyYBGFz5HLD8m3V4DytGF7cmIs] X-ClientProxiedBy: AM0PR10CA0070.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:15::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220116230405.194506-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d280e242-6b86-41b0-15ab-08d9d944959b X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQ2WpFcKeHQajRkhOqduPnsCL1aUht2cIVQPb9i5BElj28/oNEqyPsNwH4KwKtE9xY+LZG1mesHNOVk6Pu4gZo/9gU/GvD6N3kb4AvAfIgorJXbDThAYmzWdq3sdwuieYJz4OxFrm292mZluJ1GI8X4qli7CDmYh+56v7HPWhKEvx3NG+vKbWgJdNdgpUotHggm0e6ryDgSaWEU4MllDggcBRBMOwxXTUsEclH4BqFphEmFeW80j1C1M2fvEYhi90yE8ZEmej7JuiySR03LjeIyZJOkWxAmZ/FCE0LIUBKaJaAzegoSG82AcIWDq79T+IVGgisJ+3m8YhogPU+jG1OW1KR9sh5nqm/6euL6kX2SNDhxlrsgT2Z63pChvuep8pWTGDQamKebZcCq8T3p2cadTkbLMsK6GOKsJehW3IoZlW2BVARO35frnO+ITMtpx22lMmcvrtPzyd4OaHEJIDmKNheosPY4Sl3/dY3BI3cvpbNAvRYHY3m/m+tPb/Qy89D2lS8Dw85072PhCM2bo14nmlVMADlRw+lZjdFFt/FI9JYWBXcJE+4yCdghqy/0DmfZkm1QkC0fAdK8IgHyI8J9jzr30ClYxG5WRYRcqUn/ywfXr8jt/MyMZ9BKpa4aVQSc8pf/4d1Cvnw+qYhJ4xf5NyYd5TFbnL55ZpJs9KvFCIefuaC69CD+BZdv19ZtuFqeGInMWNijLiQ9k4v9bH0MN15pkuXVFjqDBxt1iA+WWBITJOv7onK/OimaiwWXttA= X-MS-TrafficTypeDiagnostic: AS8PR03MB7704:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 9rX+gzolKHx5e9blygDrO2MBk1Sk60hElpeIH7w5Rf6t3caPXWRgrqp7N5PnOLvgURB2z+M4K3O7Blb1VqutprZhy5v4juOSYtDNe/pVwYgPNcU5GUss5vvzvCNBy3BzgEwL2waBARaLDLH0rvWxz20bW75++Nqp1/Ot01SUb9X3P/saxAvLAtPynpVMlJtu45OwvqFJEPod6qlmVgEgmJMQLOgPCpGO7u4z3Vyj9I0o1zlp+jVYFLa70QLxWPWwZxibyHRpeeP8VHGZ3lJKeZ3Mf5KtkB8fVE+775PaBCeRLpPYrpUFRrlyi1AfDrph4lWCKA/9JSw/JKBP8W7siMe1xZUfDT/mcS/dmc38Haum7Hhlj7/MS15GIUYO00jakS06ENykCQALYAOFUjd6wtgUxmeF5fqCraDgmiRg44927Bs4q9oIIyJKLonaz53noAqWFp2X5WhmRDa+Tl+jvC18mvm1LLhY3ROpaA3/Auq3RukHG8nCtXTopfdtW0BZmUA1uu4F/jevlSX+h7cH4vJ9bRoWv7ae89+/Hgxc6eDbfCQe9Yuv9T6MbPOb16f3ZHUCezKymYN03xsa33wxow== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ITk9zTicNSmNafCqfD12IqCFsJI1zd7CTIoBCvXE89LObt/o+wag7MNzqGBg?= =?us-ascii?Q?4hu1tJEJ0Htc12+h7wXumO1H42F60srcJre5hbclgWJg4MwP+HDRlSSE/d5j?= =?us-ascii?Q?pkU7kHtOL5Dj6Lh2eY20nPPk/onjBd3TXpmt5O4i6mog5qnrVY08vXY6xocb?= =?us-ascii?Q?iCuEjXrdhIkMf4R/pPiNltPHvlTMgxxzLN2qjCdIn6F98rw4M6nX08qT9dar?= =?us-ascii?Q?czzhSuV5g2/syxTRU3VmGIM+RmElv1sd2FBMvnd3OWiqzztg96+so3+HaDI3?= =?us-ascii?Q?wfgYIBM7zOvZp/ZO4V/Q9Q9BRnUVp1QFy7HAPQPHG1Hqck/mHTY4BRd4vPF7?= =?us-ascii?Q?U1AzJFzDQhZWveBjZ/ZvDuQTGC6heuW/+BFCZwOx+ttVLTWUWziT6b2UsaXT?= =?us-ascii?Q?2wHDVKggcF8aPwtgGZg/shfLNoRnxQaafb1DKTbuI4gQgwB07mYnzmo/P4Ai?= =?us-ascii?Q?GYfauwfkoSen2hbUQhrl2bAJnusz8S9IJjqKWoEXPK69OysOf75zZIjH1M5H?= =?us-ascii?Q?H7sSWOznsv84bF3dgaeKngehHsF4HCTj7j1aeVC++g+Za0Ffb6h1V90ySc+M?= =?us-ascii?Q?9lCJF9RgGsq03BrCGsjjAPWDhvNp1pHaqPnXvCnPmGfW3s0kiR6KkhGvB4XY?= =?us-ascii?Q?3g9GYxoy6SLK/rA5M4bOwFPp3h6PmVvzbnaSUUlapZCxi2Ucv1JconEwR9g8?= =?us-ascii?Q?TurVxB/00fjIpYre4UCc1anLSSVy2JrCEyz9oSQVl0EBfVcDC9jSmuye1/Oc?= =?us-ascii?Q?WaL28ZQZAyG1CyeDAGODGVgXVRZtPjYXySwpxDL5RMZ+pINUwmttnPuw4dO7?= =?us-ascii?Q?Bh5rAzHqKxYEhYI01uQMFOIXYkWLS40rUq8+3+2/yRJdqB8CmXEDMxnK6IrL?= =?us-ascii?Q?S9u23w3xwJOTJLjbmf2YTm5yCl44+nPwRTLHdjkCK110NG3GvoNLx2wY2WU5?= =?us-ascii?Q?kEvSH0YxAri4ISZxd/bF1w=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d280e242-6b86-41b0-15ab-08d9d944959b X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2022 23:04:44.2482 (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: AS8PR03MB7704 Subject: [FFmpeg-devel] [PATCH 06/25] avformat/matroskaenc: Avoid seeks when writing EBML header 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: Andreas Rheinhardt 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: Using start/end_ebml_master() to write an EBML Master element uses seeks under the hood. This does not work if the output is unseekable with the AVIOContext's buffer being very small (the size of the currently written Matroska EBML header is 40) or with the AVIOContext being in direct mode, because then this seek can't be performed in the AVIOContext's buffer. So using an approach that does not rely on seeking at all is preferable; this is achieved by switching to EbmlWriter. Also factor writing the EBML header out into a function of its own. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 0927e0b873..4d4d270db1 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -214,10 +214,6 @@ typedef struct MatroskaMuxContext { uint32_t segment_uid[4]; } MatroskaMuxContext; -/** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint, - * 8 byte for "matroska" doctype string */ -#define MAX_EBML_HEADER_SIZE 35 - /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit * offset, 4 bytes for target EBML ID */ #define MAX_SEEKENTRY_SIZE 21 @@ -463,6 +459,13 @@ static void ebml_writer_add_uid(EbmlWriter *writer, uint32_t id, elem->priv.uint = val; } +static void ebml_writer_add_uint(EbmlWriter *writer, uint32_t id, + uint64_t val) +{ + EbmlElement *elem = ebml_writer_add(writer, id, EBML_UINT); + elem->priv.uint = val; +} + static int ebml_writer_str_len(EbmlElement *elem) { size_t len = strlen(elem->priv.str); @@ -2113,11 +2116,26 @@ static int64_t get_metadata_duration(AVFormatContext *s) return max; } +static void ebml_write_header(AVIOContext *pb, + const char *doctype, int version) +{ + EBML_WRITER(8); + ebml_writer_open_master(&writer, EBML_ID_HEADER); + ebml_writer_add_uint (&writer, EBML_ID_EBMLVERSION, 1); + ebml_writer_add_uint (&writer, EBML_ID_EBMLREADVERSION, 1); + ebml_writer_add_uint (&writer, EBML_ID_EBMLMAXIDLENGTH, 4); + ebml_writer_add_uint (&writer, EBML_ID_EBMLMAXSIZELENGTH, 8); + ebml_writer_add_string(&writer, EBML_ID_DOCTYPE, doctype); + ebml_writer_add_uint (&writer, EBML_ID_DOCTYPEVERSION, version); + ebml_writer_add_uint (&writer, EBML_ID_DOCTYPEREADVERSION, 2); + /* The size is bounded, so no need to check this. */ + ebml_writer_write(&writer, pb); +} + static int mkv_write_header(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; AVIOContext *pb = s->pb; - ebml_master ebml_header; const AVDictionaryEntry *tag; int ret, i, version = 2; int64_t creation_time; @@ -2134,16 +2152,7 @@ static int mkv_write_header(AVFormatContext *s) version = 4; } - ebml_header = start_ebml_master(pb, EBML_ID_HEADER, MAX_EBML_HEADER_SIZE); - put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1); - put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1); - put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4); - put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8); - put_ebml_string(pb, EBML_ID_DOCTYPE , s->oformat->name); - put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , version); - put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION, 2); - end_ebml_master(pb, ebml_header); - + ebml_write_header(pb, s->oformat->name, version); put_ebml_id(pb, MATROSKA_ID_SEGMENT); put_ebml_size_unknown(pb, 8); mkv->segment_offset = avio_tell(pb); -- 2.32.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".