Mercurial > libavcodec.hg
annotate opt.c @ 6892:ef70c05f77e8 libavcodec
indent
author | michael |
---|---|
date | Mon, 26 May 2008 02:00:18 +0000 |
parents | 9bfb69f1739e |
children | 322023e630a6 |
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 /** |
23 * @file opt.c | |
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 |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
50 static const AVOption *av_set_number(void *obj, const char *name, 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
|
51 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2862 | 52 void *dst; |
2967 | 53 if(!o || o->offset<=0) |
2873 | 54 return NULL; |
2967 | 55 |
3735
6c407dc6ab4a
Inform the user that a certain AVOption is out of range.
takis
parents:
3731
diff
changeset
|
56 if(o->max*den < num*intnum || o->min*den > num*intnum) { |
6c407dc6ab4a
Inform the user that a certain AVOption is out of range.
takis
parents:
3731
diff
changeset
|
57 av_log(NULL, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range.\n", num, name); |
2873 | 58 return NULL; |
3735
6c407dc6ab4a
Inform the user that a certain AVOption is out of range.
takis
parents:
3731
diff
changeset
|
59 } |
2967 | 60 |
2862 | 61 dst= ((uint8_t*)obj) + o->offset; |
62 | |
63 switch(o->type){ | |
2967 | 64 case FF_OPT_TYPE_FLAGS: |
6451 | 65 case FF_OPT_TYPE_INT: *(int *)dst= llrint(num/den)*intnum; break; |
66 case FF_OPT_TYPE_INT64: *(int64_t *)dst= llrint(num/den)*intnum; break; | |
2873 | 67 case FF_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break; |
68 case FF_OPT_TYPE_DOUBLE:*(double *)dst= num*intnum/den; break; | |
2862 | 69 case FF_OPT_TYPE_RATIONAL: |
2873 | 70 if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den}; |
71 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
|
72 break; |
2862 | 73 default: |
2873 | 74 return NULL; |
2862 | 75 } |
2873 | 76 return o; |
2862 | 77 } |
78 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
79 static const AVOption *set_all_opt(void *v, const char *unit, double d){ |
2877 | 80 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
|
81 const AVOption *o= c->option; |
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
82 const AVOption *ret=NULL; |
2967 | 83 |
2877 | 84 for(;o && o->name; o++){ |
85 if(o->type != FF_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)){ | |
86 double tmp= d; | |
87 if(o->type == FF_OPT_TYPE_FLAGS) | |
88 tmp= av_get_int(v, o->name, NULL) | (int64_t)d; | |
89 | |
90 av_set_number(v, o->name, tmp, 1, 1); | |
91 ret= o; | |
92 } | |
93 } | |
94 return ret; | |
95 } | |
96 | |
3778 | 97 static double const_values[]={ |
98 M_PI, | |
99 M_E, | |
100 FF_QP2LAMBDA, | |
101 0 | |
102 }; | |
103 | |
104 static const char *const_names[]={ | |
105 "PI", | |
106 "E", | |
107 "QP2LAMBDA", | |
108 0 | |
109 }; | |
110 | |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
111 static int hexchar2int(char c) { |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
112 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
|
113 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
|
114 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
|
115 return -1; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
116 } |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
117 |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
118 const AVOption *av_set_string(void *obj, const char *name, const char *val){ |
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
|
119 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2877 | 120 if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){ |
121 return set_all_opt(obj, o->unit, o->default_val); | |
122 } | |
2967 | 123 if(!o || !val || o->offset<=0) |
2873 | 124 return NULL; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
125 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
|
126 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
|
127 int *lendst = (int *)(dst + 1); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
128 uint8_t *bin, *ptr; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
129 int len = strlen(val); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
130 av_freep(dst); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
131 *lendst = 0; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
132 if (len & 1) return NULL; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
133 len /= 2; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
134 ptr = bin = av_malloc(len); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
135 while (*val) { |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
136 int a = hexchar2int(*val++); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
137 int b = hexchar2int(*val++); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
138 if (a < 0 || b < 0) { |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
139 av_free(bin); |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
140 return NULL; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
141 } |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
142 *ptr++ = (a << 4) | b; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
143 } |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
144 *dst = bin; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
145 *lendst = len; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
146 return o; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
147 } |
2862 | 148 if(o->type != FF_OPT_TYPE_STRING){ |
6853 | 149 int notfirst=0; |
2862 | 150 for(;;){ |
151 int i; | |
3778 | 152 char buf[256]; |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
153 int cmd=0; |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
154 double d; |
6353 | 155 const char *error = NULL; |
2862 | 156 |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
157 if(*val == '+' || *val == '-') |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
158 cmd= *(val++); |
2967 | 159 |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
160 for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++) |
2862 | 161 buf[i]= val[i]; |
162 buf[i]=0; | |
2967 | 163 |
3778 | 164 d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error); |
165 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
|
166 const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0, 0); |
2967 | 167 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
|
168 d= o_named->default_val; |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
169 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
|
170 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
|
171 else if(!strcmp(buf, "min" )) d= o->min; |
4747
66aff3b71861
add 'all' and 'none' options for partitions config
gpoirier
parents:
4629
diff
changeset
|
172 else if(!strcmp(buf, "none" )) d= 0; |
66aff3b71861
add 'all' and 'none' options for partitions config
gpoirier
parents:
4629
diff
changeset
|
173 else if(!strcmp(buf, "all" )) d= ~0; |
3778 | 174 else { |
6794 | 175 if (error) |
3778 | 176 av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error); |
177 return NULL; | |
178 } | |
2862 | 179 } |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
180 if(o->type == FF_OPT_TYPE_FLAGS){ |
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
181 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
|
182 else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d; |
6845 | 183 }else{ |
6853 | 184 if (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d; |
185 else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d; | |
6845 | 186 } |
2862 | 187 |
6799
2854b51e7f47
Make av_set_string() fail when number could not be set.
benoit
parents:
6797
diff
changeset
|
188 if (!av_set_number(obj, name, d, 1, 1)) |
2854b51e7f47
Make av_set_string() fail when number could not be set.
benoit
parents:
6797
diff
changeset
|
189 return NULL; |
6797
51bbc2f553e2
Update offset in the option string later, to have a better error message.
benoit
parents:
6794
diff
changeset
|
190 val+= i; |
2862 | 191 if(!*val) |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
192 return o; |
6853 | 193 notfirst=1; |
2862 | 194 } |
2873 | 195 return NULL; |
2862 | 196 } |
2967 | 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)); |
2873 | 199 return o; |
2862 | 200 } |
201 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
202 const AVOption *av_set_double(void *obj, const char *name, double n){ |
2862 | 203 return av_set_number(obj, name, n, 1, 1); |
204 } | |
205 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
206 const AVOption *av_set_q(void *obj, const char *name, AVRational n){ |
2862 | 207 return av_set_number(obj, name, n.num, n.den, 1); |
208 } | |
209 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
210 const AVOption *av_set_int(void *obj, const char *name, int64_t n){ |
2862 | 211 return av_set_number(obj, name, 1, 1, n); |
212 } | |
213 | |
2873 | 214 /** |
2967 | 215 * |
2873 | 216 * @param buf a buffer which is used for returning non string values as strings, can be NULL |
217 * @param buf_len allocated length in bytes of buf | |
218 */ | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
219 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
|
220 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2873 | 221 void *dst; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
222 uint8_t *bin; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
223 int len, i; |
2862 | 224 if(!o || o->offset<=0) |
225 return NULL; | |
2873 | 226 if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len)) |
2862 | 227 return NULL; |
228 | |
2873 | 229 dst= ((uint8_t*)obj) + o->offset; |
230 if(o_out) *o_out= o; | |
2967 | 231 |
2873 | 232 switch(o->type){ |
2874
b6def74f5811
flags and named constants with type checking of course for AVOption
michael
parents:
2873
diff
changeset
|
233 case FF_OPT_TYPE_FLAGS: snprintf(buf, buf_len, "0x%08X",*(int *)dst);break; |
2873 | 234 case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break; |
2962 | 235 case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break; |
2873 | 236 case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break; |
237 case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break; | |
238 case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; | |
5977 | 239 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
|
240 case FF_OPT_TYPE_BINARY: |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
241 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
|
242 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
|
243 bin = *(uint8_t**)dst; |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
244 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
|
245 break; |
2873 | 246 default: return NULL; |
247 } | |
248 return buf; | |
2862 | 249 } |
250 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
251 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
|
252 const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); |
2862 | 253 void *dst; |
254 if(!o || o->offset<=0) | |
2873 | 255 goto error; |
2862 | 256 |
257 dst= ((uint8_t*)obj) + o->offset; | |
258 | |
2873 | 259 if(o_out) *o_out= o; |
260 | |
2862 | 261 switch(o->type){ |
6451 | 262 case FF_OPT_TYPE_FLAGS: *intnum= *(unsigned int*)dst;return 0; |
2873 | 263 case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0; |
264 case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0; | |
265 case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0; | |
266 case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0; | |
2967 | 267 case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; |
2873 | 268 *den = ((AVRational*)dst)->den; |
269 return 0; | |
2862 | 270 } |
2873 | 271 error: |
272 *den=*intnum=0; | |
273 return -1; | |
2862 | 274 } |
2873 | 275 |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
276 double av_get_double(void *obj, const char *name, const AVOption **o_out){ |
2873 | 277 int64_t intnum=1; |
278 double num=1; | |
279 int den=1; | |
280 | |
281 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
282 return num*intnum/den; | |
283 } | |
284 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
285 AVRational av_get_q(void *obj, const char *name, const AVOption **o_out){ |
2873 | 286 int64_t intnum=1; |
287 double num=1; | |
288 int den=1; | |
289 | |
290 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
291 if(num == 1.0 && (int)intnum == intnum) | |
292 return (AVRational){intnum, den}; | |
293 else | |
294 return av_d2q(num*intnum/den, 1<<24); | |
295 } | |
296 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
297 int64_t av_get_int(void *obj, const char *name, const AVOption **o_out){ |
2873 | 298 int64_t intnum=1; |
299 double num=1; | |
300 int den=1; | |
301 | |
302 av_get_number(obj, name, o_out, &num, &den, &intnum); | |
303 return num*intnum/den; | |
304 } | |
305 | |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
306 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
|
307 { |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
308 const AVOption *opt=NULL; |
2967 | 309 |
2873 | 310 while((opt= av_next_option(obj, opt))){ |
311 if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) | |
312 continue; | |
2967 | 313 |
3788
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
314 /* 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
|
315 * 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
|
316 * 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
|
317 */ |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
318 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
|
319 continue; |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
320 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
|
321 continue; |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
322 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
|
323 continue; |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
324 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
|
325 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
|
326 else |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
327 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
|
328 |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
329 switch( opt->type ) |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
330 { |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
331 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
|
332 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
|
333 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
334 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
|
335 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
|
336 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
337 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
|
338 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
|
339 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
340 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
|
341 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
|
342 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
343 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
|
344 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
|
345 break; |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
346 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
|
347 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
|
348 break; |
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_RATIONAL: |
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 ", "<rational>" ); |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
351 break; |
6034
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
352 case FF_OPT_TYPE_BINARY: |
72bb141d9c05
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
reimar
parents:
6015
diff
changeset
|
353 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
|
354 break; |
3141
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_CONST: |
25493c849d70
Give a hint about what is the expected the data type of command line options.
gpoirier
parents:
3036
diff
changeset
|
356 default: |
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 ", "" ); |
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 } |
2876 | 360 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); |
361 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); | |
362 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); | |
363 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); | |
364 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); | |
2967 | 365 |
2888 | 366 if(opt->help) |
367 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); | |
368 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
|
369 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
|
370 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
|
371 } |
2873 | 372 } |
3788
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
373 } |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
374 |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
375 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
|
376 if(!obj) |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
377 return -1; |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
378 |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
379 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
|
380 |
484d719a2028
Reformat the output of the list of available AVOptions, by indenting the
takis
parents:
3786
diff
changeset
|
381 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
|
382 |
2873 | 383 return 0; |
384 } | |
3702 | 385 |
3703
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
386 /** 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
|
387 * 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
|
388 * array default_val field. |
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
389 * |
301d975b69e3
adds doxygen docs to av_opt_set_defaults. Patch by Takis
gpoirier
parents:
3702
diff
changeset
|
390 * @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
|
391 */ |
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
|
392 void av_opt_set_defaults2(void *s, int mask, int flags) |
3702 | 393 { |
4369
e10acab2322a
Constantize AVOption, solve few warnings, patch from flameeyes@gentoo.org aka "the other Diego"
lu_zero
parents:
3961
diff
changeset
|
394 const AVOption *opt = NULL; |
3702 | 395 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
|
396 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
|
397 continue; |
3702 | 398 switch(opt->type) { |
399 case FF_OPT_TYPE_CONST: | |
400 /* Nothing to be done here */ | |
401 break; | |
402 case FF_OPT_TYPE_FLAGS: | |
403 case FF_OPT_TYPE_INT: { | |
404 int val; | |
405 val = opt->default_val; | |
406 av_set_int(s, opt->name, val); | |
407 } | |
408 break; | |
409 case FF_OPT_TYPE_FLOAT: { | |
410 double val; | |
411 val = opt->default_val; | |
412 av_set_double(s, opt->name, val); | |
413 } | |
414 break; | |
415 case FF_OPT_TYPE_RATIONAL: { | |
416 AVRational val; | |
417 val = av_d2q(opt->default_val, INT_MAX); | |
418 av_set_q(s, opt->name, val); | |
419 } | |
420 break; | |
421 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
|
422 case FF_OPT_TYPE_BINARY: |
3702 | 423 /* Cannot set default for string as default_val is of type * double */ |
424 break; | |
425 default: | |
426 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); | |
427 } | |
428 } | |
429 } | |
430 | |
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
|
431 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
|
432 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
|
433 } |
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
|
434 |