Mercurial > libavcodec.hg
annotate opt.c @ 9595:f9a7147cc9e6 libavcodec
Do not scan for MP3 header after the given buffer and return skipped
bytes along with consumed bytes on successful decoding.
patch by Zdenek Kabelac, zdenek.kabelac gmail com
author | diego |
---|---|
date | Mon, 04 May 2009 14:23:48 +0000 |
parents | e9d9d946f213 |
children | 854368240f7d |
rev | line source |
---|---|
2862 | 1 /* |
2 * AVOptions | |
3 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at> | |
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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 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 | |
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 | 20 */ |
2967 | 21 |
2862 | 22 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8439
diff
changeset
|
23 * @file libavcodec/opt.c |
2862 | 24 * AVOptions |
25 * @author Michael Niedermayer <michaelni@gmx.at> | |
26 */ | |
2967 | 27 |
2862 | 28 #include "avcodec.h" |
2880 | 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 | 31 |
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 | 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 | 36 |
2862 | 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 | 39 return o; |
40 } | |
41 return NULL; | |
42 } | |
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 | 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 | 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 | 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) { |
8343
a6ca9f8642d6
Remove ending period in a log message, which was inconsistent with
stefano
parents:
8327
diff
changeset
|
59 av_log(NULL, 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 | 62 |
2862 | 63 dst= ((uint8_t*)obj) + o->offset; |
64 | |
65 switch(o->type){ | |
2967 | 66 case FF_OPT_TYPE_FLAGS: |
6451 | 67 case FF_OPT_TYPE_INT: *(int *)dst= llrint(num/den)*intnum; break; |
68 case FF_OPT_TYPE_INT64: *(int64_t *)dst= llrint(num/den)*intnum; break; | |
2873 | 69 case FF_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break; |
70 case FF_OPT_TYPE_DOUBLE:*(double *)dst= num*intnum/den; break; | |
2862 | 71 case FF_OPT_TYPE_RATIONAL: |
2873 | 72 if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den}; |
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 | 75 default: |
8344
844463c05193
Implement the av_set_number2() internal function, which makes possible
stefano
parents:
8343
diff
changeset
|
76 return AVERROR(EINVAL); |
2862 | 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 | 87 } |
88 | |
7129 | 89 static const double const_values[]={ |
3778 | 90 M_PI, |
91 M_E, | |
92 FF_QP2LAMBDA, | |
93 0 | |
94 }; | |
95 | |
7129 | 96 static const char * const const_names[]={ |
3778 | 97 "PI", |
98 "E", | |
99 "QP2LAMBDA", | |
100 0 | |
101 }; | |
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 | 110 int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out){ |
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 | 113 if (o_out) |
114 *o_out = o; | |
115 if(!o) | |
116 return AVERROR(ENOENT); | |
117 if(!val || o->offset<=0) | |
118 return AVERROR(EINVAL); | |
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 | 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 | 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 | 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 | 143 if(o->type != FF_OPT_TYPE_STRING){ |
6853 | 144 int notfirst=0; |
2862 | 145 for(;;){ |
146 int i; | |
3778 | 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 | 150 const char *error = NULL; |
2862 | 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 | 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 | 156 buf[i]= val[i]; |
157 buf[i]=0; | |
2967 | 158 |
3778 | 159 d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error); |
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 | 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 | 169 else { |
6794 | 170 if (error) |
3778 | 171 av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error); |
8356 | 172 return AVERROR(EINVAL); |
3778 | 173 } |
2862 | 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 | 178 }else{ |
6853 | 179 if (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d; |
180 else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d; | |
6845 | 181 } |
2862 | 182 |
8356 | 183 if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0) |
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 | 186 if(!*val) |
8356 | 187 return 0; |
6853 | 188 notfirst=1; |
2862 | 189 } |
8356 | 190 return AVERROR(EINVAL); |
2862 | 191 } |
2967 | 192 |
7224 | 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 | 195 val= av_strdup(val); |
196 } | |
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 | 199 return 0; |
200 } | |
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 | 203 const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){ |
204 const AVOption *o; | |
205 if (av_set_string3(obj, name, val, alloc, &o) < 0) | |
206 return NULL; | |
2873 | 207 return o; |
2862 | 208 } |
209 | |
7224 | 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 | 215 } |
8407
8903ad65c412
Put under #if LIBAVCODEC_VERSION_MAJOR < 53 the deprecated functions
stefano
parents:
8406
diff
changeset
|
216 #endif |
7224 | 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 | 219 return av_set_number(obj, name, n, 1, 1); |
220 } | |
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 | 223 return av_set_number(obj, name, n.num, n.den, 1); |
224 } | |
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 | 227 return av_set_number(obj, name, 1, 1, n); |
228 } | |
229 | |
2873 | 230 /** |
2967 | 231 * |
2873 | 232 * @param buf a buffer which is used for returning non string values as strings, can be NULL |
233 * @param buf_len allocated length in bytes of buf | |
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 | 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 | 240 if(!o || o->offset<=0) |
241 return NULL; | |
2873 | 242 if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len)) |
2862 | 243 return NULL; |
244 | |
2873 | 245 dst= ((uint8_t*)obj) + o->offset; |
246 if(o_out) *o_out= o; | |
2967 | 247 |
2873 | 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 | 250 case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break; |
2962 | 251 case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break; |
2873 | 252 case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break; |
253 case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break; | |
254 case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; | |
5977 | 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 | 262 default: return NULL; |
263 } | |
264 return buf; | |
2862 | 265 } |
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 | 269 void *dst; |
270 if(!o || o->offset<=0) | |
2873 | 271 goto error; |
2862 | 272 |
273 dst= ((uint8_t*)obj) + o->offset; | |
274 | |
2873 | 275 if(o_out) *o_out= o; |
276 | |
2862 | 277 switch(o->type){ |
6451 | 278 case FF_OPT_TYPE_FLAGS: *intnum= *(unsigned int*)dst;return 0; |
2873 | 279 case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0; |
280 case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0; | |
281 case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0; | |
282 case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0; | |
2967 | 283 case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; |
2873 | 284 *den = ((AVRational*)dst)->den; |
285 return 0; | |
2862 | 286 } |
2873 | 287 error: |
288 *den=*intnum=0; | |
289 return -1; | |
2862 | 290 } |
2873 | 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 | 293 int64_t intnum=1; |
294 double num=1; | |
295 int den=1; | |
296 | |
297 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
298 return num*intnum/den; | |
299 } | |
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 | 302 int64_t intnum=1; |
303 double num=1; | |
304 int den=1; | |
305 | |
306 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
307 if(num == 1.0 && (int)intnum == intnum) | |
308 return (AVRational){intnum, den}; | |
309 else | |
310 return av_d2q(num*intnum/den, 1<<24); | |
311 } | |
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 | 314 int64_t intnum=1; |
315 double num=1; | |
316 int den=1; | |
317 | |
318 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
319 return num*intnum/den; | |
320 } | |
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 | 325 |
2873 | 326 while((opt= av_next_option(obj, opt))){ |
327 if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) | |
328 continue; | |
2967 | 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 | 376 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); |
377 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); | |
378 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); | |
379 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); | |
380 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); | |
2967 | 381 |
2888 | 382 if(opt->help) |
383 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); | |
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 | 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 | 399 return 0; |
400 } | |
3702 | 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 | 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 | 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 | 414 switch(opt->type) { |
415 case FF_OPT_TYPE_CONST: | |
416 /* Nothing to be done here */ | |
417 break; | |
418 case FF_OPT_TYPE_FLAGS: | |
419 case FF_OPT_TYPE_INT: { | |
420 int val; | |
421 val = opt->default_val; | |
422 av_set_int(s, opt->name, val); | |
423 } | |
424 break; | |
8262 | 425 case FF_OPT_TYPE_INT64: |
426 if((double)(opt->default_val+0.6) == opt->default_val) | |
427 av_log(s, AV_LOG_DEBUG, "loss of precission in default of %s\n", opt->name); | |
428 av_set_int(s, opt->name, opt->default_val); | |
429 break; | |
3702 | 430 case FF_OPT_TYPE_FLOAT: { |
431 double val; | |
432 val = opt->default_val; | |
433 av_set_double(s, opt->name, val); | |
434 } | |
435 break; | |
436 case FF_OPT_TYPE_RATIONAL: { | |
437 AVRational val; | |
438 val = av_d2q(opt->default_val, INT_MAX); | |
439 av_set_q(s, opt->name, val); | |
440 } | |
441 break; | |
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 | 444 /* Cannot set default for string as default_val is of type * double */ |
445 break; | |
446 default: | |
447 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); | |
448 } | |
449 } | |
450 } | |
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 |