diff options
Diffstat (limited to 'options/m_option.c')
-rw-r--r-- | options/m_option.c | 168 |
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, +}; |