diff options
-rw-r--r-- | DOCS/man/input.rst | 21 | ||||
-rw-r--r-- | player/command.c | 12 | ||||
-rw-r--r-- | sub/osd.h | 2 | ||||
-rw-r--r-- | sub/osd_dummy.c | 3 | ||||
-rw-r--r-- | sub/osd_libass.c | 14 |
5 files changed, 48 insertions, 4 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 8afcd846ec..aae4d0a783 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -1298,8 +1298,25 @@ Property list ``osd-sym-cc`` Inserts the current OSD symbol as opaque OSD control code (cc). This makes - sense with the ``show_text`` command only. The control code is - implementation specific and is useless for any other use. + sense only with the ``show_text`` command or options which set OSD messages. + The control code is implementation specific and is useless for anything else. + +``osd-ass-cc`` + ``${osd-ass-cc/0}`` disables escaping ASS sequences of text in OSD, + ``${osd-ass-cc/1}`` enables it again. By default, ASS sequences are + escaped to avoid accidental formatting, and this property can disable + this behavior. Note that the properties return an opaque OSD control + code, which only makes sense for the ``show_text`` command or options + which set OSD messages. + + .. admonition:: Example + + --osd-status-msg='This is ${osd-ass-cc/0}{\\b1}bold text' + + Any ASS override tags as understood by libass can be used. + + Note that you need to escape the ``\`` character, because the string is + processed for C escape sequences before passing it to the OSD code. ``options/<name>`` (RW) Read-only access to value of option ``--<name>``. Most options can be diff --git a/player/command.c b/player/command.c index 8c2856c360..5a523663e8 100644 --- a/player/command.c +++ b/player/command.c @@ -2229,6 +2229,17 @@ static int mp_property_osd_sym(void *ctx, struct m_property *prop, return m_property_strdup_ro(action, arg, temp); } +static int mp_property_osd_ass(void *ctx, struct m_property *prop, + int action, void *arg) +{ + struct m_sub_property props[] = { + {"0", SUB_PROP_STR(osd_ass_0)}, + {"1", SUB_PROP_STR(osd_ass_1)}, + {0} + }; + return m_property_read_sub(props, action, arg); +} + /// Video fps (RO) static int mp_property_fps(void *ctx, struct m_property *prop, int action, void *arg) @@ -2816,6 +2827,7 @@ static const struct m_property mp_properties[] = { {"osd-par", mp_property_osd_par}, {"osd-sym-cc", mp_property_osd_sym}, + {"osd-ass-cc", mp_property_osd_ass}, // Subs {"sid", mp_property_sub}, @@ -219,6 +219,8 @@ void osd_destroy_backend(struct osd_state *osd); // doesn't need locking void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function); +extern const char *osd_ass_0; +extern const char *osd_ass_1; // defined in backend, but locks if required void osd_object_get_resolution(struct osd_state *osd, int obj, diff --git a/sub/osd_dummy.c b/sub/osd_dummy.c index 6fc78ab368..b9178e1925 100644 --- a/sub/osd_dummy.c +++ b/sub/osd_dummy.c @@ -6,6 +6,9 @@ #include "talloc.h" #include "osd.h" +const char *osd_ass_0 = ""; +const char *osd_ass_1 = ""; + void osd_init_backend(struct osd_state *osd) { } diff --git a/sub/osd_libass.c b/sub/osd_libass.c index 1fea27ced6..03d5040dbf 100644 --- a/sub/osd_libass.c +++ b/sub/osd_libass.c @@ -159,8 +159,13 @@ void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function) snprintf(buffer, buffer_size, "\xFF%c", osd_function); } +// Same trick as above: never valid UTF-8, so we expect it's free for use. +const char *osd_ass_0 = "\xFD"; +const char *osd_ass_1 = "\xFE"; + static void mangle_ass(bstr *dst, const char *in) { + bool escape_ass = true; while (*in) { // As used by osd_get_function_sym(). if (in[0] == '\xFF' && in[1]) { @@ -170,11 +175,16 @@ static void mangle_ass(bstr *dst, const char *in) in += 2; continue; } - if (*in == '{') + if (*in == '\xFD' || *in == '\xFE') { + escape_ass = *in == '\xFE'; + in += 1; + continue; + } + if (escape_ass && *in == '{') bstr_xappend(NULL, dst, bstr0("\\")); bstr_xappend(NULL, dst, (bstr){(char *)in, 1}); // Break ASS escapes with U+2060 WORD JOINER - if (*in == '\\') + if (escape_ass && *in == '\\') mp_append_utf8_bstr(NULL, dst, 0x2060); in++; } |