From patchwork Mon Sep 6 02:27:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 30017 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp3373394iov; Sun, 5 Sep 2021 19:29:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz6qJ1xOx4qDZnPiiBSSxO7tY2vPVCpgCcnuBbBrdsT3VhuBeGHLJK19p2VPxW/RHYWJf8R X-Received: by 2002:a17:906:114f:: with SMTP id i15mr11320468eja.534.1630895340700; Sun, 05 Sep 2021 19:29:00 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v10si6401956ejk.746.2021.09.05.19.29.00; Sun, 05 Sep 2021 19:29:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=MUQ2U5FS; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7868D68A81D; Mon, 6 Sep 2021 05:28:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-oln040092066020.outbound.protection.outlook.com [40.92.66.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 13D4868A78A for ; Mon, 6 Sep 2021 05:28:31 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WsxotApGX8g3l9hpn67MYU1Job0KxDhMUwWnAFKv2pHuIh42QBETNv0qLx4PMtd9XykLCC+mlWl3CxNfhdtEUeSC2DjeT6TAQrf8Nlwl43O8QKy118EKr9CzttRTWLgnBGHovW8sGjbb2EP93/z6/sGK0d8VZPF+tN6ghn4ZptzsAvLIv6tpYqPO8iN04+BKGr5Ili+IWKWV1N7+4W5hqiXWherl6cIzIsZY3Fqy5rpvuLZ1Pcss9wcOhM7f/nCZK0mb3xorNCtx+BZpsX/T9YG150UtJTxkKiWVwLuBTApvDu4fK609qyfOVutkx12MSTOfFsxZuDSZMQbFmNicfg== 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; bh=+PHKujMIghLH5R8BBkJbH60rLoqHTdzRkKPbATM8Sqw=; b=a+ThzWLmbZMpxNmIQOjd+aRpN9T93sLcrabTiqkD2WWQGIEpUTx7thb6ojNHQI+w1TOCcGj5WmaDg/NlZaNfRpZdhet2RjkA11opy6XwbU3i7pcU7MIhDrOnWyaQVA1bJJE2rcyAeBlYkuAk16t8WvOkEK2LjDeekexQxF88FgpHTvAotmUl00/BdKl3jGn9PQmz0gytsrWKB3HozPD2C6giFCowR529wFNnXNMkeh1XAqEzOiHe3goDM1CEYN2+++UnTFXnyisH8pOCSQZoITltUD/YJpwjTCOuCp58esUuZuL4QheIRWLh3RUJ4Wywukz62/BhgYNdJoQVaDDYmA== 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=+PHKujMIghLH5R8BBkJbH60rLoqHTdzRkKPbATM8Sqw=; b=MUQ2U5FSRZ9Yug1Y0KngHlyGsWNZH7/XDn9Ha/fDE8py5kJ2WZfRk+aGQpmhWdGKEx5cCLxZUBRjwIWZGSgU7f60K71uYdxC0R7WvXb6EwOb/DnskWfG2sVzX5Q3/MlkFBTdrMikVpstMwxRzynynX7zqVtUvjltTEGmoqxuXkJ0xAx9h3bg9+yFXEK8aWLRzd87aEyOj68eopfaCQKgnrrZq/hOYQgvtUWfdb45xLSyzVihnZqR2NG7IkB+ZGXSHq+ndWMKR4Eg2XLSL1wf7HIroq543lRJ7TDWwPCt7L0+r0XV67iBM3Fy2/8HRKDuADd3QELT7AvTfkLgqesWzw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM5PR03MB2850.eurprd03.prod.outlook.com (2603:10a6:206:20::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.24; Mon, 6 Sep 2021 02:28:20 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::787b:2156:ca99:fe00]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::787b:2156:ca99:fe00%3]) with mapi id 15.20.4478.025; Mon, 6 Sep 2021 02:28:20 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Sep 2021 04:27:43 +0200 Message-ID: X-Mailer: git-send-email 2.30.2 In-Reply-To: References: X-TMN: [+RKYxX3ZLuocyF/K95KZ1+pFTLCOwZNS] X-ClientProxiedBy: PR1PR01CA0033.eurprd01.prod.exchangelabs.com (2603:10a6:102::46) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20210906022802.4072793-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.142.38) by PR1PR01CA0033.eurprd01.prod.exchangelabs.com (2603:10a6:102::46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.19 via Frontend Transport; Mon, 6 Sep 2021 02:28:19 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0faeb032-2645-40b2-da89-08d970ddfdde X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQPQD6tvsiQeosiZzDpp5hDOrxT/9VmjDywFFf8+2q2+zlczHypAqbNV2kcCzPjJNXx2kqWinqrUSYpfqIG7fpeTsZN13Se/Kge27j8kapKPVJLtQvAatdOvYulP83YZ+QAb1nMaIdpf7AKWhMY2KnDHSjm1b41y2wZa6ynP/OvChExK7YVHXWMuxxxuKYlc3QGQDtvmRDNAuERgGayGThvnzDsroB1zi32aP3eknVRz9cFo1pJxOOo7vRFriAcXeaJ5cOwnVVcszbamQiz3icPdrLG3OWfZt43mi0RJP3yU7LqpKyAnYlLXjfLKGqXW+4mkJjtD3+d02hGHqj/WtFn3xHPb8jh+yhWYWrBGo+U8eSYX9UE+i7QvrlsU2pODmfC2fwnzT9haZ6lV+q6Ezf+uqePeo9UtqDVB6aNNXbqGsn5/iprmyvyaWfnhpi7Jy/VoGkCG8SjfD8n0Q4pL70vGN6nLdC6jiF7FA0BTc4fXzgvxVt3lJWOwVP3m1njZ6/bWFwcDvzaMW6CS1w4IakPHue2b1ifVV807zDugCn/gfqSAwWyUalpLvD676x2tutp3Se4Ll/D5hRoKDbXSkFxKg3+Jmjl9KEXTBxYbteOTIAT6EfBY8JNrJJb806dR0hC4TEJUyzoCMkfiLZqcISCYrDcLVRFI8MAWsfCv2yZQDf54AVGTm0F84929b++UnzhXTl52tFTvXSOHtR5OnHiqosWstJorB+QYvPDUSjxVREbXyZe62RIM92ccCWKrKM= X-MS-TrafficTypeDiagnostic: AM5PR03MB2850: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: M304FqF1Yy9yxVqE9lHSwlLe7UKfcO7EQpeUarYT2DrOlJnBMiM1zS2k7uPiXbx38JfnH81SSVEZfXeeuCDCkXE305pSrzfsONH0lclX1WXcjidYccdTzilfOXsy4zujrpvbchnuimUYvuT+9aIAgyTsh28IP3Yn3rQGxTPXw1kM95YRfXDu60kZsz0h7ujhW6HQAiYGMToM8H8c1ZGu4LdTCRrcYgxFmGLJYYoPu7miVQgCKGc4WbBC9jlZRuVK6m30GsfORW2NsEQdpSlins9+AG9ldjT/+XJiQ5cCUa0VpJXrpcy4cYmYz7YJcoKG8utV4CP8GHhW7T+yzqnw1tWY7MZGKXxwLaaP3qnpVgsQwwap2asv3rMlqotQCAuXEh33f2x6xP7o7ky9CfG78GBJr3cAlb0JTQj4KPyoOcCY2PZz4FOzCaZ0Fz1P3PGM X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 2Lt0NuOBWmm/ep3oo/imMziC1auRzAYCduPJw9rDZjrn5hKHRKOxIjNiGycHXWT1u4PJ9rO+zsuiX3blW+R/eY5ghJSVo8K1LIO80n9BL3kWL3pVdlnrODkUe4yarMXAIGmbS15f1t+x3F/qy/E1fA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0faeb032-2645-40b2-da89-08d970ddfdde X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Sep 2021 02:28:20.1010 (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: AM5PR03MB2850 Subject: [FFmpeg-devel] [PATCH 15/34] avformat/asfenc: Avoid allocations when writing metadata 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cLssfuv3WPLn Also improves the error check for avio_open_dyn_buf(). Signed-off-by: Andreas Rheinhardt --- libavformat/asfenc.c | 68 +++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c index 1706062f7b..8e9b7ffc28 100644 --- a/libavformat/asfenc.c +++ b/libavformat/asfenc.c @@ -239,19 +239,16 @@ static const AVCodecTag *const asf_codec_tags[] = { #define PREROLL_TIME 3100 -static void put_str16(AVIOContext *s, const char *tag) +static void put_str16(AVIOContext *s, AVIOContext *dyn_buf, const char *tag) { + uint8_t *buf; int len; - uint8_t *pb; - AVIOContext *dyn_buf; - if (avio_open_dyn_buf(&dyn_buf) < 0) - return; avio_put_str16le(dyn_buf, tag); - len = avio_close_dyn_buf(dyn_buf, &pb); + len = avio_get_dyn_buf(dyn_buf, &buf); avio_wl16(s, len); - avio_write(s, pb, len); - av_freep(&pb); + avio_write(s, buf, len); + ffio_reset_dyn_buf(dyn_buf); } static int64_t put_header(AVIOContext *pb, const ff_asf_guid *g) @@ -317,7 +314,7 @@ static int32_t get_send_time(ASFContext *asf, int64_t pres_time, uint64_t *offse return send_time / 10000; } -static int asf_write_markers(AVFormatContext *s) +static void asf_write_markers(AVFormatContext *s, AVIOContext *dyn_buf) { ASFContext *asf = s->priv_data; AVIOContext *pb = s->pb; @@ -336,14 +333,11 @@ static int asf_write_markers(AVFormatContext *s) int64_t pres_time = av_rescale_q(c->start, c->time_base, scale); uint64_t offset; int32_t send_time = get_send_time(asf, pres_time, &offset); - int len = 0, ret; + int len = 0; uint8_t *buf; - AVIOContext *dyn_buf; if (t) { - if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0) - return ret; avio_put_str16le(dyn_buf, t->value); - len = avio_close_dyn_buf(dyn_buf, &buf); + len = avio_get_dyn_buf(dyn_buf, &buf); } avio_wl64(pb, offset); // offset of the packet with send_time avio_wl64(pb, pres_time + PREROLL_TIME * 10000); // presentation time @@ -353,11 +347,10 @@ static int asf_write_markers(AVFormatContext *s) avio_wl32(pb, len / 2); // marker desc length in WCHARS! if (t) { avio_write(pb, buf, len); // marker desc - av_freep(&buf); + ffio_reset_dyn_buf(dyn_buf); } } end_header(pb, hpos); - return 0; } /* write the header (used two times if non streamed) */ @@ -365,14 +358,14 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data_chunk_size) { ASFContext *asf = s->priv_data; - AVIOContext *pb = s->pb; + AVIOContext *pb = s->pb, *dyn_buf; AVDictionaryEntry *tags[5]; int header_size, n, extra_size, extra_size2, wav_extra_size; int has_title, has_aspect_ratio = 0; int metadata_count; AVCodecParameters *par; int64_t header_offset, cur_pos, hpos; - int bit_rate; + int bit_rate, ret; int64_t duration; int audio_language_counts[128] = { 0 }; @@ -556,14 +549,13 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, } end_header(pb, hpos); + if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0) + return ret; + /* title and other info */ if (has_title) { - int len, ret; uint8_t *buf; - AVIOContext *dyn_buf; - - if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0) - return ret; + int len; hpos = put_header(pb, &ff_asf_comment_header); @@ -571,9 +563,9 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, len = tags[n] ? avio_put_str16le(dyn_buf, tags[n]->value) : 0; avio_wl16(pb, len); } - len = avio_close_dyn_buf(dyn_buf, &buf); + len = avio_get_dyn_buf(dyn_buf, &buf); avio_write(pb, buf, len); - av_freep(&buf); + ffio_reset_dyn_buf(dyn_buf); end_header(pb, hpos); } if (metadata_count) { @@ -581,17 +573,15 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, hpos = put_header(pb, &ff_asf_extended_content_header); avio_wl16(pb, metadata_count); while ((tag = av_dict_get(s->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { - put_str16(pb, tag->key); + put_str16(pb, dyn_buf, tag->key); avio_wl16(pb, 0); - put_str16(pb, tag->value); + put_str16(pb, dyn_buf, tag->value); } end_header(pb, hpos); } /* chapters using ASF markers */ if (!asf->is_streamed && s->nb_chapters) { - int ret; - if ((ret = asf_write_markers(s)) < 0) - return ret; + asf_write_markers(s, dyn_buf); } /* stream headers */ for (n = 0; n < s->nb_streams; n++) { @@ -636,7 +626,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int wavsize = ff_put_wav_header(s, pb, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX); if (wavsize < 0) - return -1; + goto fail; if (wavsize != extra_size) { cur_pos = avio_tell(pb); avio_seek(pb, es_pos, SEEK_SET); @@ -691,19 +681,15 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, desc = codec_desc ? codec_desc->name : NULL; if (desc) { - AVIOContext *dyn_buf; uint8_t *buf; - int len, ret; - - if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0) - return ret; + int len; avio_put_str16le(dyn_buf, desc); - len = avio_close_dyn_buf(dyn_buf, &buf); + len = avio_get_dyn_buf(dyn_buf, &buf); avio_wl16(pb, len / 2); // "number of characters" = length in bytes / 2 avio_write(pb, buf, len); - av_freep(&buf); + ffio_reset_dyn_buf(dyn_buf); } else avio_wl16(pb, 0); @@ -718,7 +704,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, avio_wl32(pb, par->codec_tag); } if (!par->codec_tag) - return -1; + goto fail; } end_header(pb, hpos); @@ -749,7 +735,11 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, avio_wl64(pb, asf->nb_packets); /* nb packets */ avio_w8(pb, 1); /* ??? */ avio_w8(pb, 1); /* ??? */ + ffio_free_dyn_buf(&dyn_buf); return 0; +fail: + ffio_free_dyn_buf(&dyn_buf); + return -1; } static int asf_write_header(AVFormatContext *s)