mirror of https://github.com/mpv-player/mpv
options: untangle track range parsing for stream_cdda
Remove the "object settings" based track range parsing (needed by stream_cdda only), and make stream_cdda use CONF_TYPE_INT_PAIR. This makes the -vf parsing code completely independent from other options. A bit of that code was used by the mechanism removed with this commit.
This commit is contained in:
parent
6526162bc0
commit
c6037982fd
|
@ -1863,62 +1863,6 @@ static int get_obj_params(struct bstr opt_name, struct bstr name,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int parse_obj_params(const m_option_t *opt, struct bstr name,
|
||||
struct bstr param, void *dst)
|
||||
{
|
||||
char **opts;
|
||||
int r;
|
||||
m_obj_params_t *p = opt->priv;
|
||||
const m_struct_t *desc;
|
||||
|
||||
// We need the object desc
|
||||
if (!p)
|
||||
return M_OPT_INVALID;
|
||||
|
||||
desc = p->desc;
|
||||
r = get_obj_params(name, bstr0(desc->name), param, desc, p->separator,
|
||||
dst ? &opts : NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (!dst)
|
||||
return 1;
|
||||
if (!opts) // no arguments given
|
||||
return 1;
|
||||
|
||||
for (r = 0; opts[r]; r += 2)
|
||||
m_struct_set(desc, dst, opts[r], bstr0(opts[r + 1]));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
const m_option_type_t m_option_type_obj_params = {
|
||||
.name = "Object params",
|
||||
.parse = parse_obj_params,
|
||||
};
|
||||
|
||||
/// Some predefined types as a definition would be quite lengthy
|
||||
|
||||
/// Span arguments
|
||||
static const m_span_t m_span_params_dflts = {
|
||||
-1, -1
|
||||
};
|
||||
static const m_option_t m_span_params_fields[] = {
|
||||
{"start", M_ST_OFF(m_span_t, start), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL},
|
||||
{"end", M_ST_OFF(m_span_t, end), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL},
|
||||
{ NULL, NULL, 0, 0, 0, 0, NULL }
|
||||
};
|
||||
static const struct m_struct_st m_span_opts = {
|
||||
"m_span",
|
||||
sizeof(m_span_t),
|
||||
&m_span_params_dflts,
|
||||
m_span_params_fields
|
||||
};
|
||||
const m_obj_params_t m_span_params_def = {
|
||||
&m_span_opts,
|
||||
'-'
|
||||
};
|
||||
|
||||
static int parse_obj_settings(struct bstr opt, struct bstr str,
|
||||
const m_obj_list_t *list,
|
||||
m_obj_settings_t **_ret, int ret_n)
|
||||
|
|
|
@ -133,20 +133,6 @@ typedef struct {
|
|||
char separator;
|
||||
} m_obj_params_t;
|
||||
|
||||
// Parse a set of parameters.
|
||||
/** Parameters are separated by the given separator and each one
|
||||
* successively sets a field from the struct. The option priv field
|
||||
* (\ref m_option::priv) must point to a \ref m_obj_params_t.
|
||||
*/
|
||||
extern const m_option_type_t m_option_type_obj_params;
|
||||
|
||||
typedef struct {
|
||||
int start;
|
||||
int end;
|
||||
} m_span_t;
|
||||
// Ready made settings to parse a \ref m_span_t with a start-end syntax.
|
||||
extern const m_obj_params_t m_span_params_def;
|
||||
|
||||
struct m_opt_choice_alternatives {
|
||||
char *name;
|
||||
int value;
|
||||
|
@ -178,12 +164,12 @@ struct m_sub_options {
|
|||
#define CONF_TYPE_IMGFMT (&m_option_type_imgfmt)
|
||||
#define CONF_TYPE_FOURCC (&m_option_type_fourcc)
|
||||
#define CONF_TYPE_AFMT (&m_option_type_afmt)
|
||||
#define CONF_TYPE_SPAN (&m_option_type_span)
|
||||
#define CONF_TYPE_OBJ_SETTINGS_LIST (&m_option_type_obj_settings_list)
|
||||
#define CONF_TYPE_CUSTOM_URL (&m_option_type_custom_url)
|
||||
#define CONF_TYPE_OBJ_PARAMS (&m_option_type_obj_params)
|
||||
#define CONF_TYPE_TIME (&m_option_type_time)
|
||||
#define CONF_TYPE_CHOICE (&m_option_type_choice)
|
||||
#define CONF_TYPE_INT_PAIR (&m_option_type_intpair)
|
||||
|
||||
// Possible option values. Code is allowed to access option data without going
|
||||
// through this union. It serves for self-documentation and to get minimal
|
||||
|
@ -202,7 +188,6 @@ union m_option_value {
|
|||
int imgfmt;
|
||||
unsigned int fourcc;
|
||||
int afmt;
|
||||
m_span_t span;
|
||||
m_obj_settings_t *obj_settings_list;
|
||||
double time;
|
||||
struct m_rel_time rel_time;
|
||||
|
|
|
@ -71,7 +71,7 @@ static struct cdda_params {
|
|||
int toc_offset;
|
||||
int no_skip;
|
||||
char *device;
|
||||
m_span_t span;
|
||||
int span[2];
|
||||
} cdda_dflts = {
|
||||
.search_overlap = -1,
|
||||
};
|
||||
|
@ -91,11 +91,9 @@ static const m_option_t cdda_params_fields[] = {
|
|||
{"noskip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||
{"skip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0, 1, 0, NULL},
|
||||
{"device", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{"span", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0,
|
||||
(void *)&m_span_params_def},
|
||||
{"span", ST_OFF(span), CONF_TYPE_INT_PAIR, 0, 0, 0, NULL},
|
||||
/// For url parsing
|
||||
{"hostname", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0,
|
||||
(void *)&m_span_params_def},
|
||||
{"hostname", ST_OFF(span), CONF_TYPE_INT_PAIR, 0, 0, 0, NULL},
|
||||
{"port", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE, 1, 100, NULL},
|
||||
{"filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{0}
|
||||
|
@ -122,8 +120,7 @@ const m_option_t cdda_opts[] = {
|
|||
{"noskip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||
{"skip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0, 1, 0, NULL},
|
||||
{"device", &cdda_dflts.device, CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{"span", &cdda_dflts.span, CONF_TYPE_OBJ_PARAMS, 0, 0, 0,
|
||||
(void *)&m_span_params_def},
|
||||
{"span", &cdda_dflts.span, CONF_TYPE_INT_PAIR, 0, 0, 0, NULL},
|
||||
{NULL, NULL, 0, 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
|
@ -435,19 +432,19 @@ static int open_cdda(stream_t *st, int m, void *opts, int *file_format)
|
|||
cdda_speed_set(cdd, p->speed);
|
||||
|
||||
last_track = cdda_tracks(cdd);
|
||||
if (p->span.start > last_track)
|
||||
p->span.start = last_track;
|
||||
if (p->span.end < p->span.start)
|
||||
p->span.end = p->span.start;
|
||||
if (p->span.end > last_track)
|
||||
p->span.end = last_track;
|
||||
if (p->span.start)
|
||||
priv->start_sector = cdda_track_firstsector(cdd, p->span.start);
|
||||
if (p->span[0] > last_track)
|
||||
p->span[0] = last_track;
|
||||
if (p->span[1] < p->span[0])
|
||||
p->span[1] = p->span[0];
|
||||
if (p->span[1] > last_track)
|
||||
p->span[1] = last_track;
|
||||
if (p->span[0])
|
||||
priv->start_sector = cdda_track_firstsector(cdd, p->span[0]);
|
||||
else
|
||||
priv->start_sector = cdda_disc_firstsector(cdd);
|
||||
|
||||
if (p->span.end)
|
||||
priv->end_sector = cdda_track_lastsector(cdd, p->span.end);
|
||||
if (p->span[1])
|
||||
priv->end_sector = cdda_track_lastsector(cdd, p->span[1]);
|
||||
else
|
||||
priv->end_sector = cdda_disc_lastsector(cdd);
|
||||
|
||||
|
|
Loading…
Reference in New Issue