49 if (!strcmp(o->
name, name) && (!unit || (o->
unit && !strcmp(o->
unit, unit))) && (o->
flags & mask) == flags)
56 #if FF_API_OLD_AVOPTIONS
66 if (!last && class->option && class->option[0].
name)
68 if (last && last[1].
name)
93 if (o->
max*den < num*intnum || o->
min*den > num*intnum) {
132 if (c >=
'0' && c <=
'9')
return c -
'0';
133 if (c >=
'a' && c <=
'f')
return c -
'a' + 10;
134 if (c >=
'A' && c <=
'F')
return c -
'A' + 10;
140 int *lendst = (
int *)(dst + 1);
142 int len = strlen(val);
157 if (a < 0 || b < 0) {
161 *ptr++ = (a << 4) | b;
176 #define DEFAULT_NUMVAL(opt) ((opt->type == AV_OPT_TYPE_INT64 || \
177 opt->type == AV_OPT_TYPE_CONST || \
178 opt->type == AV_OPT_TYPE_FLAGS || \
179 opt->type == AV_OPT_TYPE_INT) ? \
180 opt->default_val.i64 : opt->default_val.dbl)
184 int ret = 0, notfirst = 0;
193 if (*val ==
'+' || *val ==
'-') {
200 for (; i <
sizeof(buf) - 1 && val[i] && val[i] !=
'+' && val[i] !=
'-'; i++)
209 else if (!strcmp(buf,
"max" )) d = o->
max;
210 else if (!strcmp(buf,
"min" )) d = o->
min;
211 else if (!strcmp(buf,
"none" )) d = 0;
212 else if (!strcmp(buf,
"all" )) d = ~0;
214 int res =
av_expr_parse_and_eval(&d, buf,
const_names,
const_values,
NULL,
NULL,
NULL,
NULL,
NULL, 0, obj);
223 if (cmd ==
'+') d = intnum | (int64_t)d;
224 else if (cmd ==
'-') d = intnum &~(int64_t)d;
227 if (cmd ==
'+') d = notfirst*num*intnum/den + d;
228 else if (cmd ==
'-') d = notfirst*num*intnum/den - d;
242 #if FF_API_OLD_AVOPTIONS
255 void *
dst, *target_obj;
257 if (!o || !target_obj)
275 if (!val || !strcmp(val,
"none")) {
276 *(
int *)dst = *((
int *)dst + 1) = 0;
281 av_log(obj,
AV_LOG_ERROR,
"Unable to parse option value \"%s\" as image size\n", val);
284 if (!val || !strcmp(val,
"none")) {
290 ret = strtol(val, &tail, 0);
292 av_log(obj,
AV_LOG_ERROR,
"Unable to parse option value \"%s\" as pixel format\n", val);
300 if (!val || !strcmp(val,
"none")) {
306 ret = strtol(val, &tail, 0);
308 av_log(obj,
AV_LOG_ERROR,
"Unable to parse option value \"%s\" as sample format\n", val);
321 #define OPT_EVAL_NUMBER(name, opttype, vartype)\
322 int av_opt_eval_ ## name(void *obj, const AVOption *o, const char *val, vartype *name ## _out)\
324 if (!o || o->type != opttype)\
325 return AVERROR(EINVAL);\
326 return set_string_number(obj, o, val, name ## _out);\
336 static
int set_number(
void *obj, const
char *
name,
double num,
int den, int64_t intnum,
339 void *
dst, *target_obj;
342 if (!o || !target_obj)
349 #if FF_API_OLD_AVOPTIONS
377 return set_number(obj, name, 1, 1, val, search_flags);
382 return set_number(obj, name, val, 1, 1, search_flags);
398 if (!o || !target_obj)
409 lendst = (
int *)(dst + 1);
414 memcpy(ptr, val, len);
424 if (!o || !target_obj)
428 "The value set by option '%s' is not an image size.\n", o->
name);
433 "Invalid negative size value %dx%d for size '%s'\n", w, h, o->
name);
437 *(
int *)(((
uint8_t *)target_obj+
sizeof(int)) + o->
offset) = h;
446 search_flags, &target_obj);
450 if (!o || !target_obj)
452 if (o->
type != type) {
454 "The value set by option '%s' is not a %s format", name, desc);
458 #if LIBAVUTIL_VERSION_MAJOR < 53
459 if (class->version && class->version <
AV_VERSION_INT(52, 11, 100)) {
468 if (fmt < min || fmt > max) {
470 "Value %d for parameter '%s' out of %s format range [%d - %d]\n",
471 fmt, name, desc, min, max);
488 #if FF_API_OLD_AVOPTIONS
506 if (o_out) *o_out= o;
519 if (len >= (buf_len + 1)/2)
return NULL;
521 for (i = 0; i <
len; i++)
snprintf(buf + i*2, 3,
"%02X", bin[i]);
523 default:
return NULL;
531 void *
dst, *target_obj;
558 if ((uint64_t)len*2 + 1 > INT_MAX)
563 for (i = 0; i <
len; i++)
564 snprintf(*out_val + i*2, 3,
"%02X", bin[i]);
567 ret =
snprintf(buf,
sizeof(buf),
"%dx%d", ((
int *)dst)[0], ((
int *)dst)[1]);
579 if (ret >=
sizeof(buf))
588 void *
dst, *target_obj;
590 if (!o || !target_obj)
595 if (o_out) *o_out= o;
604 #if FF_API_OLD_AVOPTIONS
611 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
613 return num*intnum/den;
622 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
624 if (num == 1.0 && (
int)intnum == intnum)
627 return av_d2q(num*intnum/den, 1<<24);
636 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
638 return num*intnum/den;
648 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
650 *out_val = num*intnum/den;
660 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
662 *out_val = num*intnum/den;
672 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
675 if (num == 1.0 && (
int)intnum == intnum)
678 *out_val =
av_d2q(num*intnum/den, 1<<24);
684 void *
dst, *target_obj;
686 if (!o || !target_obj)
690 "The value for option '%s' is not an image size.\n", name);
695 if (w_out) *w_out = *(
int *)dst;
696 if (h_out) *h_out = *((
int *)dst+1);
700 static int get_format(
void *obj,
const char *
name,
int search_flags,
int *out_fmt,
703 void *
dst, *target_obj;
705 if (!o || !target_obj)
707 if (o->
type != type) {
709 "The value for option '%s' is not a %s format.\n", desc, name);
714 *out_fmt = *(
int *)dst;
744 av_log(av_log_obj, level,
"INT_MAX");
745 }
else if (d == INT_MIN) {
746 av_log(av_log_obj, level,
"INT_MIN");
747 }
else if (d == (
double)INT64_MAX) {
748 av_log(av_log_obj, level,
"I64_MAX");
749 }
else if (d == INT64_MIN) {
750 av_log(av_log_obj, level,
"I64_MIN");
751 }
else if (d == FLT_MAX) {
752 av_log(av_log_obj, level,
"FLT_MAX");
753 }
else if (d == FLT_MIN) {
754 av_log(av_log_obj, level,
"FLT_MIN");
756 av_log(av_log_obj, level,
"%g", d);
760 static void opt_list(
void *obj,
void *av_log_obj,
const char *unit,
761 int req_flags,
int rej_flags)
768 if (!(opt->
flags & req_flags) || (opt->
flags & rej_flags))
856 opt_list(obj, av_log_obj, opt->
unit, req_flags, rej_flags);
861 int av_opt_show2(
void *obj,
void *av_log_obj,
int req_flags,
int rej_flags)
875 #if FF_API_OLD_AVOPTIONS
885 #if FF_API_OLD_AVOPTIONS
886 if ((opt->flags & mask) !=
flags)
901 val = opt->default_val.dbl;
907 val =
av_d2q(opt->default_val.dbl, INT_MAX);
913 av_opt_set(s, opt->name, opt->default_val.str, 0);
916 #if LIBAVUTIL_VERSION_MAJOR < 53
917 if (class->version && class->version <
AV_VERSION_INT(52, 10, 100))
918 av_opt_set(s, opt->name, opt->default_val.str, 0);
924 #if LIBAVUTIL_VERSION_MAJOR < 53
925 if (class->version && class->version <
AV_VERSION_INT(52, 10, 100))
926 av_opt_set(s, opt->name, opt->default_val.str, 0);
935 av_log(s,
AV_LOG_DEBUG,
"AVOption type %d of option %s not implemented yet\n", opt->type, opt->name);
958 const char *key_val_sep,
const char *pairs_sep)
964 if (*key && strspn(*buf, key_val_sep)) {
968 av_log(ctx,
AV_LOG_ERROR,
"Missing key or no key/value separator found after key '%s'\n", key);
985 const char *key_val_sep,
const char *pairs_sep)
1004 #define WHITESPACES " \n\t"
1008 return (
unsigned)((c | 32) -
'a') < 26 ||
1009 (unsigned)(c -
'0') < 10 ||
1010 c ==
'-' || c ==
'_' || c ==
'/' || c ==
'.';
1021 static int get_key(
const char **ropts,
const char *delim,
char **rkey)
1023 const char *opts = *ropts;
1024 const char *key_start, *key_end;
1031 if (!*opts || !strchr(delim, *opts))
1034 if (!(*rkey =
av_malloc(key_end - key_start + 1)))
1036 memcpy(*rkey, key_start, key_end - key_start);
1037 (*rkey)[key_end - key_start] = 0;
1043 const char *key_val_sep,
const char *pairs_sep,
1045 char **rkey,
char **rval)
1048 char *key =
NULL, *val;
1049 const char *opts = *ropts;
1051 if ((ret =
get_key(&opts, key_val_sep, &key)) < 0 &&
1065 const char *
const *shorthand,
1066 const char *key_val_sep,
const char *pairs_sep)
1069 const char *dummy_shorthand =
NULL;
1076 shorthand = &dummy_shorthand;
1081 &parsed_key, &
value);
1097 key = *(shorthand++);
1146 int opt_flags,
int search_flags)
1152 int opt_flags,
int search_flags,
void **target_obj)
1171 if (o =
av_opt_find2(child, name, unit, opt_flags, search_flags, target_obj))
1177 if (!strcmp(o->
name, name) && (o->
flags & opt_flags) == opt_flags &&
1220 if (c->
version > (52 << 16 | 11 << 8))
1226 return callback(ranges_arg, obj, key, flags);
1239 if (!ranges || !range || !range_array || !field) {
1244 ranges->
range = range_array;
1245 ranges->
range[0] = range;
1251 switch (field->
type) {
1280 *ranges_arg = ranges;
1294 for (i = 0; i < ranges->
nb_ranges; i++) {
1307 typedef struct TestContext
1320 #define OFFSET(x) offsetof(TestContext, x)
1322 #define TEST_FLAG_COOL 01
1323 #define TEST_FLAG_LAME 02
1324 #define TEST_FLAG_MU 04
1326 static const AVOption test_options[]= {
1332 {
"cool",
"set cool flag ", 0,
AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_COOL}, INT_MIN, INT_MAX, 0,
"flags" },
1333 {
"lame",
"set lame flag ", 0,
AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_LAME}, INT_MIN, INT_MAX, 0,
"flags" },
1334 {
"mu",
"set mu flag ", 0,
AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_MU}, INT_MIN, INT_MAX, 0,
"flags" },
1341 static const char *test_get_name(
void *ctx)
1346 static const AVClass test_class = {
1356 printf(
"\nTesting av_set_options_string()\n");
1358 TestContext test_ctx = { 0 };
1375 "flags=+mu-lame : num=42: toggle=0",
1376 "num=42 : string=blahblah",
1377 "rational=0 : rational=1/2 : rational=1/-1",
1390 test_ctx.class = &test_class;
1404 printf(
"\nTesting av_opt_set_from_string()\n");
1406 TestContext test_ctx = { 0 };
1407 const char *options[] = {
1415 " 5 : hello : size = pal ",
1416 "a_very_long_option_name_that_will_need_to_be_ellipsized_around_here=42"
1418 const char *shorthand[] = {
"num",
"string",
NULL };
1420 test_ctx.class = &test_class;