From f24611980cab484148e5f50ea0916ba1a7e1ccb6 Mon Sep 17 00:00:00 2001 From: llyyr Date: Mon, 14 Apr 2025 07:08:26 +0530 Subject: [PATCH] sub/osd: add osd-shaper and set it to simple by default This is a change in default for libass with harfbuzz enabled, previously it would choose the best available shaper. Harfbuzz isn't really needed for mpv's OSD and it comes with a significant performance penalty, so use simple instead --- DOCS/interface-changes/osd-cache-opts.txt | 1 + DOCS/man/options.rst | 4 ++++ options/options.c | 1 + options/options.h | 1 + sub/osd_libass.c | 1 + 5 files changed, 8 insertions(+) diff --git a/DOCS/interface-changes/osd-cache-opts.txt b/DOCS/interface-changes/osd-cache-opts.txt index 3b82453e25..acfab38395 100644 --- a/DOCS/interface-changes/osd-cache-opts.txt +++ b/DOCS/interface-changes/osd-cache-opts.txt @@ -3,3 +3,4 @@ add `--osd-glyph-limit` add `--osd-bitmap-max-size` add `--sub-glyph-limit` add `--sub-bitmap-max-size` +add `--osd-shaper` diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index e051700fbb..112867f211 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -4814,6 +4814,10 @@ OSD Set the delay for automatic pruning of events from memory in libass. Disabled by default. See also ``--sub-ass-prune-delay``. +``--osd-shaper=`` + Set the text layout engine used by libass for the OSD. Default: simple. + See also ``--sub-shaper`` + Screenshot ---------- diff --git a/options/options.c b/options/options.c index cfa790d2fd..4ec4ad6e9a 100644 --- a/options/options.c +++ b/options/options.c @@ -414,6 +414,7 @@ const struct m_sub_options mp_osd_render_sub_opts = { {"osd-prune-delay", OPT_DOUBLE(osd_ass_prune_delay), M_RANGE(-1.0, 10000.0)}, {"osd-glyph-limit", OPT_INT(osd_glyph_limit)}, {"osd-bitmap-max-size", OPT_INT(osd_bitmap_max_size)}, + {"osd-shaper", OPT_CHOICE(osd_shaper, {"simple", 0}, {"complex", 1})}, {0} }, .size = sizeof(OPT_BASE_STRUCT), diff --git a/options/options.h b/options/options.h index faaa711814..3fd01545fd 100644 --- a/options/options.h +++ b/options/options.h @@ -151,6 +151,7 @@ struct mp_osd_render_opts { double osd_ass_prune_delay; int osd_glyph_limit; int osd_bitmap_max_size; + int osd_shaper; }; typedef struct MPOpts { diff --git a/sub/osd_libass.c b/sub/osd_libass.c index 0131d138d4..126426c692 100644 --- a/sub/osd_libass.c +++ b/sub/osd_libass.c @@ -128,6 +128,7 @@ static void create_ass_track(struct osd_state *osd, struct osd_object *obj, track->WrapStyle = 1; // end-of-line wrapping instead of smart wrapping track->Kerning = true; track->ScaledBorderAndShadow = true; + ass_set_shaper(ass->render, opts->osd_shaper); #if LIBASS_VERSION >= 0x01600010 ass_track_set_feature(track, ASS_FEATURE_WRAP_UNICODE, 1); #endif