From patchwork Mon Feb 12 02:01:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Oneric X-Patchwork-Id: 46218 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9002:b0:19e:cdac:8cce with SMTP id d2csp436314pzc; Sun, 11 Feb 2024 18:02:47 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCVjR0D+hzALqFxijnNFseHM97f9E2eZAHF4qI5pl5T/xnKndl85C28gcjZ/LAjZo7B/VxXpfd2ElS3LA4b4gQ73x4SfYtvRXjdh/Q== X-Google-Smtp-Source: AGHT+IF31h5LXTeqejIF1/JPYUjsXf3eY02b3SfgVzJDxLrfz25lTsoLuynASNDgFO0+xJ2+lj5E X-Received: by 2002:ac2:5488:0:b0:511:8f40:766a with SMTP id t8-20020ac25488000000b005118f40766amr516746lfk.41.1707703367636; Sun, 11 Feb 2024 18:02:47 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCVlmrYOgIUEM/6l5pcscZWXH9j8NNVuGD9whZNZTJGUIj+B07vb0Q5oB7piYOsCWI+Ay9LDC618OqIbzKJcUrMRDIWLGd98Gwf9TYq/n7/iFUkru5CNaQjveQeY87CVmkJpnLdeYiMX7Hqf6e8jjZHJPLjeyYm1KbaRvi5hoj1xQNb/GEd89AV7RONV/VawkbmL2PoL3d+IHIKpYqSkQ6xnMvIJCYVciV13JAmt+C3IAErekQ7QyAOT4pUdyWPdeknaJnAKtbpd83sZ6V/2bSeVUKUsBQ98ONg5WCwo59ZczQYjP5jsloO1A7qRg+0iV8gJBFokDiYzLSuI+vm/2dtpVJvjxA67NMpnHU40+y0pxa4Yq4HDpS9PlS6DdKSLG57Mh8z6M4mj5HymjkMyJHAAICoiWCbyivYyWQOe+vlXOpt/hfmggXfD866yY91lz9nhDHkfUtp4npVPIkRVibaOTm+bcDlfGT2gmPNzPIh2naqf/anM7hThno0R/yKySOF0EPNaHaA+bNDeAK4SleT9t/8a61sxJdQCCTypKEkR51HfNc94HeD8toyE4KTVk6nqRDl5Sgs2hbMpsNaZFVk6dAhthGS5Jn9OFzqCvIiQcxp1eIKm1jNyZPIDgEZ7TgCuGgKXIufHugLu1lqPF5R0ygeC9xywcbptWgFZk2XoRgdiotjrjkzkAI9sB7lxxMq0Nz7sZ1X+n/HsKzsEoQQFkcVufRq+8J3n5M1soe8Mqnba1OcT9TBwBIVExNY/FleudJhCKCy+Uke4GBtoIHliTScVkr9dS6fB8mBZbEzvakgYHifpa/5v4JtdfE8QV0UwGyXAjn/sKrQjMDe+K9l2Hgg2mBA6xHCiYuVQiDeeTDsGXYduERARgjk5j3N6o2XFbDJguWsIxV1idZun3vnjCiQj/MExtz2xlcIXKMG6ER6lUUrL6Z8T3gUxwpA/jZm0t2 hYMVSY2/gyF+0dKNszkeKo+jl3Kl05nBAkPBLiWu8hb1FZaZ1yVTFSEPLwIiG8a65onEK8TRUIrVmLvGlj70bqaYP9ylEm7w+qdLEd6Jg5km8Vj0w/gaVufKOYXJveFJvtID8SKr9ZviWDDvrAO9Qf2cgSJ4XUlRPnVQA0QcAS1cRkDfRdUFgc3VNiKrDFXNqjUFR0gcEUt4+OKPD8tLQxXE0NkdwFuwYF6p4cSX8sk/IRYnMZKikdpsiWVKTnmdYcc/wMhxV3k6jvCuScIX5Sc2iJ7ymCJYT1vBuU0W0G85t738sZPqsMgZm8TW3ZlLXC7aoLUW0fGe+4Sf4OS7lwLAQdmJsBrYwpJOFgfbJTuksPbN2D3jWLUD4J8yvmOahpu2lXw3eYcXwm8mdgoodKqGb9aLaGQWMSbKS/2/Z7Tdhq6wNX6spUM9xT1rIpX5y4tasgU/bvnj/0oHhNNt/98g/EBKEagtxkY18RJ2RsYJmSX2Jf12vsH7sIiF0J6LBetn+sUZF2lgi92pX+7s9TJgTkL1DFXoqzri4Q0nS5wwsmoPzyQGrFUkUWz10gYWN5/JGetNkPrbnc/e40NEYm2YLXeWnIj95GlTQhPlHrj47PkaymJwwLBrjN1DMoG9r9tZIg Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p27-20020a1709060e9b00b00a3ca112f1e3si441630ejf.462.2024.02.11.18.02.47; Sun, 11 Feb 2024 18:02:47 -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=@oneric.de header.s=strato-dkim-0002 header.b=jB0AVafn; dkim=neutral (no key) header.i=@oneric.de header.s=strato-dkim-0003; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 35E2B68C15D; Mon, 12 Feb 2024 04:02:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mo4-p00-ob.smtp.rzone.de (unknown [81.169.146.217]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 82E9E68CA0D for ; Mon, 12 Feb 2024 04:02:18 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; t=1707703337; cv=none; d=strato.com; s=strato-dkim-0002; b=IoKC+xnCIdApEk9WOWOhhucucwYNYUMtezksMbuYvXLCZL5zqr+0EtsykbV5xp+Pot flCZO/kfAqlttUXS11VByvBfZW1d2325SZpdPCVcGa0GZW2ZTJx1PBCO4ojOPBjb0UBN lHakGrABxXp4CVCIts1Fn0wZjqFsNzr5DBHIc0/De1DHHp7uuMXVGX7YGbdHjH4ruCfv Hfgplud8rKpr+1fWPPqIKdighYZsIdUarg4NiHn07M40oLWBgilhzbXIXltj3Ed2pTFU tuTm7QVCHKFoRjObxPVRoqa6A1qE7FqEYCHxZjQSAMIEnuBQlLH8c50Am82w5GlqUlwR qHWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1707703337; s=strato-dkim-0002; d=strato.com; h=References:In-Reply-To:Message-Id:Date:Subject:To:From:Cc:Date:From: Subject:Sender; bh=sWhLf975+n9pDZ+kqOvmCzNKzKIN8af5zcf5+xAzACU=; b=A98Umdp+IBOziFAV/7kukRcu5HPN34sGHtxwqLKu8y5rsxJHxTg5JPfTRdd9AmeyNo 6art4WQrBhAxIBRXvi3YkDE8n3V9TDtUYRXPKyLCBTZMeekgTW5iZ87QvE3wx+w3D+jC 5F16mKpmYkg+8vYOV27dcSbEzegKliV7BV1NyV3pUWCYWCPvmEpyOfvX4RQwHHxZi0pO yqF2xuTAu2+4w9YzZl7KqDsZDm/BCwjM7jASEeWeZmvExH094E94Dggc9ZWxcRxkywJK ZbzIefPlx82yqmGJYIu+cGQdhMyqUc7xadUs9EvwBcIUEHmWHfFdV+fd93MgTUs9gUxJ 6uKQ== ARC-Authentication-Results: i=1; strato.com; arc=none; dkim=none X-RZG-CLASS-ID: mo00 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1707703337; s=strato-dkim-0002; d=oneric.de; h=References:In-Reply-To:Message-Id:Date:Subject:To:From:Cc:Date:From: Subject:Sender; bh=sWhLf975+n9pDZ+kqOvmCzNKzKIN8af5zcf5+xAzACU=; b=jB0AVafno6YDxlNlzBHwnmSTQkbrAKqzaSTRDdqccXy95jrN3iYrcanRfJaOYREGfa eGHGLIIn66OFuzehdebt89/wDD1fDHCdifNIyGgAzZ4Dr1L6n2AGcMLkrr62dpmsthL1 B10opqEKyRZzKOxP3tVL7c+AapH/i6p1rLjoMkfoFzAEVHr3lH6PR00dt/GfzH3NazX1 0mB2b8EVuLwZHNmAUt+OOpPD9IjhpwAg4qyna5Y4m1IWIfHl8qIXMAbYrN1qgFvl98bu Z1AExzLefex2JuHiAc9AIARyi0ZrESrd5Q68id82tFwG+lIHBiUGfvNtdmQPH5fnntaB wjUQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1707703337; s=strato-dkim-0003; d=oneric.de; h=References:In-Reply-To:Message-Id:Date:Subject:To:From:Cc:Date:From: Subject:Sender; bh=sWhLf975+n9pDZ+kqOvmCzNKzKIN8af5zcf5+xAzACU=; b=kWxOg8FGQehesqhOaTvnmd/ZkSYcsrLfEgb9e71khxTvNzf9RfRH0EqRo+snUi4Czk sdPiDY2JmlUp7huTCuCw== X-RZG-AUTH: ":I2IBZ0mrW/AWQXwgB4oxKM1YsW1lFUznrLvi/XReWqAAlWwZ8wlvfXmGs4jUQ0oz8ZbhHexs8fhgUyJVddUhvSMyyTdkfRqedioxw5M6" Received: from abhoth.workgroup by smtp.strato.de (RZmta 49.11.2 AUTH) with ESMTPSA id x7ec2e01C22HBx4 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate) for ; Mon, 12 Feb 2024 03:02:17 +0100 (CET) From: Oneric To: ffmpeg-devel@ffmpeg.org Date: Mon, 12 Feb 2024 03:01:58 +0100 Message-Id: <20240212020159.6806-4-oneric@oneric.de> In-Reply-To: <20240212020159.6806-1-oneric@oneric.de> References: <20240212020159.6806-1-oneric@oneric.de> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/4] avcodec/{ass, webvttdec}: more portable curly brace escapes 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: yiNzNwJRyaFK Unlike what the old comment suggested, standard ASS has no character escape mechanism, but a closing curly bracket doesn't even need one. For manual authored sub files using a full-width variant of an apropiate font and with scaling and psacing modifiers is a common workaround. This is not an option here, but we can still make things much less bad. Now the desired opening bracket still shows up in libass and standard renders will merely display a backslash in its place instead of stripping the following text like before. --- libavcodec/ass.c | 12 ++++++++---- libavcodec/webvttdec.c | 2 +- tests/ref/fate/sub-webvtt | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libavcodec/ass.c b/libavcodec/ass.c index a68d3568b4..e7a1ac0eb5 100644 --- a/libavcodec/ass.c +++ b/libavcodec/ass.c @@ -181,10 +181,14 @@ void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size, if (linebreaks && strchr(linebreaks, *p)) { av_bprintf(buf, "\\N"); - /* standard ASS escaping so random characters don't get mis-interpreted - * as ASS */ - } else if (!keep_ass_markup && strchr("{}", *p)) { - av_bprintf(buf, "\\%c", *p); + /* cancel curly brackets to avoid bogus override tag blocks + * hiding text. Standard ASS has no character escapes, + * though (only) libass provides \{ and \}. + * Unpaired closing brackets don't need escaping at all though and + * to make the situation less bad in standard ASS insert an empty block + */ + } else if (!keep_ass_markup && *p == '{') { + av_bprintf(buf, "\\{{}"); /* append word-joiner U+2060 as UTF-8 to break up sequences like \N */ } else if (!keep_ass_markup && *p == '\\') { diff --git a/libavcodec/webvttdec.c b/libavcodec/webvttdec.c index 6e55bc5499..35bdbe805d 100644 --- a/libavcodec/webvttdec.c +++ b/libavcodec/webvttdec.c @@ -37,7 +37,7 @@ static const struct { {"", "{\\i1}"}, {"", "{\\i0}"}, {"", "{\\b1}"}, {"", "{\\b0}"}, {"", "{\\u1}"}, {"", "{\\u0}"}, - {"{", "\\{"}, {"}", "\\}"}, {"\\", "\\\xe2\x81\xa0"}, // escape to avoid ASS markup conflicts + {"{", "\\{{}"}, {"\\", "\\\xe2\x81\xa0"}, // escape to avoid ASS markup conflicts {">", ">"}, {"<", "<"}, {"‎", "\xe2\x80\x8e"}, {"‏", "\xe2\x80\x8f"}, {"&", "&"}, {" ", "\\h"}, diff --git a/tests/ref/fate/sub-webvtt b/tests/ref/fate/sub-webvtt index ea587b327c..fae50607fb 100644 --- a/tests/ref/fate/sub-webvtt +++ b/tests/ref/fate/sub-webvtt @@ -21,7 +21,7 @@ Dialogue: 0,0:00:22.00,0:00:24.00,Default,,0,0,0,,at the AMNH. Dialogue: 0,0:00:24.00,0:00:26.00,Default,,0,0,0,,Thank you for walking down here. Dialogue: 0,0:00:27.00,0:00:30.00,Default,,0,0,0,,And I want to do a follow-up on the last conversation we did.\Nmultiple lines\Nagain Dialogue: 0,0:00:30.00,0:00:31.50,Default,,0,0,0,,When we e-mailed— -Dialogue: 0,0:00:30.50,0:00:32.50,Default,,0,0,0,,Didn't we {\b1}talk {\i1}about\N{\i0} enough{\b0} in that conversation? \{I'm not an ASS comment\} +Dialogue: 0,0:00:30.50,0:00:32.50,Default,,0,0,0,,Didn't we {\b1}talk {\i1}about\N{\i0} enough{\b0} in that conversation? \{{}I'm not an ASS comment} Dialogue: 0,0:00:32.00,0:00:35.50,Default,,0,0,0,,No! No no no no; 'cos 'cos obviously 'cos Dialogue: 0,0:00:32.50,0:00:33.50,Default,,0,0,0,,{\i1}Laughs{\i0} Dialogue: 0,0:00:35.50,0:00:38.00,Default,,0,0,0,,You know I'm so excited my glasses are falling off here.