3 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author Michael Niedermayer <michaelni@gmx.at>
31 #include "channel_layout.h"
36 #include "parseutils.h"
38 #include "mathematics.h"
40 #include "samplefmt.h"
46 const AVOption *av_opt_next(const void *obj, const AVOption *last)
51 class = *(const AVClass**)obj;
52 if (!last && class && class->option && class->option[0].name)
54 if (last && last[1].name)
59 static int read_number(const AVOption *o, const void *dst, double *num, int *den, int64_t *intnum)
62 case AV_OPT_TYPE_FLAGS:
63 *intnum = *(unsigned int*)dst;
65 case AV_OPT_TYPE_PIXEL_FMT:
66 *intnum = *(enum AVPixelFormat *)dst;
68 case AV_OPT_TYPE_SAMPLE_FMT:
69 *intnum = *(enum AVSampleFormat *)dst;
71 case AV_OPT_TYPE_BOOL:
73 *intnum = *(int *)dst;
75 #if FF_API_OLD_CHANNEL_LAYOUT
76 FF_DISABLE_DEPRECATION_WARNINGS
77 case AV_OPT_TYPE_CHANNEL_LAYOUT:
78 FF_ENABLE_DEPRECATION_WARNINGS
80 case AV_OPT_TYPE_DURATION:
81 case AV_OPT_TYPE_INT64:
82 case AV_OPT_TYPE_UINT64:
83 *intnum = *(int64_t *)dst;
85 case AV_OPT_TYPE_FLOAT:
88 case AV_OPT_TYPE_DOUBLE:
89 *num = *(double *)dst;
91 case AV_OPT_TYPE_RATIONAL:
92 *intnum = ((AVRational *)dst)->num;
93 *den = ((AVRational *)dst)->den;
95 case AV_OPT_TYPE_CONST:
96 *num = o->default_val.dbl;
99 return AVERROR(EINVAL);
102 static int write_number(void *obj, const AVOption *o, void *dst, double num, int den, int64_t intnum)
104 if (o->type != AV_OPT_TYPE_FLAGS &&
105 (!den || o->max * den < num * intnum || o->min * den > num * intnum)) {
106 num = den ? num * intnum / den : (num && intnum ? INFINITY : NAN);
107 av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
108 num, o->name, o->min, o->max);
109 return AVERROR(ERANGE);
111 if (o->type == AV_OPT_TYPE_FLAGS) {
112 double d = num*intnum/den;
113 if (d < -1.5 || d > 0xFFFFFFFF+0.5 || (llrint(d*256) & 255)) {
114 av_log(obj, AV_LOG_ERROR,
115 "Value %f for parameter '%s' is not a valid set of 32bit integer flags\n",
116 num*intnum/den, o->name);
117 return AVERROR(ERANGE);
122 case AV_OPT_TYPE_PIXEL_FMT:
123 *(enum AVPixelFormat *)dst = llrint(num / den) * intnum;
125 case AV_OPT_TYPE_SAMPLE_FMT:
126 *(enum AVSampleFormat *)dst = llrint(num / den) * intnum;
128 case AV_OPT_TYPE_BOOL:
129 case AV_OPT_TYPE_FLAGS:
130 case AV_OPT_TYPE_INT:
131 *(int *)dst = llrint(num / den) * intnum;
133 case AV_OPT_TYPE_DURATION:
134 #if FF_API_OLD_CHANNEL_LAYOUT
135 FF_DISABLE_DEPRECATION_WARNINGS
136 case AV_OPT_TYPE_CHANNEL_LAYOUT:
137 FF_ENABLE_DEPRECATION_WARNINGS
139 case AV_OPT_TYPE_INT64:{
140 double d = num / den;
141 if (intnum == 1 && d == (double)INT64_MAX) {
142 *(int64_t *)dst = INT64_MAX;
144 *(int64_t *)dst = llrint(d) * intnum;
146 case AV_OPT_TYPE_UINT64:{
147 double d = num / den;
148 // We must special case uint64_t here as llrint() does not support values
149 // outside the int64_t range and there is no portable function which does
150 // "INT64_MAX + 1ULL" is used as it is representable exactly as IEEE double
151 // while INT64_MAX is not
152 if (intnum == 1 && d == (double)UINT64_MAX) {
153 *(uint64_t *)dst = UINT64_MAX;
154 } else if (d > INT64_MAX + 1ULL) {
155 *(uint64_t *)dst = (llrint(d - (INT64_MAX + 1ULL)) + (INT64_MAX + 1ULL))*intnum;
157 *(uint64_t *)dst = llrint(d) * intnum;
160 case AV_OPT_TYPE_FLOAT:
161 *(float *)dst = num * intnum / den;
163 case AV_OPT_TYPE_DOUBLE:
164 *(double *)dst = num * intnum / den;
166 case AV_OPT_TYPE_RATIONAL:
167 case AV_OPT_TYPE_VIDEO_RATE:
168 if ((int) num == num)
169 *(AVRational *)dst = (AVRational) { num *intnum, den };
171 *(AVRational *)dst = av_d2q(num * intnum / den, 1 << 24);
174 return AVERROR(EINVAL);
179 static int hexchar2int(char c) {
180 if (c >= '0' && c <= '9')
182 if (c >= 'a' && c <= 'f')
184 if (c >= 'A' && c <= 'F')
189 static int set_string_binary(void *obj, const AVOption *o, const char *val, uint8_t **dst)
191 int *lendst = (int *)(dst + 1);
198 if (!val || !(len = strlen(val)))
202 return AVERROR(EINVAL);
205 ptr = bin = av_malloc(len);
207 return AVERROR(ENOMEM);
209 int a = hexchar2int(*val++);
210 int b = hexchar2int(*val++);
211 if (a < 0 || b < 0) {
213 return AVERROR(EINVAL);
215 *ptr++ = (a << 4) | b;
223 static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **dst)
226 *dst = av_strdup(val);
227 return *dst ? 0 : AVERROR(ENOMEM);
230 #define DEFAULT_NUMVAL(opt) ((opt->type == AV_OPT_TYPE_INT64 || \
231 opt->type == AV_OPT_TYPE_UINT64 || \
232 opt->type == AV_OPT_TYPE_CONST || \
233 opt->type == AV_OPT_TYPE_FLAGS || \
234 opt->type == AV_OPT_TYPE_INT) \
235 ? opt->default_val.i64 \
236 : opt->default_val.dbl)
238 static int set_string_number(void *obj, void *target_obj, const AVOption *o, const char *val, void *dst)
242 if (o->type == AV_OPT_TYPE_RATIONAL || o->type == AV_OPT_TYPE_VIDEO_RATE) {
245 if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
246 if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
259 if (o->type == AV_OPT_TYPE_FLAGS) {
260 if (*val == '+' || *val == '-')
262 for (; i < sizeof(buf) - 1 && val[i] && val[i] != '+' && val[i] != '-'; i++)
270 double const_values[64];
271 const char * const_names[64];
272 int search_flags = (o->flags & AV_OPT_FLAG_CHILD_CONSTS) ? AV_OPT_SEARCH_CHILDREN : 0;
273 const AVOption *o_named = av_opt_find(target_obj, i ? buf : val, o->unit, 0, search_flags);
274 if (o_named && o_named->type == AV_OPT_TYPE_CONST) {
275 d = DEFAULT_NUMVAL(o_named);
276 if (o_named->flags & AV_OPT_FLAG_DEPRECATED)
277 av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n",
278 o_named->name, o_named->help);
281 for (o_named = NULL; o_named = av_opt_next(target_obj, o_named); ) {
282 if (o_named->type == AV_OPT_TYPE_CONST &&
284 !strcmp(o_named->unit, o->unit)) {
285 if (ci + 6 >= FF_ARRAY_ELEMS(const_values)) {
286 av_log(obj, AV_LOG_ERROR, "const_values array too small for %s\n", o->unit);
287 return AVERROR_PATCHWELCOME;
289 const_names [ci ] = o_named->name;
290 const_values[ci++] = DEFAULT_NUMVAL(o_named);
294 const_names [ci ] = "default";
295 const_values[ci++] = DEFAULT_NUMVAL(o);
296 const_names [ci ] = "max";
297 const_values[ci++] = o->max;
298 const_names [ci ] = "min";
299 const_values[ci++] = o->min;
300 const_names [ci ] = "none";
301 const_values[ci++] = 0;
302 const_names [ci ] = "all";
303 const_values[ci++] = ~0;
304 const_names [ci] = NULL;
305 const_values[ci] = 0;
307 res = av_expr_parse_and_eval(&d, i ? buf : val, const_names,
308 const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
310 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
315 if (o->type == AV_OPT_TYPE_FLAGS) {
316 read_number(o, dst, NULL, NULL, &intnum);
318 d = intnum | (int64_t)d;
320 d = intnum &~(int64_t)d;
323 if ((ret = write_number(obj, o, dst, d, 1, 1)) < 0)
331 static int set_string_image_size(void *obj, const AVOption *o, const char *val, int *dst)
335 if (!val || !strcmp(val, "none")) {
340 ret = av_parse_video_size(dst, dst + 1, val);
342 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val);
346 static int set_string_video_rate(void *obj, const AVOption *o, const char *val, AVRational *dst)
348 int ret = av_parse_video_rate(dst, val);
350 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val);
354 static int set_string_color(void *obj, const AVOption *o, const char *val, uint8_t *dst)
361 ret = av_parse_color(dst, val, -1, obj);
363 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as color\n", val);
369 static const char *get_bool_name(int val)
373 return val ? "true" : "false";
376 static int set_string_bool(void *obj, const AVOption *o, const char *val, int *dst)
383 if (!strcmp(val, "auto")) {
385 } else if (av_match_name(val, "true,y,yes,enable,enabled,on")) {
387 } else if (av_match_name(val, "false,n,no,disable,disabled,off")) {
391 n = strtol(val, &end, 10);
392 if (val + strlen(val) != end)
396 if (n < o->min || n > o->max)
403 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as boolean\n", val);
404 return AVERROR(EINVAL);
407 static int set_string_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst,
408 int fmt_nb, int ((*get_fmt)(const char *)), const char *desc)
412 if (!val || !strcmp(val, "none")) {
418 fmt = strtol(val, &tail, 0);
419 if (*tail || (unsigned)fmt >= fmt_nb) {
420 av_log(obj, AV_LOG_ERROR,
421 "Unable to parse option value \"%s\" as %s\n", val, desc);
422 return AVERROR(EINVAL);
427 min = FFMAX(o->min, -1);
428 max = FFMIN(o->max, fmt_nb-1);
430 // hack for compatibility with old ffmpeg
431 if(min == 0 && max == 0) {
436 if (fmt < min || fmt > max) {
437 av_log(obj, AV_LOG_ERROR,
438 "Value %d for parameter '%s' out of %s format range [%d - %d]\n",
439 fmt, o->name, desc, min, max);
440 return AVERROR(ERANGE);
447 static int set_string_pixel_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
449 return set_string_fmt(obj, o, val, dst,
450 AV_PIX_FMT_NB, av_get_pix_fmt, "pixel format");
453 static int set_string_sample_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
455 return set_string_fmt(obj, o, val, dst,
456 AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
459 static int set_string_dict(void *obj, const AVOption *o, const char *val, uint8_t **dst)
461 AVDictionary *options = NULL;
464 int ret = av_dict_parse_string(&options, val, "=", ":", 0);
466 av_dict_free(&options);
471 av_dict_free((AVDictionary **)dst);
472 *dst = (uint8_t *)options;
477 static int set_string_channel_layout(void *obj, const AVOption *o,
478 const char *val, void *dst)
480 AVChannelLayout *channel_layout = dst;
481 av_channel_layout_uninit(channel_layout);
484 return av_channel_layout_from_string(channel_layout, val);
487 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
490 void *dst, *target_obj;
491 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
492 if (!o || !target_obj)
493 return AVERROR_OPTION_NOT_FOUND;
494 FF_DISABLE_DEPRECATION_WARNINGS
495 if (!val && (o->type != AV_OPT_TYPE_STRING &&
496 o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT &&
497 o->type != AV_OPT_TYPE_IMAGE_SIZE &&
498 o->type != AV_OPT_TYPE_DURATION && o->type != AV_OPT_TYPE_COLOR &&
499 #if FF_API_OLD_CHANNEL_LAYOUT
500 o->type != AV_OPT_TYPE_CHANNEL_LAYOUT &&
502 o->type != AV_OPT_TYPE_BOOL))
503 return AVERROR(EINVAL);
504 FF_ENABLE_DEPRECATION_WARNINGS
506 if (o->flags & AV_OPT_FLAG_READONLY)
507 return AVERROR(EINVAL);
509 if (o->flags & AV_OPT_FLAG_DEPRECATED)
510 av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help);
512 dst = ((uint8_t *)target_obj) + o->offset;
514 case AV_OPT_TYPE_BOOL:
515 return set_string_bool(obj, o, val, dst);
516 case AV_OPT_TYPE_STRING:
517 return set_string(obj, o, val, dst);
518 case AV_OPT_TYPE_BINARY:
519 return set_string_binary(obj, o, val, dst);
520 case AV_OPT_TYPE_FLAGS:
521 case AV_OPT_TYPE_INT:
522 case AV_OPT_TYPE_INT64:
523 case AV_OPT_TYPE_UINT64:
524 case AV_OPT_TYPE_FLOAT:
525 case AV_OPT_TYPE_DOUBLE:
526 case AV_OPT_TYPE_RATIONAL:
527 return set_string_number(obj, target_obj, o, val, dst);
528 case AV_OPT_TYPE_IMAGE_SIZE:
529 return set_string_image_size(obj, o, val, dst);
530 case AV_OPT_TYPE_VIDEO_RATE: {
532 ret = set_string_video_rate(obj, o, val, &tmp);
535 return write_number(obj, o, dst, 1, tmp.den, tmp.num);
537 case AV_OPT_TYPE_PIXEL_FMT:
538 return set_string_pixel_fmt(obj, o, val, dst);
539 case AV_OPT_TYPE_SAMPLE_FMT:
540 return set_string_sample_fmt(obj, o, val, dst);
541 case AV_OPT_TYPE_DURATION:
545 if ((ret = av_parse_time(&usecs, val, 1)) < 0) {
546 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as duration\n", val);
550 if (usecs < o->min || usecs > o->max) {
551 av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
552 usecs / 1000000.0, o->name, o->min / 1000000.0, o->max / 1000000.0);
553 return AVERROR(ERANGE);
555 *(int64_t *)dst = usecs;
558 case AV_OPT_TYPE_COLOR:
559 return set_string_color(obj, o, val, dst);
560 #if FF_API_OLD_CHANNEL_LAYOUT
561 FF_DISABLE_DEPRECATION_WARNINGS
562 case AV_OPT_TYPE_CHANNEL_LAYOUT:
563 if (!val || !strcmp(val, "none")) {
566 int64_t cl = av_get_channel_layout(val);
568 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
569 ret = AVERROR(EINVAL);
571 *(int64_t *)dst = cl;
575 FF_ENABLE_DEPRECATION_WARNINGS
577 case AV_OPT_TYPE_CHLAYOUT:
578 ret = set_string_channel_layout(obj, o, val, dst);
580 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
581 ret = AVERROR(EINVAL);
584 case AV_OPT_TYPE_DICT:
585 return set_string_dict(obj, o, val, dst);
588 av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
589 return AVERROR(EINVAL);
592 #define OPT_EVAL_NUMBER(name, opttype, vartype) \
593 int av_opt_eval_ ## name(void *obj, const AVOption *o, \
594 const char *val, vartype *name ## _out) \
596 if (!o || o->type != opttype || o->flags & AV_OPT_FLAG_READONLY) \
597 return AVERROR(EINVAL); \
598 return set_string_number(obj, obj, o, val, name ## _out); \
601 OPT_EVAL_NUMBER(flags, AV_OPT_TYPE_FLAGS, int)
602 OPT_EVAL_NUMBER(int, AV_OPT_TYPE_INT, int)
603 OPT_EVAL_NUMBER(int64, AV_OPT_TYPE_INT64, int64_t)
604 OPT_EVAL_NUMBER(float, AV_OPT_TYPE_FLOAT, float)
605 OPT_EVAL_NUMBER(double, AV_OPT_TYPE_DOUBLE, double)
606 OPT_EVAL_NUMBER(q, AV_OPT_TYPE_RATIONAL, AVRational)
608 static int set_number(void *obj, const char *name, double num, int den, int64_t intnum,
611 void *dst, *target_obj;
612 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
614 if (!o || !target_obj)
615 return AVERROR_OPTION_NOT_FOUND;
617 if (o->flags & AV_OPT_FLAG_READONLY)
618 return AVERROR(EINVAL);
620 dst = ((uint8_t *)target_obj) + o->offset;
621 return write_number(obj, o, dst, num, den, intnum);
624 int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
626 return set_number(obj, name, 1, 1, val, search_flags);
629 int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
631 return set_number(obj, name, val, 1, 1, search_flags);
634 int av_opt_set_q(void *obj, const char *name, AVRational val, int search_flags)
636 return set_number(obj, name, val.num, val.den, 1, search_flags);
639 int av_opt_set_bin(void *obj, const char *name, const uint8_t *val, int len, int search_flags)
642 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
647 if (!o || !target_obj)
648 return AVERROR_OPTION_NOT_FOUND;
650 if (o->type != AV_OPT_TYPE_BINARY || o->flags & AV_OPT_FLAG_READONLY)
651 return AVERROR(EINVAL);
653 ptr = len ? av_malloc(len) : NULL;
655 return AVERROR(ENOMEM);
657 dst = (uint8_t **)(((uint8_t *)target_obj) + o->offset);
658 lendst = (int *)(dst + 1);
664 memcpy(ptr, val, len);
669 int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags)
672 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
674 if (!o || !target_obj)
675 return AVERROR_OPTION_NOT_FOUND;
676 if (o->type != AV_OPT_TYPE_IMAGE_SIZE) {
677 av_log(obj, AV_LOG_ERROR,
678 "The value set by option '%s' is not an image size.\n", o->name);
679 return AVERROR(EINVAL);
682 av_log(obj, AV_LOG_ERROR,
683 "Invalid negative size value %dx%d for size '%s'\n", w, h, o->name);
684 return AVERROR(EINVAL);
686 *(int *)(((uint8_t *)target_obj) + o->offset) = w;
687 *(int *)(((uint8_t *)target_obj+sizeof(int)) + o->offset) = h;
691 int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags)
694 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
696 if (!o || !target_obj)
697 return AVERROR_OPTION_NOT_FOUND;
698 if (o->type != AV_OPT_TYPE_VIDEO_RATE) {
699 av_log(obj, AV_LOG_ERROR,
700 "The value set by option '%s' is not a video rate.\n", o->name);
701 return AVERROR(EINVAL);
703 if (val.num <= 0 || val.den <= 0)
704 return AVERROR(EINVAL);
705 return set_number(obj, name, val.num, val.den, 1, search_flags);
708 static int set_format(void *obj, const char *name, int fmt, int search_flags,
709 enum AVOptionType type, const char *desc, int nb_fmts)
712 const AVOption *o = av_opt_find2(obj, name, NULL, 0,
713 search_flags, &target_obj);
716 if (!o || !target_obj)
717 return AVERROR_OPTION_NOT_FOUND;
718 if (o->type != type) {
719 av_log(obj, AV_LOG_ERROR,
720 "The value set by option '%s' is not a %s format", name, desc);
721 return AVERROR(EINVAL);
724 min = FFMAX(o->min, -1);
725 max = FFMIN(o->max, nb_fmts-1);
727 if (fmt < min || fmt > max) {
728 av_log(obj, AV_LOG_ERROR,
729 "Value %d for parameter '%s' out of %s format range [%d - %d]\n",
730 fmt, name, desc, min, max);
731 return AVERROR(ERANGE);
733 *(int *)(((uint8_t *)target_obj) + o->offset) = fmt;
737 int av_opt_set_pixel_fmt(void *obj, const char *name, enum AVPixelFormat fmt, int search_flags)
739 return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_PIXEL_FMT, "pixel", AV_PIX_FMT_NB);
742 int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags)
744 return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB);
747 #if FF_API_OLD_CHANNEL_LAYOUT
748 FF_DISABLE_DEPRECATION_WARNINGS
749 int av_opt_set_channel_layout(void *obj, const char *name, int64_t cl, int search_flags)
752 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
754 if (!o || !target_obj)
755 return AVERROR_OPTION_NOT_FOUND;
756 if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
757 av_log(obj, AV_LOG_ERROR,
758 "The value set by option '%s' is not a channel layout.\n", o->name);
759 return AVERROR(EINVAL);
761 *(int64_t *)(((uint8_t *)target_obj) + o->offset) = cl;
764 FF_ENABLE_DEPRECATION_WARNINGS
767 int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val,
772 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
774 if (!o || !target_obj)
775 return AVERROR_OPTION_NOT_FOUND;
776 if (o->flags & AV_OPT_FLAG_READONLY)
777 return AVERROR(EINVAL);
779 dst = (AVDictionary **)(((uint8_t *)target_obj) + o->offset);
781 av_dict_copy(dst, val, 0);
786 int av_opt_set_chlayout(void *obj, const char *name,
787 const AVChannelLayout *channel_layout,
791 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
792 AVChannelLayout *dst;
794 if (!o || !target_obj)
795 return AVERROR_OPTION_NOT_FOUND;
797 dst = (AVChannelLayout*)((uint8_t*)target_obj + o->offset);
799 return av_channel_layout_copy(dst, channel_layout);
802 static void format_duration(char *buf, size_t size, int64_t d)
806 av_assert0(size >= 25);
807 if (d < 0 && d != INT64_MIN) {
813 snprintf(buf, size, "INT64_MAX");
814 else if (d == INT64_MIN)
815 snprintf(buf, size, "INT64_MIN");
816 else if (d > (int64_t)3600*1000000)
817 snprintf(buf, size, "%"PRId64":%02d:%02d.%06d", d / 3600000000,
818 (int)((d / 60000000) % 60),
819 (int)((d / 1000000) % 60),
821 else if (d > 60*1000000)
822 snprintf(buf, size, "%d:%02d.%06d",
824 (int)((d / 1000000) % 60),
827 snprintf(buf, size, "%d.%06d",
830 e = buf + strlen(buf);
831 while (e > buf && e[-1] == '0')
833 if (e > buf && e[-1] == '.')
837 int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
839 void *dst, *target_obj;
840 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
841 uint8_t *bin, buf[128];
845 if (!o || !target_obj || (o->offset<=0 && o->type != AV_OPT_TYPE_CONST))
846 return AVERROR_OPTION_NOT_FOUND;
848 if (o->flags & AV_OPT_FLAG_DEPRECATED)
849 av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help);
851 dst = (uint8_t *)target_obj + o->offset;
855 case AV_OPT_TYPE_BOOL:
856 ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(get_bool_name(*(int *)dst), "invalid"));
858 case AV_OPT_TYPE_FLAGS:
859 ret = snprintf(buf, sizeof(buf), "0x%08X", *(int *)dst);
861 case AV_OPT_TYPE_INT:
862 ret = snprintf(buf, sizeof(buf), "%d", *(int *)dst);
864 case AV_OPT_TYPE_INT64:
865 ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t *)dst);
867 case AV_OPT_TYPE_UINT64:
868 ret = snprintf(buf, sizeof(buf), "%"PRIu64, *(uint64_t *)dst);
870 case AV_OPT_TYPE_FLOAT:
871 ret = snprintf(buf, sizeof(buf), "%f", *(float *)dst);
873 case AV_OPT_TYPE_DOUBLE:
874 ret = snprintf(buf, sizeof(buf), "%f", *(double *)dst);
876 case AV_OPT_TYPE_VIDEO_RATE:
877 case AV_OPT_TYPE_RATIONAL:
878 ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational *)dst)->num, ((AVRational *)dst)->den);
880 case AV_OPT_TYPE_CONST:
881 ret = snprintf(buf, sizeof(buf), "%f", o->default_val.dbl);
883 case AV_OPT_TYPE_STRING:
884 if (*(uint8_t **)dst) {
885 *out_val = av_strdup(*(uint8_t **)dst);
886 } else if (search_flags & AV_OPT_ALLOW_NULL) {
890 *out_val = av_strdup("");
892 return *out_val ? 0 : AVERROR(ENOMEM);
893 case AV_OPT_TYPE_BINARY:
894 if (!*(uint8_t **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
898 len = *(int *)(((uint8_t *)dst) + sizeof(uint8_t *));
899 if ((uint64_t)len * 2 + 1 > INT_MAX)
900 return AVERROR(EINVAL);
901 if (!(*out_val = av_malloc(len * 2 + 1)))
902 return AVERROR(ENOMEM);
907 bin = *(uint8_t **)dst;
908 for (i = 0; i < len; i++)
909 snprintf(*out_val + i * 2, 3, "%02X", bin[i]);
911 case AV_OPT_TYPE_IMAGE_SIZE:
912 ret = snprintf(buf, sizeof(buf), "%dx%d", ((int *)dst)[0], ((int *)dst)[1]);
914 case AV_OPT_TYPE_PIXEL_FMT:
915 ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_pix_fmt_name(*(enum AVPixelFormat *)dst), "none"));
917 case AV_OPT_TYPE_SAMPLE_FMT:
918 ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_sample_fmt_name(*(enum AVSampleFormat *)dst), "none"));
920 case AV_OPT_TYPE_DURATION:
921 i64 = *(int64_t *)dst;
922 format_duration(buf, sizeof(buf), i64);
923 ret = strlen(buf); // no overflow possible, checked by an assert
925 case AV_OPT_TYPE_COLOR:
926 ret = snprintf(buf, sizeof(buf), "0x%02x%02x%02x%02x",
927 (int)((uint8_t *)dst)[0], (int)((uint8_t *)dst)[1],
928 (int)((uint8_t *)dst)[2], (int)((uint8_t *)dst)[3]);
930 #if FF_API_OLD_CHANNEL_LAYOUT
931 FF_DISABLE_DEPRECATION_WARNINGS
932 case AV_OPT_TYPE_CHANNEL_LAYOUT:
934 i64 = *(int64_t *)dst;
935 ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
937 FF_ENABLE_DEPRECATION_WARNINGS
939 case AV_OPT_TYPE_CHLAYOUT:
940 ret = av_channel_layout_describe(dst, buf, sizeof(buf));
942 case AV_OPT_TYPE_DICT:
943 if (!*(AVDictionary **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
947 return av_dict_get_string(*(AVDictionary **)dst, (char **)out_val, '=', ':');
949 return AVERROR(EINVAL);
952 if (ret >= sizeof(buf))
953 return AVERROR(EINVAL);
954 *out_val = av_strdup(buf);
955 return *out_val ? 0 : AVERROR(ENOMEM);
958 static int get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum,
961 void *dst, *target_obj;
962 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
963 if (!o || !target_obj)
966 dst = ((uint8_t *)target_obj) + o->offset;
968 if (o_out) *o_out= o;
970 return read_number(o, dst, num, den, intnum);
978 int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
984 if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
989 *out_val = num * intnum / den;
993 int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val)
999 if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
1001 *out_val = num * intnum / den;
1005 int av_opt_get_q(void *obj, const char *name, int search_flags, AVRational *out_val)
1011 if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
1014 if (num == 1.0 && (int)intnum == intnum)
1015 *out_val = (AVRational){intnum, den};
1017 *out_val = av_d2q(num*intnum/den, 1<<24);
1021 int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out)
1023 void *dst, *target_obj;
1024 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
1025 if (!o || !target_obj)
1026 return AVERROR_OPTION_NOT_FOUND;
1027 if (o->type != AV_OPT_TYPE_IMAGE_SIZE) {
1028 av_log(obj, AV_LOG_ERROR,
1029 "The value for option '%s' is not an image size.\n", name);
1030 return AVERROR(EINVAL);
1033 dst = ((uint8_t*)target_obj) + o->offset;
1034 if (w_out) *w_out = *(int *)dst;
1035 if (h_out) *h_out = *((int *)dst+1);
1039 int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val)
1045 if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
1048 if (num == 1.0 && (int)intnum == intnum)
1049 *out_val = (AVRational) { intnum, den };
1051 *out_val = av_d2q(num * intnum / den, 1 << 24);
1055 static int get_format(void *obj, const char *name, int search_flags, int *out_fmt,
1056 enum AVOptionType type, const char *desc)
1058 void *dst, *target_obj;
1059 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
1060 if (!o || !target_obj)
1061 return AVERROR_OPTION_NOT_FOUND;
1062 if (o->type != type) {
1063 av_log(obj, AV_LOG_ERROR,
1064 "The value for option '%s' is not a %s format.\n", desc, name);
1065 return AVERROR(EINVAL);
1068 dst = ((uint8_t*)target_obj) + o->offset;
1069 *out_fmt = *(int *)dst;
1073 int av_opt_get_pixel_fmt(void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt)
1075 return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_PIXEL_FMT, "pixel");
1078 int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt)
1080 return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_SAMPLE_FMT, "sample");
1083 #if FF_API_OLD_CHANNEL_LAYOUT
1084 FF_DISABLE_DEPRECATION_WARNINGS
1085 int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *cl)
1087 void *dst, *target_obj;
1088 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
1089 if (!o || !target_obj)
1090 return AVERROR_OPTION_NOT_FOUND;
1091 if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
1092 av_log(obj, AV_LOG_ERROR,
1093 "The value for option '%s' is not a channel layout.\n", name);
1094 return AVERROR(EINVAL);
1097 dst = ((uint8_t*)target_obj) + o->offset;
1098 *cl = *(int64_t *)dst;
1101 FF_ENABLE_DEPRECATION_WARNINGS
1104 int av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *cl)
1106 void *dst, *target_obj;
1107 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
1108 if (!o || !target_obj)
1109 return AVERROR_OPTION_NOT_FOUND;
1110 if (o->type != AV_OPT_TYPE_CHLAYOUT) {
1111 av_log(obj, AV_LOG_ERROR,
1112 "The value for option '%s' is not a channel layout.\n", name);
1113 return AVERROR(EINVAL);
1116 dst = ((uint8_t*)target_obj) + o->offset;
1117 return av_channel_layout_copy(cl, dst);
1120 int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val)
1124 const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
1126 if (!o || !target_obj)
1127 return AVERROR_OPTION_NOT_FOUND;
1128 if (o->type != AV_OPT_TYPE_DICT)
1129 return AVERROR(EINVAL);
1131 src = *(AVDictionary **)(((uint8_t *)target_obj) + o->offset);
1132 av_dict_copy(out_val, src, 0);
1137 int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
1139 const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0);
1140 const AVOption *flag = av_opt_find(obj, flag_name,
1141 field ? field->unit : NULL, 0, 0);
1144 if (!field || !flag || flag->type != AV_OPT_TYPE_CONST ||
1145 av_opt_get_int(obj, field_name, 0, &res) < 0)
1147 return res & flag->default_val.i64;
1150 static void log_int_value(void *av_log_obj, int level, int64_t i)
1153 av_log(av_log_obj, level, "INT_MAX");
1154 } else if (i == INT_MIN) {
1155 av_log(av_log_obj, level, "INT_MIN");
1156 } else if (i == UINT32_MAX) {
1157 av_log(av_log_obj, level, "UINT32_MAX");
1158 } else if (i == INT64_MAX) {
1159 av_log(av_log_obj, level, "I64_MAX");
1160 } else if (i == INT64_MIN) {
1161 av_log(av_log_obj, level, "I64_MIN");
1163 av_log(av_log_obj, level, "%"PRId64, i);
1167 static void log_value(void *av_log_obj, int level, double d)
1170 av_log(av_log_obj, level, "INT_MAX");
1171 } else if (d == INT_MIN) {
1172 av_log(av_log_obj, level, "INT_MIN");
1173 } else if (d == UINT32_MAX) {
1174 av_log(av_log_obj, level, "UINT32_MAX");
1175 } else if (d == (double)INT64_MAX) {
1176 av_log(av_log_obj, level, "I64_MAX");
1177 } else if (d == INT64_MIN) {
1178 av_log(av_log_obj, level, "I64_MIN");
1179 } else if (d == FLT_MAX) {
1180 av_log(av_log_obj, level, "FLT_MAX");
1181 } else if (d == FLT_MIN) {
1182 av_log(av_log_obj, level, "FLT_MIN");
1183 } else if (d == -FLT_MAX) {
1184 av_log(av_log_obj, level, "-FLT_MAX");
1185 } else if (d == -FLT_MIN) {
1186 av_log(av_log_obj, level, "-FLT_MIN");
1187 } else if (d == DBL_MAX) {
1188 av_log(av_log_obj, level, "DBL_MAX");
1189 } else if (d == DBL_MIN) {
1190 av_log(av_log_obj, level, "DBL_MIN");
1191 } else if (d == -DBL_MAX) {
1192 av_log(av_log_obj, level, "-DBL_MAX");
1193 } else if (d == -DBL_MIN) {
1194 av_log(av_log_obj, level, "-DBL_MIN");
1196 av_log(av_log_obj, level, "%g", d);
1200 static const char *get_opt_const_name(void *obj, const char *unit, int64_t value)
1202 const AVOption *opt = NULL;
1206 while ((opt = av_opt_next(obj, opt)))
1207 if (opt->type == AV_OPT_TYPE_CONST && !strcmp(opt->unit, unit) &&
1208 opt->default_val.i64 == value)
1213 static char *get_opt_flags_string(void *obj, const char *unit, int64_t value)
1215 const AVOption *opt = NULL;
1221 while ((opt = av_opt_next(obj, opt))) {
1222 if (opt->type == AV_OPT_TYPE_CONST && !strcmp(opt->unit, unit) &&
1223 opt->default_val.i64 & value) {
1225 av_strlcatf(flags, sizeof(flags), "+");
1226 av_strlcatf(flags, sizeof(flags), "%s", opt->name);
1230 return av_strdup(flags);
1234 static void opt_list(void *obj, void *av_log_obj, const char *unit,
1235 int req_flags, int rej_flags, enum AVOptionType parent_type)
1237 const AVOption *opt = NULL;
1241 while ((opt = av_opt_next(obj, opt))) {
1242 if (!(opt->flags & req_flags) || (opt->flags & rej_flags))
1245 /* Don't print CONST's on level one.
1246 * Don't print anything but CONST's on level two.
1247 * Only print items from the requested unit.
1249 if (!unit && opt->type == AV_OPT_TYPE_CONST)
1251 else if (unit && opt->type != AV_OPT_TYPE_CONST)
1253 else if (unit && opt->type == AV_OPT_TYPE_CONST && strcmp(unit, opt->unit))
1255 else if (unit && opt->type == AV_OPT_TYPE_CONST)
1256 av_log(av_log_obj, AV_LOG_INFO, " %-15s ", opt->name);
1258 av_log(av_log_obj, AV_LOG_INFO, " %s%-17s ",
1259 (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? " " : "-",
1262 switch (opt->type) {
1263 case AV_OPT_TYPE_FLAGS:
1264 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<flags>");
1266 case AV_OPT_TYPE_INT:
1267 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int>");
1269 case AV_OPT_TYPE_INT64:
1270 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int64>");
1272 case AV_OPT_TYPE_UINT64:
1273 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<uint64>");
1275 case AV_OPT_TYPE_DOUBLE:
1276 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<double>");
1278 case AV_OPT_TYPE_FLOAT:
1279 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<float>");
1281 case AV_OPT_TYPE_STRING:
1282 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<string>");
1284 case AV_OPT_TYPE_RATIONAL:
1285 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<rational>");
1287 case AV_OPT_TYPE_BINARY:
1288 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<binary>");
1290 case AV_OPT_TYPE_DICT:
1291 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<dictionary>");
1293 case AV_OPT_TYPE_IMAGE_SIZE:
1294 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>");
1296 case AV_OPT_TYPE_VIDEO_RATE:
1297 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<video_rate>");
1299 case AV_OPT_TYPE_PIXEL_FMT:
1300 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>");
1302 case AV_OPT_TYPE_SAMPLE_FMT:
1303 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<sample_fmt>");
1305 case AV_OPT_TYPE_DURATION:
1306 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<duration>");
1308 case AV_OPT_TYPE_COLOR:
1309 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<color>");
1311 case AV_OPT_TYPE_CHLAYOUT:
1312 #if FF_API_OLD_CHANNEL_LAYOUT
1313 FF_DISABLE_DEPRECATION_WARNINGS
1314 case AV_OPT_TYPE_CHANNEL_LAYOUT:
1315 FF_ENABLE_DEPRECATION_WARNINGS
1317 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<channel_layout>");
1319 case AV_OPT_TYPE_BOOL:
1320 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<boolean>");
1322 case AV_OPT_TYPE_CONST:
1323 if (parent_type == AV_OPT_TYPE_INT)
1324 av_log(av_log_obj, AV_LOG_INFO, "%-12"PRId64" ", opt->default_val.i64);
1326 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
1329 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
1332 av_log(av_log_obj, AV_LOG_INFO, "%c%c%c%c%c%c%c%c%c%c%c",
1333 (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.',
1334 (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.',
1335 (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? 'F' : '.',
1336 (opt->flags & AV_OPT_FLAG_VIDEO_PARAM) ? 'V' : '.',
1337 (opt->flags & AV_OPT_FLAG_AUDIO_PARAM) ? 'A' : '.',
1338 (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.',
1339 (opt->flags & AV_OPT_FLAG_EXPORT) ? 'X' : '.',
1340 (opt->flags & AV_OPT_FLAG_READONLY) ? 'R' : '.',
1341 (opt->flags & AV_OPT_FLAG_BSF_PARAM) ? 'B' : '.',
1342 (opt->flags & AV_OPT_FLAG_RUNTIME_PARAM) ? 'T' : '.',
1343 (opt->flags & AV_OPT_FLAG_DEPRECATED) ? 'P' : '.');
1346 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
1348 if (av_opt_query_ranges(&r, obj, opt->name, AV_OPT_SEARCH_FAKE_OBJ) >= 0) {
1349 switch (opt->type) {
1350 case AV_OPT_TYPE_INT:
1351 case AV_OPT_TYPE_INT64:
1352 case AV_OPT_TYPE_UINT64:
1353 case AV_OPT_TYPE_DOUBLE:
1354 case AV_OPT_TYPE_FLOAT:
1355 case AV_OPT_TYPE_RATIONAL:
1356 for (i = 0; i < r->nb_ranges; i++) {
1357 av_log(av_log_obj, AV_LOG_INFO, " (from ");
1358 log_value(av_log_obj, AV_LOG_INFO, r->range[i]->value_min);
1359 av_log(av_log_obj, AV_LOG_INFO, " to ");
1360 log_value(av_log_obj, AV_LOG_INFO, r->range[i]->value_max);
1361 av_log(av_log_obj, AV_LOG_INFO, ")");
1365 av_opt_freep_ranges(&r);
1368 if (opt->type != AV_OPT_TYPE_CONST &&
1369 opt->type != AV_OPT_TYPE_BINARY &&
1370 !((opt->type == AV_OPT_TYPE_COLOR ||
1371 opt->type == AV_OPT_TYPE_IMAGE_SIZE ||
1372 opt->type == AV_OPT_TYPE_STRING ||
1373 opt->type == AV_OPT_TYPE_DICT ||
1374 opt->type == AV_OPT_TYPE_CHLAYOUT ||
1375 opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
1376 !opt->default_val.str)) {
1377 av_log(av_log_obj, AV_LOG_INFO, " (default ");
1378 switch (opt->type) {
1379 case AV_OPT_TYPE_BOOL:
1380 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
1382 case AV_OPT_TYPE_FLAGS: {
1383 char *def_flags = get_opt_flags_string(obj, opt->unit, opt->default_val.i64);
1385 av_log(av_log_obj, AV_LOG_INFO, "%s", def_flags);
1386 av_freep(&def_flags);
1388 av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
1392 case AV_OPT_TYPE_DURATION: {
1394 format_duration(buf, sizeof(buf), opt->default_val.i64);
1395 av_log(av_log_obj, AV_LOG_INFO, "%s", buf);
1398 case AV_OPT_TYPE_INT:
1399 case AV_OPT_TYPE_UINT64:
1400 case AV_OPT_TYPE_INT64: {
1401 const char *def_const = get_opt_const_name(obj, opt->unit, opt->default_val.i64);
1403 av_log(av_log_obj, AV_LOG_INFO, "%s", def_const);
1405 log_int_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
1408 case AV_OPT_TYPE_DOUBLE:
1409 case AV_OPT_TYPE_FLOAT:
1410 log_value(av_log_obj, AV_LOG_INFO, opt->default_val.dbl);
1412 case AV_OPT_TYPE_RATIONAL: {
1413 AVRational q = av_d2q(opt->default_val.dbl, INT_MAX);
1414 av_log(av_log_obj, AV_LOG_INFO, "%d/%d", q.num, q.den); }
1416 case AV_OPT_TYPE_PIXEL_FMT:
1417 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_pix_fmt_name(opt->default_val.i64), "none"));
1419 case AV_OPT_TYPE_SAMPLE_FMT:
1420 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_sample_fmt_name(opt->default_val.i64), "none"));
1422 case AV_OPT_TYPE_COLOR:
1423 case AV_OPT_TYPE_IMAGE_SIZE:
1424 case AV_OPT_TYPE_STRING:
1425 case AV_OPT_TYPE_DICT:
1426 case AV_OPT_TYPE_VIDEO_RATE:
1427 case AV_OPT_TYPE_CHLAYOUT:
1428 av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
1430 #if FF_API_OLD_CHANNEL_LAYOUT
1431 FF_DISABLE_DEPRECATION_WARNINGS
1432 case AV_OPT_TYPE_CHANNEL_LAYOUT:
1433 av_log(av_log_obj, AV_LOG_INFO, "0x%"PRIx64, opt->default_val.i64);
1435 FF_ENABLE_DEPRECATION_WARNINGS
1438 av_log(av_log_obj, AV_LOG_INFO, ")");
1441 av_log(av_log_obj, AV_LOG_INFO, "\n");
1442 if (opt->unit && opt->type != AV_OPT_TYPE_CONST)
1443 opt_list(obj, av_log_obj, opt->unit, req_flags, rej_flags, opt->type);
1447 int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags)
1452 av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass **)obj)->class_name);
1454 opt_list(obj, av_log_obj, NULL, req_flags, rej_flags, -1);
1459 void av_opt_set_defaults(void *s)
1461 av_opt_set_defaults2(s, 0, 0);
1464 void av_opt_set_defaults2(void *s, int mask, int flags)
1466 const AVOption *opt = NULL;
1467 while ((opt = av_opt_next(s, opt))) {
1468 void *dst = ((uint8_t*)s) + opt->offset;
1470 if ((opt->flags & mask) != flags)
1473 if (opt->flags & AV_OPT_FLAG_READONLY)
1476 switch (opt->type) {
1477 case AV_OPT_TYPE_CONST:
1478 /* Nothing to be done here */
1480 case AV_OPT_TYPE_BOOL:
1481 case AV_OPT_TYPE_FLAGS:
1482 case AV_OPT_TYPE_INT:
1483 case AV_OPT_TYPE_INT64:
1484 case AV_OPT_TYPE_UINT64:
1485 case AV_OPT_TYPE_DURATION:
1486 #if FF_API_OLD_CHANNEL_LAYOUT
1487 FF_DISABLE_DEPRECATION_WARNINGS
1488 case AV_OPT_TYPE_CHANNEL_LAYOUT:
1489 FF_ENABLE_DEPRECATION_WARNINGS
1491 case AV_OPT_TYPE_PIXEL_FMT:
1492 case AV_OPT_TYPE_SAMPLE_FMT:
1493 write_number(s, opt, dst, 1, 1, opt->default_val.i64);
1495 case AV_OPT_TYPE_DOUBLE:
1496 case AV_OPT_TYPE_FLOAT: {
1498 val = opt->default_val.dbl;
1499 write_number(s, opt, dst, val, 1, 1);
1502 case AV_OPT_TYPE_RATIONAL: {
1504 val = av_d2q(opt->default_val.dbl, INT_MAX);
1505 write_number(s, opt, dst, 1, val.den, val.num);
1508 case AV_OPT_TYPE_COLOR:
1509 set_string_color(s, opt, opt->default_val.str, dst);
1511 case AV_OPT_TYPE_STRING:
1512 set_string(s, opt, opt->default_val.str, dst);
1514 case AV_OPT_TYPE_IMAGE_SIZE:
1515 set_string_image_size(s, opt, opt->default_val.str, dst);
1517 case AV_OPT_TYPE_VIDEO_RATE:
1518 set_string_video_rate(s, opt, opt->default_val.str, dst);
1520 case AV_OPT_TYPE_BINARY:
1521 set_string_binary(s, opt, opt->default_val.str, dst);
1523 case AV_OPT_TYPE_CHLAYOUT:
1524 set_string_channel_layout(s, opt, opt->default_val.str, dst);
1526 case AV_OPT_TYPE_DICT:
1527 set_string_dict(s, opt, opt->default_val.str, dst);
1530 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n",
1531 opt->type, opt->name);
1537 * Store the value in the field in ctx that is named like key.
1538 * ctx must be an AVClass context, storing is done using AVOptions.
1540 * @param buf the string to parse, buf will be updated to point at the
1541 * separator just after the parsed key/value pair
1542 * @param key_val_sep a 0-terminated list of characters used to
1543 * separate key from value
1544 * @param pairs_sep a 0-terminated list of characters used to separate
1545 * two pairs from each other
1546 * @return 0 if the key/value pair has been successfully parsed and
1547 * set, or a negative value corresponding to an AVERROR code in case
1549 * AVERROR(EINVAL) if the key/value pair cannot be parsed,
1550 * the error code issued by av_opt_set() if the key/value pair
1553 static int parse_key_value_pair(void *ctx, const char **buf,
1554 const char *key_val_sep, const char *pairs_sep)
1556 char *key = av_get_token(buf, key_val_sep);
1561 return AVERROR(ENOMEM);
1563 if (*key && strspn(*buf, key_val_sep)) {
1565 val = av_get_token(buf, pairs_sep);
1568 return AVERROR(ENOMEM);
1571 av_log(ctx, AV_LOG_ERROR, "Missing key or no key/value separator found after key '%s'\n", key);
1573 return AVERROR(EINVAL);
1576 av_log(ctx, AV_LOG_DEBUG, "Setting entry with key '%s' to value '%s'\n", key, val);
1578 ret = av_opt_set(ctx, key, val, AV_OPT_SEARCH_CHILDREN);
1579 if (ret == AVERROR_OPTION_NOT_FOUND)
1580 av_log(ctx, AV_LOG_ERROR, "Key '%s' not found.\n", key);
1587 int av_set_options_string(void *ctx, const char *opts,
1588 const char *key_val_sep, const char *pairs_sep)
1596 if ((ret = parse_key_value_pair(ctx, &opts, key_val_sep, pairs_sep)) < 0)
1607 #define WHITESPACES " \n\t\r"
1609 static int is_key_char(char c)
1611 return (unsigned)((c | 32) - 'a') < 26 ||
1612 (unsigned)(c - '0') < 10 ||
1613 c == '-' || c == '_' || c == '/' || c == '.';
1617 * Read a key from a string.
1619 * The key consists of is_key_char characters and must be terminated by a
1620 * character from the delim string; spaces are ignored.
1622 * @return 0 for success (even with ellipsis), <0 for failure
1624 static int get_key(const char **ropts, const char *delim, char **rkey)
1626 const char *opts = *ropts;
1627 const char *key_start, *key_end;
1629 key_start = opts += strspn(opts, WHITESPACES);
1630 while (is_key_char(*opts))
1633 opts += strspn(opts, WHITESPACES);
1634 if (!*opts || !strchr(delim, *opts))
1635 return AVERROR(EINVAL);
1637 if (!(*rkey = av_malloc(key_end - key_start + 1)))
1638 return AVERROR(ENOMEM);
1639 memcpy(*rkey, key_start, key_end - key_start);
1640 (*rkey)[key_end - key_start] = 0;
1645 int av_opt_get_key_value(const char **ropts,
1646 const char *key_val_sep, const char *pairs_sep,
1648 char **rkey, char **rval)
1651 char *key = NULL, *val;
1652 const char *opts = *ropts;
1654 if ((ret = get_key(&opts, key_val_sep, &key)) < 0 &&
1655 !(flags & AV_OPT_FLAG_IMPLICIT_KEY))
1656 return AVERROR(EINVAL);
1657 if (!(val = av_get_token(&opts, pairs_sep))) {
1659 return AVERROR(ENOMEM);
1667 int av_opt_set_from_string(void *ctx, const char *opts,
1668 const char *const *shorthand,
1669 const char *key_val_sep, const char *pairs_sep)
1672 const char *dummy_shorthand = NULL;
1673 char *av_uninit(parsed_key), *av_uninit(value);
1679 shorthand = &dummy_shorthand;
1682 ret = av_opt_get_key_value(&opts, key_val_sep, pairs_sep,
1683 *shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
1684 &parsed_key, &value);
1686 if (ret == AVERROR(EINVAL))
1687 av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
1689 av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", opts,
1697 while (*shorthand) /* discard all remaining shorthand */
1700 key = *(shorthand++);
1703 av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
1704 if ((ret = av_opt_set(ctx, key, value, 0)) < 0) {
1705 if (ret == AVERROR_OPTION_NOT_FOUND)
1706 av_log(ctx, AV_LOG_ERROR, "Option '%s' not found\n", key);
1708 av_free(parsed_key);
1713 av_free(parsed_key);
1719 void av_opt_free(void *obj)
1721 const AVOption *o = NULL;
1722 while ((o = av_opt_next(obj, o))) {
1724 case AV_OPT_TYPE_STRING:
1725 case AV_OPT_TYPE_BINARY:
1726 av_freep((uint8_t *)obj + o->offset);
1729 case AV_OPT_TYPE_DICT:
1730 av_dict_free((AVDictionary **)(((uint8_t *)obj) + o->offset));
1733 case AV_OPT_TYPE_CHLAYOUT:
1734 av_channel_layout_uninit((AVChannelLayout *)(((uint8_t *)obj) + o->offset));
1743 int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
1745 const AVDictionaryEntry *t = NULL;
1746 AVDictionary *tmp = NULL;
1752 while ((t = av_dict_iterate(*options, t))) {
1753 ret = av_opt_set(obj, t->key, t->value, search_flags);
1754 if (ret == AVERROR_OPTION_NOT_FOUND)
1755 ret = av_dict_set(&tmp, t->key, t->value, AV_DICT_MULTIKEY);
1757 av_log(obj, AV_LOG_ERROR, "Error setting option %s to value %s.\n", t->key, t->value);
1762 av_dict_free(options);
1767 int av_opt_set_dict(void *obj, AVDictionary **options)
1769 return av_opt_set_dict2(obj, options, 0);
1772 const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
1773 int opt_flags, int search_flags)
1775 return av_opt_find2(obj, name, unit, opt_flags, search_flags, NULL);
1778 const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
1779 int opt_flags, int search_flags, void **target_obj)
1782 const AVOption *o = NULL;
1792 if (search_flags & AV_OPT_SEARCH_CHILDREN) {
1793 if (search_flags & AV_OPT_SEARCH_FAKE_OBJ) {
1795 const AVClass *child;
1796 while (child = av_opt_child_class_iterate(c, &iter))
1797 if (o = av_opt_find2(&child, name, unit, opt_flags, search_flags, NULL))
1801 while (child = av_opt_child_next(obj, child))
1802 if (o = av_opt_find2(child, name, unit, opt_flags, search_flags, target_obj))
1807 while (o = av_opt_next(obj, o)) {
1808 if (!strcmp(o->name, name) && (o->flags & opt_flags) == opt_flags &&
1809 ((!unit && o->type != AV_OPT_TYPE_CONST) ||
1810 (unit && o->type == AV_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)))) {
1812 if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ))
1823 void *av_opt_child_next(void *obj, void *prev)
1825 const AVClass *c = *(AVClass **)obj;
1827 return c->child_next(obj, prev);
1831 const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter)
1833 if (parent->child_class_iterate)
1834 return parent->child_class_iterate(iter);
1838 void *av_opt_ptr(const AVClass *class, void *obj, const char *name)
1840 const AVOption *opt= av_opt_find2(&class, name, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ, NULL);
1843 return (uint8_t*)obj + opt->offset;
1846 static int opt_size(enum AVOptionType type)
1849 case AV_OPT_TYPE_BOOL:
1850 case AV_OPT_TYPE_INT:
1851 case AV_OPT_TYPE_FLAGS:
1853 case AV_OPT_TYPE_DURATION:
1854 #if FF_API_OLD_CHANNEL_LAYOUT
1855 FF_DISABLE_DEPRECATION_WARNINGS
1856 case AV_OPT_TYPE_CHANNEL_LAYOUT:
1857 FF_ENABLE_DEPRECATION_WARNINGS
1859 case AV_OPT_TYPE_INT64:
1860 case AV_OPT_TYPE_UINT64:
1861 return sizeof(int64_t);
1862 case AV_OPT_TYPE_DOUBLE:
1863 return sizeof(double);
1864 case AV_OPT_TYPE_FLOAT:
1865 return sizeof(float);
1866 case AV_OPT_TYPE_STRING:
1867 return sizeof(uint8_t*);
1868 case AV_OPT_TYPE_VIDEO_RATE:
1869 case AV_OPT_TYPE_RATIONAL:
1870 return sizeof(AVRational);
1871 case AV_OPT_TYPE_BINARY:
1872 return sizeof(uint8_t*) + sizeof(int);
1873 case AV_OPT_TYPE_IMAGE_SIZE:
1874 return sizeof(int[2]);
1875 case AV_OPT_TYPE_PIXEL_FMT:
1876 return sizeof(enum AVPixelFormat);
1877 case AV_OPT_TYPE_SAMPLE_FMT:
1878 return sizeof(enum AVSampleFormat);
1879 case AV_OPT_TYPE_COLOR:
1882 return AVERROR(EINVAL);
1885 int av_opt_copy(void *dst, const void *src)
1887 const AVOption *o = NULL;
1892 return AVERROR(EINVAL);
1894 c = *(AVClass **)src;
1895 if (!c || c != *(AVClass **)dst)
1896 return AVERROR(EINVAL);
1898 while ((o = av_opt_next(src, o))) {
1899 void *field_dst = (uint8_t *)dst + o->offset;
1900 void *field_src = (uint8_t *)src + o->offset;
1901 uint8_t **field_dst8 = (uint8_t **)field_dst;
1902 uint8_t **field_src8 = (uint8_t **)field_src;
1904 if (o->type == AV_OPT_TYPE_STRING) {
1905 if (*field_dst8 != *field_src8)
1906 av_freep(field_dst8);
1907 *field_dst8 = av_strdup(*field_src8);
1908 if (*field_src8 && !*field_dst8)
1909 ret = AVERROR(ENOMEM);
1910 } else if (o->type == AV_OPT_TYPE_BINARY) {
1911 int len = *(int *)(field_src8 + 1);
1912 if (*field_dst8 != *field_src8)
1913 av_freep(field_dst8);
1914 *field_dst8 = av_memdup(*field_src8, len);
1915 if (len && !*field_dst8) {
1916 ret = AVERROR(ENOMEM);
1919 *(int *)(field_dst8 + 1) = len;
1920 } else if (o->type == AV_OPT_TYPE_CONST) {
1922 } else if (o->type == AV_OPT_TYPE_DICT) {
1923 AVDictionary **sdict = (AVDictionary **) field_src;
1924 AVDictionary **ddict = (AVDictionary **) field_dst;
1926 if (*sdict != *ddict)
1927 av_dict_free(ddict);
1929 ret2 = av_dict_copy(ddict, *sdict, 0);
1932 } else if (o->type == AV_OPT_TYPE_CHLAYOUT) {
1933 if (field_dst != field_src)
1934 ret = av_channel_layout_copy(field_dst, field_src);
1936 int size = opt_size(o->type);
1940 memcpy(field_dst, field_src, size);
1946 int av_opt_query_ranges(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
1949 const AVClass *c = *(AVClass**)obj;
1950 int (*callback)(AVOptionRanges **, void *obj, const char *key, int flags) = c->query_ranges;
1953 callback = av_opt_query_ranges_default;
1955 ret = callback(ranges_arg, obj, key, flags);
1957 if (!(flags & AV_OPT_MULTI_COMPONENT_RANGE))
1959 (*ranges_arg)->nb_components = ret;
1964 int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
1966 AVOptionRanges *ranges = av_mallocz(sizeof(*ranges));
1967 AVOptionRange **range_array = av_mallocz(sizeof(void*));
1968 AVOptionRange *range = av_mallocz(sizeof(*range));
1969 const AVOption *field = av_opt_find(obj, key, NULL, 0, flags);
1974 if (!ranges || !range || !range_array || !field) {
1975 ret = AVERROR(ENOMEM);
1979 ranges->range = range_array;
1980 ranges->range[0] = range;
1981 ranges->nb_ranges = 1;
1982 ranges->nb_components = 1;
1983 range->is_range = 1;
1984 range->value_min = field->min;
1985 range->value_max = field->max;
1987 switch (field->type) {
1988 case AV_OPT_TYPE_BOOL:
1989 case AV_OPT_TYPE_INT:
1990 case AV_OPT_TYPE_INT64:
1991 case AV_OPT_TYPE_UINT64:
1992 case AV_OPT_TYPE_PIXEL_FMT:
1993 case AV_OPT_TYPE_SAMPLE_FMT:
1994 case AV_OPT_TYPE_FLOAT:
1995 case AV_OPT_TYPE_DOUBLE:
1996 case AV_OPT_TYPE_DURATION:
1997 case AV_OPT_TYPE_COLOR:
1998 #if FF_API_OLD_CHANNEL_LAYOUT
1999 FF_DISABLE_DEPRECATION_WARNINGS
2000 case AV_OPT_TYPE_CHANNEL_LAYOUT:
2001 FF_ENABLE_DEPRECATION_WARNINGS
2004 case AV_OPT_TYPE_STRING:
2005 range->component_min = 0;
2006 range->component_max = 0x10FFFF; // max unicode value
2007 range->value_min = -1;
2008 range->value_max = INT_MAX;
2010 case AV_OPT_TYPE_RATIONAL:
2011 range->component_min = INT_MIN;
2012 range->component_max = INT_MAX;
2014 case AV_OPT_TYPE_IMAGE_SIZE:
2015 range->component_min = 0;
2016 range->component_max = INT_MAX/128/8;
2017 range->value_min = 0;
2018 range->value_max = INT_MAX/8;
2020 case AV_OPT_TYPE_VIDEO_RATE:
2021 range->component_min = 1;
2022 range->component_max = INT_MAX;
2023 range->value_min = 1;
2024 range->value_max = INT_MAX;
2027 ret = AVERROR(ENOSYS);
2031 *ranges_arg = ranges;
2036 av_free(range_array);
2040 void av_opt_freep_ranges(AVOptionRanges **rangesp)
2043 AVOptionRanges *ranges = *rangesp;
2048 for (i = 0; i < ranges->nb_ranges * ranges->nb_components; i++) {
2049 AVOptionRange *range = ranges->range[i];
2051 av_freep(&range->str);
2052 av_freep(&ranges->range[i]);
2055 av_freep(&ranges->range);
2059 int av_opt_is_set_to_default(void *obj, const AVOption *o)
2070 return AVERROR(EINVAL);
2072 dst = ((uint8_t*)obj) + o->offset;
2075 case AV_OPT_TYPE_CONST:
2077 case AV_OPT_TYPE_BOOL:
2078 case AV_OPT_TYPE_FLAGS:
2079 case AV_OPT_TYPE_PIXEL_FMT:
2080 case AV_OPT_TYPE_SAMPLE_FMT:
2081 case AV_OPT_TYPE_INT:
2082 #if FF_API_OLD_CHANNEL_LAYOUT
2083 FF_DISABLE_DEPRECATION_WARNINGS
2084 case AV_OPT_TYPE_CHANNEL_LAYOUT:
2085 FF_ENABLE_DEPRECATION_WARNINGS
2087 case AV_OPT_TYPE_DURATION:
2088 case AV_OPT_TYPE_INT64:
2089 case AV_OPT_TYPE_UINT64:
2090 read_number(o, dst, NULL, NULL, &i64);
2091 return o->default_val.i64 == i64;
2092 case AV_OPT_TYPE_CHLAYOUT: {
2093 AVChannelLayout ch_layout = { 0 };
2094 if (o->default_val.str) {
2095 if ((ret = av_channel_layout_from_string(&ch_layout, o->default_val.str)) < 0)
2098 return !av_channel_layout_compare((AVChannelLayout *)dst, &ch_layout);
2100 case AV_OPT_TYPE_STRING:
2101 str = *(char **)dst;
2102 if (str == o->default_val.str) //2 NULLs
2104 if (!str || !o->default_val.str) //1 NULL
2106 return !strcmp(str, o->default_val.str);
2107 case AV_OPT_TYPE_DOUBLE:
2108 read_number(o, dst, &d, NULL, NULL);
2109 return o->default_val.dbl == d;
2110 case AV_OPT_TYPE_FLOAT:
2111 read_number(o, dst, &d, NULL, NULL);
2112 f = o->default_val.dbl;
2115 case AV_OPT_TYPE_RATIONAL:
2116 q = av_d2q(o->default_val.dbl, INT_MAX);
2117 return !av_cmp_q(*(AVRational*)dst, q);
2118 case AV_OPT_TYPE_BINARY: {
2123 int opt_size = *(int *)((void **)dst + 1);
2124 void *opt_ptr = *(void **)dst;
2125 if (!opt_size && (!o->default_val.str || !strlen(o->default_val.str)))
2127 if (!opt_size || !o->default_val.str || !strlen(o->default_val.str ))
2129 if (opt_size != strlen(o->default_val.str) / 2)
2131 ret = set_string_binary(NULL, NULL, o->default_val.str, &tmp.data);
2133 ret = !memcmp(opt_ptr, tmp.data, tmp.size);
2137 case AV_OPT_TYPE_DICT: {
2138 AVDictionary *dict1 = NULL;
2139 AVDictionary *dict2 = *(AVDictionary **)dst;
2140 const AVDictionaryEntry *en1 = NULL;
2141 const AVDictionaryEntry *en2 = NULL;
2142 ret = av_dict_parse_string(&dict1, o->default_val.str, "=", ":", 0);
2144 av_dict_free(&dict1);
2148 en1 = av_dict_iterate(dict1, en1);
2149 en2 = av_dict_iterate(dict2, en2);
2150 } while (en1 && en2 && !strcmp(en1->key, en2->key) && !strcmp(en1->value, en2->value));
2151 av_dict_free(&dict1);
2152 return (!en1 && !en2);
2154 case AV_OPT_TYPE_IMAGE_SIZE:
2155 if (!o->default_val.str || !strcmp(o->default_val.str, "none"))
2157 else if ((ret = av_parse_video_size(&w, &h, o->default_val.str)) < 0)
2159 return (w == *(int *)dst) && (h == *((int *)dst+1));
2160 case AV_OPT_TYPE_VIDEO_RATE:
2161 q = (AVRational){0, 0};
2162 if (o->default_val.str) {
2163 if ((ret = av_parse_video_rate(&q, o->default_val.str)) < 0)
2166 return !av_cmp_q(*(AVRational*)dst, q);
2167 case AV_OPT_TYPE_COLOR: {
2168 uint8_t color[4] = {0, 0, 0, 0};
2169 if (o->default_val.str) {
2170 if ((ret = av_parse_color(color, o->default_val.str, -1, NULL)) < 0)
2173 return !memcmp(color, dst, sizeof(color));
2176 av_log(obj, AV_LOG_WARNING, "Not supported option type: %d, option name: %s\n", o->type, o->name);
2179 return AVERROR_PATCHWELCOME;
2182 int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags)
2187 return AVERROR(EINVAL);
2188 o = av_opt_find2(obj, name, NULL, 0, search_flags, &target);
2190 return AVERROR_OPTION_NOT_FOUND;
2191 return av_opt_is_set_to_default(target, o);
2194 int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
2195 const char key_val_sep, const char pairs_sep)
2197 const AVOption *o = NULL;
2201 const char special_chars[] = {pairs_sep, key_val_sep, '\0'};
2203 if (pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep ||
2204 pairs_sep == '\\' || key_val_sep == '\\') {
2205 av_log(obj, AV_LOG_ERROR, "Invalid separator(s) found.");
2206 return AVERROR(EINVAL);
2209 if (!obj || !buffer)
2210 return AVERROR(EINVAL);
2213 av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED);
2215 while (o = av_opt_next(obj, o)) {
2216 if (o->type == AV_OPT_TYPE_CONST)
2218 if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != opt_flags)
2220 else if (((o->flags & opt_flags) != opt_flags))
2222 if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
2224 if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
2225 av_bprint_finalize(&bprint, NULL);
2230 av_bprint_append_data(&bprint, &pairs_sep, 1);
2231 av_bprint_escape(&bprint, o->name, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
2232 av_bprint_append_data(&bprint, &key_val_sep, 1);
2233 av_bprint_escape(&bprint, buf, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
2237 ret = av_bprint_finalize(&bprint, buffer);