summaryrefslogtreecommitdiffstats
path: root/options
diff options
context:
space:
mode:
Diffstat (limited to 'options')
-rw-r--r--options/m_option.h232
-rw-r--r--options/options.c1091
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)