summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst7
-rw-r--r--DOCS/man/vf.rst4
-rw-r--r--options/m_option.c28
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);