annotate opt.c @ 10364:917c88a80b67 libavcodec

Revert: r18826 | stefano | 2009-05-14 20:50:58 +0200 (Thu, 14 May 2009) | 2 lines Make av_set_string3() print a message in case of unknown option. This change led to multiple identical error messages to be printed if an option was not found.
author michael
date Mon, 05 Oct 2009 20:18:16 +0000
parents 04d77f7cc7fd
children db144278f288
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
1 /*
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
2 * AVOptions
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
3 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
16 *
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3788
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
21
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
22 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8439
diff changeset
23 * @file libavcodec/opt.c
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
24 * AVOptions
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
26 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
27
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
28 #include "avcodec.h"
2880
4d91f38477ee dont include opt.h in avcodec.h
michael
parents: 2877
diff changeset
29 #include "opt.h"
3786
616a81d04758 Pull out the ff_eval* from the mpegvideo header, as it doesn't belong there and
takis
parents: 3778
diff changeset
30 #include "eval.h"
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
31
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
32 //FIXME order them and do a bin search
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
33 const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
34 AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
35 const AVOption *o= c->option;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
36
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
37 for(;o && o->name; o++){
4748
c6a2b573f259 Fix a bug in av_find_opt(). Because some of the AVOption structures have field
takis
parents: 4747
diff changeset
38 if(!strcmp(o->name, name) && (!unit || (o->unit && !strcmp(o->unit, unit))) && (o->flags & mask) == flags )
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
39 return o;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
40 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
41 return NULL;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
42 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
43
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
44 const AVOption *av_next_option(void *obj, const AVOption *last){
2865
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
45 if(last && last[1].name) return ++last;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
46 else if(last) return NULL;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
47 else return (*(AVClass**)obj)->option;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
48 }
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
49
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
50 static int av_set_number2(void *obj, const char *name, double num, int den, int64_t intnum, const AVOption **o_out){
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
51 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
52 void *dst;
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
53 if(o_out)
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
54 *o_out= o;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
55 if(!o || o->offset<=0)
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
56 return AVERROR(ENOENT);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
57
3735
6c407dc6ab4a Inform the user that a certain AVOption is out of range.
takis
parents: 3731
diff changeset
58 if(o->max*den < num*intnum || o->min*den > num*intnum) {
9640
854368240f7d Provide a context to av_log() calls in av_set_number2() and
stefano
parents: 8718
diff changeset
59 av_log(obj, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range\n", num, name);
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
60 return AVERROR(ERANGE);
3735
6c407dc6ab4a Inform the user that a certain AVOption is out of range.
takis
parents: 3731
diff changeset
61 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
62
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
63 dst= ((uint8_t*)obj) + o->offset;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
64
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
65 switch(o->type){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
66 case FF_OPT_TYPE_FLAGS:
6451
355b2eb9f553 Fix handling flags with the MSB set.
michael
parents: 6353
diff changeset
67 case FF_OPT_TYPE_INT: *(int *)dst= llrint(num/den)*intnum; break;
355b2eb9f553 Fix handling flags with the MSB set.
michael
parents: 6353
diff changeset
68 case FF_OPT_TYPE_INT64: *(int64_t *)dst= llrint(num/den)*intnum; break;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
69 case FF_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
70 case FF_OPT_TYPE_DOUBLE:*(double *)dst= num*intnum/den; break;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
71 case FF_OPT_TYPE_RATIONAL:
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
72 if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den};
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
73 else *(AVRational*)dst= av_d2q(num*intnum/den, 1<<24);
6015
bb4f24c580f5 Add a missing break, before av_set_number would always return NULL for
reimar
parents: 5977
diff changeset
74 break;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
75 default:
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
76 return AVERROR(EINVAL);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
77 }
8344
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
78 return 0;
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
79 }
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
80
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
81 static const AVOption *av_set_number(void *obj, const char *name, double num, int den, int64_t intnum){
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
82 const AVOption *o = NULL;
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
83 if (av_set_number2(obj, name, num, den, intnum, &o) < 0)
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
84 return NULL;
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
85 else
844463c05193 Implement the av_set_number2() internal function, which makes possible
stefano
parents: 8343
diff changeset
86 return o;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
87 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
88
7129
322023e630a6 mark read-only data as const
stefang
parents: 6853
diff changeset
89 static const double const_values[]={
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
90 M_PI,
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
91 M_E,
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
92 FF_QP2LAMBDA,
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
93 0
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
94 };
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
95
7129
322023e630a6 mark read-only data as const
stefang
parents: 6853
diff changeset
96 static const char * const const_names[]={
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
97 "PI",
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
98 "E",
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
99 "QP2LAMBDA",
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
100 0
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
101 };
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
102
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
103 static int hexchar2int(char c) {
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
104 if (c >= '0' && c <= '9') return c - '0';
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
105 if (c >= 'a' && c <= 'f') return c - 'a' + 10;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
106 if (c >= 'A' && c <= 'F') return c - 'A' + 10;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
107 return -1;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
108 }
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
109
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
110 int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out){
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
111 int ret;
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
112 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
113 if (o_out)
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
114 *o_out = o;
10364
917c88a80b67 Revert:
michael
parents: 9641
diff changeset
115 if(!o)
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
116 return AVERROR(ENOENT);
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
117 if(!val || o->offset<=0)
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
118 return AVERROR(EINVAL);
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
119
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
120 if(o->type == FF_OPT_TYPE_BINARY){
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
121 uint8_t **dst = (uint8_t **)(((uint8_t*)obj) + o->offset);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
122 int *lendst = (int *)(dst + 1);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
123 uint8_t *bin, *ptr;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
124 int len = strlen(val);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
125 av_freep(dst);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
126 *lendst = 0;
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
127 if (len & 1) return AVERROR(EINVAL);
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
128 len /= 2;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
129 ptr = bin = av_malloc(len);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
130 while (*val) {
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
131 int a = hexchar2int(*val++);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
132 int b = hexchar2int(*val++);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
133 if (a < 0 || b < 0) {
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
134 av_free(bin);
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
135 return AVERROR(EINVAL);
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
136 }
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
137 *ptr++ = (a << 4) | b;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
138 }
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
139 *dst = bin;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
140 *lendst = len;
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
141 return 0;
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
142 }
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
143 if(o->type != FF_OPT_TYPE_STRING){
6853
9bfb69f1739e Anoter try to make +- behave sanely.
michael
parents: 6845
diff changeset
144 int notfirst=0;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
145 for(;;){
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
146 int i;
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
147 char buf[256];
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
148 int cmd=0;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
149 double d;
6353
lucabe
parents: 6034
diff changeset
150 const char *error = NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
151
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
152 if(*val == '+' || *val == '-')
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
153 cmd= *(val++);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
154
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
155 for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
156 buf[i]= val[i];
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
157 buf[i]=0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
158
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
159 d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error);
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
160 if(isnan(d)) {
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
161 const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0, 0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
162 if(o_named && o_named->type == FF_OPT_TYPE_CONST)
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
163 d= o_named->default_val;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
164 else if(!strcmp(buf, "default")) d= o->default_val;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
165 else if(!strcmp(buf, "max" )) d= o->max;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
166 else if(!strcmp(buf, "min" )) d= o->min;
4747
66aff3b71861 add 'all' and 'none' options for partitions config
gpoirier
parents: 4629
diff changeset
167 else if(!strcmp(buf, "none" )) d= 0;
66aff3b71861 add 'all' and 'none' options for partitions config
gpoirier
parents: 4629
diff changeset
168 else if(!strcmp(buf, "all" )) d= ~0;
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
169 else {
6794
ba5913f27124 Fix a typo.
benoit
parents: 6451
diff changeset
170 if (error)
9640
854368240f7d Provide a context to av_log() calls in av_set_number2() and
stefano
parents: 8718
diff changeset
171 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error);
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
172 return AVERROR(EINVAL);
3778
67a63fa775a7 Make AVOption parsign code use ff_eval2()
takis
parents: 3735
diff changeset
173 }
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
174 }
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
175 if(o->type == FF_OPT_TYPE_FLAGS){
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
176 if (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
177 else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
6845
80ebdc755fa9 Fix + - bug with non flags.
michael
parents: 6799
diff changeset
178 }else{
6853
9bfb69f1739e Anoter try to make +- behave sanely.
michael
parents: 6845
diff changeset
179 if (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d;
9bfb69f1739e Anoter try to make +- behave sanely.
michael
parents: 6845
diff changeset
180 else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d;
6845
80ebdc755fa9 Fix + - bug with non flags.
michael
parents: 6799
diff changeset
181 }
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
182
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
183 if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0)
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
184 return ret;
6797
51bbc2f553e2 Update offset in the option string later, to have a better error message.
benoit
parents: 6794
diff changeset
185 val+= i;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
186 if(!*val)
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
187 return 0;
6853
9bfb69f1739e Anoter try to make +- behave sanely.
michael
parents: 6845
diff changeset
188 notfirst=1;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
189 }
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
190 return AVERROR(EINVAL);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
191 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
192
7224
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
193 if(alloc){
7271
8c58eeb20826 Fix the logic to access the location of a string to free when setting
stefano
parents: 7224
diff changeset
194 av_free(*(void**)(((uint8_t*)obj) + o->offset));
7224
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
195 val= av_strdup(val);
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
196 }
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
197
5976
58ee364cd8fb make the AVOption code work with strings instead of crash
michael
parents: 5215
diff changeset
198 memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val));
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
199 return 0;
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
200 }
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
201
8407
8903ad65c412 Put under #if LIBAVCODEC_VERSION_MAJOR < 53 the deprecated functions
stefano
parents: 8406
diff changeset
202 #if LIBAVCODEC_VERSION_MAJOR < 53
8356
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
203 const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
204 const AVOption *o;
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
205 if (av_set_string3(obj, name, val, alloc, &o) < 0)
0030146fc2ba Implement av_set_string3().
stefano
parents: 8344
diff changeset
206 return NULL;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
207 return o;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
208 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
209
7224
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
210 const AVOption *av_set_string(void *obj, const char *name, const char *val){
8406
ea27308fa023 Remove calls to deprecated av_set_string2() with calls to
stefano
parents: 8356
diff changeset
211 const AVOption *o;
ea27308fa023 Remove calls to deprecated av_set_string2() with calls to
stefano
parents: 8356
diff changeset
212 if (av_set_string3(obj, name, val, 0, &o) < 0)
ea27308fa023 Remove calls to deprecated av_set_string2() with calls to
stefano
parents: 8356
diff changeset
213 return NULL;
ea27308fa023 Remove calls to deprecated av_set_string2() with calls to
stefano
parents: 8356
diff changeset
214 return o;
7224
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
215 }
8407
8903ad65c412 Put under #if LIBAVCODEC_VERSION_MAJOR < 53 the deprecated functions
stefano
parents: 8406
diff changeset
216 #endif
7224
d5a52b28c9de Fix the av_set_string() free / alloc issue.
michael
parents: 7129
diff changeset
217
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
218 const AVOption *av_set_double(void *obj, const char *name, double n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
219 return av_set_number(obj, name, n, 1, 1);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
220 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
221
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
222 const AVOption *av_set_q(void *obj, const char *name, AVRational n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
223 return av_set_number(obj, name, n.num, n.den, 1);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
224 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
225
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
226 const AVOption *av_set_int(void *obj, const char *name, int64_t n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
227 return av_set_number(obj, name, 1, 1, n);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
228 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
229
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
230 /**
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
231 *
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
232 * @param buf a buffer which is used for returning non string values as strings, can be NULL
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
233 * @param buf_len allocated length in bytes of buf
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
234 */
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
235 const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len){
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
236 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
237 void *dst;
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
238 uint8_t *bin;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
239 int len, i;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
240 if(!o || o->offset<=0)
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
241 return NULL;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
242 if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len))
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
243 return NULL;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
244
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
245 dst= ((uint8_t*)obj) + o->offset;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
246 if(o_out) *o_out= o;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
247
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
248 switch(o->type){
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
249 case FF_OPT_TYPE_FLAGS: snprintf(buf, buf_len, "0x%08X",*(int *)dst);break;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
250 case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break;
2962
fde28cb7e3d5 use PRIxN, %zd, %td formats where needed
mru
parents: 2888
diff changeset
251 case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
252 case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
253 case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
254 case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
5977
853d1ea80942 simplify
michael
parents: 5976
diff changeset
255 case FF_OPT_TYPE_STRING: return *(void**)dst;
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
256 case FF_OPT_TYPE_BINARY:
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
257 len = *(int*)(((uint8_t *)dst) + sizeof(uint8_t *));
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
258 if(len >= (buf_len + 1)/2) return NULL;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
259 bin = *(uint8_t**)dst;
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
260 for(i = 0; i < len; i++) snprintf(buf + i*2, 3, "%02X", bin[i]);
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
261 break;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
262 default: return NULL;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
263 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
264 return buf;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
265 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
266
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
267 static int av_get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum){
4628
b0016ed89048 make av_find_opt() available to the public and add a mask+flags parameter to search for specific AVOptions
michael
parents: 4369
diff changeset
268 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
269 void *dst;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
270 if(!o || o->offset<=0)
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
271 goto error;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
272
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
273 dst= ((uint8_t*)obj) + o->offset;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
274
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
275 if(o_out) *o_out= o;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
276
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
277 switch(o->type){
6451
355b2eb9f553 Fix handling flags with the MSB set.
michael
parents: 6353
diff changeset
278 case FF_OPT_TYPE_FLAGS: *intnum= *(unsigned int*)dst;return 0;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
279 case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
280 case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
281 case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
282 case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
283 case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
284 *den = ((AVRational*)dst)->den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
285 return 0;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
286 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
287 error:
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
288 *den=*intnum=0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
289 return -1;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
290 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
291
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
292 double av_get_double(void *obj, const char *name, const AVOption **o_out){
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
293 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
294 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
295 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
296
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
297 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
298 return num*intnum/den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
299 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
300
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
301 AVRational av_get_q(void *obj, const char *name, const AVOption **o_out){
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
302 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
303 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
304 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
305
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
306 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
307 if(num == 1.0 && (int)intnum == intnum)
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
308 return (AVRational){intnum, den};
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
309 else
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
310 return av_d2q(num*intnum/den, 1<<24);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
311 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
312
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
313 int64_t av_get_int(void *obj, const char *name, const AVOption **o_out){
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
314 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
315 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
316 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
317
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
318 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
319 return num*intnum/den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
320 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
321
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
322 static void opt_list(void *obj, void *av_log_obj, const char *unit)
3788
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
323 {
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
324 const AVOption *opt=NULL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
325
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
326 while((opt= av_next_option(obj, opt))){
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
327 if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM)))
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
328 continue;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
329
3788
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
330 /* Don't print CONST's on level one.
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
331 * Don't print anything but CONST's on level two.
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
332 * Only print items from the requested unit.
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
333 */
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
334 if (!unit && opt->type==FF_OPT_TYPE_CONST)
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
335 continue;
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
336 else if (unit && opt->type!=FF_OPT_TYPE_CONST)
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
337 continue;
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
338 else if (unit && opt->type==FF_OPT_TYPE_CONST && strcmp(unit, opt->unit))
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
339 continue;
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
340 else if (unit && opt->type == FF_OPT_TYPE_CONST)
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
341 av_log(av_log_obj, AV_LOG_INFO, " %-15s ", opt->name);
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
342 else
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
343 av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name);
3141
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
344
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
345 switch( opt->type )
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
346 {
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
347 case FF_OPT_TYPE_FLAGS:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
348 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<flags>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
349 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
350 case FF_OPT_TYPE_INT:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
351 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
352 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
353 case FF_OPT_TYPE_INT64:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
354 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int64>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
355 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
356 case FF_OPT_TYPE_DOUBLE:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
357 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<double>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
358 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
359 case FF_OPT_TYPE_FLOAT:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
360 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<float>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
361 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
362 case FF_OPT_TYPE_STRING:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
363 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<string>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
364 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
365 case FF_OPT_TYPE_RATIONAL:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
366 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<rational>" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
367 break;
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
368 case FF_OPT_TYPE_BINARY:
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
369 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<binary>" );
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
370 break;
3141
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
371 case FF_OPT_TYPE_CONST:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
372 default:
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
373 av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" );
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
374 break;
25493c849d70 Give a hint about what is the expected the data type of command line options.
gpoirier
parents: 3036
diff changeset
375 }
2876
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
376 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
377 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
378 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
379 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
380 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.');
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
381
2888
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
382 if(opt->help)
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
383 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
384 av_log(av_log_obj, AV_LOG_INFO, "\n");
3788
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
385 if (opt->unit && opt->type != FF_OPT_TYPE_CONST) {
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
386 opt_list(obj, av_log_obj, opt->unit);
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
387 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
388 }
3788
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
389 }
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
390
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
391 int av_opt_show(void *obj, void *av_log_obj){
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
392 if(!obj)
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
393 return -1;
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
394
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
395 av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass**)obj)->class_name);
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
396
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
397 opt_list(obj, av_log_obj, NULL);
484d719a2028 Reformat the output of the list of available AVOptions, by indenting the
takis
parents: 3786
diff changeset
398
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
399 return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
400 }
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
401
3703
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
402 /** Set the values of the AVCodecContext or AVFormatContext structure.
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
403 * They are set to the defaults specified in the according AVOption options
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
404 * array default_val field.
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
405 *
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
406 * @param s AVCodecContext or AVFormatContext for which the defaults will be set
301d975b69e3 adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents: 3702
diff changeset
407 */
4629
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
408 void av_opt_set_defaults2(void *s, int mask, int flags)
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
409 {
4369
e10acab2322a Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents: 3961
diff changeset
410 const AVOption *opt = NULL;
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
411 while ((opt = av_next_option(s, opt)) != NULL) {
4629
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
412 if((opt->flags & mask) != flags)
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
413 continue;
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
414 switch(opt->type) {
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
415 case FF_OPT_TYPE_CONST:
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
416 /* Nothing to be done here */
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
417 break;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
418 case FF_OPT_TYPE_FLAGS:
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
419 case FF_OPT_TYPE_INT: {
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
420 int val;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
421 val = opt->default_val;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
422 av_set_int(s, opt->name, val);
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
423 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
424 break;
8262
f0bf2db65dc3 Fix FF_OPT_TYPE_INT64 support of defaults.
michael
parents: 7271
diff changeset
425 case FF_OPT_TYPE_INT64:
f0bf2db65dc3 Fix FF_OPT_TYPE_INT64 support of defaults.
michael
parents: 7271
diff changeset
426 if((double)(opt->default_val+0.6) == opt->default_val)
f0bf2db65dc3 Fix FF_OPT_TYPE_INT64 support of defaults.
michael
parents: 7271
diff changeset
427 av_log(s, AV_LOG_DEBUG, "loss of precission in default of %s\n", opt->name);
f0bf2db65dc3 Fix FF_OPT_TYPE_INT64 support of defaults.
michael
parents: 7271
diff changeset
428 av_set_int(s, opt->name, opt->default_val);
f0bf2db65dc3 Fix FF_OPT_TYPE_INT64 support of defaults.
michael
parents: 7271
diff changeset
429 break;
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
430 case FF_OPT_TYPE_FLOAT: {
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
431 double val;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
432 val = opt->default_val;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
433 av_set_double(s, opt->name, val);
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
434 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
435 break;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
436 case FF_OPT_TYPE_RATIONAL: {
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
437 AVRational val;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
438 val = av_d2q(opt->default_val, INT_MAX);
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
439 av_set_q(s, opt->name, val);
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
440 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
441 break;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
442 case FF_OPT_TYPE_STRING:
6034
72bb141d9c05 Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents: 6015
diff changeset
443 case FF_OPT_TYPE_BINARY:
3702
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
444 /* Cannot set default for string as default_val is of type * double */
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
445 break;
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
446 default:
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
447 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name);
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
448 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
449 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
450 }
7e7d8a3fe080 make AVOptions default value field work.
gpoirier
parents: 3141
diff changeset
451
4629
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
452 void av_opt_set_defaults(void *s){
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
453 av_opt_set_defaults2(s, 0, 0);
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
454 }
2faa1399dd68 add av_opt_set_defaults2() which sets just defaults from AVOptions whos flags match a user specified & mask = flags
michael
parents: 4628
diff changeset
455