From patchwork Thu Dec 9 12:13:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soft Works X-Patchwork-Id: 32232 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp279845iog; Thu, 9 Dec 2021 04:17:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJz65fUhpvZS80lWKjg5440j0TIYpQeIWQeDd5u9AY0rKjEHXqevDLDJtPl8sQsFm9PUumzy X-Received: by 2002:aa7:ca46:: with SMTP id j6mr28722133edt.234.1639052245210; Thu, 09 Dec 2021 04:17:25 -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 nd27si12044094ejc.554.2021.12.09.04.17.24; Thu, 09 Dec 2021 04:17:25 -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=@hotmail.com header.s=selector1 header.b=VYZpbrBe; 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=NONE dis=NONE) header.from=hotmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 295B068AFE6; Thu, 9 Dec 2021 14:13:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12olkn2010.outbound.protection.outlook.com [40.92.22.10]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6D20468AFC7 for ; Thu, 9 Dec 2021 14:13:07 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AfIKndq7l3wbi5etIzRmWQNo172TfwN+S03nXuJwg6JemWZ7IHS3+xXVkvnYy8FltXdLkKAUTyOnZRvQhjoMOQ7obpB4P9ch4fKw1k6xEmZ3F8tPCgjKiPvskpgJVWsctwIfnOKYwz8Hx/FXdFbLL5vZw7/7nhax+Shy8F7dE4uEFkAcK+0tpSDd1fAktUXZ/m+KqZW4QpRa65TTYEMcGCrB1pm/x5IHQqun/EoJWdpkvDiaPx/HEl0bTxFzx+vtugu/HvolsVgj9m0oC5vMOq1lxup1jacDTXDtaa7bh+kUYZ0bIgjgsPkmFhx0/I1xeXI+Jffp7wNd+yJig3dt7g== 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=tqlhhgzAHB9WB0+x2fiCOx6x4OM78w/fE5z5n9T69FA=; b=aUoZmKgsdjqsqiH5ZgI5Ktg2Q1UE2u1DUqIoxoNqCqY7wiVs51cEJGLVJ9Gxs6lSxwVrU41b21RIKg4wdo7ayoc87rxqn6JssLTOUPvQp7VNOuUf4lPoWAevq+3QoaIRTC8jHJ0HvhqCpaTsnvN3Fxlw+IZMLew9zwkZT94aXycVn2AlKCdkKVtFdl1ABiAs+jVsxRAQNjLflKisFn5LhMnOZmU08STXamCsmPp7WDG1SX50j2Akg3nhBAlyfoJKOpnZGPjMEoFrZsPI1OuTmD4Yhf46T2hbKDZAG0V0Y62LYK5N27HqZPdpbwdPUHyiqaSnVDA47hKg6y7P3CqWnw== 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=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tqlhhgzAHB9WB0+x2fiCOx6x4OM78w/fE5z5n9T69FA=; b=VYZpbrBeOLSDnblnYKtr+H/R7AOX3MACh347up87dA9tQ2n8XrGongbHPAH2dUcLmi6lVVpoOhh6DpzV/YtxBB9/hmFE6bb9rguvgV09suwTnz5ToU/jOD/ZODQEpNCXoPS3zhTRjpBQKjM1nNjjreUab1EE0q18NTZzLSDKJKRnamkDhDOm47sqPx8ByDThKygfOYlr7CG7GDa506fToGGIdA8GyM1fgkXcDyxdfdij2OIGd/ehOX9gaZTR7lKhjercPnTYKIYqg47sqK7Y9pF59HoUjsEWPGhugSWnaaXW/ysmdGTDWS5eR5lyT85pFfGBH8co8fMu1cxdw6KfcA== Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::20) by DM8P223MB0383.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.20; Thu, 9 Dec 2021 12:13:06 +0000 Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::9c8d:fc63:9488:9775]) by DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::9c8d:fc63:9488:9775%8]) with mapi id 15.20.4755.025; Thu, 9 Dec 2021 12:13:06 +0000 From: Soft Works To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH v22 22/23] avutil/ass_split: Add parsing of hard-space tags (\h) Thread-Index: AQHX7PYfiR9lD7f2/U63KGJPgf2S1A== Date: Thu, 9 Dec 2021 12:13:06 +0000 Message-ID: References: <05fff8a8e41014ff699b57bd805f0411865328af.1639051681.git.softworkz@hotmail.com> <18ca2f636f4ef69cbd1b146fe2b3384e242bc377.1639051681.git.softworkz@hotmail.com> <3f3d922baa2061dc8a4e4243c2fcd9813e59ebc3.1639051681.git.softworkz@hotmail.com> <36b0675ac77e7856359413d13b3c655cd3f32abc.1639051681.git.softworkz@hotmail.com> <3549fd8493f7ddba0a9c8facc7be023f6d8c3d01.1639051681.git.softworkz@hotmail.com> <7100eefc62a46f3454521f15bb67b699247a6c2e.1639051681.git.softworkz@hotmail.com> <11d7684d824fda57056ea6dea1c8c8e132c982a0.1639051681.git.softworkz@hotmail.com> <32dc31a9ab2bf74e6fc3ddcd58177983cdc3849e.1639051681.git.softworkz@hotmail.com> <71eae8f27929669d9765cda5a49dc0f45c925398.1639051681.git.softworkz@hotmail.com> <9247eeb569a0a9ed82df80e6e1f87e09283c9bcb.1639051681.git.softworkz@hotmail.com> <6058c526bc0c6138feef313eb5fc3ef1a3c550c6.1639051681.git.softworkz@hotmail.com> <072b028e6c6ac795b7e1204fee6dbe79c4df2a34.1639051681.git.softworkz@hotmail.com> <36a99cab3051c9bdd2f6639996ea6d85314f6b74.1639051681.git.softworkz@hotmail.com> In-Reply-To: <36a99cab3051c9bdd2f6639996ea6d85314f6b74.1639051681.git.softworkz@hotmail.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [iLoxQkbeJufzZ44Z+AoCd5NoEULMir7W] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 6220dde1-2213-4538-75db-08d9bb0d41e1 x-ms-traffictypediagnostic: DM8P223MB0383:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: iqfxa5H+tbu5FPUpxlFXesEvzG/SjM/Pvln6Mjgo4lvca2pHMEm+vAJE2QTmeN0yGFHFRUKma9B3uu//+/S5QfqxH44YR5KHEQhOkJz5S6KTK+nKrwJK5cORhwRxYWubvD5vCl3l+bJl2bjXMOE34HsOUzKlku9LX2OUTL5NEo8fDH7iwiA9Bce/KRNHWdkbsBwTBLoSAxmtrEhRs3Bgk9uogvrHTMFU3WoXxPz3z1FGFMOxkFEwQnks4Dq+FvDBh9OKya3UewwhKuix9lDjLILHewMJNLCKMy0nc9G7n+Is5hdoUHXlCwnF9KjSPe12d3GHdCCw4rx6K/jAkV0mjmIdtlXfpnBV2TCIApmUvCLOOLuEhkcI1sGEl5NWflXnHZYdalX99qlDijtzVpu9My9yXIAAMAEO+KWuP7Fqtnkyw7iUvxV0aYbY5vrMmBnDibxcya9X4D96D2mFN8Ju6yywakZjasxppbYzPXSho+m3O4kIjEmNqfW21e7dLkriCSHjfRe6DIuO1M/X4qWqqKKp1LNtWG6lun4LCdqE+Fl9QynZV5dvtjOfZgs38rsruWfNf6sIuw2l2pTYQK/pnDrdIb36cFqoQLFj7RwK1GFjuSozBJ9zwL7Mv4yN0uB2 x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?q?GBvMbM7D+5BquG5Cd91uKpsBwCkO?= =?utf-8?q?er1WIQNRjVK6tW5y19bkPIrC0+1j6HPECUDoAscBiDxdVIAFVpcTxWqRyp56FOz1R?= =?utf-8?q?zgOIMQIVIp/jANyK8cDMafiWtBdL2Exi2WylJfWN88CS+kXcL1alwnRYWOUdXJXC3?= =?utf-8?q?Z/hhxPkwmS6zP9XrIIZGVrhmS9Z0UgrS7iXxbyr+tNvFa5M0+TpDzZm7X2IBeRxx7?= =?utf-8?q?8wUuugxUi0XAD8LF1FAUfEC3XPjGRyLYbR3b5GWCbBhGzRU8VxlgeCKvkls79bt93?= =?utf-8?q?YKM9SBIfH/rKMRMPM/Fivihs+IXrksJ/Fv69f0eqmEFd39BwinAIfFqA3QMDePUcV?= =?utf-8?q?j4nVOiN29Ko7fY7FlRM2UE36kWnUuFs/vlFljYNhu+3+6FFhY3GMNqyq3bitmYhCi?= =?utf-8?q?BD103kvJn2jIf1cR9gV6zP4Al4duLkP+uB/MJxlyJR7DK33C6GVqAgB1b47/y4p2Q?= =?utf-8?q?+G/+9PzkIwQfwT7Xcjio+EZEiK3W3lXaTO119XwdijY+4O3OIsHj8gQQpmCRr6KRL?= =?utf-8?q?oGBs4ZmKKe2fEG7AGXv3vYYrdgospFEB+zjCWrM+h3Pj7UgTYU/VBfCeqiPHbfJDD?= =?utf-8?q?Wl9zt6rHbZr9EIJhmfMUqbSzb/GmBflwyFcOu0PJ9KhoDmbATIcT/IdyLlaVROg2i?= =?utf-8?q?LSmklpzKUkXIBtUZFlttr8M64Y/2LgqjL3raAh0WmjT2A2TxV2XYkay3hZYlfYm21?= =?utf-8?q?e6z51CggjjlFx8/beRRi/iKaGV2J38J9JzPSpRBkp8tw+lIty40UC7+jvWuc+/Jr3?= =?utf-8?q?uICnAhqJ/5InNeHy1f5Y6P6etikaf3iaggJdk7ywUlCUjVAZxI8HN/eddkXi+snXp?= =?utf-8?q?MVj7P9GoZ0djfiCQ1v5jBlOHYyRDEz2htLAFG+LmkWUYaZGQ+NbwMsxcujvolSWa6?= =?utf-8?q?hvwRy8Y3BADAUXBYuopmfhd8Ydgm3w9OpKhnSHHvGDRA=3D=3D?= MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-1ff67.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 6220dde1-2213-4538-75db-08d9bb0d41e1 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Dec 2021 12:13:06.3123 (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: DM8P223MB0383 Subject: [FFmpeg-devel] [PATCH v22 22/23] avutil/ass_split: Add parsing of hard-space tags (\h) 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: HioEzLG/2wrM The \h tag in ASS/SSA is indicating a non-breaking space. See https://github.com/Aegisub/aegisite/blob/master/source/docs/3.2/ASS_Tags.html.md The ass_split implementation is used by almost all text subtitle encoders and it didn't handle this tag. Interestingly, several tests are testing for \h parsing and had incorrect reference data for those tests. The \h tag is specific to ASS and doesn't have any meaning outside of ASS. Still, the reference data for ttmlenc, textenc and webvttenc were full of \h tags even though this tag doesn't have a meaning there. Signed-off-by: softworkz --- libavutil/ass_split.c | 7 +++++++ libavutil/ass_split_internal.h | 1 + tests/ref/fate/mov-mp4-ttml-dfxp | 8 ++++---- tests/ref/fate/mov-mp4-ttml-stpp | 8 ++++---- tests/ref/fate/sub-textenc | 10 +++++----- tests/ref/fate/sub-ttmlenc | 8 ++++---- tests/ref/fate/sub-webvttenc | 10 +++++----- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/libavutil/ass_split.c b/libavutil/ass_split.c index c5963351fc..30512dfc74 100644 --- a/libavutil/ass_split.c +++ b/libavutil/ass_split.c @@ -484,6 +484,7 @@ int avpriv_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *pr while (buf && *buf) { if (text && callbacks->text && (sscanf(buf, "\\%1[nN]", new_line) == 1 || + sscanf(buf, "\\%1[hH]", new_line) == 1 || !strncmp(buf, "{\\", 2))) { callbacks->text(priv, text, text_len); text = NULL; @@ -492,6 +493,12 @@ int avpriv_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *pr if (callbacks->new_line) callbacks->new_line(priv, new_line[0] == 'N'); buf += 2; + } else if (sscanf(buf, "\\%1[hH]", new_line) == 1) { + if (callbacks->hard_space) + callbacks->hard_space(priv); + else if (callbacks->text) + callbacks->text(priv, " ", 1); + buf += 2; } else if (!strncmp(buf, "{\\", 2)) { buf++; while (*buf == '\\') { diff --git a/libavutil/ass_split_internal.h b/libavutil/ass_split_internal.h index 8e8e51115c..d6eaade4a4 100644 --- a/libavutil/ass_split_internal.h +++ b/libavutil/ass_split_internal.h @@ -141,6 +141,7 @@ typedef struct { * @{ */ void (*text)(void *priv, const char *text, int len); + void (*hard_space)(void *priv); void (*new_line)(void *priv, int forced); void (*style)(void *priv, char style, int close); void (*color)(void *priv, unsigned int /* color */, unsigned int color_id); diff --git a/tests/ref/fate/mov-mp4-ttml-dfxp b/tests/ref/fate/mov-mp4-ttml-dfxp index e24b5d618b..e565ffa1f6 100644 --- a/tests/ref/fate/mov-mp4-ttml-dfxp +++ b/tests/ref/fate/mov-mp4-ttml-dfxp @@ -1,9 +1,9 @@ -2e7e01c821c111466e7a2844826b7f6d *tests/data/fate/mov-mp4-ttml-dfxp.mp4 -8519 tests/data/fate/mov-mp4-ttml-dfxp.mp4 +658884e1b789e75c454b25bdf71283c9 *tests/data/fate/mov-mp4-ttml-dfxp.mp4 +8486 tests/data/fate/mov-mp4-ttml-dfxp.mp4 #tb 0: 1/1000 #media_type 0: data #codec_id 0: none -0, 0, 0, 68500, 7866, 0x456c36b7 +0, 0, 0, 68500, 7833, 0x31b22193 { "packets": [ { @@ -15,7 +15,7 @@ "dts_time": "0.000000", "duration": 68500, "duration_time": "68.500000", - "size": "7866", + "size": "7833", "pos": "44", "flags": "K_" } diff --git a/tests/ref/fate/mov-mp4-ttml-stpp b/tests/ref/fate/mov-mp4-ttml-stpp index 77bd23b7bf..f25b5b2d28 100644 --- a/tests/ref/fate/mov-mp4-ttml-stpp +++ b/tests/ref/fate/mov-mp4-ttml-stpp @@ -1,9 +1,9 @@ -cbd2c7ff864a663b0d893deac5a0caec *tests/data/fate/mov-mp4-ttml-stpp.mp4 -8547 tests/data/fate/mov-mp4-ttml-stpp.mp4 +c9570de0ccebc858b0c662a7e449582c *tests/data/fate/mov-mp4-ttml-stpp.mp4 +8514 tests/data/fate/mov-mp4-ttml-stpp.mp4 #tb 0: 1/1000 #media_type 0: data #codec_id 0: none -0, 0, 0, 68500, 7866, 0x456c36b7 +0, 0, 0, 68500, 7833, 0x31b22193 { "packets": [ { @@ -15,7 +15,7 @@ cbd2c7ff864a663b0d893deac5a0caec *tests/data/fate/mov-mp4-ttml-stpp.mp4 "dts_time": "0.000000", "duration": 68500, "duration_time": "68.500000", - "size": "7866", + "size": "7833", "pos": "44", "flags": "K_" } diff --git a/tests/ref/fate/sub-textenc b/tests/ref/fate/sub-textenc index 3ea56b38f0..910ca3d6e3 100644 --- a/tests/ref/fate/sub-textenc +++ b/tests/ref/fate/sub-textenc @@ -160,18 +160,18 @@ but show this: {normal text} \ N is a forced line break \ h is a hard space Normal spaces at the start and at the end of the line are trimmed while hard spaces are not trimmed. -The\hline\hwill\hnever\hbreak\hautomatically\hright\hbefore\hor\hafter\ha\hhard\hspace.\h:-D +The line will never break automatically right before or after a hard space. :-D 31 00:00:54,501 --> 00:00:56,500 -\h\h\h\h\hA (05 hard spaces followed by a letter) + A (05 hard spaces followed by a letter) A (Normal spaces followed by a letter) A (No hard spaces followed by a letter) 32 00:00:56,501 --> 00:00:58,500 -\h\h\h\h\hA (05 hard spaces followed by a letter) + A (05 hard spaces followed by a letter) A (Normal spaces followed by a letter) A (No hard spaces followed by a letter) Show this: \TEST and this: \-) @@ -179,10 +179,10 @@ Show this: \TEST and this: \-) 33 00:00:58,501 --> 00:01:00,500 -A letter followed by 05 hard spaces: A\h\h\h\h\h +A letter followed by 05 hard spaces: A A letter followed by normal spaces: A A letter followed by no hard spaces: A -05 hard spaces between letters: A\h\h\h\h\hA +05 hard spaces between letters: A A 5 normal spaces between letters: A A ^--Forced line break diff --git a/tests/ref/fate/sub-ttmlenc b/tests/ref/fate/sub-ttmlenc index 4df8f8796f..aea09bb31e 100644 --- a/tests/ref/fate/sub-ttmlenc +++ b/tests/ref/fate/sub-ttmlenc @@ -109,16 +109,16 @@ end="00:00:54.500">Hide these tags:
also hide these tags:
but show this: {normal text}


\ N is a forced line break
\ h is a hard space
Normal spaces at the start and at the end of the line are trimmed while hard spaces are not trimmed.
The\hline\hwill\hnever\hbreak\hautomatically\hright\hbefore\hor\hafter\ha\hhard\hspace.\h:-D

+ end="00:01:00.500">
\ N is a forced line break
\ h is a hard space
Normal spaces at the start and at the end of the line are trimmed while hard spaces are not trimmed.
The line will never break automatically right before or after a hard space. :-D


\h\h\h\h\hA (05 hard spaces followed by a letter)
A (Normal spaces followed by a letter)
A (No hard spaces followed by a letter)

+ end="00:00:56.500">
A (05 hard spaces followed by a letter)
A (Normal spaces followed by a letter)
A (No hard spaces followed by a letter)

\h\h\h\h\hA (05 hard spaces followed by a letter)
A (Normal spaces followed by a letter)
A (No hard spaces followed by a letter)
Show this: \TEST and this: \-)

+ end="00:00:58.500"> A (05 hard spaces followed by a letter)
A (Normal spaces followed by a letter)
A (No hard spaces followed by a letter)
Show this: \TEST and this: \-)


A letter followed by 05 hard spaces: A\h\h\h\h\h
A letter followed by normal spaces: A
A letter followed by no hard spaces: A
05 hard spaces between letters: A\h\h\h\h\hA
5 normal spaces between letters: A A

^--Forced line break

+ end="00:01:00.500">
A letter followed by 05 hard spaces: A
A letter followed by normal spaces: A
A letter followed by no hard spaces: A
05 hard spaces between letters: A A
5 normal spaces between letters: A A

^--Forced line break

Both line should be strikethrough,
yes.
Correctly closed tags
should be hidden.

diff --git a/tests/ref/fate/sub-webvttenc b/tests/ref/fate/sub-webvttenc index 45ae0b6131..f4172dcc84 100644 --- a/tests/ref/fate/sub-webvttenc +++ b/tests/ref/fate/sub-webvttenc @@ -132,26 +132,26 @@ but show this: {normal text} \ N is a forced line break \ h is a hard space Normal spaces at the start and at the end of the line are trimmed while hard spaces are not trimmed. -The\hline\hwill\hnever\hbreak\hautomatically\hright\hbefore\hor\hafter\ha\hhard\hspace.\h:-D +The line will never break automatically right before or after a hard space. :-D 00:54.501 --> 00:56.500 -\h\h\h\h\hA (05 hard spaces followed by a letter) + A (05 hard spaces followed by a letter) A (Normal spaces followed by a letter) A (No hard spaces followed by a letter) 00:56.501 --> 00:58.500 -\h\h\h\h\hA (05 hard spaces followed by a letter) + A (05 hard spaces followed by a letter) A (Normal spaces followed by a letter) A (No hard spaces followed by a letter) Show this: \TEST and this: \-) 00:58.501 --> 01:00.500 -A letter followed by 05 hard spaces: A\h\h\h\h\h +A letter followed by 05 hard spaces: A A letter followed by normal spaces: A A letter followed by no hard spaces: A -05 hard spaces between letters: A\h\h\h\h\hA +05 hard spaces between letters: A A 5 normal spaces between letters: A A ^--Forced line break