diff mbox series

[FFmpeg-devel,v3,2/3] lavc/libaribcaption.c: add MSZ characters related options

Message ID 20231017112159.199755-3-aimingoff@pc.nifty.jp
State New
Headers show
Series [FFmpeg-devel,v2] lavc/libaribcaption.c: add MSZ characters related options | expand

Checks

Context Check Description
andriy/configure_x86 warning Failed to apply patch
yinshiyou/configure_loongarch64 warning Failed to apply patch

Commit Message

TADANO Tokumei Oct. 17, 2023, 11:21 a.m. UTC
This patch add MSZ (Middle Size; half width) characters related
options.

* add `-replace_msz_japanese` option introduced in version 1.0.1
  of libaribcaption.
* add `-replace_msz_glyph` option introduced in version 1.1.0
  of libaribcaption.

If specified fonts contain half-width glyphs (e.g., BIZ UDGothic),
it make better rendering with `-replace_msz_ascii false` and
`-replace_msz_japanese false` option for bitmap sub_type.

Signed-off-by: TADANO Tokumei <aimingoff@pc.nifty.jp>
---
 configure                   |  2 +-
 doc/decoders.texi           | 16 ++++++++++++++++
 libavcodec/libaribcaption.c | 10 ++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/configure b/configure
index d203177a74..2fb827e1fb 100755
--- a/configure
+++ b/configure
@@ -6679,7 +6679,7 @@  enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_co
 enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
                                { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
                                die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
-enabled libaribcaption    && require_pkg_config libaribcaption "libaribcaption >= 0.1.0" "aribcaption/aribcaption.h" aribcc_context_alloc
+enabled libaribcaption    && require_pkg_config libaribcaption "libaribcaption >= 1.1.1" "aribcaption/aribcaption.h" aribcc_context_alloc
 enabled lv2               && require_pkg_config lv2 lilv-0 "lilv/lilv.h" lilv_world_new
 enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
 enabled libass            && require_pkg_config libass "libass >= 0.11.0" ass/ass.h ass_library_init
diff --git a/doc/decoders.texi b/doc/decoders.texi
index 09b8314dd2..36c3404475 100644
--- a/doc/decoders.texi
+++ b/doc/decoders.texi
@@ -459,6 +459,22 @@  Specify whether to render replaced DRCS characters as Unicode characters.
 
 The default is @var{true}.
 
+@item -replace_msz_japanese @var{boolean}
+Specify whether to replace some MSZ (Middle Size; half width) fullwidth
+japanese special characters with halfwidth ones.
+
+The default is @var{true}.
+
+@item -replace_msz_glyph @var{boolean}
+Specify whether to replace MSZ (Middle Size; half width) characters
+with halfwidth glyphs if the fonts supports it.
+This option works under FreeType or DirectWrite renderer
+with Adobe-Japan1 compliant fonts.
+e.g., IBM Plex Sans JP, Morisawa BIZ UDGothic, Morisawa BIZ UDMincho,
+Yu Gothic, Yu Mincho, and Meiryo.
+
+The default is @var{true}.
+
 @item -canvas_size @var{image_size}
 Specify the resolution of the canvas to render subtitles to; usually, this
 should be frame size of input video.
diff --git a/libavcodec/libaribcaption.c b/libavcodec/libaribcaption.c
index be3328c5c9..74822586dc 100644
--- a/libavcodec/libaribcaption.c
+++ b/libavcodec/libaribcaption.c
@@ -76,6 +76,8 @@  typedef struct ARIBCaptionContext {
     int ignore_ruby;
     float stroke_width;
     int replace_drcs;
+    int replace_msz_japanese;
+    int replace_msz_glyph;
 
     int64_t pts;
     AVRational time_base;
@@ -1005,6 +1007,8 @@  static int aribcaption_init(AVCodecContext *avctx)
     }
     aribcc_decoder_set_replace_msz_fullwidth_ascii(ctx->decoder,
                                                    ctx->replace_fullwidth_ascii);
+    aribcc_decoder_set_replace_msz_fullwidth_japanese(ctx->decoder,
+                                                   ctx->replace_msz_japanese);
 
     /* Similar behavior as ffmpeg tool to set canvas size */
     if (ctx->canvas_width > 0 && ctx->canvas_height > 0 &&
@@ -1057,6 +1061,8 @@  static int aribcaption_init(AVCodecContext *avctx)
         aribcc_renderer_set_force_no_background(ctx->renderer, ctx->ignore_background);
         aribcc_renderer_set_force_no_ruby(ctx->renderer, ctx->ignore_ruby);
         aribcc_renderer_set_stroke_width(ctx->renderer, ctx->stroke_width);
+        aribcc_renderer_set_replace_msz_halfwidth_glyph(ctx->renderer,
+                                                        ctx->replace_msz_glyph);
         if (ctx->font) {
             int is_nomem = 0;
             size_t count = 0;
@@ -1144,6 +1150,10 @@  static const AVOption options[] = {
       OFFSET(stroke_width), AV_OPT_TYPE_FLOAT, { .dbl = 1.5 }, 0.0, 3.0, SD },
     { "replace_drcs", "replace known DRCS [bitmap]",
       OFFSET(replace_drcs), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, SD },
+    { "replace_msz_japanese", "replace MSZ fullwidth Japanese with halfwidth [ass, bitmap]",
+      OFFSET(replace_msz_japanese), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, SD },
+    { "replace_msz_glyph", "replace MSZ characters with halfwidth glyphs [bitmap]",
+      OFFSET(replace_msz_glyph), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, SD },
     {"canvas_size", "set input video size (WxH or abbreviation) [bitmap]",
       OFFSET(canvas_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, INT_MAX, SD },
     { NULL }