From patchwork Sun Feb 18 01:43:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 46332 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dda5:b0:19e:cdac:8cce with SMTP id kw37csp553425pzb; Sat, 17 Feb 2024 17:42:09 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCVPMTp7Z+5Aj5kaXG4W8WLr5zAYIPzNvX6TPRPtJqXAPUw1FnOYsYc06ayia8uPWWxoG6mWpmoZAMsspPn9+vmocpdfgQoWjCO0/w== X-Google-Smtp-Source: AGHT+IEiVgDPakjRC7jUahcKBMUm+XajZfU9tmCSKESjoZp6/aqQEoMB0yg1fOL/KZ5wqLSRIo8R X-Received: by 2002:a19:4318:0:b0:511:69b3:a47e with SMTP id q24-20020a194318000000b0051169b3a47emr5000498lfa.52.1708220528906; Sat, 17 Feb 2024 17:42:08 -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 r10-20020a1709067fca00b00a3df1ee0c65si1301423ejs.286.2024.02.17.17.42.08; Sat, 17 Feb 2024 17:42:08 -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=Kn9B9E3N; 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 EB04F68D31D; Sun, 18 Feb 2024 03:41:40 +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 3317C68D315 for ; Sun, 18 Feb 2024 03:41:37 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hRueNGx+FthAdCZhUiwUoAmfpx/ZA5FB9YGpT7IJ08Xn4FTPXxzgAZ7SMLl9ANYiAjNsO/t4Z2n3MsJWT/ukIRraOjrUhvVCS062TC55CF0ZDiDIXZw8UXKq174jhLQoinSl78iDwg22OV+a+DXa0zkzYsblJyTmBH/TXsjEmWOGS+nVg6YWjFvF82Eo/j3Hx2N7FLhgMaiS2U88gR8eEyE2BhuJsrNUve92RCGuWLrIINx/Ydyfx11Rr09nLFuWxoOTYuQPxKggk2Y5GUG6+RWosx++6tB3NG0YBDkLr7WnIDovHE2aoJiFKJwYdf0w4wvavWl/m+FopjPdEl7/qw== 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=6R0Lm9p5VbW/E0xs/kzIvIMVXGxv0WEZoJzMMx0H+Ow=; b=DOFVWIjHZYLcap3uuQfWMqNPpnsvS0mzi8ZfCyHndFVW0uYnT4F3ZzpbGZma+ivK9QFpFRuQrd/XCW6lhVzJWA+f4xxve0WuZ9kOM65mCDBLTZafYji35NDY5BqktH8ekiOdzm4ABu/ASGL/wvpHec04optAX5bXApDDqN02Ly6AHxw9L/ttPZfFnP8tCRk4XrfbbUDsyGslw1m7h8lQ3nZyCdykyweoE1Aq64BW4G7dcBsE885/hhmZFXl56G4jFAp/NUEIbdCCX2wAXqISpYCoJF3S9c1L0irLSHxgD3B5vIukV91Df+p6seQtEVQ5M59n9aR8tj/P//r+qXRQLg== 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=6R0Lm9p5VbW/E0xs/kzIvIMVXGxv0WEZoJzMMx0H+Ow=; b=Kn9B9E3NH8hE0kz5CtrhYSpfNRPsLTLjEaAJxotDDnN5ouTWLXpRCPgZDm9GxmRkfwbzVUu5N28bbQ5Hba1mwqvc1ZiViC7t50x5HCoDKaWLL2daErOrrO2EDE2c4EvjVTuQH4sxe2AZiRa48/28/yh3AX2ftR/RWsgK7ihP9FPJpbYOoaceCCnJNj5aoCk7KQHJIDX2Kz7cP6h+h18pcPdW2S+eKjjcH89uuWE5Y/8XmomN81LF/TKTLc8zvVGQaRGiztU4CaLQcL5q7mnMuz0HFBaFLdM6hgyIvPZsJFXOEFKEOIXPbFaD+F8xYaGF/oNZHPkrSODArDz08gFwxQ== 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:28 +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:27 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 18 Feb 2024 02:43:08 +0100 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [f7LBRkJDKhG4opJBAcj1lQ6Y0Hlc6CW8rVd6aNLHf6w=] 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-6-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: 72ad2a6f-9f00-48bb-d3bd-08dc3022b96d X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: QbJY5X6pF+C4dZiK7Ta6P0gYKjfXrwE8uQv4ytHkcc/r4p+cVWVfpxlSuKsJ1KLASx6uMzNbAW4V4XQEM4ZBaMXOWaTvOEoQCT3lz+DPNJe4KKS+5EsFkFM6xvrPGx070Sik1WZBy1niT13RVio2N7g49e1qTmbioKN7tW6G3N96s8pFfmiGsGuCXbmOtu3/znUPAjFxXkx334bpq44ReWjQWwaOv/NkQP286CIRr96KIxQVS6RhuVv91Gb/fnvQ2eEzf6ijD3kOTcgOqpnom/MUFiJIUrpX1NznCMXJeKloopbXENNwr8w5r79hqnxBhXyEtetYFnTW9wSLxQkVZc6fsok0xX0n0Tz5r2yELQ/hfMqHe9xkK7hMH4JWFifR4OKpqz9owm+zcLEVtz8cx14EgGXxdzkBlfyNalw/PL8roIZoAckmZhGl0Ve6RS0KAwajZKJ28ehWCgtm1YqUrRqFsLQTGfB4yclQavwBRGHE7E7kFESNXkZlYADfYybk4s8p+TIll7j4dvaG4rN4GgfgScN7Evr4xddae76BeXwcgvtNt0vvuve4nI29aSRnu0aAhoznX8l4gOUleMuoEnFcuPHIlqEzwWSPGt3A820l5CG7R8dCaUwhepJcVv71 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GSSZ9shrErQW+v2yTPhVxIVjcWqlZyx7oK9jS3cE7wV1ucwMn8KH2Tu1M4/0jCDMYcaubv4G1HFnbP/kQJx25EwkAyoRz9Ir3k82ha1q4yiaKbB4swM5dG9kWwQ5l27Nmix1DfrXWdEPeIoHz1yTRriL00Le/bUnVUlVJe0vyzOkxOydjpJdR99fb00cjY51OfTYl8o4X7kDvrgpfb5XQQFH0qZeHUOJjPGYPcvzFxwqOEqD3+q5b5V5G7d/lIcaIW2oVWZDed73Km86+QZAWiSGfURlJIq6avgb12RQ84Bo2byWWPd+bzH7JxK7gxzFspMdfBs4sQrYUJSgzDYX4kcFe92erRHTPsdJG4SpDDyXbOjgN1rE/HJhZbHvd4ACzig++81RvI9ISeCVX1+MShWdLvuQAKXZQQbFTwM4+BqJ1LUprPiHqFGkqNsEcl8r6EXkD5mpWe69WBWEXjNBTiySJBJ7HAuPUnGScuBqkZEJ0GtVVGPBcpN85Mm+lDVsYVez+kFHFsR4DWmi37Cw0XL+/d2/mmrWLrXAEVsJ6mcpYfi2bWvMSXJZbzgPXxc/iomM/AcWyn9UwjVz0LYo9j3lZPZKtKvp/dAv27y02YbxRRbOaKVv56QPGy7AaIdFKPJQzD7P2LJDBRWUA/eCvxEoQ8YNuWDB3sd5+yDTYDJg1rStSYD4+IKo5GTBHu7ko/75mUykuvl8QR6XlTBGsIspiEu83Ut0Xl88VOxo1Vt6hO4V1SZCyksFlcgilOvLXBhOBL7nrywwrBvVowHjig2dAg79EInp4QkVLYcmQUFwPvGlYisr1VN+q+qJX55QIyebS4kyil9Mq5LvsGy0bZQAaTBhj3hUV0d8zQwD4AnCWrEPd4yKAReVouzFWMwkK5Dhexdbg2yrOmoDTWc6/5xlWJbGo5PD9JlpINrqa4ZXVobHirO4VONIx3M41Av4x8/ogQloTJ5wnW6ehCK57OEpTjEUvcYedpy9QcEaAd4gMIO611fmes+NeDhZQ1NOP3oDph1Twhus9omEHo6ivy0PftcxIaa7KpoebmRCO9KFR3qse8JLzRUh9c0w8I3O0CebbOPD4FN/IjvUE4nA7iHxfFs3ERAKf42Dx2Cfnfqe2dUpA0jYB8tTWZTgPu/ytnjrvya679CoRqeKMODumZLb8g9AmF05s0VHPJQ2KyMXlcYghcQac8vokTZ2rcuZlfk5PhxBCiiJ19NCyZ2aP79I7svkVuZ5trKazunXArvcSdJN2EmOydMn4BGOEoai//Fi/M6nCQizZRN4kR8I1A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 72ad2a6f-9f00-48bb-d3bd-08dc3022b96d 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:27.9028 (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 7/7] avcodec/movtextenc: 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: 7MJYxAW/UBWW 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/movtextenc.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c index 7aa74d7c9d..fd8c7dc9f7 100644 --- a/libavcodec/movtextenc.c +++ b/libavcodec/movtextenc.c @@ -22,7 +22,6 @@ #include #include "avcodec.h" #include "libavutil/opt.h" -#include "libavutil/avstring.h" #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" #include "libavutil/common.h" @@ -170,7 +169,6 @@ static int mov_text_encode_close(AVCodecContext *avctx) ff_ass_split_free(s->ass_ctx); av_freep(&s->style_attributes); av_freep(&s->fonts); - av_bprint_finalize(&s->buffer, NULL); return 0; } @@ -183,6 +181,9 @@ static int encode_sample_description(AVCodecContext *avctx) int font_names_total_len = 0; MovTextContext *s = avctx->priv_data; uint8_t buf[30], *p = buf; + int ret; + + av_bprint_init(&s->buffer, 0, INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE + 1); // 0x00, 0x00, 0x00, 0x00, // uint32_t displayFlags // 0x01, // int8_t horizontal-justification @@ -306,19 +307,23 @@ static int encode_sample_description(AVCodecContext *avctx) // }; if (!av_bprint_is_complete(&s->buffer)) { - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto fail; } avctx->extradata_size = s->buffer.len; avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!avctx->extradata) { - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto fail; } memcpy(avctx->extradata, s->buffer.str, avctx->extradata_size); - av_bprint_clear(&s->buffer); + ret = 0; +fail: + av_bprint_finalize(&s->buffer, NULL); - return 0; + return ret; } static av_cold int mov_text_encode_init(AVCodecContext *avctx) @@ -327,8 +332,6 @@ static av_cold int mov_text_encode_init(AVCodecContext *avctx) MovTextContext *s = avctx->priv_data; s->avctx = avctx; - av_bprint_init(&s->buffer, 0, AV_BPRINT_SIZE_UNLIMITED); - s->ass_ctx = ff_ass_split(avctx->subtitle_header); if (!s->ass_ctx) return AVERROR_INVALIDDATA; @@ -640,10 +643,14 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, ASSDialog *dialog; int i, length; + if (bufsize < 3) + goto too_small; + s->text_pos = 0; s->count = 0; s->box_flags = 0; - av_bprint_clear(&s->buffer); + + av_bprint_init_for_buffer(&s->buffer, buf + 2, bufsize - 2); for (i = 0; i < sub->num_rects; i++) { const char *ass = sub->rects[i]->ass; @@ -663,23 +670,19 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, if (s->buffer.len > UINT16_MAX) return AVERROR(ERANGE); AV_WB16(buf, s->buffer.len); - buf += 2; for (size_t j = 0; j < box_count; j++) box_types[j].encode(s); - if (!av_bprint_is_complete(&s->buffer)) - return AVERROR(ENOMEM); - if (!s->buffer.len) return 0; - if (s->buffer.len > bufsize - 3) { + if (!av_bprint_is_complete(&s->buffer)) { +too_small: av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n"); return AVERROR_BUFFER_TOO_SMALL; } - memcpy(buf, s->buffer.str, s->buffer.len); length = s->buffer.len + 2; return length;