diff options
Diffstat (limited to 'options')
-rw-r--r-- | options/m_config.c | 56 | ||||
-rw-r--r-- | options/m_config.h | 4 | ||||
-rw-r--r-- | options/m_option.c | 17 | ||||
-rw-r--r-- | options/m_option.h | 13 | ||||
-rw-r--r-- | options/options.c | 7 | ||||
-rw-r--r-- | options/options.h | 3 |
6 files changed, 78 insertions, 22 deletions
diff --git a/options/m_config.c b/options/m_config.c index 19eb61d082..125702c362 100644 --- a/options/m_config.c +++ b/options/m_config.c @@ -257,39 +257,44 @@ struct m_config *m_config_from_obj_desc_noalloc(void *talloc_ctx, return m_config_new(talloc_ctx, log, 0, desc->priv_defaults, desc->options); } -static int m_config_set_obj_params(struct m_config *conf, char **args) +static int m_config_set_obj_params(struct m_config *config, struct mp_log *log, + struct mpv_global *global, char **args) { for (int n = 0; args && args[n * 2 + 0]; n++) { - int r = m_config_set_option(conf, bstr0(args[n * 2 + 0]), - bstr0(args[n * 2 + 1])); - if (r < 0) - return r; + const char *opt = args[n * 2 + 0]; + const char *val = args[n * 2 + 1]; + struct m_config_option *co = m_config_get_co(config, bstr0(opt)); + struct m_config *target = config; + if (co && co->opt->type == &m_option_type_subopt_legacy) { + const char *newopt = co->opt->priv; + assert(global); + target = mp_get_root_config(global); + mp_warn(log, "Using suboptions is deprecated. Use the global '--%s' " + "option instead of '%s' suboption.\n", newopt, opt); + opt = newopt; + } + if (m_config_set_option(target, bstr0(opt), bstr0(val)) < 0) + return -1; } + return 0; } -static int m_config_apply_defaults(struct m_config *config, const char *name, - struct m_obj_settings *defaults) +struct m_config *m_config_from_obj_desc_and_args(void *ta_parent, + struct mp_log *log, struct mpv_global *global, struct m_obj_desc *desc, + const char *name, struct m_obj_settings *defaults, char **args) { - int r = 0; + struct m_config *config = m_config_from_obj_desc(ta_parent, log, desc); + for (int n = 0; defaults && defaults[n].name; n++) { struct m_obj_settings *entry = &defaults[n]; if (name && strcmp(entry->name, name) == 0) { - r = m_config_set_obj_params(config, entry->attribs); - break; + if (m_config_set_obj_params(config, log, global, entry->attribs) < 0) + goto error; } } - return r; -} -struct m_config *m_config_from_obj_desc_and_args(void *ta_parent, - struct mp_log *log, struct mpv_global *global, struct m_obj_desc *desc, - const char *name, struct m_obj_settings *defaults, char **args) -{ - struct m_config *config = m_config_from_obj_desc(ta_parent, log, desc); - if (m_config_apply_defaults(config, name, defaults) < 0) - goto error; - if (m_config_set_obj_params(config, args) < 0) + if (m_config_set_obj_params(config, log, global, args) < 0) goto error; return config; @@ -1143,6 +1148,17 @@ void m_config_notify_change_co(struct m_config *config, mp_msg_update_msglevels(config->global); } +bool m_config_is_in_group(struct m_config *config, + const struct m_sub_options *group, + struct m_config_option *co) +{ + for (int n = 0; n < config->num_groups; n++) { + if (config->groups[n].group == group) + return is_group_included(config, co->group, n); + } + return false; +} + void *mp_get_config_group(void *ta_parent, struct mpv_global *global, const struct m_sub_options *group) { diff --git a/options/m_config.h b/options/m_config.h index e1fbb758b6..7a4c15a08e 100644 --- a/options/m_config.h +++ b/options/m_config.h @@ -208,6 +208,10 @@ int m_config_option_requires_param(struct m_config *config, bstr name); void m_config_notify_change_co(struct m_config *config, struct m_config_option *co); +bool m_config_is_in_group(struct m_config *config, + const struct m_sub_options *group, + struct m_config_option *co); + // Return all (visible) option names as NULL terminated string list. char **m_config_list_options(void *ta_parent, const struct m_config *config); diff --git a/options/m_option.c b/options/m_option.c index a44ca0012d..3cd9a1fb8c 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -2653,8 +2653,11 @@ static int get_obj_param(struct mp_log *log, bstr opt_name, bstr obj_name, { 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, @@ -3356,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, +}; diff --git a/options/m_option.h b/options/m_option.h index 548db319a1..d1426467e7 100644 --- a/options/m_option.h +++ b/options/m_option.h @@ -63,6 +63,7 @@ extern const m_option_type_t m_option_type_size_box; extern const m_option_type_t m_option_type_channels; extern const m_option_type_t m_option_type_aspect; extern const m_option_type_t m_option_type_node; +extern const m_option_type_t m_option_type_subopt_legacy; // Used internally by m_config.c extern const m_option_type_t m_option_type_alias; @@ -694,6 +695,12 @@ extern const char m_option_path_separator; .type = &m_option_type_subconfig, \ .priv = (void*)&subconf) +// Same as above, but for legacy suboption usage, which have no associated +// field (no actual data anywhere). +#define OPT_SUBSTRUCT_LEGACY(optname, subconf) \ + {.name = optname, .offset = -1, .type = &m_option_type_subconfig, \ + .priv = (void*)&subconf} + // Provide a another name for the option. #define OPT_ALIAS(optname, newname) \ {.name = optname, .type = &m_option_type_alias, .priv = newname, \ @@ -710,4 +717,10 @@ extern const char m_option_path_separator; {.name = optname, .type = &m_option_type_removed, .priv = msg, \ .deprecation_message = "", .offset = -1} +// Redirect a suboption (e.g. from --vo) to a global option. The redirection +// is handled as a special case instead of being applied automatically. +#define OPT_SUBOPT_LEGACY(optname, globalname) \ + {.name = optname, .type = &m_option_type_subopt_legacy, .priv = globalname, \ + .offset = -1} + #endif /* MPLAYER_M_OPTION_H */ diff --git a/options/options.c b/options/options.c index bd16a0a025..37e6c9fd61 100644 --- a/options/options.c +++ b/options/options.c @@ -73,6 +73,8 @@ extern const struct m_sub_options ad_lavc_conf; extern const struct m_sub_options input_config; extern const struct m_sub_options encode_config; extern const struct m_sub_options image_writer_conf; +extern const struct m_sub_options gl_video_conf; +extern const struct m_sub_options vo_opengl_conf; extern const struct m_obj_list vf_obj_list; extern const struct m_obj_list af_obj_list; @@ -641,6 +643,11 @@ const m_option_t mp_opts[] = { OPT_SUBSTRUCT("", vo, vo_sub_opts, 0), +#if HAVE_GL + OPT_SUBSTRUCT("", gl_video_opts, gl_video_conf, 0), + OPT_SUBSTRUCT("", vo_opengl_opts, vo_opengl_conf, 0), +#endif + #if HAVE_ENCODING OPT_SUBSTRUCT("", encode_opts, encode_config, 0), #endif diff --git a/options/options.h b/options/options.h index d450675e61..59ed7b4a43 100644 --- a/options/options.h +++ b/options/options.h @@ -331,6 +331,9 @@ typedef struct MPOpts { char *ipc_path; char *input_file; + + struct gl_video_opts *gl_video_opts; + struct vo_opengl_opts *vo_opengl_opts; } MPOpts; extern const m_option_t mp_opts[]; |