summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst21
-rw-r--r--player/command.c12
-rw-r--r--sub/osd.h2
-rw-r--r--sub/osd_dummy.c3
-rw-r--r--sub/osd_libass.c14
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},
diff --git a/sub/osd.h b/sub/osd.h
index 2a5bf71b05..2662e2b67f 100644
--- a/sub/osd.h
+++ b/sub/osd.h
@@ -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++;
}