From patchwork Thu Jul 7 22:45:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Raymond Cheng X-Patchwork-Id: 36706 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp5196042pzh; Thu, 7 Jul 2022 15:45:54 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uP1shC8caJl1GHn0grKyu2BT0Tly49o+dIcoe9JlDdT5BMMwvcekShqTE4jmd8lAdlJdrC X-Received: by 2002:a17:907:271b:b0:72a:72bb:6f47 with SMTP id w27-20020a170907271b00b0072a72bb6f47mr420062ejk.634.1657233954223; Thu, 07 Jul 2022 15:45:54 -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 k21-20020a17090646d500b00722e82edf14si2275265ejs.14.2022.07.07.15.45.30; Thu, 07 Jul 2022 15:45:54 -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=@hotmail.com header.s=selector1 header.b=aEdcZzE5; 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 1198A68B900; Fri, 8 Jul 2022 01:45:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11olkn2037.outbound.protection.outlook.com [40.92.18.37]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 77CE068B900 for ; Fri, 8 Jul 2022 01:45:19 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QSAcNvYAE6SRGb8bshDsp5ZMRTS8k8n5pc2DOUEeqqj8tnXg0g1XsAmRL2DA01jdcsk033xaoVd+mLW88LWKcCSVf8kCk+vTatcKzQVmL+u4S/nGqyy28ASoubJoRNnELL3uQk4m63Hvunpg03hip4y9iIpscchI6n0FKYj1nz3aPaNWeCeJLNTfKZqhd3lec2MSUdOPtxfeioEEEL+v9QaLQwI2sMF3m+eTbvmBfW/dlEwsQwo/gLK4xFFPdRwExn+y3jZyQv9NJD9EDZ2TtTR4Qq47lq3+tD+PRd2ewzkrdMJAKLuZOaJ5zv2JvP2t+YLzoXiQvj3w/J4SUSEM4A== 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=X6myIO4ZRZMMv6hXsD/vwYjMndES+xs8jSHTepeZ3v8=; b=eHtOR9HQGr/FXsyspQGcrwYbZ5dHNVcHsDVjamUia51RSfE8DUBAuCP29HlXTpNCPRlXzLZi1m8A3dQkzoh8FcPVlgLzKoZcHD0AwtBWr8W+EUfwjZKTeOFx0nTjqJEb5I66xg/OCLdNd9c0nhsPJYPAyNIZBXFprfPTEg3AEwsYYbrSURUfP+KVBnxsjKQ0Ji+0OEPxDBy0O6AbcH8FTPcktthjsjvzEOoKnTZWCKwirUIKdXPMRW/bjvr9AbLAsiblq83cyoutQgmL1vW2s/4gxJRtu6BhjW1xpKwGfOGh1xec+L19TIYiE7amGOwz/ytm8+swhxe0SmxbaAgqnA== 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=X6myIO4ZRZMMv6hXsD/vwYjMndES+xs8jSHTepeZ3v8=; b=aEdcZzE5QO+pD5ecVkvGbkkEHMtsBnEtRqSQ7j/rqP80+FWOo0pL53BAdBFtOdKMlV7PuoA6E+2K8sz+EulDv1ol2hcPe0Yu/H53iaac51CW8Hf8ikQTwP9E38XfMYdPlI38AogY7OQC6oJWLrVdIiMnx1iREtK3GPZihw8f9UfnZfCm7apV5wAFMSoXEcjBmeyrTPPW2blxissIIbPZbROaKenN6ZlYbqM/9clmFadBECfLQDT09lbjozE5USqnKYYJJIUgONUDmhL3Qt16rpVHuVZ0MvWfZFsksSTyJkqHo+O6FP41jOl+/FajeGQzGr6dWikQ/li4aTktGS9FnQ== Received: from PH0PR13MB5921.namprd13.prod.outlook.com (2603:10b6:510:164::14) by BN6PR13MB0962.namprd13.prod.outlook.com (2603:10b6:404:20::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.16; Thu, 7 Jul 2022 22:45:15 +0000 Received: from PH0PR13MB5921.namprd13.prod.outlook.com ([fe80::a0f7:d887:29be:1ac2]) by PH0PR13MB5921.namprd13.prod.outlook.com ([fe80::a0f7:d887:29be:1ac2%5]) with mapi id 15.20.5417.013; Thu, 7 Jul 2022 22:45:15 +0000 From: Raymond Cheng To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH] avfilter/drawtext: Support bidirectional metadata in drawtext filter Thread-Index: AdiRPFeHtPnuBHGBRK67ha6e+do/UQ== Date: Thu, 7 Jul 2022 22:45:14 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ActionId=058e6da0-177b-47bf-9f3b-be175586141c; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ContentBits=0; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=true; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Method=Standard; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=Internal; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2022-07-07T22:40:10Z; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [gAz0FY0vnkXRSqbKDop42qjp2L3yYbxu3ixmy+1VOIM=] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e5d05f0e-0b24-4c0e-8d73-08da606a5bdc x-ms-exchange-slblob-mailprops: S/btQ8cKWiTg+J2w2IFOyzMKDPZ6G0Q1ND39DhOZagtOESEzdO17VQzR7XW2G1gdrDLcJT8AJ5oGO1wfzIiTzvyTLo/smWrAKurO9I4VeDb8dBMV8e2HyKXgaMHM+EfFptjeUPqHof+wZOofRS0B30WC1VeZXGJfR5zD3CBhdJOD5KTNZG1E0+ksmN/Km7DtQL2Mpb+JeS+PyA+/3fd6ZlBR+uL3+DlfLsI7RyXkyeGVtWUAnQV1LKRQtm2lc32tz4EJb5Ev4zKu3QglMftX5tj8AttN6k4eMxmzJH20CvJqzYZ+iu34cnnJQxbFfw6/TziG1kzdCyZsNIhl3mcfj9uEJPPM4T3UzxF3YuAhpsesNuDQyqtZRL3tFCxRb02nyVC0+Adad3AQmSLNgFe2odP8wZbkCsW0aqxbNfwZuF4CFGaoeSavEwoDX6/Lu2egDKE8W0tcAaLhBoqZr5/xj/cR6Pg5o1agUuXcB+gVEHkwngAJ0IsCftlMzZsJKaHWPSaVtm/8dtUoAEhsMrMT1+Ss5Gnw9T19i0EgqdVmkv1eArTxXt31cOcEEOBskW0iLmXfis96C0eli6w9LL7TqNKuaTQRH+bfAvN1qQIg6nrnYVW2lnIfEEg7Jd2Q1egrwJbHErIZsSJ4kN2Bl9sD41/U1CwNDdx7Rof8ht+X5yq7oitRsACwSu/YfEV/0YaJbqIVlXH0HfnroULgGJ9QwEkMCyOrtUaigGOLp3lwPRNk886DsOmWZ5cFC/+Z3v5nf3IUsxA8IWw= x-ms-traffictypediagnostic: BN6PR13MB0962:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: BnMBWyRFR2BRaU/2xb0TNOB5acBRzUFLxl6ha9qAESh8NqQChhFfgYEr7A8+xYJULUJwo+WB1v4wAIrodhfszTVQ4sLiUZEUtge5kD/gxO230e1RdsEn5qiyhUoiBPyjwCPXy2qYiF4z1qYqH4sXJClpw5u5IrJEwSEGv19nu0VuZNdA0gp9apEkRd2+4BrDCsv+w51MqFiF1cXigPyB3cIxNlXz1d03qYUKW2jgEh9RMSoHdT4RVMe9qSwM6LJIFGCzmwYf9NT4vOy+CLhNrfuLGm58lT7ZYTwRwav0IX5tIGwNDjg6H+Gn09VXJ3Cx+phVMqWBcwZZjp3+pcKBFUPYra9/q0Qr4BZok1K2sdPApADjx5gu3KTo7bETkjtJA7sw4CeUxss/coGJoAlHKXccLCMd7sFaPPrfC7XK7Z/ppUMr4fms2Qh8z1GTAnvcEPYtyJYsrBJQQo9vAYSnwU5FyAFVbDL7PsdQA8vYh8mfGQdCyeSVs3TR6ix0iTAf0H3oWm4TNK6BmYkwRyAKqmWvqUIQZD9t2vKUULVXuUPspsU+ABX1sXZ9M7sUY9P5O9ThOLk8RbSqfTTzlLScWqj2dCdmukNz+i/84zrBBS02jHSYRplanFHgeL1JEppBEyQmo2d+Dpdff7BO/mzv7LImVeebLtDNDZvuRiSnndDaYIvhwoEzcORZS0zOKAUaJr2545OhSw7G7TNRh79+Fg== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?q?lIcAhDAnFMiiDZp5sOLQpRXMy1R/?= =?utf-8?q?rcKm/BVXR1ZAl42BOQLYqNKr7eTs+pr+xhmlgf8SePFfXDIRgu/OOLD5bUSG9vyqe?= =?utf-8?q?LcsrwFm+rpE6uSvTvPg6j7Z0YQyr4F/wNPMfaMQ0Ax/p6X/thRCW1ELKNyaz4IB9Z?= =?utf-8?q?mi58hyemC0m2wwZgUNf4Ar4WooT6AeNmZlcPP95bUPTQ9LhIB+kR25oRxc7rAHqbF?= =?utf-8?q?9Un2pfS4eqFoRpL3fg/eKvfqNrZaYqk8XjCQGSiEJaWU65/OY8EDEy4DxU/z2n+JT?= =?utf-8?q?UUEQSTNeIvIH90HQWpMew5qH2kFPRJhDRlH19ueYdmIvOvcoEuiHd1MXCmT8LP27E?= =?utf-8?q?UXFBAf+sQxcRGXC1xp/ms2N2EPKgtLQcdk1Y7pCbyE78zy0UZg6OBRTRNrF0/kKcz?= =?utf-8?q?nws09TKfZu/83CDfOxLw50AjufAq7XEiv7vbNh8XFslK0UxCRKI6+QSqUpWC3/r42?= =?utf-8?q?8YtCRzKkYG+Zi8wLpqzCZxUtTTO6P0qWe4sjRqUR1BapaUOzKHDbo8as34RS1zyJF?= =?utf-8?q?PSTfcw2jTEOdFi80XJ7HwAKWaUB/IPSB+VBQ/BDJioigk8LJcaXKqEMz2Y9xpVOMz?= =?utf-8?q?xs1JCTdSBOhgb958+pPrRWXxEUcr6o3fbEKVgvgjlAO3A+igGvDvBzCfG/9ZvL08b?= =?utf-8?q?t5YtCBdcylDKAN1Bm9MEwFcHDTqoFEBHdZDwQn6dW7HnjIbjioQnKLGehgwVE94Fn?= =?utf-8?q?K18lrJQ5Fgd5t2V3OcGOjzqlOvbtpCRE46INbOrfFTcSE+IzYorDCs6MBI1MCcvTM?= =?utf-8?q?M8cp2B801yysIIiAPfSJYkmb/fNiqOIMf+K5bPhCtewofBPU7BgpSEXZ3LucIOvmM?= =?utf-8?q?3/Tl+F9dnErosU4CH57g+nrGIYvlSkePWPi5BUHyQtzt8G2im5xooy2gY/GeGE92c?= =?utf-8?q?Rsgaat5yO+g9AbnFkPeA1XyJZq8XXDiI8fF5mKMcbIHlKDjFVCG8sKF5mdJkSsdzx?= =?utf-8?q?ljbPE22RkG1B+Dy7v2n+BJI3zohDMHKd0oec3jFbywsUpPEsqzmLqd7bRJ0UJxzbY?= =?utf-8?q?6rgITAtCHIV1dq8W2+eA0n/d8bjZMA+Mk+e9cB08YDsi3UiX+OkuTzhTZpCG6Rn6n?= =?utf-8?q?Ha21jqcS9yAW31X5PQDYdFCTXB4iZWo4dKXMrt3D4aQ5IrkL6J9nnQfNj5yRKRKC0?= =?utf-8?q?jCz9IOZITkDjmM+E3XXMIgTjq6m7GGo1ROF7yt6fJ9C3MYWWAEW7SIr6TEpINvVeo?= =?utf-8?q?5o0bZqIggnCmFmP9xtuM1L6v1WedL+JWDbVGGsg=3D=3D?= MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-4778-2-msonline-outlook-da780.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PH0PR13MB5921.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: e5d05f0e-0b24-4c0e-8d73-08da606a5bdc X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Jul 2022 22:45:15.0014 (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: BN6PR13MB0962 Subject: [FFmpeg-devel] [PATCH] avfilter/drawtext: Support bidirectional metadata in drawtext filter 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: 2ywVQT1vGHCI The drawtext filter supports static bidi text via a function called shape_text(). Fixed so that it calls shape_text() when rendering non-static text from metadata (so that bidi text is rendered properly). As an example, "Hello world" is "مرحبا بالعالم" in Arabic. The following command line worked just fine before, and still works after this change: ffmpeg -i input -vf drawtext=fontsize=30:x=30:y=30:fontcolor=yellow:text='مرحبا بالعالم' out.mp4 However, this command line did NOT work: ffmpeg -i input -vf metadata=mode=add:key=transcription:value='مرحبا بالعالم',drawtext=fontsize=30:x=30:y=30:fontcolor=yellow:text="'From metadata\: %{metadata\:transcription}'" out.mp4 This commit fixes it so that this second command line now works. NOTE that the above command lines are for example only. They render the proper text, but improperly justified (left-justified instead of right-justified). For one-line transcriptions, this is easily fixed by replacing x=30 with x=\(700-tw\). Two-line transcriptions do not have a simple solution. Signed-off-by: Raymond Cheng --- libavfilter/vf_drawtext.c | 57 +++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 20 deletions(-) -- 2.34.1 diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index feb6898848..9e4a63b7fd 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -608,7 +608,7 @@ static int load_textfile(AVFilterContext *ctx) } #if CONFIG_LIBFRIBIDI -static int shape_text(AVFilterContext *ctx) +static int shape_text_arg(AVFilterContext *ctx, char **ppText) { DrawTextContext *s = ctx->priv; uint8_t *tmp; @@ -625,12 +625,15 @@ static int shape_text(AVFilterContext *ctx) FriBidiCharType *bidi_types = NULL; FriBidiStrIndex i,j; - len = strlen(s->text); + if (!s->text_shaping) + return 0; // Do nothing + + len = strlen(*ppText); if (!(unicodestr = av_malloc_array(len, sizeof(*unicodestr)))) { goto out; } len = fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, - s->text, len, unicodestr); + *ppText, len, unicodestr); bidi_types = av_malloc_array(len, sizeof(*bidi_types)); if (!bidi_types) { @@ -676,14 +679,14 @@ static int shape_text(AVFilterContext *ctx) unicodestr[j++] = unicodestr[i]; len = j; - if (!(tmp = av_realloc(s->text, (len * 4 + 1) * sizeof(*s->text)))) { + if (!(tmp = av_realloc(*ppText, (len * 4 + 1) * sizeof(**ppText)))) { /* Use len * 4, as a unicode character can be up to 4 bytes in UTF-8 */ goto out; } - s->text = tmp; + *ppText = tmp; len = fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, - unicodestr, len, s->text); + unicodestr, len, *ppText); ret = 0; out: @@ -693,8 +696,19 @@ out: av_free(bidi_types); return ret; } +#else +static int shape_text_arg(AVFilterContext *ctx, char **ppText) +{ + return 0; +} #endif +static int shape_text(AVFilterContext *ctx) +{ + DrawTextContext *s = ctx->priv; + return shape_text_arg(ctx, (char **)&s->text); +} + static enum AVFrameSideDataType text_source_string_parse(const char *text_source_string) { av_assert0(text_source_string); @@ -771,11 +785,8 @@ static av_cold int init(AVFilterContext *ctx) return AVERROR(EINVAL); } -#if CONFIG_LIBFRIBIDI - if (s->text_shaping) - if ((err = shape_text(ctx)) < 0) - return err; -#endif + if ((err = shape_text(ctx)) < 0) + return err; if ((err = FT_Init_FreeType(&(s->library)))) { av_log(ctx, AV_LOG_ERROR, @@ -1034,11 +1045,19 @@ static int func_metadata(AVFilterContext *ctx, AVBPrint *bp, { DrawTextContext *s = ctx->priv; AVDictionaryEntry *e = av_dict_get(s->metadata, argv[0], NULL, 0); + int err; + + if (e && e->value) { + if ((err = shape_text_arg(ctx, &e->value)) < 0) + return err; - if (e && e->value) av_bprintf(bp, "%s", e->value); - else if (argc >= 2) + } else if (argc >= 2) { + if ((err = shape_text_arg(ctx, &argv[1])) < 0) + return err; + av_bprintf(bp, "%s", argv[1]); + } return 0; } @@ -1634,13 +1653,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) av_frame_free(&frame); return ret; } -#if CONFIG_LIBFRIBIDI - if (s->text_shaping) - if ((ret = shape_text(ctx)) < 0) { - av_frame_free(&frame); - return ret; - } -#endif + + if ((ret = shape_text(ctx)) < 0) { + av_frame_free(&frame); + return ret; + } } s->var_values[VAR_N] = inlink->frame_count_out + s->start_number;