From patchwork Sun Feb 18 01:43:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 46329 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dda5:b0:19e:cdac:8cce with SMTP id kw37csp553342pzb; Sat, 17 Feb 2024 17:41:46 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCUcTfMnj2/rzrz4OCoFNfRQedLYiPjL34oYmM+dwE2fFv6kRwjIGK1q9a9QWV1SGRP+Qld7kV8Rj1oPN5ZtfqLty8D9kS3qZrkTqA== X-Google-Smtp-Source: AGHT+IF/gWn8V9sLWy9DIEcIOf7HEtJ+zanVKq99RlGaL0TqxskdGyo/nX2SG4R8M1iU9kOi68Gq X-Received: by 2002:a05:6512:3d0f:b0:512:8a75:53f9 with SMTP id d15-20020a0565123d0f00b005128a7553f9mr6870272lfv.57.1708220505933; Sat, 17 Feb 2024 17:41:45 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cq19-20020a056402221300b005620158b65bsi1229310edb.292.2024.02.17.17.41.45; Sat, 17 Feb 2024 17:41:45 -0800 (PST) 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=HWwTUXrp; 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 4D63468D320; Sun, 18 Feb 2024 03:41:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2097.outbound.protection.outlook.com [40.92.74.97]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A923968D312 for ; Sun, 18 Feb 2024 03:41:31 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ULYsStM6hfOdyw/uqNmuQIsIBV7yycGI5zv50jAh+/t/CwdZl7ZZRef/qgWm+zWDlbHrhAtSc3nU9azQnagWfiGLNlcapZyWSg40/RdkG3El+kOKGtcG0ZZz42ka2pIUtLtI4szp8Oa9DLcA9M4W7TxYVlpENKN9pl62eqGDrVaarz44dINo64Fl2SkYUqT04feOJG4d0W/vxpNfKsMb7lNaiNDDCHo1gkN0vQ+HZZ1JYjGc031Sw55/UIMblUSz5Y6bTxhbcAOy5LV0otpYdpzKYnTYTXKJSX3cKdLWtLyZZTer/rM8HsIab4VdB2ERdMKVUqbTnfZkJBJglW6a8w== 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=3Kz67IpH22CRtHdwFwqZswk7hBDBTfZAVrk+3CGoDWg=; b=SU4eOkH1Hw5x21/h2Xxwrcvbc1fr/A0lpY5qURufIGRDuqYtDw6QpRGCIajl3lm2TwF94dT8OK8snvXNYprNLCtftbPNIzt+W3VMIEVB/uHw0kpwKa6BiW3YKaTx+8XxhWmAB5a9X1MAYw6hPt+9jPEhp/Guz1U7nWUL/GB+orrGwtLuzCsjLYGZ8ZKD91h8tp6Cit9yuq6fkNPnUAec/lMUxnaN26MS+wdCoF3mxpwlvXLJGLEHJ+CGn5d2W3a8XXOnqvUAGGWbr8uXqwsccH/wzLhLECIytjB6HvEifkJlDay+7eYnKHU3/GI5HznJQkIhTNqXMPf2HFODsj/r5Q== 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=3Kz67IpH22CRtHdwFwqZswk7hBDBTfZAVrk+3CGoDWg=; b=HWwTUXrpiofoeBJxAIqt3AbRkMNphzj441Ov4DVpBT0MZMJoh1a509jgDV/8FSaDj2cvhoZjySSfBMFHnazqvhwHc2shhVaarHbP7LPGzwE4XN9Za0rcuyKE8Aa7bdnAP9kGrp48lqA58rQH2FYu+eEUuInmsnvf3w87IbjCl7H9f1Gn2X49+MdTtMhFnVeUetr3YngUGCfynOnT5nKM1RDF5Dblj/c4NeTXgoFja4F1iHQdXqDyHZXDDrnuWTRUREgOQYLq4NmTCB+XnUSSooBe4dEy6lKT3ZY71TqkLmheDEeay0cMNsBQR57LjEk2wdC9lJwv6LzE4t5lERjKUA== Received: from GV1SPRMB0063.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:109::7) by DU2P250MB0319.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:27c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.32; Sun, 18 Feb 2024 01:41:23 +0000 Received: from GV1SPRMB0063.EURP250.PROD.OUTLOOK.COM ([fe80::ffe3:46c:6214:2504]) by GV1SPRMB0063.EURP250.PROD.OUTLOOK.COM ([fe80::ffe3:46c:6214:2504%6]) with mapi id 15.20.7292.026; Sun, 18 Feb 2024 01:41:23 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 18 Feb 2024 02:43:05 +0100 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [EJqnldXegLbQ13/9I5YOss9Tdur8xXdbhEjRa0bZlNo=] X-ClientProxiedBy: FR3P281CA0033.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1c::12) To GV1SPRMB0063.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:109::7) X-Microsoft-Original-Message-ID: <20240218014308.2819410-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1SPRMB0063:EE_|DU2P250MB0319:EE_ X-MS-Office365-Filtering-Correlation-Id: ac4f7c6f-46a5-4d8d-b5bd-08dc3022b6d9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: X4UjNhrheARTFPlVWTpbO+1EwdXLJvb2jwRzn10mvRf1J3dLT5Ie9nguadZDM5Zn1n/pL2fEXNJ9e2Wca+5XVxJXI2v7riPQBy7w2yCFJE4mncn2d1jV8bnj6OZ+LsJDfwknfhI7tWriAbiRUKbYgP1W48BXukgVdIQH64ROij87LWEaeze45BFJrnu0A1B+PooCaEnF4+haQf5iTUOHy8THL1mxhNOKvzpxN3y7TdZeUcocpbLEpckej+0sB/NrQyYNGtNpixHUeLUIZ1oqMbe5UdGD/r7dx2stdPJds0ZWNYGmCRyohLg4+8dPXDP4xIUiTj3RBZFztPA7RDdpdWGy9pRwIs8zIZqI3kKwdC6HEyIBGT2EwokdLK3ZG2vcuVJdRAjdKoK92TAjv5wQypiTKcySH4tHuOQo6Jmr26oYEZmOgE5XAYqflfIFhKBehiJ7D9D22lYjsayTbXvDSWuDiYUPqEzi5y7lubIV8sEf/dmYPbUMgqfrAa+M5Mwd3sgQMVfGd4lpVXSIP3uf1yzJ2OpOWRMVys3yfAe7o5vmWwZDNXci59X7vL/YFvODwOWI2JnB0LrWInE2hGLjtly+lRQjbHEuM5pFqYpfqwQ= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: jMdh7DZO+vTLrhwOdeB+RfIkkt5s1jn+8/6lPsFjfDqAr3JGN3mkdv2veZHZZTq7JAuMjosJvFsltCSuMJVFWiDOF8TPdsDxJ5so8AwP/TlFmVT/DdbhgVoqOTEMwKMuZd7hqMIwwpoVWRvE/Qi/L/O6cQ0ZrwdYK/ChKQfZE+ee+yrwIhMA7niY+srs/saxySufS6bLPywbYwLRIp7E2HBkPwzJVOkHV5ZPtI1XDnCxTxlRb+imgoOFGR50GWlhDPQ2ho/TWs8iM+1+5JgCk5QYQkfRqHUf3cTdC43C8Ww/UJbMZdwrhsNbr6vxAuZBGg5LHsX4fhFbyEDdj7JwfAJMbJ7Pl3PMrNXaxupuTfXFC99YvX62KE168pU61MN3RJl0jf5vdWq2wrfmveWuOtZH594+a44IvxT86lsxhYQplwA8/pbTFUS3Gf5y7fFj5kybsfsfXCsYLHfkUuW6EH1VrGoMs2kOMaWE9OtFJTBnv3dCUFPq9UU1cBtuniMLAScRrex7S+2a3TbxI7FVrxkRMA/mbtZAnjznLaFGA22rRg7v5Ddw70Sk4+zBAPIOXT1JSq5XxdukGrzbcBRFsG7WS+HpuVy7rPbEywOj9KNhNGn9YSvXo27pXHY4RvbNLagt7rfUOe+AyP6gUyC7dsBdrs66hXZPrSijETGq512ft5VqT1RJ3n5Ed1qrlrWw2KakqZ9aDYH9O77LEQqh14nAuiN+EhyBB2UVPETYw87698ZrkPhMYAgNXi+bELYmuQgIGqGhx1Wbs0Fwjoma3eEalIOduno4wONBeatA7kh9XGehYx5KHbDSPPueLSvMsjgBguqdlxsrxgqX5smESQsuFOkS7axtYi9puyp6r0esW5GP23NK+QpD12kbMkv/rnkxPz/SSLhvTiom/wGsQj983yvmGzzgjcMzCrnnSrl+GVisTjkkX0iEAUrNEUprBRRF6NLBPcFP3BqJ+jxwWRxVJFKxdsm+53ftBfnCgGCgq/dEkoqTJ1pf+qfUQhEHMNi6SNDpseUSIiEVL1Cq3F8yNB78QHDWoVNwSGB98ID8MdGeMOoD9pKPcZi+KJwV9t+SECQFkAfyUiRHYryqLWbwH2gpigWuA7OQ6EMnCt7hv9I70obfwc9HDpDP1/GNYVSsDuSpW9tz6bn6Y/W6JAgHvZJDB6DAd/VdQ9zZmC7mOalfFrua1tm8I6xA+JfkQCvKI6uxGFFtz0yq+ebgALBuuUCjY/nniK4E16Li0hQWbc4wwYG9smlXdg7OTeCcCCGQqvHJXWID632K87ULeQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ac4f7c6f-46a5-4d8d-b5bd-08dc3022b6d9 X-MS-Exchange-CrossTenant-AuthSource: GV1SPRMB0063.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2024 01:41:23.6101 (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: DU2P250MB0319 Subject: [FFmpeg-devel] [PATCH 4/7] avcodec/ttmlenc: Don't copy data around unnecessarily 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: PRnq58QVA7K6 Using av_bprint_init_for_buffer() avoids copying data into the internal AVBPrint buffer (or worse: to allocate a temporary buffer in case the internal buffer does not suffice). Signed-off-by: Andreas Rheinhardt --- libavcodec/ttmlenc.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/libavcodec/ttmlenc.c b/libavcodec/ttmlenc.c index 6a2ab23cab..f48274d2ea 100644 --- a/libavcodec/ttmlenc.c +++ b/libavcodec/ttmlenc.c @@ -29,11 +29,9 @@ #include "avcodec.h" #include "codec_internal.h" -#include "libavutil/avstring.h" #include "libavutil/bprint.h" #include "libavutil/internal.h" #include "ass_split.h" -#include "ass.h" #include "ttmlenc.h" typedef struct { @@ -84,7 +82,7 @@ static int ttml_encode_frame(AVCodecContext *avctx, uint8_t *buf, ASSDialog *dialog; int i; - av_bprint_clear(&s->buffer); + av_bprint_init_for_buffer(&s->buffer, buf, bufsize); for (i=0; inum_rects; i++) { const char *ass = sub->rects[i]->ass; @@ -129,14 +127,9 @@ static int ttml_encode_frame(AVCodecContext *avctx, uint8_t *buf, ff_ass_free_dialog(&dialog); } - if (!av_bprint_is_complete(&s->buffer)) - return AVERROR(ENOMEM); if (!s->buffer.len) return 0; - - // force null-termination, so in case our destination buffer is - // too small, the return value is larger than bufsize minus null. - if (av_strlcpy(buf, s->buffer.str, bufsize) > bufsize - 1) { + if (!av_bprint_is_complete(&s->buffer)) { av_log(avctx, AV_LOG_ERROR, "Buffer too small for TTML event.\n"); return AVERROR_BUFFER_TOO_SMALL; } @@ -150,8 +143,6 @@ static av_cold int ttml_encode_close(AVCodecContext *avctx) ff_ass_split_free(s->ass_ctx); - av_bprint_finalize(&s->buffer, NULL); - return 0; } @@ -306,6 +297,7 @@ static int ttml_write_header_content(AVCodecContext *avctx) const size_t base_extradata_size = TTMLENC_EXTRADATA_SIGNATURE_SIZE + 1 + AV_INPUT_BUFFER_PADDING_SIZE; size_t additional_extradata_size = 0; + int ret; if (script_info.play_res_x <= 0 || script_info.play_res_y <= 0) { av_log(avctx, AV_LOG_ERROR, @@ -314,6 +306,8 @@ static int ttml_write_header_content(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } + av_bprint_init(&s->buffer, 0, INT_MAX - base_extradata_size); + // write the first string in extradata, attributes in the base "tt" element. av_bprintf(&s->buffer, TTML_DEFAULT_NAMESPACING); // the cell resolution is in character cells, so not exactly 1:1 against @@ -329,10 +323,10 @@ static int ttml_write_header_content(AVCodecContext *avctx) av_bprintf(&s->buffer, " \n"); for (int i = 0; i < ass->styles_count; i++) { - int ret = ttml_write_region(avctx, &s->buffer, script_info, - ass->styles[i]); + ret = ttml_write_region(avctx, &s->buffer, script_info, + ass->styles[i]); if (ret < 0) - return ret; + goto fail; } av_bprintf(&s->buffer, " \n"); @@ -340,14 +334,16 @@ static int ttml_write_header_content(AVCodecContext *avctx) av_bprint_chars(&s->buffer, '\0', 1); if (!av_bprint_is_complete(&s->buffer)) { - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto fail; } additional_extradata_size = s->buffer.len; if (!(avctx->extradata = av_mallocz(base_extradata_size + additional_extradata_size))) { - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto fail; } avctx->extradata_size = @@ -359,9 +355,11 @@ static int ttml_write_header_content(AVCodecContext *avctx) memcpy(avctx->extradata + TTMLENC_EXTRADATA_SIGNATURE_SIZE, s->buffer.str, additional_extradata_size); - av_bprint_clear(&s->buffer); + ret = 0; +fail: + av_bprint_finalize(&s->buffer, NULL); - return 0; + return ret; } static av_cold int ttml_encode_init(AVCodecContext *avctx) @@ -370,8 +368,6 @@ static av_cold int ttml_encode_init(AVCodecContext *avctx) int ret = AVERROR_BUG; s->avctx = avctx; - av_bprint_init(&s->buffer, 0, AV_BPRINT_SIZE_UNLIMITED); - if (!(s->ass_ctx = ff_ass_split(avctx->subtitle_header))) { return AVERROR_INVALIDDATA; }