42 for (; o && o->
name; o++) {
43 if (!strcmp(o->
name, name) && (!unit || (o->
unit && !strcmp(o->
unit, unit))) && (o->
flags &
mask) == flags)
50 #if FF_API_OLD_AVOPTIONS
60 if (!last && class->option[0].
name)
return class->
option;
61 if (last && last[1].
name)
return ++last;
82 if (o->
max*den < num*intnum || o->
min*den > num*intnum) {
118 if (c >=
'0' && c <=
'9')
return c -
'0';
119 if (c >=
'a' && c <=
'f')
return c -
'a' + 10;
120 if (c >=
'A' && c <=
'F')
return c -
'A' + 10;
126 int *lendst = (
int *)(dst + 1);
128 int len = strlen(val);
141 if (a < 0 || b < 0) {
145 *ptr++ = (a << 4) | b;
162 int ret = 0, notfirst = 0;
170 if (*val ==
'+' || *val ==
'-')
173 for (i = 0; i <
sizeof(buf) - 1 && val[i] && val[i] !=
'+' && val[i] !=
'-'; i++)
182 else if (!strcmp(buf,
"max" )) d = o->
max;
183 else if (!strcmp(buf,
"min" )) d = o->
min;
184 else if (!strcmp(buf,
"none" )) d = 0;
185 else if (!strcmp(buf,
"all" )) d = ~0;
187 int res =
av_expr_parse_and_eval(&d, buf,
const_names,
const_values,
NULL,
NULL,
NULL,
NULL,
NULL, 0, obj);
196 if (cmd ==
'+') d = intnum | (int64_t)d;
197 else if (cmd ==
'-') d = intnum &~(int64_t)d;
200 if (cmd ==
'+') d = notfirst*num*intnum/den + d;
201 else if (cmd ==
'-') d = notfirst*num*intnum/den - d;
215 #if FF_API_OLD_AVOPTIONS
227 void *dst, *target_obj;
229 if (!o || !target_obj)
234 dst = ((uint8_t*)target_obj) + o->
offset;
250 #define OPT_EVAL_NUMBER(name, opttype, vartype)\
251 int av_opt_eval_ ## name(void *obj, const AVOption *o, const char *val, vartype *name ## _out)\
253 if (!o || o->type != opttype)\
254 return AVERROR(EINVAL);\
255 return set_string_number(obj, o, val, name ## _out);\
265 static
int set_number(
void *obj, const
char *
name,
double num,
int den, int64_t intnum,
268 void *dst, *target_obj;
271 if (!o || !target_obj)
274 dst = ((uint8_t*)target_obj) + o->
offset;
278 #if FF_API_OLD_AVOPTIONS
306 return set_number(obj, name, 1, 1, val, search_flags);
311 return set_number(obj, name, val, 1, 1, search_flags);
319 #if FF_API_OLD_AVOPTIONS
336 dst= ((uint8_t*)obj) + o->
offset;
337 if (o_out) *o_out= o;
341 case AV_OPT_TYPE_INT: snprintf(buf, buf_len,
"%d" , *(
int *)dst);
break;
348 len = *(
int*)(((uint8_t *)dst) +
sizeof(uint8_t *));
349 if (len >= (buf_len + 1)/2)
return NULL;
350 bin = *(uint8_t**)dst;
351 for (i = 0; i <
len; i++) snprintf(buf + i*2, 3,
"%02X", bin[i]);
353 default:
return NULL;
361 void *dst, *target_obj;
363 uint8_t *bin, buf[128];
366 if (!o || !target_obj)
369 dst = (uint8_t*)target_obj + o->
offset;
373 case AV_OPT_TYPE_FLAGS: ret = snprintf(buf,
sizeof(buf),
"0x%08X", *(
int *)dst);
break;
374 case AV_OPT_TYPE_INT: ret = snprintf(buf,
sizeof(buf),
"%d" , *(
int *)dst);
break;
375 case AV_OPT_TYPE_INT64: ret = snprintf(buf,
sizeof(buf),
"%"PRId64, *(int64_t*)dst);
break;
376 case AV_OPT_TYPE_FLOAT: ret = snprintf(buf,
sizeof(buf),
"%f" , *(
float *)dst);
break;
377 case AV_OPT_TYPE_DOUBLE: ret = snprintf(buf,
sizeof(buf),
"%f" , *(
double *)dst);
break;
386 len = *(
int*)(((uint8_t *)dst) +
sizeof(uint8_t *));
387 if ((uint64_t)len*2 + 1 > INT_MAX)
391 bin = *(uint8_t**)dst;
392 for (i = 0; i <
len; i++)
393 snprintf(*out_val + i*2, 3,
"%02X", bin[i]);
399 if (ret >=
sizeof(buf))
408 void *dst, *target_obj;
410 if (!o || !target_obj)
413 dst = ((uint8_t*)target_obj) + o->
offset;
415 if (o_out) *o_out= o;
424 #if FF_API_OLD_AVOPTIONS
431 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
433 return num*intnum/den;
442 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
444 if (num == 1.0 && (
int)intnum == intnum)
447 return av_d2q(num*intnum/den, 1<<24);
456 if (
get_number(obj, name, o_out, &num, &den, &intnum, 0) < 0)
458 return num*intnum/den;
468 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
470 *out_val = num*intnum/den;
480 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
482 *out_val = num*intnum/den;
492 if ((ret =
get_number(obj, name,
NULL, &num, &den, &intnum, search_flags)) < 0)
495 if (num == 1.0 && (
int)intnum == intnum)
498 *out_val =
av_d2q(num*intnum/den, 1<<24);
515 static void opt_list(
void *obj,
void *av_log_obj,
const char *unit,
516 int req_flags,
int rej_flags)
521 if (!(opt->
flags & req_flags) || (opt->
flags & rej_flags))
579 opt_list(obj, av_log_obj, opt->
unit, req_flags, rej_flags);
584 int av_opt_show2(
void *obj,
void *av_log_obj,
int req_flags,
int rej_flags)
598 #if FF_API_OLD_AVOPTIONS
607 #if FF_API_OLD_AVOPTIONS
608 if ((opt->
flags & mask) != flags)
670 const char *key_val_sep,
const char *pairs_sep)
676 if (*key && strspn(*buf, key_val_sep)) {
680 av_log(ctx,
AV_LOG_ERROR,
"Missing key or no key/value separator found after key '%s'\n", key);
697 const char *key_val_sep,
const char *pairs_sep)
746 int opt_flags,
int search_flags)
752 int opt_flags,
int search_flags,
void **target_obj)
766 if (o =
av_opt_find2(child, name, unit, opt_flags, search_flags, target_obj))
772 if (!strcmp(o->
name, name) && (o->
flags & opt_flags) == opt_flags &&
774 (unit && o->
unit && !strcmp(o->
unit, unit)))) {
806 typedef struct TestContext
816 #define OFFSET(x) offsetof(TestContext, x)
818 #define TEST_FLAG_COOL 01
819 #define TEST_FLAG_LAME 02
820 #define TEST_FLAG_MU 04
822 static const AVOption test_options[]= {
828 {
"cool",
"set cool flag ", 0,
AV_OPT_TYPE_CONST, {TEST_FLAG_COOL}, INT_MIN, INT_MAX, 0,
"flags" },
829 {
"lame",
"set lame flag ", 0,
AV_OPT_TYPE_CONST, {TEST_FLAG_LAME}, INT_MIN, INT_MAX, 0,
"flags" },
830 {
"mu",
"set mu flag ", 0,
AV_OPT_TYPE_CONST, {TEST_FLAG_MU}, INT_MIN, INT_MAX, 0,
"flags" },
834 static const char *test_get_name(
void *ctx)
839 static const AVClass test_class = {
849 printf(
"\nTesting av_set_options_string()\n");
851 TestContext test_ctx;
868 "flags=+mu-lame : num=42: toggle=0",
869 "num=42 : string=blahblah",
870 "rational=0 : rational=1/2 : rational=1/-1",
874 test_ctx.class = &test_class;