summaryrefslogtreecommitdiffstats
path: root/options/m_option.c
diff options
context:
space:
mode:
Diffstat (limited to 'options/m_option.c')
-rw-r--r--options/m_option.c168
1 files changed, 58 insertions, 110 deletions
diff --git a/options/m_option.c b/options/m_option.c
index 0acdc55b0a..4ef5481ceb 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -133,14 +133,6 @@ static void copy_opt(const m_option_t *opt, void *dst, const void *src)
#define VAL(x) (*(int *)(x))
-static int clamp_flag(const m_option_t *opt, void *val)
-{
- if (VAL(val) == 0 || VAL(val) == 1)
- return 0;
- VAL(val) = 0;
- return M_OPT_OUT_OF_RANGE;
-}
-
static int parse_flag(struct mp_log *log, const m_option_t *opt,
struct bstr name, struct bstr param, void *dst)
{
@@ -202,7 +194,6 @@ const m_option_type_t m_option_type_flag = {
.print = print_flag,
.copy = copy_opt,
.add = add_flag,
- .clamp = clamp_flag,
.set = flag_set,
.get = flag_get,
};
@@ -243,45 +234,6 @@ const m_option_type_t m_option_type_store = {
.set = store_set,
};
-// Same for float types
-
-#undef VAL
-#define VAL(x) (*(float *)(x))
-
-static int parse_store_float(struct mp_log *log, const m_option_t *opt,
- struct bstr name, struct bstr param, void *dst)
-{
- if (param.len == 0) {
- if (dst)
- VAL(dst) = opt->max;
- return 0;
- } else {
- mp_err(log, "Invalid parameter for %.*s flag: %.*s\n",
- BSTR_P(name), BSTR_P(param));
- return M_OPT_DISALLOW_PARAM;
- }
-}
-
-static int store_float_set(const m_option_t *opt, void *dst, struct mpv_node *src)
-{
- if (src->format != MPV_FORMAT_FLAG)
- return M_OPT_UNKNOWN;
- if (!src->u.flag)
- return M_OPT_INVALID;
- VAL(dst) = opt->max;
- return 1;
-}
-
-const m_option_type_t m_option_type_float_store = {
- // can only be activated
- .name = "Flag",
- .size = sizeof(float),
- .flags = M_OPT_TYPE_OPTIONAL_PARAM,
- .parse = parse_store_float,
- .copy = copy_opt,
- .set = store_float_set,
-};
-
// Integer
#undef VAL
@@ -336,14 +288,6 @@ static int parse_longlong(struct mp_log *log, const m_option_t *opt,
return 1;
}
-static int clamp_int(const m_option_t *opt, void *val)
-{
- long long tmp = *(int *)val;
- int r = clamp_longlong(opt, &tmp);
- *(int *)val = tmp;
- return r;
-}
-
static int clamp_int64(const m_option_t *opt, void *val)
{
long long tmp = *(int64_t *)val;
@@ -475,7 +419,6 @@ const m_option_type_t m_option_type_int = {
.copy = copy_opt,
.add = add_int,
.multiply = multiply_int,
- .clamp = clamp_int,
.set = int_set,
.get = int_get,
};
@@ -488,7 +431,6 @@ const m_option_type_t m_option_type_int64 = {
.copy = copy_opt,
.add = add_int64,
.multiply = multiply_int64,
- .clamp = clamp_int64,
.set = int64_set,
.get = int64_get,
};
@@ -546,21 +488,6 @@ const char *m_opt_choice_str(const struct m_opt_choice_alternatives *choices,
return NULL;
}
-static int clamp_choice(const m_option_t *opt, void *val)
-{
- int v = *(int *)val;
- if ((opt->flags & M_OPT_MIN) && (opt->flags & M_OPT_MAX)) {
- if (v >= opt->min && v <= opt->max)
- return 0;
- }
- ;
- for (struct m_opt_choice_alternatives *alt = opt->priv; alt->name; alt++) {
- if (alt->value == v)
- return 0;
- }
- return M_OPT_INVALID;
-}
-
static int parse_choice(struct mp_log *log, const struct m_option *opt,
struct bstr name, struct bstr param, void *dst)
{
@@ -750,7 +677,6 @@ const struct m_option_type m_option_type_choice = {
.print = print_choice,
.copy = copy_opt,
.add = add_choice,
- .clamp = clamp_choice,
.set = choice_set,
.get = choice_get,
};
@@ -999,7 +925,6 @@ const m_option_type_t m_option_type_double = {
.print = print_double,
.pretty_print = print_double_f3,
.copy = copy_opt,
- .clamp = clamp_double,
.add = add_double,
.multiply = multiply_double,
.set = double_set,
@@ -1009,14 +934,6 @@ const m_option_type_t m_option_type_double = {
#undef VAL
#define VAL(x) (*(float *)(x))
-static int clamp_float(const m_option_t *opt, void *val)
-{
- double tmp = VAL(val);
- int r = clamp_double(opt, &tmp);
- VAL(val) = tmp;
- return r;
-}
-
static int parse_float(struct mp_log *log, const m_option_t *opt,
struct bstr name, struct bstr param, void *dst)
{
@@ -1078,7 +995,30 @@ const m_option_type_t m_option_type_float = {
.copy = copy_opt,
.add = add_float,
.multiply = multiply_float,
- .clamp = clamp_float,
+ .set = float_set,
+ .get = float_get,
+};
+
+static int parse_float_aspect(struct mp_log *log, const m_option_t *opt,
+ struct bstr name, struct bstr param, void *dst)
+{
+ if (bstr_equals0(param, "no")) {
+ if (dst)
+ VAL(dst) = 0.0f;
+ return 1;
+ }
+ return parse_float(log, opt, name, param, dst);
+}
+
+const m_option_type_t m_option_type_aspect = {
+ .name = "Aspect",
+ .size = sizeof(float),
+ .parse = parse_float_aspect,
+ .print = print_float,
+ .pretty_print = print_float_f3,
+ .copy = copy_opt,
+ .add = add_float,
+ .multiply = multiply_float,
.set = float_set,
.get = float_get,
};
@@ -1175,12 +1115,10 @@ static void free_str(void *src)
const m_option_type_t m_option_type_string = {
.name = "String",
.size = sizeof(char *),
- .flags = M_OPT_TYPE_DYNAMIC,
.parse = parse_str,
.print = print_str,
.copy = copy_str,
.free = free_str,
- .clamp = clamp_str,
.set = str_set,
.get = str_get,
};
@@ -1486,7 +1424,7 @@ const m_option_type_t m_option_type_string_list = {
*/
.name = "String list",
.size = sizeof(char **),
- .flags = M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD,
+ .flags = M_OPT_TYPE_ALLOW_WILDCARD,
.parse = parse_str_list,
.print = print_str_list,
.copy = copy_str_list,
@@ -1522,7 +1460,6 @@ static int parse_str_append_list(struct mp_log *log, const m_option_t *opt,
const m_option_type_t m_option_type_string_append_list = {
.name = "String list",
.size = sizeof(char **),
- .flags = M_OPT_TYPE_DYNAMIC,
.parse = parse_str_append_list,
.print = print_str_list,
.copy = copy_str_list,
@@ -1636,7 +1573,6 @@ static int keyvalue_list_get(const m_option_t *opt, void *ta_parent,
const m_option_type_t m_option_type_keyvalue_list = {
.name = "Key/value list",
.size = sizeof(char **),
- .flags = M_OPT_TYPE_DYNAMIC,
.parse = parse_keyvalue_list,
.print = print_keyvalue_list,
.copy = copy_str_list,
@@ -1703,7 +1639,6 @@ static int set_msglevels(const m_option_t *opt, void *dst,
const m_option_type_t m_option_type_msglevels = {
.name = "Output verbosity levels",
.size = sizeof(char **),
- .flags = M_OPT_TYPE_DYNAMIC,
.parse = parse_msglevels,
.print = print_keyvalue_list,
.copy = copy_str_list,
@@ -2169,7 +2104,7 @@ static int parse_imgfmt(struct mp_log *log, const m_option_t *opt,
mp_info(log, " %s", list[i]);
mp_info(log, "\n");
talloc_free(list);
- return M_OPT_EXIT - 1;
+ return M_OPT_EXIT;
}
unsigned int fmt = mp_imgfmt_from_name(param, true);
@@ -2240,7 +2175,7 @@ static int parse_afmt(struct mp_log *log, const m_option_t *opt,
for (int i = 1; i < AF_FORMAT_COUNT; i++)
mp_info(log, " %s", af_fmt_to_str(i));
mp_info(log, "\n");
- return M_OPT_EXIT - 1;
+ return M_OPT_EXIT;
}
int fmt = 0;
@@ -2284,7 +2219,7 @@ static int parse_channels(struct mp_log *log, const m_option_t *opt,
mp_info(log, "\nOther values:\n"
" auto-safe\n");
}
- return M_OPT_EXIT - 1;
+ return M_OPT_EXIT;
}
bool auto_safe = bstr_equals0(param, "auto-safe");
@@ -2466,7 +2401,6 @@ const m_option_type_t m_option_type_time = {
.pretty_print = pretty_print_time,
.copy = copy_opt,
.add = add_double,
- .clamp = clamp_double,
.set = time_set,
.get = time_get,
};
@@ -2714,17 +2648,21 @@ static void copy_obj_settings_list(const m_option_t *opt, void *dst,
// without '=' sets a flag, or whether it's a positional argument.
static int get_obj_param(struct mp_log *log, bstr opt_name, bstr obj_name,
struct m_config *config, bstr name, bstr val,
- int flags, int *nold, bstr *out_name, bstr *out_val)
+ int flags, bool nopos,
+ int *nold, bstr *out_name, bstr *out_val)
{
int r;
- if (!config)
- return 0; // skip
+ if (!config) {
+ *out_name = name; // preserve args for opengl-hq legacy handling
+ *out_val = val;
+ return 1;
+ }
// va.start != NULL => of the form name=val (not positional)
// If it's just "name", and the associated option exists and is a flag,
// don't accept it as positional argument.
- if (val.start || m_config_option_requires_param(config, name) == 0) {
+ if (val.start || m_config_option_requires_param(config, name) == 0 || nopos) {
r = m_config_set_option_ext(config, name, val, flags);
if (r < 0) {
if (r == M_OPT_UNKNOWN) {
@@ -2732,7 +2670,7 @@ static int get_obj_param(struct mp_log *log, bstr opt_name, bstr obj_name,
BSTR_P(opt_name), BSTR_P(obj_name), BSTR_P(name));
return M_OPT_UNKNOWN;
}
- if (r > M_OPT_EXIT)
+ if (r != M_OPT_EXIT)
mp_err(log, "Option %.*s: "
"Error while parsing %.*s parameter %.*s (%.*s)\n",
BSTR_P(opt_name), BSTR_P(obj_name), BSTR_P(name),
@@ -2758,7 +2696,7 @@ static int get_obj_param(struct mp_log *log, bstr opt_name, bstr obj_name,
}
r = m_config_set_option_ext(config, bstr0(opt), val, flags);
if (r < 0) {
- if (r > M_OPT_EXIT)
+ if (r != M_OPT_EXIT)
mp_err(log, "Option %.*s: "
"Error while parsing %.*s parameter %s (%.*s)\n",
BSTR_P(opt_name), BSTR_P(obj_name), opt, BSTR_P(val));
@@ -2780,7 +2718,7 @@ static int get_obj_param(struct mp_log *log, bstr opt_name, bstr obj_name,
// desc is optional.
static int m_obj_parse_sub_config(struct mp_log *log, struct bstr opt_name,
struct bstr name, struct bstr *pstr,
- struct m_config *config, int flags,
+ struct m_config *config, int flags, bool nopos,
struct m_obj_desc *desc, char ***ret)
{
int nold = 0;
@@ -2801,8 +2739,8 @@ static int m_obj_parse_sub_config(struct mp_log *log, struct bstr opt_name,
goto exit;
if (bstr_equals0(fname, "help"))
goto print_help;
- r = get_obj_param(log, opt_name, name, config, fname, fval, flags, &nold,
- &fname, &fval);
+ r = get_obj_param(log, opt_name, name, config, fname, fval, flags,
+ nopos, &nold, &fname, &fval);
if (r < 0)
goto exit;
@@ -2833,12 +2771,12 @@ print_help: ;
if (config) {
if (desc->print_help)
desc->print_help(log);
- m_config_print_option_list(config);
+ m_config_print_option_list(config, "*");
} else {
mp_warn(log, "Option %.*s: item %.*s doesn't exist.\n",
BSTR_P(opt_name), BSTR_P(name));
}
- r = M_OPT_EXIT - 1;
+ r = M_OPT_EXIT;
exit:
free_str_list(&args);
@@ -2857,6 +2795,7 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt,
char **plist = NULL;
struct m_obj_desc desc;
bstr label = {0};
+ bool nopos = list->disallow_positional_parameters;
if (bstr_eatstart0(pstr, "@")) {
if (!bstr_split_tok(*pstr, ":", &label, pstr)) {
@@ -2892,7 +2831,7 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt,
struct m_config *config = m_config_from_obj_desc_noalloc(NULL, log, &desc);
bstr s = bstr0(desc.init_options);
m_obj_parse_sub_config(log, opt, str, &s, config,
- M_SETOPT_CHECK_ONLY, NULL, &plist);
+ M_SETOPT_CHECK_ONLY, nopos, NULL, &plist);
assert(s.len == 0);
talloc_free(config);
}
@@ -2902,7 +2841,7 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt,
if (!skip)
config = m_config_from_obj_desc_noalloc(NULL, log, &desc);
r = m_obj_parse_sub_config(log, opt, str, pstr, config,
- M_SETOPT_CHECK_ONLY, &desc,
+ M_SETOPT_CHECK_ONLY, nopos, &desc,
_ret ? &plist : NULL);
talloc_free(config);
if (r < 0)
@@ -3034,7 +2973,7 @@ static int parse_obj_settings_list(struct mp_log *log, const m_option_t *opt,
}
}
mp_info(log, "\n");
- return M_OPT_EXIT - 1;
+ return M_OPT_EXIT;
}
if (op == OP_CLR) {
@@ -3284,7 +3223,7 @@ static int get_obj_settings_list(const m_option_t *opt, void *ta_parent,
const m_option_type_t m_option_type_obj_settings_list = {
.name = "Object settings list",
.size = sizeof(m_obj_settings_t *),
- .flags = M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD,
+ .flags = M_OPT_TYPE_ALLOW_WILDCARD,
.parse = parse_obj_settings_list,
.print = print_obj_settings_list,
.copy = copy_obj_settings_list,
@@ -3405,7 +3344,6 @@ static int node_get(const m_option_t *opt, void *ta_parent,
const m_option_type_t m_option_type_node = {
.name = "Complex",
.size = sizeof(struct mpv_node),
- .flags = M_OPT_TYPE_DYNAMIC,
.parse = parse_node,
.print = print_node,
.copy = copy_node,
@@ -3421,3 +3359,13 @@ const m_option_type_t m_option_type_alias = {
const m_option_type_t m_option_type_removed = {
.name = "removed",
};
+
+static int parse_dummy(struct mp_log *log, const m_option_t *opt,
+ struct bstr name, struct bstr param, void *dst)
+{
+ return 1;
+}
+const m_option_type_t m_option_type_subopt_legacy = {
+ .name = "legacy suboption",
+ .parse = parse_dummy,
+};