diff options
-rw-r--r-- | DOCS/man/input.rst | 7 | ||||
-rw-r--r-- | DOCS/man/vf.rst | 4 | ||||
-rw-r--r-- | options/m_option.c | 28 |
3 files changed, 31 insertions, 8 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 12193843ff..984b8db7d6 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -452,8 +452,9 @@ Input Commands that are Possibly Subject to Change (If several filters are passed to the command, this is done for each filter.) - A special variant is combining this with labels, and using ``@name:!`` - as filter entry. This toggles the enable/disable flag. + A special variant is combining this with labels, and using ``@name`` + without filter name and parameters as filter entry. This toggles the + enable/disable flag. del Remove the given filters from the video chain. Unlike in the other @@ -497,7 +498,7 @@ Input Commands that are Possibly Subject to Change name for this filter entry. The ``!`` before the filter name disables the filter by default. Everything after this is the normal filter name and the filter parameters. - - Add ``a vf toggle @deband:!`` to ``input.conf``. This toggles the + - Add ``a vf toggle @deband`` to ``input.conf``. This toggles the "disabled" flag for the filter identified with ``deband``. ``cycle-values ["!reverse"] <property> "<value1>" "<value2>" ...`` diff --git a/DOCS/man/vf.rst b/DOCS/man/vf.rst index a3f7ee6dab..e61b758af5 100644 --- a/DOCS/man/vf.rst +++ b/DOCS/man/vf.rst @@ -24,6 +24,10 @@ syntax is: ``["@"<label-name>":"] ["!"] <filter-name> [ "=" <filter-parameter-list> ]`` + or for the special "toggle" syntax (see ``vf`` command): + + ``"@"<label-name>`` + and the ``filter-parameter-list``: ``<filter-parameter> | <filter-parameter> "," <filter-parameter-list>`` diff --git a/options/m_option.c b/options/m_option.c index 796677696a..a30f89d18d 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -2762,15 +2762,31 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op, int r; char **plist = NULL; struct m_obj_desc desc; + bstr str = {0}; bstr label = {0}; bool nopos = list->disallow_positional_parameters; bool enabled = true; if (bstr_eatstart0(pstr, "@")) { - if (!bstr_split_tok(*pstr, ":", &label, pstr)) { + bstr rest; + if (!bstr_split_tok(*pstr, ":", &label, &rest)) { + // "@labelname" is the special enable/disable toggle syntax + if (op == OP_TOGGLE) { + int idx = bstrspn(*pstr, NAMECH); + label = bstr_splice(*pstr, 0, idx); + if (label.len) { + *pstr = bstr_cut(*pstr, idx); + goto done; + } + } mp_err(log, "Option %.*s: ':' expected after label.\n", BSTR_P(opt)); return M_OPT_INVALID; } + *pstr = rest; + if (label.len == 0) { + mp_err(log, "Option %.*s: label name expected.\n", BSTR_P(opt)); + return M_OPT_INVALID; + } } if (list->allow_disable_entries && bstr_eatstart0(pstr, "!")) @@ -2778,9 +2794,11 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op, bool has_param = false; int idx = bstrspn(*pstr, NAMECH); - bstr str = bstr_splice(*pstr, 0, idx); - if (str.len == 0 && !enabled && label.len && op == OP_TOGGLE) - goto done; // "@labelname:!" is the special enable/disable toggle syntax + str = bstr_splice(*pstr, 0, idx); + if (!str.len) { + mp_err(log, "Option %.*s: filter name expected.\n", BSTR_P(opt)); + return M_OPT_INVALID; + } *pstr = bstr_cut(*pstr, idx); // video filters use "=", VOs use ":" if (bstr_eatstart0(pstr, "=") || bstr_eatstart0(pstr, ":")) @@ -3026,7 +3044,7 @@ static int parse_obj_settings_list(struct mp_log *log, const m_option_t *opt, talloc_free(res); } else if (op == OP_TOGGLE) { for (int n = 0; res && res[n].name; n++) { - if (!res[n].enabled && !res[n].name[0]) { + if (res[n].label && !res[n].name[0]) { // Toggle enable/disable special case. int found = obj_settings_list_find_by_label0(list, res[n].label); |