diff options
Diffstat (limited to 'options')
-rw-r--r-- | options/m_option.h | 232 | ||||
-rw-r--r-- | options/options.c | 1091 |
2 files changed, 651 insertions, 672 deletions
diff --git a/options/m_option.h b/options/m_option.h index 97383237a5..fc48b42bd2 100644 --- a/options/m_option.h +++ b/options/m_option.h @@ -371,6 +371,7 @@ struct m_option { // Float types use [DBL_MIN, DBL_MAX], though by setting min or max to // -/+INFINITY, the range can be extended to INFINITY. (This part is buggy // for "float".) + // Preferably use M_RANGE() to set these fields. // Some types will abuse the min or max field for unrelated things. double min, max; @@ -569,6 +570,9 @@ extern const char m_option_path_separator; (offsetof(type, member) + (0 && MP_EXPECT_TYPE(expected_member_type*, \ &((type*)0)->member))) +#define OPT_TYPED_FIELD(type_, c_type, field) \ + .type = &type_, \ + .offset = MP_CHECKED_OFFSETOF(OPT_BASE_STRUCT, field, c_type) #define OPTION_LIST_SEPARATOR ',' @@ -578,185 +582,147 @@ extern const char m_option_path_separator; #define OPTDEF_FLOAT(f) .defval = (void *)&(const float){f} #define OPTDEF_DOUBLE(d) .defval = (void *)&(const double){d} -#define OPT_GENERAL(ctype, optname, varname, flagv, ...) \ - {.name = optname, .flags = flagv, \ - .offset = MP_CHECKED_OFFSETOF(OPT_BASE_STRUCT, varname, ctype), \ - __VA_ARGS__} +#define M_RANGE(a, b) .min = (a), .max = (b) -#define OPT_GENERAL_NOTYPE(optname, varname, flagv, ...) \ - {.name = optname, .flags = flagv, \ - .offset = offsetof(OPT_BASE_STRUCT, varname), \ - __VA_ARGS__} +#define OPT_BOOL(field) \ + OPT_TYPED_FIELD(m_option_type_bool, bool, field) -#define OPT_HELPER_REMOVEPAREN(...) __VA_ARGS__ +#define OPT_FLAG(field) \ + OPT_TYPED_FIELD(m_option_type_flag, int, field) -#define OPTF_BOOL(field) \ - .type = &m_option_type_bool, \ - .offset = MP_CHECKED_OFFSETOF(OPT_BASE_STRUCT, field, bool), +#define OPT_INT(field) \ + OPT_TYPED_FIELD(m_option_type_int, int, field) -/* The OPT_SOMETHING->OPT_SOMETHING_ kind of redirection exists to - * make the code fully standard-conforming: the C standard requires that - * __VA_ARGS__ has at least one argument (though GCC for example would accept - * 0). Thus the first OPT_SOMETHING is a wrapper which just adds one - * argument to ensure __VA_ARGS__ is not empty when calling the next macro. - */ +#define OPT_INT64(field) \ + OPT_TYPED_FIELD(m_option_type_int64, int64_t, field) + +#define OPT_FLOAT(field) \ + OPT_TYPED_FIELD(m_option_type_float, float, field) -// Note: new code should use OPTF_BOOL instead -#define OPT_FLAG(...) \ - OPT_GENERAL(int, __VA_ARGS__, .type = &m_option_type_flag) +#define OPT_DOUBLE(field) \ + OPT_TYPED_FIELD(m_option_type_double, double, field) -#define OPT_STRINGLIST(...) \ - OPT_GENERAL(char**, __VA_ARGS__, .type = &m_option_type_string_list) +#define OPT_STRING(field) \ + OPT_TYPED_FIELD(m_option_type_string, char*, field) -#define OPT_KEYVALUELIST(...) \ - OPT_GENERAL(char**, __VA_ARGS__, .type = &m_option_type_keyvalue_list) +#define OPT_STRINGLIST(field) \ + OPT_TYPED_FIELD(m_option_type_string_list, char**, field) -#define OPT_PATHLIST(...) \ - OPT_GENERAL(char**, __VA_ARGS__, .type = &m_option_type_string_list,\ - .priv = (void *)&m_option_path_separator) +#define OPT_KEYVALUELIST(field) \ + OPT_TYPED_FIELD(m_option_type_keyvalue_list, char**, field) -#define OPT_INT(...) \ - OPT_GENERAL(int, __VA_ARGS__, .type = &m_option_type_int) +#define OPT_PATHLIST(field) \ + OPT_TYPED_FIELD(m_option_type_string_list, char**, field), \ + .priv = (void *)&m_option_path_separator -#define OPT_INT64(...) \ - OPT_GENERAL(int64_t, __VA_ARGS__, .type = &m_option_type_int64) +#define OPT_TIME(field) \ + OPT_TYPED_FIELD(m_option_type_time, double, field) -#define OPT_RANGE_(ctype, optname, varname, flags, minval, maxval, ...) \ - OPT_GENERAL(ctype, optname, varname, flags, \ - .min = minval, .max = maxval, __VA_ARGS__) +#define OPT_REL_TIME(field) \ + OPT_TYPED_FIELD(m_option_type_rel_time, struct m_rel_time, field) -#define OPT_INTRANGE(...) \ - OPT_RANGE_(int, __VA_ARGS__, .type = &m_option_type_int) +#define OPT_COLOR(field) \ + OPT_TYPED_FIELD(m_option_type_color, struct m_color, field) -#define OPT_FLOATRANGE(...) \ - OPT_RANGE_(float, __VA_ARGS__, .type = &m_option_type_float) +#define OPT_BYTE_SIZE(field) \ + OPT_TYPED_FIELD(m_option_type_byte_size, int64_t, field) -#define OPT_DOUBLERANGE(...) \ - OPT_RANGE_(double, __VA_ARGS__, .type = &m_option_type_double) +#define OPT_GEOMETRY(field) \ + OPT_TYPED_FIELD(m_option_type_geometry, struct m_geometry, field) -#define OPT_FLOAT(...) \ - OPT_GENERAL(float, __VA_ARGS__, .type = &m_option_type_float) +#define OPT_SIZE_BOX(field) \ + OPT_TYPED_FIELD(m_option_type_size_box, struct m_geometry, field) -#define OPT_DOUBLE(...) \ - OPT_GENERAL(double, __VA_ARGS__, .type = &m_option_type_double) +#define OPT_TRACKCHOICE(field) \ + OPT_CHOICE(field, {"no", -2}, {"auto", -1}), \ + M_RANGE(0, 8190) -#define OPT_STRING(...) \ - OPT_GENERAL(char*, __VA_ARGS__, .type = &m_option_type_string) +#define OPT_MSGLEVELS(field) \ + OPT_TYPED_FIELD(m_option_type_msglevels, char **, field) -#define OPT_SETTINGSLIST(optname, varname, flags, objlist, ...) \ - OPT_GENERAL(m_obj_settings_t*, optname, varname, flags, \ - .type = &m_option_type_obj_settings_list, \ - .priv = (void*)MP_EXPECT_TYPE(const struct m_obj_list*, objlist), \ - __VA_ARGS__) +#define OPT_ASPECT(field) \ + OPT_TYPED_FIELD(m_option_type_aspect, float, field) -#define OPT_IMAGEFORMAT(...) \ - OPT_GENERAL(int, __VA_ARGS__, .type = &m_option_type_imgfmt) +#define OPT_IMAGEFORMAT(field) \ + OPT_TYPED_FIELD(m_option_type_imgfmt, int, field) -#define OPT_AUDIOFORMAT(...) \ - OPT_GENERAL(int, __VA_ARGS__, .type = &m_option_type_afmt) +#define OPT_AUDIOFORMAT(field) \ + OPT_TYPED_FIELD(m_option_type_afmt, int, field) // If .min==1, then passing auto is disallowed, but "" is still accepted, and // limit channel list to 1 item. -#define OPT_CHANNELS(...) \ - OPT_GENERAL(struct m_channels, __VA_ARGS__, .type = &m_option_type_channels) - -#define M_CHOICES(choices) \ - .priv = (void *)&(const struct m_opt_choice_alternatives[]){ \ - OPT_HELPER_REMOVEPAREN choices, {NULL}} - -#define OPT_CHOICE(...) \ - OPT_CHOICE_(__VA_ARGS__, .type = &m_option_type_choice) -#define OPT_CHOICE_(optname, varname, flags, choices, ...) \ - OPT_GENERAL(int, optname, varname, flags, M_CHOICES(choices), __VA_ARGS__) -// Variant which takes a pointer to struct m_opt_choice_alternatives directly -#define OPT_CHOICE_C(optname, varname, flags, choices, ...) \ - OPT_GENERAL(int, optname, varname, flags, .priv = (void *) \ - MP_EXPECT_TYPE(const struct m_opt_choice_alternatives*, choices), \ - .type = &m_option_type_choice, __VA_ARGS__) - -#define OPT_FLAGS(...) \ - OPT_CHOICE_(__VA_ARGS__, .type = &m_option_type_flags) +#define OPT_CHANNELS(field) \ + OPT_TYPED_FIELD(m_option_type_channels, struct m_channels, field) -// Union of choices and an int range. The choice values can be included in the -// int range, or be completely separate - both works. -#define OPT_CHOICE_OR_INT_(optname, varname, flags, minval, maxval, choices, ...) \ - OPT_GENERAL(int, optname, varname, flags, \ - .min = minval, .max = maxval, \ - M_CHOICES(choices), __VA_ARGS__) -#define OPT_CHOICE_OR_INT(...) \ - OPT_CHOICE_OR_INT_(__VA_ARGS__, .type = &m_option_type_choice) +#define OPT_STRING_VALIDATE(field, validate_fn) \ + OPT_TYPED_FIELD(m_option_type_string, char*, field), \ + .priv = MP_EXPECT_TYPE(m_opt_string_validate_fn, validate_fn) -#define OPT_TIME(...) \ - OPT_GENERAL(double, __VA_ARGS__, .type = &m_option_type_time) +#define M_CHOICES(...) \ + .priv = (void *)&(const struct m_opt_choice_alternatives[]){ __VA_ARGS__, {0}} -#define OPT_REL_TIME(...) \ - OPT_GENERAL(struct m_rel_time, __VA_ARGS__, .type = &m_option_type_rel_time) - -#define OPT_COLOR(...) \ - OPT_GENERAL(struct m_color, __VA_ARGS__, .type = &m_option_type_color) - -#define OPT_BYTE_SIZE(...) \ - OPT_RANGE_(int64_t, __VA_ARGS__, .type = &m_option_type_byte_size) - -#define OPT_GEOMETRY(...) \ - OPT_GENERAL(struct m_geometry, __VA_ARGS__, .type = &m_option_type_geometry) +// Variant which takes a pointer to struct m_opt_choice_alternatives directly +#define OPT_CHOICE_C(field, choices) \ + OPT_TYPED_FIELD(m_option_type_choice, int, field), \ + .priv = (void *)MP_EXPECT_TYPE(const struct m_opt_choice_alternatives*, choices) -#define OPT_SIZE_BOX(...) \ - OPT_GENERAL(struct m_geometry, __VA_ARGS__, .type = &m_option_type_size_box) +// Variant where you pass a struct m_opt_choice_alternatives initializer +#define OPT_CHOICE(field, ...) \ + OPT_TYPED_FIELD(m_option_type_choice, int, field), \ + M_CHOICES(__VA_ARGS__) -#define OPT_TRACKCHOICE(name, var, ...) \ - OPT_CHOICE_OR_INT(name, var, 0, 0, 8190, ({"no", -2}, {"auto", -1}), \ - ## __VA_ARGS__) +#define OPT_FLAGS(field, ...) \ + OPT_TYPED_FIELD(m_option_type_flags, int, field), \ + M_CHOICES(__VA_ARGS__) -#define OPT_ASPECT(...) \ - OPT_GENERAL(float, __VA_ARGS__, .type = &m_option_type_aspect) +#define OPT_SETTINGSLIST(field, objlist) \ + OPT_TYPED_FIELD(m_option_type_obj_settings_list, m_obj_settings_t*, field), \ + .priv = (void*)MP_EXPECT_TYPE(const struct m_obj_list*, objlist) -#define OPT_STRING_VALIDATE_(optname, varname, flags, validate_fn, ...) \ - OPT_GENERAL(char*, optname, varname, flags, __VA_ARGS__, \ - .priv = MP_EXPECT_TYPE(m_opt_string_validate_fn, validate_fn)) -#define OPT_STRING_VALIDATE(...) \ - OPT_STRING_VALIDATE_(__VA_ARGS__, .type = &m_option_type_string) +#define OPT_FOURCC(field) \ + OPT_TYPED_FIELD(m_option_type_fourcc, int, field) -#define OPT_PRINT(optname, fn) \ - {.name = optname, \ - .flags = M_OPT_NOCFG | M_OPT_PRE_PARSE | M_OPT_NOPROP, \ - .type = &m_option_type_print_fn, \ - .priv = MP_EXPECT_TYPE(m_opt_print_fn, fn), \ - .offset = -1} +#define OPT_CYCLEDIR(field) \ + OPT_TYPED_FIELD(m_option_type_cycle_dir, double, field) // subconf must have the type struct m_sub_options. // All sub-options are prefixed with "name-" and are added to the current // (containing) option list. // If name is "", add the sub-options directly instead. -// varname refers to the field, that must be a pointer to a field described by +// "field" refers to the field, that must be a pointer to a field described by // the subconf struct. -#define OPT_SUBSTRUCT(name, varname, subconf, flagv) \ - OPT_GENERAL_NOTYPE(name, varname, flagv, \ - .type = &m_option_type_subconfig, \ - .priv = (void*)&subconf) +#define OPT_SUBSTRUCT(field, subconf) \ + .offset = offsetof(OPT_BASE_STRUCT, field), \ + .type = &m_option_type_subconfig, .priv = (void*)&subconf + +// Non-fields -// Provide a another name for the option. -#define OPT_ALIAS(optname, newname) \ - {.name = optname, .type = &m_option_type_alias, .priv = newname, \ - .offset = -1} +#define OPT_ALIAS(newname) \ + .type = &m_option_type_alias, .priv = newname, .offset = -1 // If "--optname" was removed, but "--newname" has the same semantics. // It will be redirected, and a warning will be printed on first use. -#define OPT_REPLACED_MSG(optname, newname, msg) \ - {.name = optname, .type = &m_option_type_alias, .priv = newname, \ - .deprecation_message = (msg), .offset = -1} +#define OPT_REPLACED_MSG(newname, msg) \ + .type = &m_option_type_alias, .priv = newname, \ + .deprecation_message = (msg), .offset = -1 // Same, with a generic deprecation message. -#define OPT_REPLACED(optname, newname) OPT_REPLACED_MSG(optname, newname, "") +#define OPT_REPLACED(newname) OPT_REPLACED_MSG(newname, "") // Alias, resolved on the CLI/config file/profile parser level only. -#define OPT_CLI_ALIAS(optname, newname) \ - {.name = optname, .type = &m_option_type_cli_alias, .priv = newname, \ - .flags = M_OPT_NOPROP, .offset = -1} +#define OPT_CLI_ALIAS(newname) \ + .type = &m_option_type_cli_alias, .priv = newname, \ + .flags = M_OPT_NOPROP, .offset = -1 // "--optname" doesn't exist, but inform the user about a replacement with msg. -#define OPT_REMOVED(optname, msg) \ - {.name = optname, .type = &m_option_type_removed, .priv = msg, \ - .deprecation_message = "", .flags = M_OPT_NOPROP, .offset = -1} +#define OPT_REMOVED(msg) \ + .type = &m_option_type_removed, .priv = msg, \ + .deprecation_message = "", .flags = M_OPT_NOPROP, .offset = -1 + +#define OPT_PRINT(fn) \ + .flags = M_OPT_NOCFG | M_OPT_PRE_PARSE | M_OPT_NOPROP, \ + .type = &m_option_type_print_fn, \ + .priv = MP_EXPECT_TYPE(m_opt_print_fn, fn), \ + .offset = -1 #endif /* MPLAYER_M_OPTION_H */ diff --git a/options/options.c b/options/options.c index b237c0b268..f6e1569994 100644 --- a/options/options.c +++ b/options/options.c @@ -106,66 +106,65 @@ static const struct m_sub_options screenshot_conf = { #define OPT_BASE_STRUCT struct mp_vo_opts static const m_option_t mp_vo_opt_list[] = { - OPT_SETTINGSLIST("vo", video_driver_list, 0, &vo_obj_list, ), - OPT_FLAG("taskbar-progress", taskbar_progress, 0), - OPT_FLAG("snap-window", snap_window, 0), - OPT_FLAG("ontop", ontop, 0), - OPT_CHOICE_OR_INT("ontop-level", ontop_level, 0, 0, INT_MAX, - ({"window", -1}, {"system", -2})), - OPT_FLAG("border", border, 0), - OPT_FLAG("fit-border", fit_border, 0), - OPT_FLAG("on-all-workspaces", all_workspaces, 0), - OPT_GEOMETRY("geometry", geometry, 0), - OPT_SIZE_BOX("autofit", autofit, 0), - OPT_SIZE_BOX("autofit-larger", autofit_larger, 0), - OPT_SIZE_BOX("autofit-smaller", autofit_smaller, 0), - OPT_DOUBLE("window-scale", window_scale, 0, .min = 0.001, .max = 100), - OPT_FLAG("window-minimized", window_minimized, 0), - OPT_FLAG("window-maximized", window_maximized, 0), - OPT_FLAG("force-window-position", force_window_position, 0), - OPT_STRING("x11-name", winname, 0), - OPT_FLOATRANGE("monitoraspect", force_monitor_aspect, 0, 0.0, 9.0), - OPT_FLOATRANGE("monitorpixelaspect", monitor_pixel_aspect, 0, 1.0/32.0, 32.0), - {"fullscreen", OPTF_BOOL(fullscreen)}, - OPT_ALIAS("fs", "fullscreen"), - OPT_FLAG("native-keyrepeat", native_keyrepeat, 0), - OPT_FLOATRANGE("panscan", panscan, 0, 0.0, 1.0), - OPT_FLOATRANGE("video-zoom", zoom, 0, -20.0, 20.0), - OPT_FLOATRANGE("video-pan-x", pan_x, 0, -3.0, 3.0), - OPT_FLOATRANGE("video-pan-y", pan_y, 0, -3.0, 3.0), - OPT_FLOATRANGE("video-align-x", align_x, 0, -1.0, 1.0), - OPT_FLOATRANGE("video-align-y", align_y, 0, -1.0, 1.0), - OPT_FLOATRANGE("video-margin-ratio-left", margin_x[0], 0, 0.0, 1.0), - OPT_FLOATRANGE("video-margin-ratio-right", margin_x[1], 0, 0.0, 1.0), - OPT_FLOATRANGE("video-margin-ratio-top", margin_y[0], 0, 0.0, 1.0), - OPT_FLOATRANGE("video-margin-ratio-bottom", margin_y[1], 0, 0.0, 1.0), - OPT_CHOICE("video-unscaled", unscaled, 0, - ({"no", 0}, {"yes", 1}, {"downscale-big", 2})), - OPT_INT64("wid", WinID, 0), - OPT_CHOICE_OR_INT("screen", screen_id, 0, 0, 32, - ({"default", -1})), - OPT_CHOICE_OR_INT("fs-screen", fsscreen_id, 0, 0, 32, - ({"all", -2}, {"current", -1})), - OPT_FLAG("keepaspect", keepaspect, 0), - OPT_FLAG("keepaspect-window", keepaspect_window, 0), - OPT_FLAG("hidpi-window-scale", hidpi_window_scale, 0), - OPT_FLAG("native-fs", native_fs, 0), - OPT_DOUBLE("override-display-fps", override_display_fps, 0, - .min = 0, .max = DBL_MAX), - OPT_DOUBLERANGE("video-timing-offset", timing_offset, 0, 0.0, 1.0), + {"vo", OPT_SETTINGSLIST(video_driver_list, &vo_obj_list)}, + {"taskbar-progress", OPT_FLAG(taskbar_progress)}, + {"snap-window", OPT_FLAG(snap_window)}, + {"ontop", OPT_FLAG(ontop)}, + {"ontop-level", OPT_CHOICE(ontop_level, {"window", -1}, {"system", -2}), + M_RANGE(0, INT_MAX)}, + {"border", OPT_FLAG(border)}, + {"fit-border", OPT_FLAG(fit_border)}, + {"on-all-workspaces", OPT_FLAG(all_workspaces)}, + {"geometry", OPT_GEOMETRY(geometry)}, + {"autofit", OPT_SIZE_BOX(autofit)}, + {"autofit-larger", OPT_SIZE_BOX(autofit_larger)}, + {"autofit-smaller", OPT_SIZE_BOX(autofit_smaller)}, + {"window-scale", OPT_DOUBLE(window_scale), M_RANGE(0.001, 100)}, + {"window-minimized", OPT_FLAG(window_minimized)}, + {"window-maximized", OPT_FLAG(window_maximized)}, + {"force-window-position", OPT_FLAG(force_window_position)}, + {"x11-name", OPT_STRING(winname)}, + {"monitoraspect", OPT_FLOAT(force_monitor_aspect), M_RANGE(0.0, 9.0)}, + {"monitorpixelaspect", OPT_FLOAT(monitor_pixel_aspect), + M_RANGE(1.0/32.0, 32.0)}, + {"fullscreen", OPT_BOOL(fullscreen)}, + {"fs", OPT_ALIAS("fullscreen")}, + {"native-keyrepeat", OPT_FLAG(native_keyrepeat)}, + {"panscan", OPT_FLOAT(panscan), M_RANGE(0.0, 1.0)}, + {"video-zoom", OPT_FLOAT(zoom), M_RANGE(-20.0, 20.0)}, + {"video-pan-x", OPT_FLOAT(pan_x), M_RANGE(-3.0, 3.0)}, + {"video-pan-y", OPT_FLOAT(pan_y), M_RANGE(-3.0, 3.0)}, + {"video-align-x", OPT_FLOAT(align_x), M_RANGE(-1.0, 1.0)}, + {"video-align-y", OPT_FLOAT(align_y), M_RANGE(-1.0, 1.0)}, + {"video-margin-ratio-left", OPT_FLOAT(margin_x[0]), M_RANGE(0.0, 1.0)}, + {"video-margin-ratio-right", OPT_FLOAT(margin_x[1]), M_RANGE(0.0, 1.0)}, + {"video-margin-ratio-top", OPT_FLOAT(margin_y[0]), M_RANGE(0.0, 1.0)}, + {"video-margin-ratio-bottom", OPT_FLOAT(margin_y[1]), M_RANGE(0.0, 1.0)}, + {"video-unscaled", OPT_CHOICE(unscaled, + {"no", 0}, {"yes", 1}, {"downscale-big", 2})}, + {"wid", OPT_INT64(WinID)}, + {"screen", OPT_CHOICE(screen_id, {"default", -1}), M_RANGE(0, 32)}, + {"fs-screen", OPT_CHOICE(fsscreen_id, {"all", -2}, {"current", -1}), + M_RANGE(0, 32)}, + {"keepaspect", OPT_FLAG(keepaspect)}, + {"keepaspect-window", OPT_FLAG(keepaspect_window)}, + {"hidpi-window-scale", OPT_FLAG(hidpi_window_scale)}, + {"native-fs", OPT_FLAG(native_fs)}, + {"override-display-fps", OPT_DOUBLE(override_display_fps), + M_RANGE(0, DBL_MAX)}, + {"video-timing-offset", OPT_DOUBLE(timing_offset), M_RANGE(0.0, 1.0)}, #if HAVE_X11 - OPT_CHOICE("x11-netwm", x11_netwm, 0, - ({"auto", 0}, {"no", -1}, {"yes", 1})), - OPT_CHOICE("x11-bypass-compositor", x11_bypass_compositor, 0, - ({"no", 0}, {"yes", 1}, {"fs-only", 2}, {"never", 3})), + {"x11-netwm", OPT_CHOICE(x11_netwm, {"auto", 0}, {"no", -1}, {"yes", 1})}, + {"x11-bypass-compositor", OPT_CHOICE(x11_bypass_compositor, + {"no", 0}, {"yes", 1}, {"fs-only", 2}, {"never", 3})}, #endif #if HAVE_WIN32_DESKTOP - OPT_STRING("vo-mmcss-profile", mmcss_profile, 0), + {"vo-mmcss-profile", OPT_STRING(mmcss_profile)}, #endif #if HAVE_DRM - OPT_SUBSTRUCT("", drm_opts, drm_conf, 0), + {"", OPT_SUBSTRUCT(drm_opts, drm_conf)}, #endif - OPT_INTRANGE("swapchain-depth", swapchain_depth, 0, 1, 8), + {"swapchain-depth", OPT_INT(swapchain_depth), M_RANGE(1, 8)}, {0} }; @@ -201,11 +200,11 @@ const struct m_sub_options vo_sub_opts = { const struct m_sub_options mp_sub_filter_opts = { .opts = (const struct m_option[]){ - OPT_FLAG("sub-filter-sdh", sub_filter_SDH, 0), - OPT_FLAG("sub-filter-sdh-harder", sub_filter_SDH_harder, 0), - OPT_FLAG("sub-filter-regex-enable", rf_enable, 0), - OPT_STRINGLIST("sub-filter-regex", rf_items, 0), - OPT_FLAG("sub-filter-regex-warn", rf_warn, 0), + {"sub-filter-sdh", OPT_FLAG(sub_filter_SDH)}, + {"sub-filter-sdh-harder", OPT_FLAG(sub_filter_SDH_harder)}, + {"sub-filter-regex-enable", OPT_FLAG(rf_enable)}, + {"sub-filter-regex", OPT_STRINGLIST(rf_items)}, + {"sub-filter-regex-warn", OPT_FLAG(rf_warn)}, {0} }, .size = sizeof(OPT_BASE_STRUCT), @@ -220,43 +219,44 @@ const struct m_sub_options mp_sub_filter_opts = { const struct m_sub_options mp_subtitle_sub_opts = { .opts = (const struct m_option[]){ - OPT_FLOAT("sub-delay", sub_delay, 0), - OPT_FLOAT("sub-fps", sub_fps, 0), - OPT_FLOAT("sub-speed", sub_speed, 0), - OPT_FLAG("sub-visibility", sub_visibility, 0), - OPT_FLAG("sub-forced-only", forced_subs_only, 0), - OPT_FLAG("stretch-dvd-subs", stretch_dvd_subs, 0), - OPT_FLAG("stretch-image-subs-to-screen", stretch_image_subs, 0), - OPT_FLAG("image-subs-video-resolution", image_subs_video_res, 0), - OPT_FLAG("sub-fix-timing", sub_fix_timing, 0), - OPT_INTRANGE("sub-pos", sub_pos, 0, 0, 100), - OPT_FLOATRANGE("sub-gauss", sub_gauss, 0, 0.0, 3.0), - OPT_FLAG("sub-gray", sub_gray, 0), - OPT_FLAG("sub-ass", ass_enabled, 0), - OPT_FLOATRANGE("sub-scale", sub_scale, 0, 0, 100), - OPT_FLOATRANGE("sub-ass-line-spacing", ass_line_spacing, 0, -1000, 1000), - OPT_FLAG("sub-use-margins", sub_use_margins, 0), - OPT_FLAG("sub-ass-force-margins", ass_use_margins, 0), - OPT_FLAG("sub-ass-vsfilter-aspect-compat", ass_vsfilter_aspect_compat, 0), - OPT_CHOICE("sub-ass-vsfilter-color-compat", ass_vsfilter_color_compat, 0, - ({"no", 0}, {"basic", 1}, {"full", 2}, {"force-601", 3})), - OPT_FLAG("sub-ass-vsfilter-blur-compat", ass_vsfilter_blur_compat, 0), - OPT_FLAG("embeddedfonts", use_embedded_fonts, 0), - OPT_STRINGLIST("sub-ass-force-style", ass_force_style_list, 0), - OPT_STRING("sub-ass-styles", ass_styles_file, M_OPT_FILE), - OPT_CHOICE("sub-ass-hinting", ass_hinting, 0, - ({"none", 0}, {"light", 1}, {"normal", 2}, {"native", 3})), - OPT_CHOICE("sub-ass-shaper", ass_shaper, 0, - ({"simple", 0}, {"complex", 1})), - OPT_FLAG("sub-ass-justify", ass_justify, 0), - OPT_CHOICE("sub-ass-override", ass_style_override, 0, - ({"no", 0}, {"yes", 1}, {"force", 3}, {"scale", 4}, {"strip", 5})), - OPT_FLAG("sub-scale-by-window", sub_scale_by_window, 0), - OPT_FLAG("sub-scale-with-window", sub_scale_with_window, 0), - OPT_FLAG("sub-ass-scale-with-window", ass_scale_with_window, 0), - OPT_SUBSTRUCT("sub", sub_style, sub_style_conf, 0), - OPT_FLAG("sub-clear-on-seek", sub_clear_on_seek, 0), - OPT_INTRANGE("teletext-page", teletext_page, 0, 1, 999), + {"sub-delay", OPT_FLOAT(sub_delay)}, + {"sub-fps", OPT_FLOAT(sub_fps)}, + {"sub-speed", OPT_FLOAT(sub_speed)}, + {"sub-visibility", OPT_FLAG(sub_visibility)}, + {"sub-forced-only", OPT_FLAG(forced_subs_only)}, + {"stretch-dvd-subs", OPT_FLAG(stretch_dvd_subs)}, + {"stretch-image-subs-to-screen", OPT_FLAG(stretch_image_subs)}, + {"image-subs-video-resolution", OPT_FLAG(image_subs_video_res)}, + {"sub-fix-timing", OPT_FLAG(sub_fix_timing)}, + {"sub-pos", OPT_INT(sub_pos), M_RANGE(0, 100)}, + {"sub-gauss", OPT_FLOAT(sub_gauss), M_RANGE(0.0, 3.0)}, + {"sub-gray", OPT_FLAG(sub_gray)}, + {"sub-ass", OPT_FLAG(ass_enabled)}, + {"sub-scale", OPT_FLOAT(sub_scale), M_RANGE(0, 100)}, + {"sub-ass-line-spacing", OPT_FLOAT(ass_line_spacing), + M_RANGE(-1000, 1000)}, + {"sub-use-margins", OPT_FLAG(sub_use_margins)}, + {"sub-ass-force-margins", OPT_FLAG(ass_use_margins)}, + {"sub-ass-vsfilter-aspect-compat", OPT_FLAG(ass_vsfilter_aspect_compat)}, + {"sub-ass-vsfilter-color-compat", OPT_CHOICE(ass_vsfilter_color_compat, + {"no", 0}, {"basic", 1}, {"full", 2}, {"force-601", 3})}, + {"sub-ass-vsfilter-blur-compat", OPT_FLAG(ass_vsfilter_blur_compat)}, + {"embeddedfonts", OPT_FLAG(use_embedded_fonts)}, + {"sub-ass-force-style", OPT_STRINGLIST(ass_force_style_list)}, + {"sub-ass-styles", OPT_STRING(ass_styles_file), .flags = M_OPT_FILE}, + {"sub-ass-hinting", OPT_CHOICE(ass_hinting, + {"none", 0}, {"light", 1}, {"normal", 2}, {"native", 3})}, + {"sub-ass-shaper", OPT_CHOICE(ass_shaper, + {"simple", 0}, {"complex", 1})}, + {"sub-ass-justify", OPT_FLAG(ass_justify)}, + {"sub-ass-override", OPT_CHOICE(ass_style_override, + {"no", 0}, {"yes", 1}, {"force", 3}, {"scale", 4}, {"strip", 5})}, + {"sub-scale-by-window", OPT_FLAG(sub_scale_by_window)}, + {"sub-scale-with-window", OPT_FLAG(sub_scale_with_window)}, + {"sub-ass-scale-with-window", OPT_FLAG(ass_scale_with_window)}, + {"sub", OPT_SUBSTRUCT(sub_style, sub_style_conf)}, + {"sub-clear-on-seek", OPT_FLAG(sub_clear_on_seek)}, + {"teletext-page", OPT_INT(teletext_page), M_RANGE(1, 999)}, {0} }, .size = sizeof(OPT_BASE_STRUCT), @@ -287,14 +287,14 @@ const struct m_sub_options mp_subtitle_sub_opts = { const struct m_sub_options mp_osd_render_sub_opts = { .opts = (const struct m_option[]){ - OPT_FLOATRANGE("osd-bar-align-x", osd_bar_align_x, 0, -1.0, +1.0), - OPT_FLOATRANGE("osd-bar-align-y", osd_bar_align_y, 0, -1.0, +1.0), - OPT_FLOATRANGE("osd-bar-w", osd_bar_w, 0, 1, 100), - OPT_FLOATRANGE("osd-bar-h", osd_bar_h, 0, 0.1, 50), - OPT_SUBSTRUCT("osd", osd_style, osd_style_conf, 0), - OPT_FLOATRANGE("osd-scale", osd_scale, 0, 0, 100), - OPT_FLAG("osd-scale-by-window", osd_scale_by_window, 0), - OPT_FLAG("force-rgba-osd-rendering", force_rgba_osd, 0), + {"osd-bar-align-x", OPT_FLOAT(osd_bar_align_x), M_RANGE(-1.0, +1.0)}, + {"osd-bar-align-y", OPT_FLOAT(osd_bar_align_y), M_RANGE(-1.0, +1.0)}, + {"osd-bar-w", OPT_FLOAT(osd_bar_w), M_RANGE(1, 100)}, + {"osd-bar-h", OPT_FLOAT(osd_bar_h), M_RANGE(0.1, 50)}, + {"osd", OPT_SUBSTRUCT(osd_style, osd_style_conf)}, + {"osd-scale", OPT_FLOAT(osd_scale), M_RANGE(0, 100)}, + {"osd-scale-by-window", OPT_FLAG(osd_scale_by_window)}, + {"force-rgba-osd-rendering", OPT_FLAG(force_rgba_osd)}, {0} }, .size = sizeof(OPT_BASE_STRUCT), @@ -313,9 +313,9 @@ const struct m_sub_options mp_osd_render_sub_opts = { const struct m_sub_options dvd_conf = { .opts = (const struct m_option[]){ - OPT_STRING("dvd-device", device, M_OPT_FILE), - OPT_INT("dvd-speed", speed, 0), - OPT_INTRANGE("dvd-angle", angle, 0, 1, 99), + {"dvd-device", OPT_STRING(device), .flags = M_OPT_FILE}, + {"dvd-speed", OPT_INT(speed)}, + {"dvd-angle", OPT_INT(angle), M_RANGE(1, 99)}, {0} }, .size = sizeof(struct dvd_opts), @@ -329,7 +329,7 @@ const struct m_sub_options dvd_conf = { const struct m_sub_options filter_conf = { .opts = (const struct m_option[]){ - OPT_FLAG("deinterlace", deinterlace, 0), + {"deinterlace", OPT_FLAG(deinterlace)}, {0} }, .size = sizeof(OPT_BASE_STRUCT), @@ -356,550 +356,563 @@ static const m_option_t mp_opts[] = { M_OPT_OPTIONAL_PARAM, .offset = -1}, { "list-options", &m_option_type_dummy_flag, CONF_NOCFG | M_OPT_NOPROP, .offset = -1}, - OPT_FLAG("list-properties", property_print_help, CONF_NOCFG | M_OPT_NOPROP), + {"list-properties", OPT_FLAG(property_print_help), + .flags = CONF_NOCFG | M_OPT_NOPROP}, { "help", CONF_TYPE_STRING, CONF_NOCFG | M_OPT_NOPROP | M_OPT_OPTIONAL_PARAM, .offset = -1}, { "h", CONF_TYPE_STRING, CONF_NOCFG | M_OPT_NOPROP | M_OPT_OPTIONAL_PARAM, .offset = -1}, - OPT_PRINT("list-protocols", stream_print_proto_list), - OPT_PRINT("version", print_version), - OPT_PRINT("V", print_version), + {"list-protocols", OPT_PRINT(stream_print_proto_list)}, + {"version", OPT_PRINT(print_version)}, + {"V", OPT_PRINT(print_version)}, #if HAVE_TESTS - OPT_STRING("unittest", test_mode, CONF_NOCFG | M_OPT_NOPROP), + {"unittest", OPT_STRING(test_mode), .flags = CONF_NOCFG | M_OPT_NOPROP}, #endif - OPT_CHOICE("player-operation-mode", operation_mode, - M_OPT_PRE_PARSE | M_OPT_NOPROP, - ({"cplayer", 0}, {"pseudo-gui", 1})), + {"player-operation-mode", OPT_CHOICE(operation_mode, + {"cplayer", 0}, {"pseudo-gui", 1}), + .flags = M_OPT_PRE_PARSE | M_OPT_NOPROP}, - OPT_FLAG("shuffle", shuffle, 0), + {"shuffle", OPT_FLAG(shuffle)}, // ------------------------- common options -------------------- - OPT_FLAG("quiet", quiet, 0), - OPT_FLAG("really-quiet", msg_really_quiet, CONF_PRE_PARSE | UPDATE_TERM), - OPT_FLAG("terminal", use_terminal, CONF_PRE_PARSE | UPDATE_TERM), - OPT_GENERAL(char**, "msg-level", msg_levels, CONF_PRE_PARSE | UPDATE_TERM, - .type = &m_option_type_msglevels), - OPT_STRING("dump-stats", dump_stats, UPDATE_TERM | CONF_PRE_PARSE | M_OPT_FILE), - OPT_FLAG("msg-color", msg_color, CONF_PRE_PARSE | UPDATE_TERM), - OPT_STRING("log-file", log_file, CONF_PRE_PARSE | M_OPT_FILE | UPDATE_TERM), - OPT_FLAG("msg-module", msg_module, UPDATE_TERM), - OPT_FLAG("msg-time", msg_time, UPDATE_TERM), + {"quiet", OPT_FLAG(quiet)}, + {"really-quiet", OPT_FLAG(msg_really_quiet), + .flags = CONF_PRE_PARSE | UPDATE_TERM}, + {"terminal", OPT_FLAG(use_terminal), .flags = CONF_PRE_PARSE | UPDATE_TERM}, + {"msg-level", OPT_MSGLEVELS(msg_levels), + .flags = CONF_PRE_PARSE | UPDATE_TERM}, + {"dump-stats", OPT_STRING(dump_stats), + .flags = UPDATE_TERM | CONF_PRE_PARSE | M_OPT_FILE}, + {"msg-color", OPT_FLAG(msg_color), .flags = CONF_PRE_PARSE | UPDATE_TERM}, + {"log-file", OPT_STRING(log_file), + .flags = CONF_PRE_PARSE | M_OPT_FILE | UPDATE_TERM}, + {"msg-module", OPT_FLAG(msg_module), .flags = UPDATE_TERM}, + {"msg-time", OPT_FLAG(msg_time), .flags = UPDATE_TERM}, #if HAVE_WIN32_DESKTOP - OPT_CHOICE("priority", w32_priority, UPDATE_PRIORITY, - ({"no", 0}, - {"realtime", REALTIME_PRIORITY_CLASS}, - {"high", HIGH_PRIORITY_CLASS}, - {"abovenormal", ABOVE_NORMAL_PRIORITY_CLASS}, - {"normal", NORMAL_PRIORITY_CLASS}, - {"belownormal", BELOW_NORMAL_PRIORITY_CLASS}, - {"idle", IDLE_PRIORITY_CLASS})), + {"priority", OPT_CHOICE(w32_priority, + {"no", 0}, + {"realtime", REALTIME_PRIORITY_CLASS}, + {"high", HIGH_PRIORITY_CLASS}, + {"abovenormal", ABOVE_NORMAL_PRIORITY_CLASS}, + {"normal", NORMAL_PRIORITY_CLASS}, + {"belownormal", BELOW_NORMAL_PRIORITY_CLASS}, + {"idle", IDLE_PRIORITY_CLASS}), + .flags = UPDATE_PRIORITY}, #endif - OPT_FLAG("config", load_config, CONF_PRE_PARSE), - OPT_STRING("config-dir", force_configdir, - CONF_NOCFG | CONF_PRE_PARSE | M_OPT_FILE), - OPT_STRINGLIST("reset-on-next-file", reset_options, 0), + {"config", OPT_FLAG(load_config), .flags = CONF_PRE_PARSE}, + {"config-dir", OPT_STRING(force_configdir), + .flags = CONF_NOCFG | CONF_PRE_PARSE | M_OPT_FILE}, + {"reset-on-next-file", OPT_STRINGLIST(reset_options)}, #if HAVE_LUA || HAVE_JAVASCRIPT - OPT_PATHLIST("scripts", script_files, M_OPT_FILE), - OPT_CLI_ALIAS("script", "scripts-append"), - OPT_KEYVALUELIST("script-opts", script_opts, 0), - OPT_FLAG("load-scripts", auto_load_scripts, 0), + {"scripts", OPT_PATHLIST(script_files), .flags = M_OPT_FILE}, + {"script", OPT_CLI_ALIAS("scripts-append")}, + {"script-opts", OPT_KEYVALUELIST(script_opts)}, + {"load-scripts", OPT_FLAG(auto_load_scripts)}, #endif #if HAVE_LUA - OPT_FLAG("osc", lua_load_osc, UPDATE_BUILTIN_SCRIPTS), - OPT_FLAG("ytdl", lua_load_ytdl, UPDATE_BUILTIN_SCRIPTS), - OPT_STRING("ytdl-format", lua_ytdl_format, 0), - OPT_KEYVALUELIST("ytdl-raw-options", lua_ytdl_raw_options, 0), - OPT_FLAG("load-stats-overlay", lua_load_stats, UPDATE_BUILTIN_SCRIPTS), - OPT_FLAG("load-osd-console", lua_load_console, UPDATE_BUILTIN_SCRIPTS), + {"osc", OPT_FLAG(lua_load_osc), .flags = UPDATE_BUILTIN_SCRIPTS}, + {"ytdl", OPT_FLAG(lua_load_ytdl), .flags = UPDATE_BUILTIN_SCRIPTS}, + {"ytdl-format", OPT_STRING(lua_ytdl_format)}, + {"ytdl-raw-options", OPT_KEYVALUELIST(lua_ytdl_raw_options)}, + {"load-stats-overlay", OPT_FLAG(lua_load_stats), + .flags = UPDATE_BUILTIN_SCRIPTS}, + {"load-osd-console", OPT_FLAG(lua_load_console), + .flags = UPDATE_BUILTIN_SCRIPTS}, #endif // ------------------------- stream options -------------------- #if HAVE_DVDNAV - OPT_SUBSTRUCT("", dvd_opts, dvd_conf, 0), + {"", OPT_SUBSTRUCT(dvd_opts, dvd_conf)}, #endif - OPT_CHOICE_OR_INT("edition", edition_id, 0, 0, 8190, - ({"auto", -1})), + {"edition", OPT_CHOICE(edition_id, {"auto", -1}), M_RANGE(0, 8190)}, #if HAVE_LIBBLURAY - OPT_STRING("bluray-device", bluray_device, M_OPT_FILE), + {"bluray-device", OPT_STRING(bluray_device), .flags = M_OPT_FILE}, #endif /* HAVE_LIBBLURAY */ // ------------------------- demuxer options -------------------- - OPT_CHOICE_OR_INT("frames", play_frames, 0, 0, INT_MAX, ({"all", -1})), + {"frames", OPT_CHOICE(play_frames, {"all", -1}), M_RANGE(0, INT_MAX)}, - OPT_REL_TIME("start", play_start, 0), - OPT_REL_TIME("end", play_end, 0), - OPT_REL_TIME("length", play_length, 0), + {"start", OPT_REL_TIME(play_start)}, + {"end", OPT_REL_TIME(play_end)}, + {"length", OPT_REL_TIME(play_length)}, - OPT_CHOICE("play-dir", play_dir, 0, - ({"forward", 1}, {"+", 1}, {"backward", -1}, {"-", -1})), + {"play-dir", OPT_CHOICE(play_dir, + {"forward", 1}, {"+", 1}, {"backward", -1}, {"-", -1})}, - OPT_FLAG("rebase-start-time", rebase_start_time, 0), + {"rebase-start-time", OPT_FLAG(rebase_start_time)}, - OPT_TIME("ab-loop-a", ab_loop[0], 0, .min = MP_NOPTS_VALUE), - OPT_TIME("ab-loop-b", ab_loop[1], 0, .min = MP_NOPTS_VALUE), - OPT_CHOICE_OR_INT("ab-loop-count", ab_loop_count, 0, 0, INT_MAX, - ({"inf", -1})), + {"ab-loop-a", OPT_TIME(ab_loop[0]), .min = MP_NOPTS_VALUE}, + {"ab-loop-b", OPT_TIME(ab_loop[1]), .min = MP_NOPTS_VALUE}, + {"ab-loop-count", OPT_CHOICE(ab_loop_count, {"inf", -1}), + M_RANGE(0, INT_MAX)}, - OPT_CHOICE_OR_INT("playlist-start", playlist_pos, 0, 0, INT_MAX, - ({"auto", -1}, {"no", -1})), + {"playlist-start", OPT_CHOICE(playlist_pos, {"auto", -1}, {"no", -1}), + M_RANGE(0, INT_MAX)}, - OPT_FLAG("pause", pause, 0), - OPT_CHOICE("keep-open", keep_open, 0, - ({"no", 0}, - {"yes", 1}, - {"always", 2})), - OPT_FLAG("keep-open-pause", keep_open_pause, 0), - OPT_DOUBLE("image-display-duration", image_display_duration, - 0, 0, INFINITY), + {"pause", OPT_FLAG(pause)}, + {"keep-open", OPT_CHOICE(keep_open, + {"no", 0}, + {"yes", 1}, + {"always", 2})}, + {"keep-open-pause", OPT_FLAG(keep_open_pause)}, + {"image-display-duration", OPT_DOUBLE(image_display_duration), + M_RANGE(0, INFINITY)}, - OPT_CHOICE("index", index_mode, 0, ({"default", 1}, {"recreate", 0})), + {"index", OPT_CHOICE(index_mode, {"default", 1}, {"recreate", 0})}, // select audio/video/subtitle stream - OPT_TRACKCHOICE("aid", stream_id[0][STREAM_AUDIO]), - OPT_TRACKCHOICE("vid", stream_id[0][STREAM_VIDEO]), - OPT_TRACKCHOICE("sid", stream_id[0][STREAM_SUB]), - OPT_TRACKCHOICE("secondary-sid", stream_id[1][STREAM_SUB]), - OPT_ALIAS("sub", "sid"), - OPT_ALIAS("video", "vid"), - OPT_ALIAS("audio", "aid"), - OPT_STRINGLIST("alang", stream_lang[STREAM_AUDIO], 0), - OPT_STRINGLIST("slang", stream_lang[STREAM_SUB], 0), - OPT_STRINGLIST("vlang", stream_lang[STREAM_VIDEO], 0), - OPT_FLAG("track-auto-selection", stream_auto_sel, 0), + {"aid", OPT_TRACKCHOICE(stream_id[0][STREAM_AUDIO])}, + {"vid", OPT_TRACKCHOICE(stream_id[0][STREAM_VIDEO])}, + {"sid", OPT_TRACKCHOICE(stream_id[0][STREAM_SUB])}, + {"secondary-sid", OPT_TRACKCHOICE(stream_id[1][STREAM_SUB])}, + {"sub", OPT_ALIAS("sid")}, + {"video", OPT_ALIAS("vid")}, + {"audio", OPT_ALIAS("aid")}, + {"alang", OPT_STRINGLIST(stream_lang[STREAM_AUDIO])}, + {"slang", OPT_STRINGLIST(stream_lang[STREAM_SUB])}, + {"vlang", OPT_STRINGLIST(stream_lang[STREAM_VIDEO])}, + {"track-auto-selection", OPT_FLAG(stream_auto_sel)}, - OPT_STRING("lavfi-complex", lavfi_complex, UPDATE_LAVFI_COMPLEX), + {"lavfi-complex", OPT_STRING(lavfi_complex), .flags = UPDATE_LAVFI_COMPLEX}, - OPT_CHOICE("audio-display", audio_display, 0, - ({"no", 0}, {"attachment", 1})), + {"audio-display", OPT_CHOICE(audio_display, {"no", 0}, {"attachment", 1})}, - OPT_CHOICE_OR_INT("hls-bitrate", hls_bitrate, 0, 0, INT_MAX, - ({"no", -1}, {"min", 0}, {"max", INT_MAX})), + {"hls-bitrate", OPT_CHOICE(hls_bitrate, + {"no", -1}, {"min", 0}, {"max", INT_MAX}), M_RANGE(0, INT_MAX)}, - OPT_STRINGLIST("display-tags", display_tags, 0), + {"display-tags", OPT_STRINGLIST(display_tags)}, #if HAVE_CDDA - OPT_SUBSTRUCT("cdda", stream_cdda_opts, stream_cdda_conf, 0), - OPT_STRING("cdrom-device", cdrom_device, M_OPT_FILE), + {"cdda", OPT_SUBSTRUCT(stream_cdda_opts, stream_cdda_conf)}, + {"cdrom-device", OPT_STRING(cdrom_device), .flags = M_OPT_FILE}, #endif // demuxer.c - select audio/sub file/demuxer - OPT_PATHLIST("audio-files", audio_files, M_OPT_FILE), - OPT_CLI_ALIAS("audio-file", "audio-files-append"), - OPT_STRING("demuxer", demuxer_name, 0), - OPT_STRING("audio-demuxer", audio_demuxer_name, 0), - OPT_STRING("sub-demuxer", sub_demuxer_name, 0), - OPT_FLAG("demuxer-thread", demuxer_thread, 0), - OPT_DOUBLE("demuxer-termination-timeout", demux_termination_timeout, 0), - OPT_FLAG("demuxer-cache-wait", demuxer_cache_wait, 0), - OPT_FLAG("prefetch-playlist", prefetch_open, 0), - OPT_FLAG("cache-pause", cache_pause, 0), - OPT_FLAG("cache-pause-initial", cache_pause_initial, 0), - OPT_FLOAT("cache-pause-wait", cache_pause_wait, 0, .min = 0, .max = DBL_MAX), - - OPT_DOUBLE("mf-fps", mf_fps, 0), - OPT_STRING("mf-type", mf_type, 0), + {"audio-files", OPT_PATHLIST(audio_files), .flags = M_OPT_FILE}, + {"audio-file", OPT_CLI_ALIAS("audio-files-append")}, + {"demuxer", OPT_STRING(demuxer_name)}, + {"audio-demuxer", OPT_STRING(audio_demuxer_name)}, + {"sub-demuxer", OPT_STRING(sub_demuxer_name)}, + {"demuxer-thread", OPT_FLAG(demuxer_thread)}, + {"demuxer-termination-timeout", OPT_DOUBLE(demux_termination_timeout)}, + {"demuxer-cache-wait", OPT_FLAG(demuxer_cache_wait)}, + {"prefetch-playlist", OPT_FLAG(prefetch_open)}, + {"cache-pause", OPT_FLAG(cache_pause)}, + {"cache-pause-initial", OPT_FLAG(cache_pause_initial) |