Mercurial > libavcodec.hg
annotate opt.c @ 10345:294c444866f7 libavcodec
Make avcodec_open set codec_id and codec_type if they haven't been set.
This fixes the API breakage introduced by the check that avctx codec id and type
match the opened codec and should make (almost?) all applications work again.
author | reimar |
---|---|
date | Thu, 01 Oct 2009 15:54:55 +0000 |
parents | 04d77f7cc7fd |
children | 917c88a80b67 |
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) { |
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 | 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; | |
9641
04d77f7cc7fd
Make av_set_string3() print a message in case of unknown option.
stefano
parents:
9640
diff
changeset
|
115 if(!o) { |
04d77f7cc7fd
Make av_set_string3() print a message in case of unknown option.
stefano
parents:
9640
diff
changeset
|
116 av_log(obj, AV_LOG_ERROR, "Unknown option '%s'\n", name); |
8356 | 117 return AVERROR(ENOENT); |
9641
04d77f7cc7fd
Make av_set_string3() print a message in case of unknown option.
stefano
parents:
9640
diff
changeset
|
118 } |
8356 | 119 if(!val || o->offset<=0) |
120 return AVERROR(EINVAL); | |
121 | |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
122 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
|
123 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
|
124 int *lendst = (int *)(dst + 1); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
125 uint8_t *bin, *ptr; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
126 int len = strlen(val); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
127 av_freep(dst); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
128 *lendst = 0; |
8356 | 129 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
|
130 len /= 2; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
131 ptr = bin = av_malloc(len); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
132 while (*val) { |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
133 int a = hexchar2int(*val++); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
134 int b = hexchar2int(*val++); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
135 if (a < 0 || b < 0) { |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
136 av_free(bin); |
8356 | 137 return AVERROR(EINVAL); |
6034
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 *ptr++ = (a << 4) | b; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
140 } |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
141 *dst = bin; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
142 *lendst = len; |
8356 | 143 return 0; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
144 } |
2862 | 145 if(o->type != FF_OPT_TYPE_STRING){ |
6853 | 146 int notfirst=0; |
2862 | 147 for(;;){ |
148 int i; | |
3778 | 149 char buf[256]; |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
150 int cmd=0; |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
151 double d; |
6353 | 152 const char *error = NULL; |
2862 | 153 |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
154 if(*val == '+' || *val == '-') |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
155 cmd= *(val++); |
2967 | 156 |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
157 for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++) |
2862 | 158 buf[i]= val[i]; |
159 buf[i]=0; | |
2967 | 160 |
3778 | 161 d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error); |
162 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
|
163 const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0, 0); |
2967 | 164 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
|
165 d= o_named->default_val; |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
166 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
|
167 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
|
168 else if(!strcmp(buf, "min" )) d= o->min; |
4747
66aff3b71861
add 'all' and 'none' options for partitions config
gpoirier
parents:
4629
diff
changeset
|
169 else if(!strcmp(buf, "none" )) d= 0; |
66aff3b71861
add 'all' and 'none' options for partitions config
gpoirier
parents:
4629
diff
changeset
|
170 else if(!strcmp(buf, "all" )) d= ~0; |
3778 | 171 else { |
6794 | 172 if (error) |
9640
854368240f7d
Provide a context to av_log() calls in av_set_number2() and
stefano
parents:
8718
diff
changeset
|
173 av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error); |
8356 | 174 return AVERROR(EINVAL); |
3778 | 175 } |
2862 | 176 } |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
177 if(o->type == FF_OPT_TYPE_FLAGS){ |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
178 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
|
179 else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d; |
6845 | 180 }else{ |
6853 | 181 if (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d; |
182 else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d; | |
6845 | 183 } |
2862 | 184 |
8356 | 185 if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0) |
186 return ret; | |
6797
51bbc2f553e2
Update offset in the option string later, to have a better error message.
benoit
parents:
6794
diff
changeset
|
187 val+= i; |
2862 | 188 if(!*val) |
8356 | 189 return 0; |
6853 | 190 notfirst=1; |
2862 | 191 } |
8356 | 192 return AVERROR(EINVAL); |
2862 | 193 } |
2967 | 194 |
7224 | 195 if(alloc){ |
7271
8c58eeb20826
Fix the logic to access the location of a string to free when setting
stefano
parents:
7224
diff
changeset
|
196 av_free(*(void**)(((uint8_t*)obj) + o->offset)); |
7224 | 197 val= av_strdup(val); |
198 } | |
199 | |
5976
58ee364cd8fb
make the AVOption code work with strings instead of crash
michael
parents:
5215
diff
changeset
|
200 memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val)); |
8356 | 201 return 0; |
202 } | |
203 | |
8407
8903ad65c412
Put under #if LIBAVCODEC_VERSION_MAJOR < 53 the deprecated functions
stefano
parents:
8406
diff
changeset
|
204 #if LIBAVCODEC_VERSION_MAJOR < 53 |
8356 | 205 const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){ |
206 const AVOption *o; | |
207 if (av_set_string3(obj, name, val, alloc, &o) < 0) | |
208 return NULL; | |
2873 | 209 return o; |
2862 | 210 } |
211 | |
7224 | 212 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
|
213 const AVOption *o; |
ea27308fa023
Remove calls to deprecated av_set_string2() with calls to
stefano
parents:
8356
diff
changeset
|
214 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
|
215 return NULL; |
ea27308fa023
Remove calls to deprecated av_set_string2() with calls to
stefano
parents:
8356
diff
changeset
|
216 return o; |
7224 | 217 } |
8407
8903ad65c412
Put under #if LIBAVCODEC_VERSION_MAJOR < 53 the deprecated functions
stefano
parents:
8406
diff
changeset
|
218 #endif |
7224 | 219 |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
220 const AVOption *av_set_double(void *obj, const char *name, double n){ |
2862 | 221 return av_set_number(obj, name, n, 1, 1); |
222 } | |
223 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
224 const AVOption *av_set_q(void *obj, const char *name, AVRational n){ |
2862 | 225 return av_set_number(obj, name, n.num, n.den, 1); |
226 } | |
227 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
228 const AVOption *av_set_int(void *obj, const char *name, int64_t n){ |
2862 | 229 return av_set_number(obj, name, 1, 1, n); |
230 } | |
231 | |
2873 | 232 /** |
2967 | 233 * |
2873 | 234 * @param buf a buffer which is used for returning non string values as strings, can be NULL |
235 * @param buf_len allocated length in bytes of buf | |
236 */ | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
237 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
|
238 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2873 | 239 void *dst; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
240 uint8_t *bin; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
241 int len, i; |
2862 | 242 if(!o || o->offset<=0) |
243 return NULL; | |
2873 | 244 if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len)) |
2862 | 245 return NULL; |
246 | |
2873 | 247 dst= ((uint8_t*)obj) + o->offset; |
248 if(o_out) *o_out= o; | |
2967 | 249 |
2873 | 250 switch(o->type){ |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
251 case FF_OPT_TYPE_FLAGS: snprintf(buf, buf_len, "0x%08X",*(int *)dst);break; |
2873 | 252 case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break; |
2962 | 253 case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break; |
2873 | 254 case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break; |
255 case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break; | |
256 case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; | |
5977 | 257 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
|
258 case FF_OPT_TYPE_BINARY: |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
259 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
|
260 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
|
261 bin = *(uint8_t**)dst; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
262 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
|
263 break; |
2873 | 264 default: return NULL; |
265 } | |
266 return buf; | |
2862 | 267 } |
268 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
269 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
|
270 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2862 | 271 void *dst; |
272 if(!o || o->offset<=0) | |
2873 | 273 goto error; |
2862 | 274 |
275 dst= ((uint8_t*)obj) + o->offset; | |
276 | |
2873 | 277 if(o_out) *o_out= o; |
278 | |
2862 | 279 switch(o->type){ |
6451 | 280 case FF_OPT_TYPE_FLAGS: *intnum= *(unsigned int*)dst;return 0; |
2873 | 281 case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0; |
282 case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0; | |
283 case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0; | |
284 case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0; | |
2967 | 285 case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; |
2873 | 286 *den = ((AVRational*)dst)->den; |
287 return 0; | |
2862 | 288 } |
2873 | 289 error: |
290 *den=*intnum=0; | |
291 return -1; | |
2862 | 292 } |
2873 | 293 |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
294 double av_get_double(void *obj, const char *name, const AVOption **o_out){ |
2873 | 295 int64_t intnum=1; |
296 double num=1; | |
297 int den=1; | |
298 | |
299 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
300 return num*intnum/den; | |
301 } | |
302 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
303 AVRational av_get_q(void *obj, const char *name, const AVOption **o_out){ |
2873 | 304 int64_t intnum=1; |
305 double num=1; | |
306 int den=1; | |
307 | |
308 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
309 if(num == 1.0 && (int)intnum == intnum) | |
310 return (AVRational){intnum, den}; | |
311 else | |
312 return av_d2q(num*intnum/den, 1<<24); | |
313 } | |
314 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
315 int64_t av_get_int(void *obj, const char *name, const AVOption **o_out){ |
2873 | 316 int64_t intnum=1; |
317 double num=1; | |
318 int den=1; | |
319 | |
320 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
321 return num*intnum/den; | |
322 } | |
323 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
324 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
|
325 { |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
326 const AVOption *opt=NULL; |
2967 | 327 |
2873 | 328 while((opt= av_next_option(obj, opt))){ |
329 if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) | |
330 continue; | |
2967 | 331 |
3788
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
332 /* 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
|
333 * 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
|
334 * 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
|
335 */ |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
336 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) |
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 && strcmp(unit, opt->unit)) |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
341 continue; |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
342 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
|
343 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
|
344 else |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
345 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
|
346 |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
347 switch( opt->type ) |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
348 { |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
349 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
|
350 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
|
351 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
352 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
|
353 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
|
354 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
355 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
|
356 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
|
357 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
358 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
|
359 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
|
360 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
361 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
|
362 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
|
363 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
364 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
|
365 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
|
366 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
367 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
|
368 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
|
369 break; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
370 case FF_OPT_TYPE_BINARY: |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
371 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
|
372 break; |
3141
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
373 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
|
374 default: |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
375 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
|
376 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
377 } |
2876 | 378 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); |
379 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); | |
380 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); | |
381 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); | |
382 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); | |
2967 | 383 |
2888 | 384 if(opt->help) |
385 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); | |
386 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
|
387 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
|
388 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
|
389 } |
2873 | 390 } |
3788
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
391 } |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
392 |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
393 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
|
394 if(!obj) |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
395 return -1; |
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 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
|
398 |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
399 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
|
400 |
2873 | 401 return 0; |
402 } | |
3702 | 403 |
3703
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
404 /** 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
|
405 * 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
|
406 * array default_val field. |
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
407 * |
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
408 * @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
|
409 */ |
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
|
410 void av_opt_set_defaults2(void *s, int mask, int flags) |
3702 | 411 { |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
412 const AVOption *opt = NULL; |
3702 | 413 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
|
414 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
|
415 continue; |
3702 | 416 switch(opt->type) { |
417 case FF_OPT_TYPE_CONST: | |
418 /* Nothing to be done here */ | |
419 break; | |
420 case FF_OPT_TYPE_FLAGS: | |
421 case FF_OPT_TYPE_INT: { | |
422 int val; | |
423 val = opt->default_val; | |
424 av_set_int(s, opt->name, val); | |
425 } | |
426 break; | |
8262 | 427 case FF_OPT_TYPE_INT64: |
428 if((double)(opt->default_val+0.6) == opt->default_val) | |
429 av_log(s, AV_LOG_DEBUG, "loss of precission in default of %s\n", opt->name); | |
430 av_set_int(s, opt->name, opt->default_val); | |
431 break; | |
3702 | 432 case FF_OPT_TYPE_FLOAT: { |
433 double val; | |
434 val = opt->default_val; | |
435 av_set_double(s, opt->name, val); | |
436 } | |
437 break; | |
438 case FF_OPT_TYPE_RATIONAL: { | |
439 AVRational val; | |
440 val = av_d2q(opt->default_val, INT_MAX); | |
441 av_set_q(s, opt->name, val); | |
442 } | |
443 break; | |
444 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
|
445 case FF_OPT_TYPE_BINARY: |
3702 | 446 /* Cannot set default for string as default_val is of type * double */ |
447 break; | |
448 default: | |
449 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); | |
450 } | |
451 } | |
452 } | |
453 | |
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
|
454 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
|
455 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
|
456 } |
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
|
457 |