Commit bbc5adfb authored by Michael Niedermayer's avatar Michael Niedermayer

avutil/opt: Fix parsing regression with constants starting with numbers

Fixes parsing "3dnow"

Found-by: jamrial
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent a6132579
...@@ -206,44 +206,47 @@ static int set_string_number(void *obj, void *target_obj, const AVOption *o, con ...@@ -206,44 +206,47 @@ static int set_string_number(void *obj, void *target_obj, const AVOption *o, con
} }
{ {
const AVOption *o_named; const AVOption *o_named = av_opt_find(target_obj, buf, o->unit, 0, 0);
int res; int res;
int ci = 0; int ci = 0;
double const_values[64]; double const_values[64];
const char * const_names[64]; const char * const_names[64];
if (o_named && o_named->type == AV_OPT_TYPE_CONST)
if (o->unit) { d = DEFAULT_NUMVAL(o_named);
for (o_named = NULL; o_named = av_opt_next(target_obj, o_named); ) { else {
if (o_named->type == AV_OPT_TYPE_CONST && if (o->unit) {
o_named->unit && for (o_named = NULL; o_named = av_opt_next(target_obj, o_named); ) {
!strcmp(o_named->unit, o->unit)) { if (o_named->type == AV_OPT_TYPE_CONST &&
if (ci + 6 >= FF_ARRAY_ELEMS(const_values)) { o_named->unit &&
av_log(obj, AV_LOG_ERROR, "const_values array too small for %s\n", o->unit); !strcmp(o_named->unit, o->unit)) {
return AVERROR_PATCHWELCOME; if (ci + 6 >= FF_ARRAY_ELEMS(const_values)) {
av_log(obj, AV_LOG_ERROR, "const_values array too small for %s\n", o->unit);
return AVERROR_PATCHWELCOME;
}
const_names [ci ] = o_named->name;
const_values[ci++] = DEFAULT_NUMVAL(o_named);
} }
const_names [ci ] = o_named->name;
const_values[ci++] = DEFAULT_NUMVAL(o_named);
} }
} }
} const_names [ci ] = "default";
const_names [ci ] = "default"; const_values[ci++] = DEFAULT_NUMVAL(o);
const_values[ci++] = DEFAULT_NUMVAL(o); const_names [ci ] = "max";
const_names [ci ] = "max"; const_values[ci++] = o->max;
const_values[ci++] = o->max; const_names [ci ] = "min";
const_names [ci ] = "min"; const_values[ci++] = o->min;
const_values[ci++] = o->min; const_names [ci ] = "none";
const_names [ci ] = "none"; const_values[ci++] = 0;
const_values[ci++] = 0; const_names [ci ] = "all";
const_names [ci ] = "all"; const_values[ci++] = ~0;
const_values[ci++] = ~0; const_names [ci] = NULL;
const_names [ci] = NULL; const_values[ci] = 0;
const_values[ci] = 0;
res = av_expr_parse_and_eval(&d, i ? buf : val, const_names,
res = av_expr_parse_and_eval(&d, i ? buf : val, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
const_values, NULL, NULL, NULL, NULL, NULL, 0, obj); if (res < 0) {
if (res < 0) { av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val); return res;
return res; }
} }
} }
if (o->type == AV_OPT_TYPE_FLAGS) { if (o->type == AV_OPT_TYPE_FLAGS) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment