92
94
static int write_number(void *obj, const AVOption *o, void *dst, double num, int den, int64_t intnum)
94
if (o->max*den < num*intnum || o->min*den > num*intnum) {
96
if (o->type != AV_OPT_TYPE_FLAGS &&
97
(o->max * den < num * intnum || o->min * den > num * intnum)) {
95
98
av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
96
99
num*intnum/den, o->name, o->min, o->max);
97
100
return AVERROR(ERANGE);
102
if (o->type == AV_OPT_TYPE_FLAGS) {
103
double d = num*intnum/den;
104
if (d < -1.5 || d > 0xFFFFFFFF+0.5 || (llrint(d*256) & 255)) {
105
av_log(obj, AV_LOG_ERROR,
106
"Value %f for parameter '%s' is not a valid set of 32bit integer flags\n",
107
num*intnum/den, o->name);
108
return AVERROR(ERANGE);
100
112
switch (o->type) {
101
113
case AV_OPT_TYPE_FLAGS:
255
static int set_string_image_size(void *obj, const AVOption *o, const char *val, int *dst)
259
if (!val || !strcmp(val, "none")) {
264
ret = av_parse_video_size(dst, dst + 1, val);
266
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val);
270
static int set_string_video_rate(void *obj, const AVOption *o, const char *val, AVRational *dst)
274
ret = AVERROR(EINVAL);
276
ret = av_parse_video_rate(dst, val);
279
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val);
283
static int set_string_color(void *obj, const AVOption *o, const char *val, uint8_t *dst)
290
ret = av_parse_color(dst, val, -1, obj);
292
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as color\n", val);
298
static int set_string_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst,
299
int fmt_nb, int ((*get_fmt)(const char *)), const char *desc)
303
if (!val || !strcmp(val, "none")) {
309
fmt = strtol(val, &tail, 0);
310
if (*tail || (unsigned)fmt >= fmt_nb) {
311
av_log(obj, AV_LOG_ERROR,
312
"Unable to parse option value \"%s\" as %s\n", val, desc);
313
return AVERROR(EINVAL);
318
min = FFMAX(o->min, -1);
319
max = FFMIN(o->max, fmt_nb-1);
321
if (fmt < min || fmt > max) {
322
av_log(obj, AV_LOG_ERROR,
323
"Value %d for parameter '%s' out of %s format range [%d - %d]\n",
324
fmt, o->name, desc, min, max);
325
return AVERROR(ERANGE);
332
static int set_string_pixel_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
334
return set_string_fmt(obj, o, val, dst,
335
AV_PIX_FMT_NB, av_get_pix_fmt, "pixel format");
338
static int set_string_sample_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
340
return set_string_fmt(obj, o, val, dst,
341
AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
242
344
#if FF_API_OLD_AVOPTIONS
243
345
int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out)
272
375
case AV_OPT_TYPE_FLOAT:
273
376
case AV_OPT_TYPE_DOUBLE:
274
377
case AV_OPT_TYPE_RATIONAL: return set_string_number(obj, target_obj, o, val, dst);
275
case AV_OPT_TYPE_IMAGE_SIZE:
276
if (!val || !strcmp(val, "none")) {
277
*(int *)dst = *((int *)dst + 1) = 0;
280
ret = av_parse_video_size(dst, ((int *)dst) + 1, val);
282
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val);
284
case AV_OPT_TYPE_VIDEO_RATE:
286
ret = AVERROR(EINVAL);
288
ret = av_parse_video_rate(dst, val);
291
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val);
293
case AV_OPT_TYPE_PIXEL_FMT:
294
if (!val || !strcmp(val, "none")) {
295
ret = AV_PIX_FMT_NONE;
297
ret = av_get_pix_fmt(val);
298
if (ret == AV_PIX_FMT_NONE) {
300
ret = strtol(val, &tail, 0);
301
if (*tail || (unsigned)ret >= AV_PIX_FMT_NB) {
302
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as pixel format\n", val);
303
return AVERROR(EINVAL);
307
*(enum AVPixelFormat *)dst = ret;
309
case AV_OPT_TYPE_SAMPLE_FMT:
310
if (!val || !strcmp(val, "none")) {
311
ret = AV_SAMPLE_FMT_NONE;
313
ret = av_get_sample_fmt(val);
314
if (ret == AV_SAMPLE_FMT_NONE) {
316
ret = strtol(val, &tail, 0);
317
if (*tail || (unsigned)ret >= AV_SAMPLE_FMT_NB) {
318
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as sample format\n", val);
319
return AVERROR(EINVAL);
323
*(enum AVSampleFormat *)dst = ret;
378
case AV_OPT_TYPE_IMAGE_SIZE: return set_string_image_size(obj, o, val, dst);
379
case AV_OPT_TYPE_VIDEO_RATE: return set_string_video_rate(obj, o, val, dst);
380
case AV_OPT_TYPE_PIXEL_FMT: return set_string_pixel_fmt(obj, o, val, dst);
381
case AV_OPT_TYPE_SAMPLE_FMT: return set_string_sample_fmt(obj, o, val, dst);
325
382
case AV_OPT_TYPE_DURATION:
327
384
*(int64_t *)dst = 0;
335
case AV_OPT_TYPE_COLOR:
392
case AV_OPT_TYPE_COLOR: return set_string_color(obj, o, val, dst);
393
case AV_OPT_TYPE_CHANNEL_LAYOUT:
394
if (!val || !strcmp(val, "none")) {
339
ret = av_parse_color(dst, val, -1, obj);
341
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as color\n", val);
397
#if FF_API_GET_CHANNEL_LAYOUT_COMPAT
398
int64_t cl = ff_get_channel_layout(val, 0);
400
int64_t cl = av_get_channel_layout(val);
403
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
404
ret = AVERROR(EINVAL);
406
*(int64_t *)dst = cl;
346
412
av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
502
568
return AVERROR(EINVAL);
505
#if LIBAVUTIL_VERSION_MAJOR < 53
571
#if LIBAVUTIL_VERSION_MAJOR < 54
506
572
if (class->version && class->version < AV_VERSION_INT(52, 11, 100)) {
512
min = FFMIN(o->min, -1);
513
max = FFMAX(o->max, nb_fmts-1);
578
min = FFMAX(o->min, -1);
579
max = FFMIN(o->max, nb_fmts-1);
515
581
if (fmt < min || fmt > max) {
516
582
av_log(obj, AV_LOG_ERROR,
532
598
return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB);
601
int av_opt_set_channel_layout(void *obj, const char *name, int64_t cl, int search_flags)
604
const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
606
if (!o || !target_obj)
607
return AVERROR_OPTION_NOT_FOUND;
608
if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
609
av_log(obj, AV_LOG_ERROR,
610
"The value set by option '%s' is not a channel layout.\n", o->name);
611
return AVERROR(EINVAL);
613
*(int *)(((int64_t *)target_obj) + o->offset) = cl;
535
617
#if FF_API_OLD_AVOPTIONS
799
885
return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_SAMPLE_FMT, "sample");
888
int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *cl)
890
void *dst, *target_obj;
891
const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
892
if (!o || !target_obj)
893
return AVERROR_OPTION_NOT_FOUND;
894
if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
895
av_log(obj, AV_LOG_ERROR,
896
"The value for option '%s' is not a channel layout.\n", name);
897
return AVERROR(EINVAL);
900
dst = ((uint8_t*)target_obj) + o->offset;
901
*cl = *(int64_t *)dst;
802
905
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
804
907
const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0);
1019
1130
case AV_OPT_TYPE_INT:
1020
1131
case AV_OPT_TYPE_INT64:
1021
1132
case AV_OPT_TYPE_DURATION:
1022
av_opt_set_int(s, opt->name, opt->default_val.i64, 0);
1133
case AV_OPT_TYPE_CHANNEL_LAYOUT:
1134
write_number(s, opt, dst, 1, 1, opt->default_val.i64);
1024
1136
case AV_OPT_TYPE_DOUBLE:
1025
1137
case AV_OPT_TYPE_FLOAT: {
1027
1139
val = opt->default_val.dbl;
1028
av_opt_set_double(s, opt->name, val, 0);
1140
write_number(s, opt, dst, val, 1, 1);
1031
1143
case AV_OPT_TYPE_RATIONAL: {
1032
1144
AVRational val;
1033
1145
val = av_d2q(opt->default_val.dbl, INT_MAX);
1034
av_opt_set_q(s, opt->name, val, 0);
1146
write_number(s, opt, dst, 1, val.den, val.num);
1037
1149
case AV_OPT_TYPE_COLOR:
1150
set_string_color(s, opt, opt->default_val.str, dst);
1038
1152
case AV_OPT_TYPE_STRING:
1153
set_string(s, opt, opt->default_val.str, dst);
1039
1155
case AV_OPT_TYPE_IMAGE_SIZE:
1156
set_string_image_size(s, opt, opt->default_val.str, dst);
1040
1158
case AV_OPT_TYPE_VIDEO_RATE:
1041
av_opt_set(s, opt->name, opt->default_val.str, 0);
1159
set_string_video_rate(s, opt, opt->default_val.str, dst);
1043
1161
case AV_OPT_TYPE_PIXEL_FMT:
1044
#if LIBAVUTIL_VERSION_MAJOR < 53
1162
#if LIBAVUTIL_VERSION_MAJOR < 54
1045
1163
if (class->version && class->version < AV_VERSION_INT(52, 10, 100))
1046
1164
av_opt_set(s, opt->name, opt->default_val.str, 0);
1049
av_opt_set_pixel_fmt(s, opt->name, opt->default_val.i64, 0);
1167
write_number(s, opt, dst, 1, 1, opt->default_val.i64);
1051
1169
case AV_OPT_TYPE_SAMPLE_FMT:
1052
#if LIBAVUTIL_VERSION_MAJOR < 53
1170
#if LIBAVUTIL_VERSION_MAJOR < 54
1053
1171
if (class->version && class->version < AV_VERSION_INT(52, 10, 100))
1054
1172
av_opt_set(s, opt->name, opt->default_val.str, 0);
1057
av_opt_set_sample_fmt(s, opt->name, opt->default_val.i64, 0);
1175
write_number(s, opt, dst, 1, 1, opt->default_val.i64);
1059
1177
case AV_OPT_TYPE_BINARY:
1060
1178
/* Cannot set default for binary */
1480
1600
{"lame", "set lame flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_LAME}, INT_MIN, INT_MAX, 0, "flags" },
1481
1601
{"mu", "set mu flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_MU}, INT_MIN, INT_MAX, 0, "flags" },
1482
1602
{"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 },
1483
{"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, AV_PIX_FMT_NB-1},
1484
{"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, AV_SAMPLE_FMT_NB-1},
1603
{"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, INT_MAX},
1604
{"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, INT_MAX},
1485
1605
{"video_rate", "set videorate", OFFSET(video_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0 },
1486
1606
{"duration", "set duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_MAX},
1487
1607
{"color", "set color", OFFSET(color), AV_OPT_TYPE_COLOR, {.str = "pink"}, 0, 0},
1608
{"cl", "set channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64 = AV_CH_LAYOUT_HEXAGONAL}, 0, INT64_MAX},