]> git.sesse.net Git - ffmpeg/blob - libavutil/opt.c
Merge commit '15b0517da986b312fc2fcb364a92db328380b15b'
[ffmpeg] / libavutil / opt.c
1 /*
2  * AVOptions
3  * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21
22 /**
23  * @file
24  * AVOptions
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27
28 #include "avutil.h"
29 #include "avassert.h"
30 #include "avstring.h"
31 #include "channel_layout.h"
32 #include "common.h"
33 #include "dict.h"
34 #include "eval.h"
35 #include "log.h"
36 #include "parseutils.h"
37 #include "pixdesc.h"
38 #include "mathematics.h"
39 #include "opt.h"
40 #include "samplefmt.h"
41 #include "bprint.h"
42
43 #include <float.h>
44
45 const AVOption *av_opt_next(const void *obj, const AVOption *last)
46 {
47     const AVClass *class;
48     if (!obj)
49         return NULL;
50     class = *(const AVClass**)obj;
51     if (!last && class && class->option && class->option[0].name)
52         return class->option;
53     if (last && last[1].name)
54         return ++last;
55     return NULL;
56 }
57
58 static int read_number(const AVOption *o, const void *dst, double *num, int *den, int64_t *intnum)
59 {
60     switch (o->type) {
61     case AV_OPT_TYPE_FLAGS:
62         *intnum = *(unsigned int*)dst;
63         return 0;
64     case AV_OPT_TYPE_PIXEL_FMT:
65         *intnum = *(enum AVPixelFormat *)dst;
66         return 0;
67     case AV_OPT_TYPE_SAMPLE_FMT:
68         *intnum = *(enum AVSampleFormat *)dst;
69         return 0;
70     case AV_OPT_TYPE_BOOL:
71     case AV_OPT_TYPE_INT:
72         *intnum = *(int *)dst;
73         return 0;
74     case AV_OPT_TYPE_CHANNEL_LAYOUT:
75     case AV_OPT_TYPE_DURATION:
76     case AV_OPT_TYPE_INT64:
77         *intnum = *(int64_t *)dst;
78         return 0;
79     case AV_OPT_TYPE_FLOAT:
80         *num = *(float *)dst;
81         return 0;
82     case AV_OPT_TYPE_DOUBLE:
83         *num = *(double *)dst;
84         return 0;
85     case AV_OPT_TYPE_RATIONAL:
86         *intnum = ((AVRational *)dst)->num;
87         *den    = ((AVRational *)dst)->den;
88         return 0;
89     case AV_OPT_TYPE_CONST:
90         *num = o->default_val.dbl;
91         return 0;
92     }
93     return AVERROR(EINVAL);
94 }
95
96 static int write_number(void *obj, const AVOption *o, void *dst, double num, int den, int64_t intnum)
97 {
98     if (o->type != AV_OPT_TYPE_FLAGS &&
99         (o->max * den < num * intnum || o->min * den > num * intnum)) {
100         num = den ? num * intnum / den : (num * intnum ? INFINITY : NAN);
101         av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
102                num, o->name, o->min, o->max);
103         return AVERROR(ERANGE);
104     }
105     if (o->type == AV_OPT_TYPE_FLAGS) {
106         double d = num*intnum/den;
107         if (d < -1.5 || d > 0xFFFFFFFF+0.5 || (llrint(d*256) & 255)) {
108             av_log(obj, AV_LOG_ERROR,
109                    "Value %f for parameter '%s' is not a valid set of 32bit integer flags\n",
110                    num*intnum/den, o->name);
111             return AVERROR(ERANGE);
112         }
113     }
114
115     switch (o->type) {
116     case AV_OPT_TYPE_PIXEL_FMT:
117         *(enum AVPixelFormat *)dst = llrint(num / den) * intnum;
118         break;
119     case AV_OPT_TYPE_SAMPLE_FMT:
120         *(enum AVSampleFormat *)dst = llrint(num / den) * intnum;
121         break;
122     case AV_OPT_TYPE_BOOL:
123     case AV_OPT_TYPE_FLAGS:
124     case AV_OPT_TYPE_INT:
125         *(int *)dst = llrint(num / den) * intnum;
126         break;
127     case AV_OPT_TYPE_DURATION:
128     case AV_OPT_TYPE_CHANNEL_LAYOUT:
129     case AV_OPT_TYPE_INT64:
130         *(int64_t *)dst = llrint(num / den) * intnum;
131         break;
132     case AV_OPT_TYPE_FLOAT:
133         *(float *)dst = num * intnum / den;
134         break;
135     case AV_OPT_TYPE_DOUBLE:
136         *(double    *)dst = num * intnum / den;
137         break;
138     case AV_OPT_TYPE_RATIONAL:
139         if ((int) num == num)
140             *(AVRational *)dst = (AVRational) { num *intnum, den };
141         else
142             *(AVRational *)dst = av_d2q(num * intnum / den, 1 << 24);
143         break;
144     default:
145         return AVERROR(EINVAL);
146     }
147     return 0;
148 }
149
150 static int hexchar2int(char c) {
151     if (c >= '0' && c <= '9')
152         return c - '0';
153     if (c >= 'a' && c <= 'f')
154         return c - 'a' + 10;
155     if (c >= 'A' && c <= 'F')
156         return c - 'A' + 10;
157     return -1;
158 }
159
160 static int set_string_binary(void *obj, const AVOption *o, const char *val, uint8_t **dst)
161 {
162     int *lendst = (int *)(dst + 1);
163     uint8_t *bin, *ptr;
164     int len;
165
166     av_freep(dst);
167     *lendst = 0;
168
169     if (!val || !(len = strlen(val)))
170         return 0;
171
172     if (len & 1)
173         return AVERROR(EINVAL);
174     len /= 2;
175
176     ptr = bin = av_malloc(len);
177     if (!ptr)
178         return AVERROR(ENOMEM);
179     while (*val) {
180         int a = hexchar2int(*val++);
181         int b = hexchar2int(*val++);
182         if (a < 0 || b < 0) {
183             av_free(bin);
184             return AVERROR(EINVAL);
185         }
186         *ptr++ = (a << 4) | b;
187     }
188     *dst    = bin;
189     *lendst = len;
190
191     return 0;
192 }
193
194 static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **dst)
195 {
196     av_freep(dst);
197     *dst = av_strdup(val);
198     return *dst ? 0 : AVERROR(ENOMEM);
199 }
200
201 #define DEFAULT_NUMVAL(opt) ((opt->type == AV_OPT_TYPE_INT64 || \
202                               opt->type == AV_OPT_TYPE_CONST || \
203                               opt->type == AV_OPT_TYPE_FLAGS || \
204                               opt->type == AV_OPT_TYPE_INT)     \
205                              ? opt->default_val.i64             \
206                              : opt->default_val.dbl)
207
208 static int set_string_number(void *obj, void *target_obj, const AVOption *o, const char *val, void *dst)
209 {
210     int ret = 0;
211     int num, den;
212     char c;
213
214     if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
215         if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
216             return ret;
217         ret = 0;
218     }
219
220     for (;;) {
221         int i = 0;
222         char buf[256];
223         int cmd = 0;
224         double d;
225         int64_t intnum = 1;
226
227         if (o->type == AV_OPT_TYPE_FLAGS) {
228             if (*val == '+' || *val == '-')
229                 cmd = *(val++);
230             for (; i < sizeof(buf) - 1 && val[i] && val[i] != '+' && val[i] != '-'; i++)
231                 buf[i] = val[i];
232             buf[i] = 0;
233         }
234
235         {
236             const AVOption *o_named = av_opt_find(target_obj, i ? buf : val, o->unit, 0, 0);
237             int res;
238             int ci = 0;
239             double const_values[64];
240             const char * const_names[64];
241             if (o_named && o_named->type == AV_OPT_TYPE_CONST)
242                 d = DEFAULT_NUMVAL(o_named);
243             else {
244                 if (o->unit) {
245                     for (o_named = NULL; o_named = av_opt_next(target_obj, o_named); ) {
246                         if (o_named->type == AV_OPT_TYPE_CONST &&
247                             o_named->unit &&
248                             !strcmp(o_named->unit, o->unit)) {
249                             if (ci + 6 >= FF_ARRAY_ELEMS(const_values)) {
250                                 av_log(obj, AV_LOG_ERROR, "const_values array too small for %s\n", o->unit);
251                                 return AVERROR_PATCHWELCOME;
252                             }
253                             const_names [ci  ] = o_named->name;
254                             const_values[ci++] = DEFAULT_NUMVAL(o_named);
255                         }
256                     }
257                 }
258                 const_names [ci  ] = "default";
259                 const_values[ci++] = DEFAULT_NUMVAL(o);
260                 const_names [ci  ] = "max";
261                 const_values[ci++] = o->max;
262                 const_names [ci  ] = "min";
263                 const_values[ci++] = o->min;
264                 const_names [ci  ] = "none";
265                 const_values[ci++] = 0;
266                 const_names [ci  ] = "all";
267                 const_values[ci++] = ~0;
268                 const_names [ci] = NULL;
269                 const_values[ci] = 0;
270
271                 res = av_expr_parse_and_eval(&d, i ? buf : val, const_names,
272                                             const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
273                 if (res < 0) {
274                     av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
275                     return res;
276                 }
277             }
278         }
279         if (o->type == AV_OPT_TYPE_FLAGS) {
280             read_number(o, dst, NULL, NULL, &intnum);
281             if (cmd == '+')
282                 d = intnum | (int64_t)d;
283             else if (cmd == '-')
284                 d = intnum &~(int64_t)d;
285         }
286
287         if ((ret = write_number(obj, o, dst, d, 1, 1)) < 0)
288             return ret;
289         val += i;
290         if (!i || !*val)
291             return 0;
292     }
293
294     return 0;
295 }
296
297 static int set_string_image_size(void *obj, const AVOption *o, const char *val, int *dst)
298 {
299     int ret;
300
301     if (!val || !strcmp(val, "none")) {
302         dst[0] =
303         dst[1] = 0;
304         return 0;
305     }
306     ret = av_parse_video_size(dst, dst + 1, val);
307     if (ret < 0)
308         av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as image size\n", val);
309     return ret;
310 }
311
312 static int set_string_video_rate(void *obj, const AVOption *o, const char *val, AVRational *dst)
313 {
314     int ret;
315     if (!val) {
316         ret = AVERROR(EINVAL);
317     } else {
318         ret = av_parse_video_rate(dst, val);
319     }
320     if (ret < 0)
321         av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val);
322     return ret;
323 }
324
325 static int set_string_color(void *obj, const AVOption *o, const char *val, uint8_t *dst)
326 {
327     int ret;
328
329     if (!val) {
330         return 0;
331     } else {
332         ret = av_parse_color(dst, val, -1, obj);
333         if (ret < 0)
334             av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as color\n", val);
335         return ret;
336     }
337     return 0;
338 }
339
340 static const char *get_bool_name(int val)
341 {
342     if (val < 0)
343         return "auto";
344     return val ? "true" : "false";
345 }
346
347 static int set_string_bool(void *obj, const AVOption *o, const char *val, int *dst)
348 {
349     int n;
350
351     if (!val)
352         return 0;
353
354     if (!strcmp(val, "auto")) {
355         n = -1;
356     } else if (av_match_name(val, "true,y,yes,enable,enabled,on")) {
357         n = 1;
358     } else if (av_match_name(val, "false,n,no,disable,disabled,off")) {
359         n = 0;
360     } else {
361         char *end = NULL;
362         n = strtol(val, &end, 10);
363         if (val + strlen(val) != end)
364             goto fail;
365     }
366
367     if (n < o->min || n > o->max)
368         goto fail;
369
370     *dst = n;
371     return 0;
372
373 fail:
374     av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as boolean\n", val);
375     return AVERROR(EINVAL);
376 }
377
378 static int set_string_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst,
379                           int fmt_nb, int ((*get_fmt)(const char *)), const char *desc)
380 {
381     int fmt, min, max;
382
383     if (!val || !strcmp(val, "none")) {
384         fmt = -1;
385     } else {
386         fmt = get_fmt(val);
387         if (fmt == -1) {
388             char *tail;
389             fmt = strtol(val, &tail, 0);
390             if (*tail || (unsigned)fmt >= fmt_nb) {
391                 av_log(obj, AV_LOG_ERROR,
392                        "Unable to parse option value \"%s\" as %s\n", val, desc);
393                 return AVERROR(EINVAL);
394             }
395         }
396     }
397
398     min = FFMAX(o->min, -1);
399     max = FFMIN(o->max, fmt_nb-1);
400
401     // hack for compatibility with old ffmpeg
402     if(min == 0 && max == 0) {
403         min = -1;
404         max = fmt_nb-1;
405     }
406
407     if (fmt < min || fmt > max) {
408         av_log(obj, AV_LOG_ERROR,
409                "Value %d for parameter '%s' out of %s format range [%d - %d]\n",
410                fmt, o->name, desc, min, max);
411         return AVERROR(ERANGE);
412     }
413
414     *(int *)dst = fmt;
415     return 0;
416 }
417
418 static int set_string_pixel_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
419 {
420     return set_string_fmt(obj, o, val, dst,
421                           AV_PIX_FMT_NB, av_get_pix_fmt, "pixel format");
422 }
423
424 static int set_string_sample_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
425 {
426     return set_string_fmt(obj, o, val, dst,
427                           AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
428 }
429
430 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
431 {
432     int ret = 0;
433     void *dst, *target_obj;
434     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
435     if (!o || !target_obj)
436         return AVERROR_OPTION_NOT_FOUND;
437     if (!val && (o->type != AV_OPT_TYPE_STRING &&
438                  o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT &&
439                  o->type != AV_OPT_TYPE_IMAGE_SIZE && o->type != AV_OPT_TYPE_VIDEO_RATE &&
440                  o->type != AV_OPT_TYPE_DURATION && o->type != AV_OPT_TYPE_COLOR &&
441                  o->type != AV_OPT_TYPE_CHANNEL_LAYOUT && o->type != AV_OPT_TYPE_BOOL))
442         return AVERROR(EINVAL);
443
444     if (o->flags & AV_OPT_FLAG_READONLY)
445         return AVERROR(EINVAL);
446
447     dst = ((uint8_t *)target_obj) + o->offset;
448     switch (o->type) {
449     case AV_OPT_TYPE_BOOL:
450         return set_string_bool(obj, o, val, dst);
451     case AV_OPT_TYPE_STRING:
452         return set_string(obj, o, val, dst);
453     case AV_OPT_TYPE_BINARY:
454         return set_string_binary(obj, o, val, dst);
455     case AV_OPT_TYPE_FLAGS:
456     case AV_OPT_TYPE_INT:
457     case AV_OPT_TYPE_INT64:
458     case AV_OPT_TYPE_FLOAT:
459     case AV_OPT_TYPE_DOUBLE:
460     case AV_OPT_TYPE_RATIONAL:
461         return set_string_number(obj, target_obj, o, val, dst);
462     case AV_OPT_TYPE_IMAGE_SIZE:
463         return set_string_image_size(obj, o, val, dst);
464     case AV_OPT_TYPE_VIDEO_RATE:
465         return set_string_video_rate(obj, o, val, dst);
466     case AV_OPT_TYPE_PIXEL_FMT:
467         return set_string_pixel_fmt(obj, o, val, dst);
468     case AV_OPT_TYPE_SAMPLE_FMT:
469         return set_string_sample_fmt(obj, o, val, dst);
470     case AV_OPT_TYPE_DURATION:
471         if (!val) {
472             *(int64_t *)dst = 0;
473             return 0;
474         } else {
475             if ((ret = av_parse_time(dst, val, 1)) < 0)
476                 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as duration\n", val);
477             return ret;
478         }
479         break;
480     case AV_OPT_TYPE_COLOR:
481         return set_string_color(obj, o, val, dst);
482     case AV_OPT_TYPE_CHANNEL_LAYOUT:
483         if (!val || !strcmp(val, "none")) {
484             *(int64_t *)dst = 0;
485         } else {
486             int64_t cl = av_get_channel_layout(val);
487             if (!cl) {
488                 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
489                 ret = AVERROR(EINVAL);
490             }
491             *(int64_t *)dst = cl;
492             return ret;
493         }
494         break;
495     }
496
497     av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
498     return AVERROR(EINVAL);
499 }
500
501 #define OPT_EVAL_NUMBER(name, opttype, vartype)                         \
502 int av_opt_eval_ ## name(void *obj, const AVOption *o,                  \
503                          const char *val, vartype *name ## _out)        \
504 {                                                                       \
505     if (!o || o->type != opttype || o->flags & AV_OPT_FLAG_READONLY)    \
506         return AVERROR(EINVAL);                                         \
507     return set_string_number(obj, obj, o, val, name ## _out);           \
508 }
509
510 OPT_EVAL_NUMBER(flags,  AV_OPT_TYPE_FLAGS,    int)
511 OPT_EVAL_NUMBER(int,    AV_OPT_TYPE_INT,      int)
512 OPT_EVAL_NUMBER(int64,  AV_OPT_TYPE_INT64,    int64_t)
513 OPT_EVAL_NUMBER(float,  AV_OPT_TYPE_FLOAT,    float)
514 OPT_EVAL_NUMBER(double, AV_OPT_TYPE_DOUBLE,   double)
515 OPT_EVAL_NUMBER(q,      AV_OPT_TYPE_RATIONAL, AVRational)
516
517 static int set_number(void *obj, const char *name, double num, int den, int64_t intnum,
518                       int search_flags)
519 {
520     void *dst, *target_obj;
521     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
522
523     if (!o || !target_obj)
524         return AVERROR_OPTION_NOT_FOUND;
525
526     if (o->flags & AV_OPT_FLAG_READONLY)
527         return AVERROR(EINVAL);
528
529     dst = ((uint8_t *)target_obj) + o->offset;
530     return write_number(obj, o, dst, num, den, intnum);
531 }
532
533 int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
534 {
535     return set_number(obj, name, 1, 1, val, search_flags);
536 }
537
538 int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
539 {
540     return set_number(obj, name, val, 1, 1, search_flags);
541 }
542
543 int av_opt_set_q(void *obj, const char *name, AVRational val, int search_flags)
544 {
545     return set_number(obj, name, val.num, val.den, 1, search_flags);
546 }
547
548 int av_opt_set_bin(void *obj, const char *name, const uint8_t *val, int len, int search_flags)
549 {
550     void *target_obj;
551     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
552     uint8_t *ptr;
553     uint8_t **dst;
554     int *lendst;
555
556     if (!o || !target_obj)
557         return AVERROR_OPTION_NOT_FOUND;
558
559     if (o->type != AV_OPT_TYPE_BINARY || o->flags & AV_OPT_FLAG_READONLY)
560         return AVERROR(EINVAL);
561
562     ptr = len ? av_malloc(len) : NULL;
563     if (len && !ptr)
564         return AVERROR(ENOMEM);
565
566     dst    = (uint8_t **)(((uint8_t *)target_obj) + o->offset);
567     lendst = (int *)(dst + 1);
568
569     av_free(*dst);
570     *dst    = ptr;
571     *lendst = len;
572     if (len)
573         memcpy(ptr, val, len);
574
575     return 0;
576 }
577
578 int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags)
579 {
580     void *target_obj;
581     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
582
583     if (!o || !target_obj)
584         return AVERROR_OPTION_NOT_FOUND;
585     if (o->type != AV_OPT_TYPE_IMAGE_SIZE) {
586         av_log(obj, AV_LOG_ERROR,
587                "The value set by option '%s' is not an image size.\n", o->name);
588         return AVERROR(EINVAL);
589     }
590     if (w<0 || h<0) {
591         av_log(obj, AV_LOG_ERROR,
592                "Invalid negative size value %dx%d for size '%s'\n", w, h, o->name);
593         return AVERROR(EINVAL);
594     }
595     *(int *)(((uint8_t *)target_obj)             + o->offset) = w;
596     *(int *)(((uint8_t *)target_obj+sizeof(int)) + o->offset) = h;
597     return 0;
598 }
599
600 int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags)
601 {
602     void *target_obj;
603     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
604
605     if (!o || !target_obj)
606         return AVERROR_OPTION_NOT_FOUND;
607     if (o->type != AV_OPT_TYPE_VIDEO_RATE) {
608         av_log(obj, AV_LOG_ERROR,
609                "The value set by option '%s' is not a video rate.\n", o->name);
610         return AVERROR(EINVAL);
611     }
612     if (val.num <= 0 || val.den <= 0)
613         return AVERROR(EINVAL);
614     return set_number(obj, name, val.num, val.den, 1, search_flags);
615 }
616
617 static int set_format(void *obj, const char *name, int fmt, int search_flags,
618                       enum AVOptionType type, const char *desc, int nb_fmts)
619 {
620     void *target_obj;
621     const AVOption *o = av_opt_find2(obj, name, NULL, 0,
622                                      search_flags, &target_obj);
623     int min, max;
624
625     if (!o || !target_obj)
626         return AVERROR_OPTION_NOT_FOUND;
627     if (o->type != type) {
628         av_log(obj, AV_LOG_ERROR,
629                "The value set by option '%s' is not a %s format", name, desc);
630         return AVERROR(EINVAL);
631     }
632
633     min = FFMAX(o->min, -1);
634     max = FFMIN(o->max, nb_fmts-1);
635
636     if (fmt < min || fmt > max) {
637         av_log(obj, AV_LOG_ERROR,
638                "Value %d for parameter '%s' out of %s format range [%d - %d]\n",
639                fmt, name, desc, min, max);
640         return AVERROR(ERANGE);
641     }
642     *(int *)(((uint8_t *)target_obj) + o->offset) = fmt;
643     return 0;
644 }
645
646 int av_opt_set_pixel_fmt(void *obj, const char *name, enum AVPixelFormat fmt, int search_flags)
647 {
648     return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_PIXEL_FMT, "pixel", AV_PIX_FMT_NB);
649 }
650
651 int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags)
652 {
653     return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB);
654 }
655
656 int av_opt_set_channel_layout(void *obj, const char *name, int64_t cl, int search_flags)
657 {
658     void *target_obj;
659     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
660
661     if (!o || !target_obj)
662         return AVERROR_OPTION_NOT_FOUND;
663     if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
664         av_log(obj, AV_LOG_ERROR,
665                "The value set by option '%s' is not a channel layout.\n", o->name);
666         return AVERROR(EINVAL);
667     }
668     *(int64_t *)(((uint8_t *)target_obj) + o->offset) = cl;
669     return 0;
670 }
671
672 int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val,
673                         int search_flags)
674 {
675     void *target_obj;
676     AVDictionary **dst;
677     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
678
679     if (!o || !target_obj)
680         return AVERROR_OPTION_NOT_FOUND;
681     if (o->flags & AV_OPT_FLAG_READONLY)
682         return AVERROR(EINVAL);
683
684     dst = (AVDictionary **)(((uint8_t *)target_obj) + o->offset);
685     av_dict_free(dst);
686     av_dict_copy(dst, val, 0);
687
688     return 0;
689 }
690
691 static void format_duration(char *buf, size_t size, int64_t d)
692 {
693     char *e;
694
695     av_assert0(size >= 25);
696     if (d < 0 && d != INT64_MIN) {
697         *(buf++) = '-';
698         size--;
699         d = -d;
700     }
701     if (d == INT64_MAX)
702         snprintf(buf, size, "INT64_MAX");
703     else if (d == INT64_MIN)
704         snprintf(buf, size, "INT64_MIN");
705     else if (d > (int64_t)3600*1000000)
706         snprintf(buf, size, "%"PRId64":%02d:%02d.%06d", d / 3600000000,
707                  (int)((d / 60000000) % 60),
708                  (int)((d / 1000000) % 60),
709                  (int)(d % 1000000));
710     else if (d > 60*1000000)
711         snprintf(buf, size, "%d:%02d.%06d",
712                  (int)(d / 60000000),
713                  (int)((d / 1000000) % 60),
714                  (int)(d % 1000000));
715     else
716         snprintf(buf, size, "%d.%06d",
717                  (int)(d / 1000000),
718                  (int)(d % 1000000));
719     e = buf + strlen(buf);
720     while (e > buf && e[-1] == '0')
721         *(--e) = 0;
722     if (e > buf && e[-1] == '.')
723         *(--e) = 0;
724 }
725
726 int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
727 {
728     void *dst, *target_obj;
729     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
730     uint8_t *bin, buf[128];
731     int len, i, ret;
732     int64_t i64;
733
734     if (!o || !target_obj || (o->offset<=0 && o->type != AV_OPT_TYPE_CONST))
735         return AVERROR_OPTION_NOT_FOUND;
736
737     dst = (uint8_t *)target_obj + o->offset;
738
739     buf[0] = 0;
740     switch (o->type) {
741     case AV_OPT_TYPE_BOOL:
742         ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(get_bool_name(*(int *)dst), "invalid"));
743         break;
744     case AV_OPT_TYPE_FLAGS:
745         ret = snprintf(buf, sizeof(buf), "0x%08X", *(int *)dst);
746         break;
747     case AV_OPT_TYPE_INT:
748         ret = snprintf(buf, sizeof(buf), "%d", *(int *)dst);
749         break;
750     case AV_OPT_TYPE_INT64:
751         ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t *)dst);
752         break;
753     case AV_OPT_TYPE_FLOAT:
754         ret = snprintf(buf, sizeof(buf), "%f", *(float *)dst);
755         break;
756     case AV_OPT_TYPE_DOUBLE:
757         ret = snprintf(buf, sizeof(buf), "%f", *(double *)dst);
758         break;
759     case AV_OPT_TYPE_VIDEO_RATE:
760     case AV_OPT_TYPE_RATIONAL:
761         ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational *)dst)->num, ((AVRational *)dst)->den);
762         break;
763     case AV_OPT_TYPE_CONST:
764         ret = snprintf(buf, sizeof(buf), "%f", o->default_val.dbl);
765         break;
766     case AV_OPT_TYPE_STRING:
767         if (*(uint8_t **)dst) {
768             *out_val = av_strdup(*(uint8_t **)dst);
769         } else if (search_flags & AV_OPT_ALLOW_NULL) {
770             *out_val = NULL;
771             return 0;
772         } else {
773             *out_val = av_strdup("");
774         }
775         return *out_val ? 0 : AVERROR(ENOMEM);
776     case AV_OPT_TYPE_BINARY:
777         if (!*(uint8_t **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
778             *out_val = NULL;
779             return 0;
780         }
781         len = *(int *)(((uint8_t *)dst) + sizeof(uint8_t *));
782         if ((uint64_t)len * 2 + 1 > INT_MAX)
783             return AVERROR(EINVAL);
784         if (!(*out_val = av_malloc(len * 2 + 1)))
785             return AVERROR(ENOMEM);
786         if (!len) {
787             *out_val[0] = '\0';
788             return 0;
789         }
790         bin = *(uint8_t **)dst;
791         for (i = 0; i < len; i++)
792             snprintf(*out_val + i * 2, 3, "%02X", bin[i]);
793         return 0;
794     case AV_OPT_TYPE_IMAGE_SIZE:
795         ret = snprintf(buf, sizeof(buf), "%dx%d", ((int *)dst)[0], ((int *)dst)[1]);
796         break;
797     case AV_OPT_TYPE_PIXEL_FMT:
798         ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_pix_fmt_name(*(enum AVPixelFormat *)dst), "none"));
799         break;
800     case AV_OPT_TYPE_SAMPLE_FMT:
801         ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_sample_fmt_name(*(enum AVSampleFormat *)dst), "none"));
802         break;
803     case AV_OPT_TYPE_DURATION:
804         i64 = *(int64_t *)dst;
805         format_duration(buf, sizeof(buf), i64);
806         ret = strlen(buf); // no overflow possible, checked by an assert
807         break;
808     case AV_OPT_TYPE_COLOR:
809         ret = snprintf(buf, sizeof(buf), "0x%02x%02x%02x%02x",
810                        (int)((uint8_t *)dst)[0], (int)((uint8_t *)dst)[1],
811                        (int)((uint8_t *)dst)[2], (int)((uint8_t *)dst)[3]);
812         break;
813     case AV_OPT_TYPE_CHANNEL_LAYOUT:
814         i64 = *(int64_t *)dst;
815         ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
816         break;
817     default:
818         return AVERROR(EINVAL);
819     }
820
821     if (ret >= sizeof(buf))
822         return AVERROR(EINVAL);
823     *out_val = av_strdup(buf);
824     return *out_val ? 0 : AVERROR(ENOMEM);
825 }
826
827 static int get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum,
828                       int search_flags)
829 {
830     void *dst, *target_obj;
831     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
832     if (!o || !target_obj)
833         goto error;
834
835     dst = ((uint8_t *)target_obj) + o->offset;
836
837     if (o_out) *o_out= o;
838
839     return read_number(o, dst, num, den, intnum);
840
841 error:
842     *den    =
843     *intnum = 0;
844     return -1;
845 }
846
847 int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
848 {
849     int64_t intnum = 1;
850     double num = 1;
851     int ret, den = 1;
852
853     if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
854         return ret;
855     *out_val = num * intnum / den;
856     return 0;
857 }
858
859 int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val)
860 {
861     int64_t intnum = 1;
862     double num = 1;
863     int ret, den = 1;
864
865     if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
866         return ret;
867     *out_val = num * intnum / den;
868     return 0;
869 }
870
871 int av_opt_get_q(void *obj, const char *name, int search_flags, AVRational *out_val)
872 {
873     int64_t intnum = 1;
874     double num = 1;
875     int ret, den = 1;
876
877     if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
878         return ret;
879
880     if (num == 1.0 && (int)intnum == intnum)
881         *out_val = (AVRational){intnum, den};
882     else
883         *out_val = av_d2q(num*intnum/den, 1<<24);
884     return 0;
885 }
886
887 int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out)
888 {
889     void *dst, *target_obj;
890     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
891     if (!o || !target_obj)
892         return AVERROR_OPTION_NOT_FOUND;
893     if (o->type != AV_OPT_TYPE_IMAGE_SIZE) {
894         av_log(obj, AV_LOG_ERROR,
895                "The value for option '%s' is not an image size.\n", name);
896         return AVERROR(EINVAL);
897     }
898
899     dst = ((uint8_t*)target_obj) + o->offset;
900     if (w_out) *w_out = *(int *)dst;
901     if (h_out) *h_out = *((int *)dst+1);
902     return 0;
903 }
904
905 int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val)
906 {
907     int64_t intnum = 1;
908     double     num = 1;
909     int   ret, den = 1;
910
911     if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
912         return ret;
913
914     if (num == 1.0 && (int)intnum == intnum)
915         *out_val = (AVRational) { intnum, den };
916     else
917         *out_val = av_d2q(num * intnum / den, 1 << 24);
918     return 0;
919 }
920
921 static int get_format(void *obj, const char *name, int search_flags, int *out_fmt,
922                       enum AVOptionType type, const char *desc)
923 {
924     void *dst, *target_obj;
925     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
926     if (!o || !target_obj)
927         return AVERROR_OPTION_NOT_FOUND;
928     if (o->type != type) {
929         av_log(obj, AV_LOG_ERROR,
930                "The value for option '%s' is not a %s format.\n", desc, name);
931         return AVERROR(EINVAL);
932     }
933
934     dst = ((uint8_t*)target_obj) + o->offset;
935     *out_fmt = *(int *)dst;
936     return 0;
937 }
938
939 int av_opt_get_pixel_fmt(void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt)
940 {
941     return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_PIXEL_FMT, "pixel");
942 }
943
944 int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt)
945 {
946     return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_SAMPLE_FMT, "sample");
947 }
948
949 int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *cl)
950 {
951     void *dst, *target_obj;
952     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
953     if (!o || !target_obj)
954         return AVERROR_OPTION_NOT_FOUND;
955     if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
956         av_log(obj, AV_LOG_ERROR,
957                "The value for option '%s' is not a channel layout.\n", name);
958         return AVERROR(EINVAL);
959     }
960
961     dst = ((uint8_t*)target_obj) + o->offset;
962     *cl = *(int64_t *)dst;
963     return 0;
964 }
965
966 int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val)
967 {
968     void *target_obj;
969     AVDictionary *src;
970     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
971
972     if (!o || !target_obj)
973         return AVERROR_OPTION_NOT_FOUND;
974     if (o->type != AV_OPT_TYPE_DICT)
975         return AVERROR(EINVAL);
976
977     src = *(AVDictionary **)(((uint8_t *)target_obj) + o->offset);
978     av_dict_copy(out_val, src, 0);
979
980     return 0;
981 }
982
983 int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
984 {
985     const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0);
986     const AVOption *flag  = av_opt_find(obj, flag_name,
987                                         field ? field->unit : NULL, 0, 0);
988     int64_t res;
989
990     if (!field || !flag || flag->type != AV_OPT_TYPE_CONST ||
991         av_opt_get_int(obj, field_name, 0, &res) < 0)
992         return 0;
993     return res & flag->default_val.i64;
994 }
995
996 static void log_value(void *av_log_obj, int level, double d)
997 {
998     if      (d == INT_MAX) {
999         av_log(av_log_obj, level, "INT_MAX");
1000     } else if (d == INT_MIN) {
1001         av_log(av_log_obj, level, "INT_MIN");
1002     } else if (d == UINT32_MAX) {
1003         av_log(av_log_obj, level, "UINT32_MAX");
1004     } else if (d == (double)INT64_MAX) {
1005         av_log(av_log_obj, level, "I64_MAX");
1006     } else if (d == INT64_MIN) {
1007         av_log(av_log_obj, level, "I64_MIN");
1008     } else if (d == FLT_MAX) {
1009         av_log(av_log_obj, level, "FLT_MAX");
1010     } else if (d == FLT_MIN) {
1011         av_log(av_log_obj, level, "FLT_MIN");
1012     } else if (d == -FLT_MAX) {
1013         av_log(av_log_obj, level, "-FLT_MAX");
1014     } else if (d == -FLT_MIN) {
1015         av_log(av_log_obj, level, "-FLT_MIN");
1016     } else if (d == DBL_MAX) {
1017         av_log(av_log_obj, level, "DBL_MAX");
1018     } else if (d == DBL_MIN) {
1019         av_log(av_log_obj, level, "DBL_MIN");
1020     } else if (d == -DBL_MAX) {
1021         av_log(av_log_obj, level, "-DBL_MAX");
1022     } else if (d == -DBL_MIN) {
1023         av_log(av_log_obj, level, "-DBL_MIN");
1024     } else {
1025         av_log(av_log_obj, level, "%g", d);
1026     }
1027 }
1028
1029 static const char *get_opt_const_name(void *obj, const char *unit, int64_t value)
1030 {
1031     const AVOption *opt = NULL;
1032
1033     if (!unit)
1034         return NULL;
1035     while ((opt = av_opt_next(obj, opt)))
1036         if (opt->type == AV_OPT_TYPE_CONST && !strcmp(opt->unit, unit) &&
1037             opt->default_val.i64 == value)
1038             return opt->name;
1039     return NULL;
1040 }
1041
1042 static char *get_opt_flags_string(void *obj, const char *unit, int64_t value)
1043 {
1044     const AVOption *opt = NULL;
1045     char flags[512];
1046
1047     flags[0] = 0;
1048     if (!unit)
1049         return NULL;
1050     while ((opt = av_opt_next(obj, opt))) {
1051         if (opt->type == AV_OPT_TYPE_CONST && !strcmp(opt->unit, unit) &&
1052             opt->default_val.i64 & value) {
1053             if (flags[0])
1054                 av_strlcatf(flags, sizeof(flags), "+");
1055             av_strlcatf(flags, sizeof(flags), "%s", opt->name);
1056         }
1057     }
1058     if (flags[0])
1059         return av_strdup(flags);
1060     return NULL;
1061 }
1062
1063 static void opt_list(void *obj, void *av_log_obj, const char *unit,
1064                      int req_flags, int rej_flags)
1065 {
1066     const AVOption *opt = NULL;
1067     AVOptionRanges *r;
1068     int i;
1069
1070     while ((opt = av_opt_next(obj, opt))) {
1071         if (!(opt->flags & req_flags) || (opt->flags & rej_flags))
1072             continue;
1073
1074         /* Don't print CONST's on level one.
1075          * Don't print anything but CONST's on level two.
1076          * Only print items from the requested unit.
1077          */
1078         if (!unit && opt->type == AV_OPT_TYPE_CONST)
1079             continue;
1080         else if (unit && opt->type != AV_OPT_TYPE_CONST)
1081             continue;
1082         else if (unit && opt->type == AV_OPT_TYPE_CONST && strcmp(unit, opt->unit))
1083             continue;
1084         else if (unit && opt->type == AV_OPT_TYPE_CONST)
1085             av_log(av_log_obj, AV_LOG_INFO, "     %-15s ", opt->name);
1086         else
1087             av_log(av_log_obj, AV_LOG_INFO, "  %s%-17s ",
1088                    (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? "" : "-",
1089                    opt->name);
1090
1091         switch (opt->type) {
1092             case AV_OPT_TYPE_FLAGS:
1093                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<flags>");
1094                 break;
1095             case AV_OPT_TYPE_INT:
1096                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int>");
1097                 break;
1098             case AV_OPT_TYPE_INT64:
1099                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int64>");
1100                 break;
1101             case AV_OPT_TYPE_DOUBLE:
1102                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<double>");
1103                 break;
1104             case AV_OPT_TYPE_FLOAT:
1105                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<float>");
1106                 break;
1107             case AV_OPT_TYPE_STRING:
1108                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<string>");
1109                 break;
1110             case AV_OPT_TYPE_RATIONAL:
1111                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<rational>");
1112                 break;
1113             case AV_OPT_TYPE_BINARY:
1114                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<binary>");
1115                 break;
1116             case AV_OPT_TYPE_IMAGE_SIZE:
1117                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>");
1118                 break;
1119             case AV_OPT_TYPE_VIDEO_RATE:
1120                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<video_rate>");
1121                 break;
1122             case AV_OPT_TYPE_PIXEL_FMT:
1123                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>");
1124                 break;
1125             case AV_OPT_TYPE_SAMPLE_FMT:
1126                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<sample_fmt>");
1127                 break;
1128             case AV_OPT_TYPE_DURATION:
1129                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<duration>");
1130                 break;
1131             case AV_OPT_TYPE_COLOR:
1132                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<color>");
1133                 break;
1134             case AV_OPT_TYPE_CHANNEL_LAYOUT:
1135                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<channel_layout>");
1136                 break;
1137             case AV_OPT_TYPE_BOOL:
1138                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<boolean>");
1139                 break;
1140             case AV_OPT_TYPE_CONST:
1141             default:
1142                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
1143                 break;
1144         }
1145         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.');
1146         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.');
1147         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_FILTERING_PARAM)? 'F' : '.');
1148         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM   ) ? 'V' : '.');
1149         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM   ) ? 'A' : '.');
1150         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.');
1151         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_EXPORT)         ? 'X' : '.');
1152         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_READONLY)       ? 'R' : '.');
1153
1154         if (opt->help)
1155             av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
1156
1157         if (av_opt_query_ranges(&r, obj, opt->name, AV_OPT_SEARCH_FAKE_OBJ) >= 0) {
1158             switch (opt->type) {
1159             case AV_OPT_TYPE_INT:
1160             case AV_OPT_TYPE_INT64:
1161             case AV_OPT_TYPE_DOUBLE:
1162             case AV_OPT_TYPE_FLOAT:
1163             case AV_OPT_TYPE_RATIONAL:
1164                 for (i = 0; i < r->nb_ranges; i++) {
1165                     av_log(av_log_obj, AV_LOG_INFO, " (from ");
1166                     log_value(av_log_obj, AV_LOG_INFO, r->range[i]->value_min);
1167                     av_log(av_log_obj, AV_LOG_INFO, " to ");
1168                     log_value(av_log_obj, AV_LOG_INFO, r->range[i]->value_max);
1169                     av_log(av_log_obj, AV_LOG_INFO, ")");
1170                 }
1171                 break;
1172             }
1173             av_opt_freep_ranges(&r);
1174         }
1175
1176         if (opt->type != AV_OPT_TYPE_CONST  &&
1177             opt->type != AV_OPT_TYPE_BINARY &&
1178                 !((opt->type == AV_OPT_TYPE_COLOR      ||
1179                    opt->type == AV_OPT_TYPE_IMAGE_SIZE ||
1180                    opt->type == AV_OPT_TYPE_STRING     ||
1181                    opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
1182                   !opt->default_val.str)) {
1183             av_log(av_log_obj, AV_LOG_INFO, " (default ");
1184             switch (opt->type) {
1185             case AV_OPT_TYPE_BOOL:
1186                 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
1187                 break;
1188             case AV_OPT_TYPE_FLAGS: {
1189                 char *def_flags = get_opt_flags_string(obj, opt->unit, opt->default_val.i64);
1190                 if (def_flags) {
1191                     av_log(av_log_obj, AV_LOG_INFO, "%s", def_flags);
1192                     av_freep(&def_flags);
1193                 } else {
1194                     av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
1195                 }
1196                 break;
1197             }
1198             case AV_OPT_TYPE_DURATION: {
1199                 char buf[25];
1200                 format_duration(buf, sizeof(buf), opt->default_val.i64);
1201                 av_log(av_log_obj, AV_LOG_INFO, "%s", buf);
1202                 break;
1203             }
1204             case AV_OPT_TYPE_INT:
1205             case AV_OPT_TYPE_INT64: {
1206                 const char *def_const = get_opt_const_name(obj, opt->unit, opt->default_val.i64);
1207                 if (def_const)
1208                     av_log(av_log_obj, AV_LOG_INFO, "%s", def_const);
1209                 else
1210                     log_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
1211                 break;
1212             }
1213             case AV_OPT_TYPE_DOUBLE:
1214             case AV_OPT_TYPE_FLOAT:
1215                 log_value(av_log_obj, AV_LOG_INFO, opt->default_val.dbl);
1216                 break;
1217             case AV_OPT_TYPE_RATIONAL: {
1218                 AVRational q = av_d2q(opt->default_val.dbl, INT_MAX);
1219                 av_log(av_log_obj, AV_LOG_INFO, "%d/%d", q.num, q.den); }
1220                 break;
1221             case AV_OPT_TYPE_PIXEL_FMT:
1222                 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_pix_fmt_name(opt->default_val.i64), "none"));
1223                 break;
1224             case AV_OPT_TYPE_SAMPLE_FMT:
1225                 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_sample_fmt_name(opt->default_val.i64), "none"));
1226                 break;
1227             case AV_OPT_TYPE_COLOR:
1228             case AV_OPT_TYPE_IMAGE_SIZE:
1229             case AV_OPT_TYPE_STRING:
1230             case AV_OPT_TYPE_VIDEO_RATE:
1231                 av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
1232                 break;
1233             case AV_OPT_TYPE_CHANNEL_LAYOUT:
1234                 av_log(av_log_obj, AV_LOG_INFO, "0x%"PRIx64, opt->default_val.i64);
1235                 break;
1236             }
1237             av_log(av_log_obj, AV_LOG_INFO, ")");
1238         }
1239
1240         av_log(av_log_obj, AV_LOG_INFO, "\n");
1241         if (opt->unit && opt->type != AV_OPT_TYPE_CONST)
1242             opt_list(obj, av_log_obj, opt->unit, req_flags, rej_flags);
1243     }
1244 }
1245
1246 int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags)
1247 {
1248     if (!obj)
1249         return -1;
1250
1251     av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass **)obj)->class_name);
1252
1253     opt_list(obj, av_log_obj, NULL, req_flags, rej_flags);
1254
1255     return 0;
1256 }
1257
1258 void av_opt_set_defaults(void *s)
1259 {
1260     av_opt_set_defaults2(s, 0, 0);
1261 }
1262
1263 void av_opt_set_defaults2(void *s, int mask, int flags)
1264 {
1265     const AVOption *opt = NULL;
1266     while ((opt = av_opt_next(s, opt))) {
1267         void *dst = ((uint8_t*)s) + opt->offset;
1268
1269         if ((opt->flags & mask) != flags)
1270             continue;
1271
1272         if (opt->flags & AV_OPT_FLAG_READONLY)
1273             continue;
1274
1275         switch (opt->type) {
1276             case AV_OPT_TYPE_CONST:
1277                 /* Nothing to be done here */
1278                 break;
1279             case AV_OPT_TYPE_BOOL:
1280             case AV_OPT_TYPE_FLAGS:
1281             case AV_OPT_TYPE_INT:
1282             case AV_OPT_TYPE_INT64:
1283             case AV_OPT_TYPE_DURATION:
1284             case AV_OPT_TYPE_CHANNEL_LAYOUT:
1285             case AV_OPT_TYPE_PIXEL_FMT:
1286             case AV_OPT_TYPE_SAMPLE_FMT:
1287                 write_number(s, opt, dst, 1, 1, opt->default_val.i64);
1288                 break;
1289             case AV_OPT_TYPE_DOUBLE:
1290             case AV_OPT_TYPE_FLOAT: {
1291                 double val;
1292                 val = opt->default_val.dbl;
1293                 write_number(s, opt, dst, val, 1, 1);
1294             }
1295             break;
1296             case AV_OPT_TYPE_RATIONAL: {
1297                 AVRational val;
1298                 val = av_d2q(opt->default_val.dbl, INT_MAX);
1299                 write_number(s, opt, dst, 1, val.den, val.num);
1300             }
1301             break;
1302             case AV_OPT_TYPE_COLOR:
1303                 set_string_color(s, opt, opt->default_val.str, dst);
1304                 break;
1305             case AV_OPT_TYPE_STRING:
1306                 set_string(s, opt, opt->default_val.str, dst);
1307                 break;
1308             case AV_OPT_TYPE_IMAGE_SIZE:
1309                 set_string_image_size(s, opt, opt->default_val.str, dst);
1310                 break;
1311             case AV_OPT_TYPE_VIDEO_RATE:
1312                 set_string_video_rate(s, opt, opt->default_val.str, dst);
1313                 break;
1314             case AV_OPT_TYPE_BINARY:
1315                 set_string_binary(s, opt, opt->default_val.str, dst);
1316                 break;
1317             case AV_OPT_TYPE_DICT:
1318                 /* Cannot set defaults for these types */
1319             break;
1320         default:
1321             av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n",
1322                    opt->type, opt->name);
1323         }
1324     }
1325 }
1326
1327 /**
1328  * Store the value in the field in ctx that is named like key.
1329  * ctx must be an AVClass context, storing is done using AVOptions.
1330  *
1331  * @param buf the string to parse, buf will be updated to point at the
1332  * separator just after the parsed key/value pair
1333  * @param key_val_sep a 0-terminated list of characters used to
1334  * separate key from value
1335  * @param pairs_sep a 0-terminated list of characters used to separate
1336  * two pairs from each other
1337  * @return 0 if the key/value pair has been successfully parsed and
1338  * set, or a negative value corresponding to an AVERROR code in case
1339  * of error:
1340  * AVERROR(EINVAL) if the key/value pair cannot be parsed,
1341  * the error code issued by av_opt_set() if the key/value pair
1342  * cannot be set
1343  */
1344 static int parse_key_value_pair(void *ctx, const char **buf,
1345                                 const char *key_val_sep, const char *pairs_sep)
1346 {
1347     char *key = av_get_token(buf, key_val_sep);
1348     char *val;
1349     int ret;
1350
1351     if (!key)
1352         return AVERROR(ENOMEM);
1353
1354     if (*key && strspn(*buf, key_val_sep)) {
1355         (*buf)++;
1356         val = av_get_token(buf, pairs_sep);
1357         if (!val) {
1358             av_freep(&key);
1359             return AVERROR(ENOMEM);
1360         }
1361     } else {
1362         av_log(ctx, AV_LOG_ERROR, "Missing key or no key/value separator found after key '%s'\n", key);
1363         av_free(key);
1364         return AVERROR(EINVAL);
1365     }
1366
1367     av_log(ctx, AV_LOG_DEBUG, "Setting entry with key '%s' to value '%s'\n", key, val);
1368
1369     ret = av_opt_set(ctx, key, val, AV_OPT_SEARCH_CHILDREN);
1370     if (ret == AVERROR_OPTION_NOT_FOUND)
1371         av_log(ctx, AV_LOG_ERROR, "Key '%s' not found.\n", key);
1372
1373     av_free(key);
1374     av_free(val);
1375     return ret;
1376 }
1377
1378 int av_set_options_string(void *ctx, const char *opts,
1379                           const char *key_val_sep, const char *pairs_sep)
1380 {
1381     int ret, count = 0;
1382
1383     if (!opts)
1384         return 0;
1385
1386     while (*opts) {
1387         if ((ret = parse_key_value_pair(ctx, &opts, key_val_sep, pairs_sep)) < 0)
1388             return ret;
1389         count++;
1390
1391         if (*opts)
1392             opts++;
1393     }
1394
1395     return count;
1396 }
1397
1398 #define WHITESPACES " \n\t"
1399
1400 static int is_key_char(char c)
1401 {
1402     return (unsigned)((c | 32) - 'a') < 26 ||
1403            (unsigned)(c - '0') < 10 ||
1404            c == '-' || c == '_' || c == '/' || c == '.';
1405 }
1406
1407 /**
1408  * Read a key from a string.
1409  *
1410  * The key consists of is_key_char characters and must be terminated by a
1411  * character from the delim string; spaces are ignored.
1412  *
1413  * @return  0 for success (even with ellipsis), <0 for failure
1414  */
1415 static int get_key(const char **ropts, const char *delim, char **rkey)
1416 {
1417     const char *opts = *ropts;
1418     const char *key_start, *key_end;
1419
1420     key_start = opts += strspn(opts, WHITESPACES);
1421     while (is_key_char(*opts))
1422         opts++;
1423     key_end = opts;
1424     opts += strspn(opts, WHITESPACES);
1425     if (!*opts || !strchr(delim, *opts))
1426         return AVERROR(EINVAL);
1427     opts++;
1428     if (!(*rkey = av_malloc(key_end - key_start + 1)))
1429         return AVERROR(ENOMEM);
1430     memcpy(*rkey, key_start, key_end - key_start);
1431     (*rkey)[key_end - key_start] = 0;
1432     *ropts = opts;
1433     return 0;
1434 }
1435
1436 int av_opt_get_key_value(const char **ropts,
1437                          const char *key_val_sep, const char *pairs_sep,
1438                          unsigned flags,
1439                          char **rkey, char **rval)
1440 {
1441     int ret;
1442     char *key = NULL, *val;
1443     const char *opts = *ropts;
1444
1445     if ((ret = get_key(&opts, key_val_sep, &key)) < 0 &&
1446         !(flags & AV_OPT_FLAG_IMPLICIT_KEY))
1447         return AVERROR(EINVAL);
1448     if (!(val = av_get_token(&opts, pairs_sep))) {
1449         av_free(key);
1450         return AVERROR(ENOMEM);
1451     }
1452     *ropts = opts;
1453     *rkey  = key;
1454     *rval  = val;
1455     return 0;
1456 }
1457
1458 int av_opt_set_from_string(void *ctx, const char *opts,
1459                            const char *const *shorthand,
1460                            const char *key_val_sep, const char *pairs_sep)
1461 {
1462     int ret, count = 0;
1463     const char *dummy_shorthand = NULL;
1464     char *av_uninit(parsed_key), *av_uninit(value);
1465     const char *key;
1466
1467     if (!opts)
1468         return 0;
1469     if (!shorthand)
1470         shorthand = &dummy_shorthand;
1471
1472     while (*opts) {
1473         ret = av_opt_get_key_value(&opts, key_val_sep, pairs_sep,
1474                                    *shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
1475                                    &parsed_key, &value);
1476         if (ret < 0) {
1477             if (ret == AVERROR(EINVAL))
1478                 av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
1479             else
1480                 av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", opts,
1481                        av_err2str(ret));
1482             return ret;
1483         }
1484         if (*opts)
1485             opts++;
1486         if (parsed_key) {
1487             key = parsed_key;
1488             while (*shorthand) /* discard all remaining shorthand */
1489                 shorthand++;
1490         } else {
1491             key = *(shorthand++);
1492         }
1493
1494         av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
1495         if ((ret = av_opt_set(ctx, key, value, 0)) < 0) {
1496             if (ret == AVERROR_OPTION_NOT_FOUND)
1497                 av_log(ctx, AV_LOG_ERROR, "Option '%s' not found\n", key);
1498             av_free(value);
1499             av_free(parsed_key);
1500             return ret;
1501         }
1502
1503         av_free(value);
1504         av_free(parsed_key);
1505         count++;
1506     }
1507     return count;
1508 }
1509
1510 void av_opt_free(void *obj)
1511 {
1512     const AVOption *o = NULL;
1513     while ((o = av_opt_next(obj, o))) {
1514         switch (o->type) {
1515         case AV_OPT_TYPE_STRING:
1516         case AV_OPT_TYPE_BINARY:
1517             av_freep((uint8_t *)obj + o->offset);
1518             break;
1519
1520         case AV_OPT_TYPE_DICT:
1521             av_dict_free((AVDictionary **)(((uint8_t *)obj) + o->offset));
1522             break;
1523
1524         default:
1525             break;
1526         }
1527     }
1528 }
1529
1530 int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
1531 {
1532     AVDictionaryEntry *t = NULL;
1533     AVDictionary    *tmp = NULL;
1534     int ret = 0;
1535
1536     if (!options)
1537         return 0;
1538
1539     while ((t = av_dict_get(*options, "", t, AV_DICT_IGNORE_SUFFIX))) {
1540         ret = av_opt_set(obj, t->key, t->value, search_flags);
1541         if (ret == AVERROR_OPTION_NOT_FOUND)
1542             ret = av_dict_set(&tmp, t->key, t->value, 0);
1543         if (ret < 0) {
1544             av_log(obj, AV_LOG_ERROR, "Error setting option %s to value %s.\n", t->key, t->value);
1545             av_dict_free(&tmp);
1546             return ret;
1547         }
1548         ret = 0;
1549     }
1550     av_dict_free(options);
1551     *options = tmp;
1552     return ret;
1553 }
1554
1555 int av_opt_set_dict(void *obj, AVDictionary **options)
1556 {
1557     return av_opt_set_dict2(obj, options, 0);
1558 }
1559
1560 const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
1561                             int opt_flags, int search_flags)
1562 {
1563     return av_opt_find2(obj, name, unit, opt_flags, search_flags, NULL);
1564 }
1565
1566 const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
1567                              int opt_flags, int search_flags, void **target_obj)
1568 {
1569     const AVClass  *c;
1570     const AVOption *o = NULL;
1571
1572     if(!obj)
1573         return NULL;
1574
1575     c= *(AVClass**)obj;
1576
1577     if (!c)
1578         return NULL;
1579
1580     if (search_flags & AV_OPT_SEARCH_CHILDREN) {
1581         if (search_flags & AV_OPT_SEARCH_FAKE_OBJ) {
1582             const AVClass *child = NULL;
1583             while (child = av_opt_child_class_next(c, child))
1584                 if (o = av_opt_find2(&child, name, unit, opt_flags, search_flags, NULL))
1585                     return o;
1586         } else {
1587             void *child = NULL;
1588             while (child = av_opt_child_next(obj, child))
1589                 if (o = av_opt_find2(child, name, unit, opt_flags, search_flags, target_obj))
1590                     return o;
1591         }
1592     }
1593
1594     while (o = av_opt_next(obj, o)) {
1595         if (!strcmp(o->name, name) && (o->flags & opt_flags) == opt_flags &&
1596             ((!unit && o->type != AV_OPT_TYPE_CONST) ||
1597              (unit  && o->type == AV_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)))) {
1598             if (target_obj) {
1599                 if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ))
1600                     *target_obj = obj;
1601                 else
1602                     *target_obj = NULL;
1603             }
1604             return o;
1605         }
1606     }
1607     return NULL;
1608 }
1609
1610 void *av_opt_child_next(void *obj, void *prev)
1611 {
1612     const AVClass *c = *(AVClass **)obj;
1613     if (c->child_next)
1614         return c->child_next(obj, prev);
1615     return NULL;
1616 }
1617
1618 const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev)
1619 {
1620     if (parent->child_class_next)
1621         return parent->child_class_next(prev);
1622     return NULL;
1623 }
1624
1625 void *av_opt_ptr(const AVClass *class, void *obj, const char *name)
1626 {
1627     const AVOption *opt= av_opt_find2(&class, name, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ, NULL);
1628     if(!opt)
1629         return NULL;
1630     return (uint8_t*)obj + opt->offset;
1631 }
1632
1633 static int opt_size(enum AVOptionType type)
1634 {
1635     switch(type) {
1636     case AV_OPT_TYPE_BOOL:
1637     case AV_OPT_TYPE_INT:
1638     case AV_OPT_TYPE_FLAGS:
1639         return sizeof(int);
1640     case AV_OPT_TYPE_DURATION:
1641     case AV_OPT_TYPE_CHANNEL_LAYOUT:
1642     case AV_OPT_TYPE_INT64:
1643         return sizeof(int64_t);
1644     case AV_OPT_TYPE_DOUBLE:
1645         return sizeof(double);
1646     case AV_OPT_TYPE_FLOAT:
1647         return sizeof(float);
1648     case AV_OPT_TYPE_STRING:
1649         return sizeof(uint8_t*);
1650     case AV_OPT_TYPE_VIDEO_RATE:
1651     case AV_OPT_TYPE_RATIONAL:
1652         return sizeof(AVRational);
1653     case AV_OPT_TYPE_BINARY:
1654         return sizeof(uint8_t*) + sizeof(int);
1655     case AV_OPT_TYPE_IMAGE_SIZE:
1656         return sizeof(int[2]);
1657     case AV_OPT_TYPE_PIXEL_FMT:
1658         return sizeof(enum AVPixelFormat);
1659     case AV_OPT_TYPE_SAMPLE_FMT:
1660         return sizeof(enum AVSampleFormat);
1661     case AV_OPT_TYPE_COLOR:
1662         return 4;
1663     }
1664     return AVERROR(EINVAL);
1665 }
1666
1667 int av_opt_copy(void *dst, const void *src)
1668 {
1669     const AVOption *o = NULL;
1670     const AVClass *c;
1671     int ret = 0;
1672
1673     if (!src)
1674         return AVERROR(EINVAL);
1675
1676     c = *(AVClass **)src;
1677     if (!c || c != *(AVClass **)dst)
1678         return AVERROR(EINVAL);
1679
1680     while ((o = av_opt_next(src, o))) {
1681         void *field_dst = (uint8_t *)dst + o->offset;
1682         void *field_src = (uint8_t *)src + o->offset;
1683         uint8_t **field_dst8 = (uint8_t **)field_dst;
1684         uint8_t **field_src8 = (uint8_t **)field_src;
1685
1686         if (o->type == AV_OPT_TYPE_STRING) {
1687             if (*field_dst8 != *field_src8)
1688                 av_freep(field_dst8);
1689             *field_dst8 = av_strdup(*field_src8);
1690             if (*field_src8 && !*field_dst8)
1691                 ret = AVERROR(ENOMEM);
1692         } else if (o->type == AV_OPT_TYPE_BINARY) {
1693             int len = *(int *)(field_src8 + 1);
1694             if (*field_dst8 != *field_src8)
1695                 av_freep(field_dst8);
1696             *field_dst8 = av_memdup(*field_src8, len);
1697             if (len && !*field_dst8) {
1698                 ret = AVERROR(ENOMEM);
1699                 len = 0;
1700             }
1701             *(int *)(field_dst8 + 1) = len;
1702         } else if (o->type == AV_OPT_TYPE_CONST) {
1703             // do nothing
1704         } else if (o->type == AV_OPT_TYPE_DICT) {
1705             AVDictionary **sdict = (AVDictionary **) field_src;
1706             AVDictionary **ddict = (AVDictionary **) field_dst;
1707             if (*sdict != *ddict)
1708                 av_dict_free(ddict);
1709             *ddict = NULL;
1710             av_dict_copy(ddict, *sdict, 0);
1711             if (av_dict_count(*sdict) != av_dict_count(*ddict))
1712                 ret = AVERROR(ENOMEM);
1713         } else {
1714             int size = opt_size(o->type);
1715             if (size < 0)
1716                 ret = size;
1717             else
1718                 memcpy(field_dst, field_src, size);
1719         }
1720     }
1721     return ret;
1722 }
1723
1724 int av_opt_query_ranges(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
1725 {
1726     int ret;
1727     const AVClass *c = *(AVClass**)obj;
1728     int (*callback)(AVOptionRanges **, void *obj, const char *key, int flags) = NULL;
1729
1730     if (c->version > (52 << 16 | 11 << 8))
1731         callback = c->query_ranges;
1732
1733     if (!callback)
1734         callback = av_opt_query_ranges_default;
1735
1736     ret = callback(ranges_arg, obj, key, flags);
1737     if (ret >= 0) {
1738         if (!(flags & AV_OPT_MULTI_COMPONENT_RANGE))
1739             ret = 1;
1740         (*ranges_arg)->nb_components = ret;
1741     }
1742     return ret;
1743 }
1744
1745 int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
1746 {
1747     AVOptionRanges *ranges = av_mallocz(sizeof(*ranges));
1748     AVOptionRange **range_array = av_mallocz(sizeof(void*));
1749     AVOptionRange *range = av_mallocz(sizeof(*range));
1750     const AVOption *field = av_opt_find(obj, key, NULL, 0, flags);
1751     int ret;
1752
1753     *ranges_arg = NULL;
1754
1755     if (!ranges || !range || !range_array || !field) {
1756         ret = AVERROR(ENOMEM);
1757         goto fail;
1758     }
1759
1760     ranges->range = range_array;
1761     ranges->range[0] = range;
1762     ranges->nb_ranges = 1;
1763     ranges->nb_components = 1;
1764     range->is_range = 1;
1765     range->value_min = field->min;
1766     range->value_max = field->max;
1767
1768     switch (field->type) {
1769     case AV_OPT_TYPE_BOOL:
1770     case AV_OPT_TYPE_INT:
1771     case AV_OPT_TYPE_INT64:
1772     case AV_OPT_TYPE_PIXEL_FMT:
1773     case AV_OPT_TYPE_SAMPLE_FMT:
1774     case AV_OPT_TYPE_FLOAT:
1775     case AV_OPT_TYPE_DOUBLE:
1776     case AV_OPT_TYPE_DURATION:
1777     case AV_OPT_TYPE_COLOR:
1778     case AV_OPT_TYPE_CHANNEL_LAYOUT:
1779         break;
1780     case AV_OPT_TYPE_STRING:
1781         range->component_min = 0;
1782         range->component_max = 0x10FFFF; // max unicode value
1783         range->value_min = -1;
1784         range->value_max = INT_MAX;
1785         break;
1786     case AV_OPT_TYPE_RATIONAL:
1787         range->component_min = INT_MIN;
1788         range->component_max = INT_MAX;
1789         break;
1790     case AV_OPT_TYPE_IMAGE_SIZE:
1791         range->component_min = 0;
1792         range->component_max = INT_MAX/128/8;
1793         range->value_min = 0;
1794         range->value_max = INT_MAX/8;
1795         break;
1796     case AV_OPT_TYPE_VIDEO_RATE:
1797         range->component_min = 1;
1798         range->component_max = INT_MAX;
1799         range->value_min = 1;
1800         range->value_max = INT_MAX;
1801         break;
1802     default:
1803         ret = AVERROR(ENOSYS);
1804         goto fail;
1805     }
1806
1807     *ranges_arg = ranges;
1808     return 1;
1809 fail:
1810     av_free(ranges);
1811     av_free(range);
1812     av_free(range_array);
1813     return ret;
1814 }
1815
1816 void av_opt_freep_ranges(AVOptionRanges **rangesp)
1817 {
1818     int i;
1819     AVOptionRanges *ranges = *rangesp;
1820
1821     if (!ranges)
1822         return;
1823
1824     for (i = 0; i < ranges->nb_ranges * ranges->nb_components; i++) {
1825         AVOptionRange *range = ranges->range[i];
1826         if (range) {
1827             av_freep(&range->str);
1828             av_freep(&ranges->range[i]);
1829         }
1830     }
1831     av_freep(&ranges->range);
1832     av_freep(rangesp);
1833 }
1834
1835 int av_opt_is_set_to_default(void *obj, const AVOption *o)
1836 {
1837     int64_t i64;
1838     double d, d2;
1839     float f;
1840     AVRational q;
1841     int ret, w, h;
1842     char *str;
1843     void *dst;
1844
1845     if (!o || !obj)
1846         return AVERROR(EINVAL);
1847
1848     dst = ((uint8_t*)obj) + o->offset;
1849
1850     switch (o->type) {
1851     case AV_OPT_TYPE_CONST:
1852         return 1;
1853     case AV_OPT_TYPE_BOOL:
1854     case AV_OPT_TYPE_FLAGS:
1855     case AV_OPT_TYPE_PIXEL_FMT:
1856     case AV_OPT_TYPE_SAMPLE_FMT:
1857     case AV_OPT_TYPE_INT:
1858     case AV_OPT_TYPE_CHANNEL_LAYOUT:
1859     case AV_OPT_TYPE_DURATION:
1860     case AV_OPT_TYPE_INT64:
1861         read_number(o, dst, NULL, NULL, &i64);
1862         return o->default_val.i64 == i64;
1863     case AV_OPT_TYPE_STRING:
1864         str = *(char **)dst;
1865         if (str == o->default_val.str) //2 NULLs
1866             return 1;
1867         if (!str || !o->default_val.str) //1 NULL
1868             return 0;
1869         return !strcmp(str, o->default_val.str);
1870     case AV_OPT_TYPE_DOUBLE:
1871         read_number(o, dst, &d, NULL, NULL);
1872         return o->default_val.dbl == d;
1873     case AV_OPT_TYPE_FLOAT:
1874         read_number(o, dst, &d, NULL, NULL);
1875         f = o->default_val.dbl;
1876         d2 = f;
1877         return d2 == d;
1878     case AV_OPT_TYPE_RATIONAL:
1879         q = av_d2q(o->default_val.dbl, INT_MAX);
1880         return !av_cmp_q(*(AVRational*)dst, q);
1881     case AV_OPT_TYPE_BINARY: {
1882         struct {
1883             uint8_t *data;
1884             int size;
1885         } tmp = {0};
1886         int opt_size = *(int *)((void **)dst + 1);
1887         void *opt_ptr = *(void **)dst;
1888         if (!opt_size && (!o->default_val.str || !strlen(o->default_val.str)))
1889             return 1;
1890         if (!opt_size ||  !o->default_val.str || !strlen(o->default_val.str ))
1891             return 0;
1892         if (opt_size != strlen(o->default_val.str) / 2)
1893             return 0;
1894         ret = set_string_binary(NULL, NULL, o->default_val.str, &tmp.data);
1895         if (!ret)
1896             ret = !memcmp(opt_ptr, tmp.data, tmp.size);
1897         av_free(tmp.data);
1898         return ret;
1899     }
1900     case AV_OPT_TYPE_DICT:
1901         /* Binary and dict have not default support yet. Any pointer is not default. */
1902         return !!(*(void **)dst);
1903     case AV_OPT_TYPE_IMAGE_SIZE:
1904         if (!o->default_val.str || !strcmp(o->default_val.str, "none"))
1905             w = h = 0;
1906         else if ((ret = av_parse_video_size(&w, &h, o->default_val.str)) < 0)
1907             return ret;
1908         return (w == *(int *)dst) && (h == *((int *)dst+1));
1909     case AV_OPT_TYPE_VIDEO_RATE:
1910         q = (AVRational){0, 0};
1911         if (o->default_val.str) {
1912             if ((ret = av_parse_video_rate(&q, o->default_val.str)) < 0)
1913                 return ret;
1914         }
1915         return !av_cmp_q(*(AVRational*)dst, q);
1916     case AV_OPT_TYPE_COLOR: {
1917         uint8_t color[4] = {0, 0, 0, 0};
1918         if (o->default_val.str) {
1919             if ((ret = av_parse_color(color, o->default_val.str, -1, NULL)) < 0)
1920                 return ret;
1921         }
1922         return !memcmp(color, dst, sizeof(color));
1923     }
1924     default:
1925         av_log(obj, AV_LOG_WARNING, "Not supported option type: %d, option name: %s\n", o->type, o->name);
1926         break;
1927     }
1928     return AVERROR_PATCHWELCOME;
1929 }
1930
1931 int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags)
1932 {
1933     const AVOption *o;
1934     void *target;
1935     if (!obj)
1936         return AVERROR(EINVAL);
1937     o = av_opt_find2(obj, name, NULL, 0, search_flags, &target);
1938     if (!o)
1939         return AVERROR_OPTION_NOT_FOUND;
1940     return av_opt_is_set_to_default(target, o);
1941 }
1942
1943 int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
1944                      const char key_val_sep, const char pairs_sep)
1945 {
1946     const AVOption *o = NULL;
1947     uint8_t *buf;
1948     AVBPrint bprint;
1949     int ret, cnt = 0;
1950     const char special_chars[] = {pairs_sep, key_val_sep, '\0'};
1951
1952     if (pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep ||
1953         pairs_sep == '\\' || key_val_sep == '\\') {
1954         av_log(obj, AV_LOG_ERROR, "Invalid separator(s) found.");
1955         return AVERROR(EINVAL);
1956     }
1957
1958     if (!obj || !buffer)
1959         return AVERROR(EINVAL);
1960
1961     *buffer = NULL;
1962     av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED);
1963
1964     while (o = av_opt_next(obj, o)) {
1965         if (o->type == AV_OPT_TYPE_CONST)
1966             continue;
1967         if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != opt_flags)
1968             continue;
1969         else if (((o->flags & opt_flags) != opt_flags))
1970             continue;
1971         if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
1972             continue;
1973         if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
1974             av_bprint_finalize(&bprint, NULL);
1975             return ret;
1976         }
1977         if (buf) {
1978             if (cnt++)
1979                 av_bprint_append_data(&bprint, &pairs_sep, 1);
1980             av_bprint_escape(&bprint, o->name, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
1981             av_bprint_append_data(&bprint, &key_val_sep, 1);
1982             av_bprint_escape(&bprint, buf, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
1983             av_freep(&buf);
1984         }
1985     }
1986     av_bprint_finalize(&bprint, buffer);
1987     return 0;
1988 }
1989
1990 #ifdef TEST
1991
1992 typedef struct TestContext {
1993     const AVClass *class;
1994     int num;
1995     int toggle;
1996     char *string;
1997     int flags;
1998     AVRational rational;
1999     AVRational video_rate;
2000     int w, h;
2001     enum AVPixelFormat pix_fmt;
2002     enum AVSampleFormat sample_fmt;
2003     int64_t duration;
2004     uint8_t color[4];
2005     int64_t channel_layout;
2006     void *binary;
2007     int binary_size;
2008     void *binary1;
2009     int binary_size1;
2010     void *binary2;
2011     int binary_size2;
2012     int64_t num64;
2013     float flt;
2014     double dbl;
2015     char *escape;
2016     int bool1;
2017     int bool2;
2018     int bool3;
2019 } TestContext;
2020
2021 #define OFFSET(x) offsetof(TestContext, x)
2022
2023 #define TEST_FLAG_COOL 01
2024 #define TEST_FLAG_LAME 02
2025 #define TEST_FLAG_MU   04
2026
2027 static const AVOption test_options[]= {
2028     {"num",        "set num",            OFFSET(num),            AV_OPT_TYPE_INT,            { .i64 = 0 },                      0,       100, 1 },
2029     {"toggle",     "set toggle",         OFFSET(toggle),         AV_OPT_TYPE_INT,            { .i64 = 1 },                      0,         1, 1 },
2030     {"rational",   "set rational",       OFFSET(rational),       AV_OPT_TYPE_RATIONAL,       { .dbl = 1 },                      0,        10, 1 },
2031     {"string",     "set string",         OFFSET(string),         AV_OPT_TYPE_STRING,         { .str = "default" },       CHAR_MIN,  CHAR_MAX, 1 },
2032     {"escape",     "set escape str",     OFFSET(escape),         AV_OPT_TYPE_STRING,         { .str = "\\=," },          CHAR_MIN,  CHAR_MAX, 1 },
2033     {"flags",      "set flags",          OFFSET(flags),          AV_OPT_TYPE_FLAGS,          { .i64 = 1 },                      0,   INT_MAX, 1, "flags" },
2034     {"cool",       "set cool flag",      0,                      AV_OPT_TYPE_CONST,          { .i64 = TEST_FLAG_COOL },   INT_MIN,   INT_MAX, 1, "flags" },
2035     {"lame",       "set lame flag",      0,                      AV_OPT_TYPE_CONST,          { .i64 = TEST_FLAG_LAME },   INT_MIN,   INT_MAX, 1, "flags" },
2036     {"mu",         "set mu flag",        0,                      AV_OPT_TYPE_CONST,          { .i64 = TEST_FLAG_MU },     INT_MIN,   INT_MAX, 1, "flags" },
2037     {"size",       "set size",           OFFSET(w),              AV_OPT_TYPE_IMAGE_SIZE,     { .str="200x300" },                0,         0, 1 },
2038     {"pix_fmt",    "set pixfmt",         OFFSET(pix_fmt),        AV_OPT_TYPE_PIXEL_FMT,      { .i64 = AV_PIX_FMT_0BGR },       -1,   INT_MAX, 1 },
2039     {"sample_fmt", "set samplefmt",      OFFSET(sample_fmt),     AV_OPT_TYPE_SAMPLE_FMT,     { .i64 = AV_SAMPLE_FMT_S16 },     -1,   INT_MAX, 1 },
2040     {"video_rate", "set videorate",      OFFSET(video_rate),     AV_OPT_TYPE_VIDEO_RATE,     { .str = "25" },                   0,         0, 1 },
2041     {"duration",   "set duration",       OFFSET(duration),       AV_OPT_TYPE_DURATION,       { .i64 = 1000 },                   0, INT64_MAX, 1 },
2042     {"color",      "set color",          OFFSET(color),          AV_OPT_TYPE_COLOR,          { .str = "pink" },                 0,         0, 1 },
2043     {"cl",         "set channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, { .i64 = AV_CH_LAYOUT_HEXAGONAL }, 0, INT64_MAX, 1 },
2044     {"bin",        "set binary value",   OFFSET(binary),         AV_OPT_TYPE_BINARY,         { .str="62696e00" },               0,         0, 1 },
2045     {"bin1",       "set binary value",   OFFSET(binary1),        AV_OPT_TYPE_BINARY,         { .str=NULL },                     0,         0, 1 },
2046     {"bin2",       "set binary value",   OFFSET(binary2),        AV_OPT_TYPE_BINARY,         { .str="" },                       0,         0, 1 },
2047     {"num64",      "set num 64bit",      OFFSET(num64),          AV_OPT_TYPE_INT64,          { .i64 = 1 },                      0,       100, 1 },
2048     {"flt",        "set float",          OFFSET(flt),            AV_OPT_TYPE_FLOAT,          { .dbl = 1.0 / 3 },                0,       100, 1 },
2049     {"dbl",        "set double",         OFFSET(dbl),            AV_OPT_TYPE_DOUBLE,         { .dbl = 1.0 / 3 },                0,       100, 1 },
2050     {"bool1",      "set boolean value",  OFFSET(bool1),          AV_OPT_TYPE_BOOL,           { .i64 = -1 },                    -1,         1, 1 },
2051     {"bool2",      "set boolean value",  OFFSET(bool2),          AV_OPT_TYPE_BOOL,           { .i64 = 1 },                     -1,         1, 1 },
2052     {"bool3",      "set boolean value",  OFFSET(bool3),          AV_OPT_TYPE_BOOL,           { .i64 = 0 },                      0,         1, 1 },
2053     { NULL },
2054 };
2055
2056 static const char *test_get_name(void *ctx)
2057 {
2058     return "test";
2059 }
2060
2061 static const AVClass test_class = {
2062     "TestContext",
2063     test_get_name,
2064     test_options
2065 };
2066
2067 static void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
2068 {
2069     vfprintf(stdout, fmt, vl);
2070 }
2071
2072 int main(void)
2073 {
2074     int i;
2075
2076     av_log_set_level(AV_LOG_DEBUG);
2077     av_log_set_callback(log_callback_help);
2078
2079     printf("Testing default values\n");
2080     {
2081         TestContext test_ctx = { 0 };
2082         test_ctx.class = &test_class;
2083         av_opt_set_defaults(&test_ctx);
2084
2085         printf("num=%d\n", test_ctx.num);
2086         printf("toggle=%d\n", test_ctx.toggle);
2087         printf("string=%s\n", test_ctx.string);
2088         printf("escape=%s\n", test_ctx.escape);
2089         printf("flags=%d\n", test_ctx.flags);
2090         printf("rational=%d/%d\n", test_ctx.rational.num, test_ctx.rational.den);
2091         printf("video_rate=%d/%d\n", test_ctx.video_rate.num, test_ctx.video_rate.den);
2092         printf("width=%d height=%d\n", test_ctx.w, test_ctx.h);
2093         printf("pix_fmt=%s\n", av_get_pix_fmt_name(test_ctx.pix_fmt));
2094         printf("sample_fmt=%s\n", av_get_sample_fmt_name(test_ctx.sample_fmt));
2095         printf("duration=%"PRId64"\n", test_ctx.duration);
2096         printf("color=%d %d %d %d\n", test_ctx.color[0], test_ctx.color[1], test_ctx.color[2], test_ctx.color[3]);
2097         printf("channel_layout=%"PRId64"=%"PRId64"\n", test_ctx.channel_layout, (int64_t)AV_CH_LAYOUT_HEXAGONAL);
2098         if (test_ctx.binary)
2099             printf("binary=%x %x %x %x\n", ((uint8_t*)test_ctx.binary)[0], ((uint8_t*)test_ctx.binary)[1], ((uint8_t*)test_ctx.binary)[2], ((uint8_t*)test_ctx.binary)[3]);
2100         printf("binary_size=%d\n", test_ctx.binary_size);
2101         printf("num64=%"PRId64"\n", test_ctx.num64);
2102         printf("flt=%.6f\n", test_ctx.flt);
2103         printf("dbl=%.6f\n", test_ctx.dbl);
2104
2105         av_opt_show2(&test_ctx, NULL, -1, 0);
2106
2107         av_opt_free(&test_ctx);
2108     }
2109
2110     printf("\nTesting av_opt_is_set_to_default()\n");
2111     {
2112         int ret;
2113         TestContext test_ctx = { 0 };
2114         const AVOption *o = NULL;
2115         test_ctx.class = &test_class;
2116
2117         av_log_set_level(AV_LOG_QUIET);
2118
2119         while (o = av_opt_next(&test_ctx, o)) {
2120             ret = av_opt_is_set_to_default_by_name(&test_ctx, o->name, 0);
2121             printf("name:%10s default:%d error:%s\n", o->name, !!ret, ret < 0 ? av_err2str(ret) : "");
2122         }
2123         av_opt_set_defaults(&test_ctx);
2124         while (o = av_opt_next(&test_ctx, o)) {
2125             ret = av_opt_is_set_to_default_by_name(&test_ctx, o->name, 0);
2126             printf("name:%10s default:%d error:%s\n", o->name, !!ret, ret < 0 ? av_err2str(ret) : "");
2127         }
2128         av_opt_free(&test_ctx);
2129     }
2130
2131     printf("\nTest av_opt_serialize()\n");
2132     {
2133         TestContext test_ctx = { 0 };
2134         char *buf;
2135         test_ctx.class = &test_class;
2136
2137         av_log_set_level(AV_LOG_QUIET);
2138
2139         av_opt_set_defaults(&test_ctx);
2140         if (av_opt_serialize(&test_ctx, 0, 0, &buf, '=', ',') >= 0) {
2141             printf("%s\n", buf);
2142             av_opt_free(&test_ctx);
2143             memset(&test_ctx, 0, sizeof(test_ctx));
2144             test_ctx.class = &test_class;
2145             av_set_options_string(&test_ctx, buf, "=", ",");
2146             av_free(buf);
2147             if (av_opt_serialize(&test_ctx, 0, 0, &buf, '=', ',') >= 0) {
2148                 printf("%s\n", buf);
2149                 av_free(buf);
2150             }
2151         }
2152         av_opt_free(&test_ctx);
2153     }
2154
2155     printf("\nTesting av_set_options_string()\n");
2156     {
2157         TestContext test_ctx = { 0 };
2158         static const char * const options[] = {
2159             "",
2160             ":",
2161             "=",
2162             "foo=:",
2163             ":=foo",
2164             "=foo",
2165             "foo=",
2166             "foo",
2167             "foo=val",
2168             "foo==val",
2169             "toggle=:",
2170             "string=:",
2171             "toggle=1 : foo",
2172             "toggle=100",
2173             "toggle==1",
2174             "flags=+mu-lame : num=42: toggle=0",
2175             "num=42 : string=blahblah",
2176             "rational=0 : rational=1/2 : rational=1/-1",
2177             "rational=-1/0",
2178             "size=1024x768",
2179             "size=pal",
2180             "size=bogus",
2181             "pix_fmt=yuv420p",
2182             "pix_fmt=2",
2183             "pix_fmt=bogus",
2184             "sample_fmt=s16",
2185             "sample_fmt=2",
2186             "sample_fmt=bogus",
2187             "video_rate=pal",
2188             "video_rate=25",
2189             "video_rate=30000/1001",
2190             "video_rate=30/1.001",
2191             "video_rate=bogus",
2192             "duration=bogus",
2193             "duration=123.45",
2194             "duration=1\\:23\\:45.67",
2195             "color=blue",
2196             "color=0x223300",
2197             "color=0x42FF07AA",
2198             "cl=stereo+downmix",
2199             "cl=foo",
2200             "bin=boguss",
2201             "bin=111",
2202             "bin=ffff",
2203             "num64=bogus",
2204             "num64=44",
2205             "num64=44.4",
2206             "num64=-1",
2207             "num64=101",
2208             "flt=bogus",
2209             "flt=2",
2210             "flt=2.2",
2211             "flt=-1",
2212             "flt=101",
2213             "dbl=bogus",
2214             "dbl=2",
2215             "dbl=2.2",
2216             "dbl=-1",
2217             "dbl=101",
2218             "bool1=true",
2219             "bool2=auto",
2220         };
2221
2222         test_ctx.class = &test_class;
2223         av_opt_set_defaults(&test_ctx);
2224
2225         av_log_set_level(AV_LOG_QUIET);
2226
2227         for (i=0; i < FF_ARRAY_ELEMS(options); i++) {
2228             int silence_log = !strcmp(options[i], "rational=-1/0"); // inf formating differs between platforms
2229             av_log(&test_ctx, AV_LOG_DEBUG, "Setting options string '%s'\n", options[i]);
2230             if (silence_log)
2231                 av_log_set_callback(NULL);
2232             if (av_set_options_string(&test_ctx, options[i], "=", ":") < 0)
2233                 printf("Error '%s'\n", options[i]);
2234             else
2235                 printf("OK    '%s'\n", options[i]);
2236             av_log_set_callback(log_callback_help);
2237         }
2238         av_opt_free(&test_ctx);
2239     }
2240
2241     printf("\nTesting av_opt_set_from_string()\n");
2242     {
2243         TestContext test_ctx = { 0 };
2244         static const char * const options[] = {
2245             "",
2246             "5",
2247             "5:hello",
2248             "5:hello:size=pal",
2249             "5:size=pal:hello",
2250             ":",
2251             "=",
2252             " 5 : hello : size = pal ",
2253             "a_very_long_option_name_that_will_need_to_be_ellipsized_around_here=42"
2254         };
2255         static const char * const shorthand[] = { "num", "string", NULL };
2256
2257         test_ctx.class = &test_class;
2258         av_opt_set_defaults(&test_ctx);
2259
2260         av_log_set_level(AV_LOG_QUIET);
2261
2262         for (i=0; i < FF_ARRAY_ELEMS(options); i++) {
2263             av_log(&test_ctx, AV_LOG_DEBUG, "Setting options string '%s'\n", options[i]);
2264             if (av_opt_set_from_string(&test_ctx, options[i], shorthand, "=", ":") < 0)
2265                 printf("Error '%s'\n", options[i]);
2266             else
2267                 printf("OK    '%s'\n", options[i]);
2268         }
2269         av_opt_free(&test_ctx);
2270     }
2271
2272     return 0;
2273 }
2274
2275 #endif