annotate opt.c @ 2956:5f51b1e0bed6 libavcodec

Cook compatibe decoder, patch by Benjamin Larsson Add cook demucing, change rm demuxer so that it reorders audio packets before sending them to the decoder, and send minimum decodeable sized packets; pass only real codec extradata fo the decoder Fix 28_8 decoder for the new demuxer strategy
author rtognimp
date Fri, 09 Dec 2005 16:08:18 +0000
parents 771fae923356
children fde28cb7e3d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
1 /*
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
2 * AVOptions
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
3 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
4 *
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
9 *
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
13 * Lesser General Public License for more details.
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
14 *
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
18 *
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
19 */
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
20
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
21 /**
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
22 * @file opt.c
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
23 * AVOptions
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
24 * @author Michael Niedermayer <michaelni@gmx.at>
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
25 */
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
26
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
27 #include "avcodec.h"
2880
4d91f38477ee dont include opt.h in avcodec.h
michael
parents: 2877
diff changeset
28 #include "opt.h"
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
29
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
30 static double av_parse_num(const char *name, char **tail){
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
31 double d;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
32 d= strtod(name, tail);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
33 if(*tail>name && (**tail=='/' || **tail==':'))
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
34 d/=strtod((*tail)+1, tail);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
35 return d;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
36 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
37
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
38 //FIXME order them and do a bin search
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
39 static AVOption *find_opt(void *v, const char *name, const char *unit){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
40 AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
41 AVOption *o= c->option;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
42
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
43 for(;o && o->name; o++){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
44 if(!strcmp(o->name, name) && (!unit || !strcmp(o->unit, unit)) )
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
45 return o;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
46 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
47 return NULL;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
48 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
49
2865
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
50 AVOption *av_next_option(void *obj, AVOption *last){
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
51 if(last && last[1].name) return ++last;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
52 else if(last) return NULL;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
53 else return (*(AVClass**)obj)->option;
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
54 }
3b999ce45b37 AVOption enumeration support and some flags to classify AVOptions
michael
parents: 2862
diff changeset
55
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
56 static AVOption *av_set_number(void *obj, const char *name, double num, int den, int64_t intnum){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
57 AVOption *o= find_opt(obj, name, NULL);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
58 void *dst;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
59 if(!o || o->offset<=0)
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
60 return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
61
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
62 if(o->max*den < num*intnum || o->min*den > num*intnum)
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
63 return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
64
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
65 dst= ((uint8_t*)obj) + o->offset;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
66
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
67 switch(o->type){
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
68 case FF_OPT_TYPE_FLAGS:
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
69 case FF_OPT_TYPE_INT: *(int *)dst= lrintf(num/den)*intnum; break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
70 case FF_OPT_TYPE_INT64: *(int64_t *)dst= lrintf(num/den)*intnum; break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
71 case FF_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
72 case FF_OPT_TYPE_DOUBLE:*(double *)dst= num*intnum/den; break;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
73 case FF_OPT_TYPE_RATIONAL:
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
74 if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den};
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
75 else *(AVRational*)dst= av_d2q(num*intnum/den, 1<<24);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
76 default:
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
77 return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
78 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
79 return o;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
80 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
81
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
82 static AVOption *set_all_opt(void *v, const char *unit, double d){
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
83 AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
84 AVOption *o= c->option;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
85 AVOption *ret=NULL;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
86
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
87 for(;o && o->name; o++){
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
88 if(o->type != FF_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)){
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
89 double tmp= d;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
90 if(o->type == FF_OPT_TYPE_FLAGS)
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
91 tmp= av_get_int(v, o->name, NULL) | (int64_t)d;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
92
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
93 av_set_number(v, o->name, tmp, 1, 1);
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
94 ret= o;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
95 }
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
96 }
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
97 return ret;
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
98 }
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
99
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
100 //FIXME use eval.c maybe?
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
101 AVOption *av_set_string(void *obj, const char *name, const char *val){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
102 AVOption *o= find_opt(obj, name, NULL);
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
103 if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
104 return set_all_opt(obj, o->unit, o->default_val);
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
105 }
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
106 if(!o || !val || o->offset<=0)
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
107 return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
108 if(o->type != FF_OPT_TYPE_STRING){
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
109 for(;;){
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
110 int i;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
111 char buf[256], *tail;
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
112 int cmd=0;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
113 double d;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
114
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
115 if(*val == '+' || *val == '-')
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
116 cmd= *(val++);
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
117
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
118 for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
119 buf[i]= val[i];
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
120 buf[i]=0;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
121 val+= i;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
122
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
123 d= av_parse_num(buf, &tail);
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
124 if(tail <= buf){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
125 AVOption *o_named= find_opt(obj, buf, o->unit);
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
126 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
127 d= o_named->default_val;
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
128 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
129 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
130 else if(!strcmp(buf, "min" )) d= o->min;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
131 else return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
132 }
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
133 if(o->type == FF_OPT_TYPE_FLAGS){
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
134 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
135 else 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
136 }else if(cmd=='-')
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
137 d= -d;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
138
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
139 av_set_number(obj, name, d, 1, 1);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
140 if(!*val)
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
141 return o;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
142 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
143 return NULL;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
144 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
145
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
146 memcpy(((uint8_t*)obj) + o->offset, val, sizeof(val));
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
147 return o;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
148 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
149
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
150 AVOption *av_set_double(void *obj, const char *name, double n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
151 return av_set_number(obj, name, n, 1, 1);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
152 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
153
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
154 AVOption *av_set_q(void *obj, const char *name, AVRational n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
155 return av_set_number(obj, name, n.num, n.den, 1);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
156 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
157
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
158 AVOption *av_set_int(void *obj, const char *name, int64_t n){
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
159 return av_set_number(obj, name, 1, 1, n);
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
160 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
161
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
162 /**
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
163 *
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
164 * @param buf a buffer which is used for returning non string values as strings, can be NULL
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
165 * @param buf_len allocated length in bytes of buf
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
166 */
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
167 const char *av_get_string(void *obj, const char *name, AVOption **o_out, char *buf, int buf_len){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
168 AVOption *o= find_opt(obj, name, NULL);
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
169 void *dst;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
170 if(!o || o->offset<=0)
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
171 return NULL;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
172 if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len))
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
173 return NULL;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
174
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
175 dst= ((uint8_t*)obj) + o->offset;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
176 if(o_out) *o_out= o;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
177
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
178 if(o->type == FF_OPT_TYPE_STRING)
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
179 return dst;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
180
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
181 switch(o->type){
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
182 case FF_OPT_TYPE_FLAGS: snprintf(buf, buf_len, "0x%08X",*(int *)dst);break;
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
183 case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
184 case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%Ld", *(int64_t*)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
185 case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
186 case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
187 case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
188 default: return NULL;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
189 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
190 return buf;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
191 }
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
192
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
193 static int av_get_number(void *obj, const char *name, AVOption **o_out, double *num, int *den, int64_t *intnum){
2877
b447caeb6978 convert some options in ffmpeg.c to AVOptions
michael
parents: 2876
diff changeset
194 AVOption *o= find_opt(obj, name, NULL);
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
195 void *dst;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
196 if(!o || o->offset<=0)
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
197 goto error;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
198
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
199 dst= ((uint8_t*)obj) + o->offset;
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
200
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
201 if(o_out) *o_out= o;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
202
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
203 switch(o->type){
2874
b6def74f5811 flags and named constants with type checking of course for AVOption
michael
parents: 2873
diff changeset
204 case FF_OPT_TYPE_FLAGS:
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
205 case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
206 case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
207 case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
208 case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
209 case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
210 *den = ((AVRational*)dst)->den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
211 return 0;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
212 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
213 error:
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
214 *den=*intnum=0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
215 return -1;
2862
f4aea2c316cc AVOption first try
michael
parents:
diff changeset
216 }
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
217
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
218 double av_get_double(void *obj, const char *name, AVOption **o_out){
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
219 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
220 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
221 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
222
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
223 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
224 return num*intnum/den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
225 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
226
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
227 AVRational av_get_q(void *obj, const char *name, AVOption **o_out){
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
228 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
229 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
230 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
231
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
232 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
233 if(num == 1.0 && (int)intnum == intnum)
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
234 return (AVRational){intnum, den};
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
235 else
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
236 return av_d2q(num*intnum/den, 1<<24);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
237 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
238
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
239 int64_t av_get_int(void *obj, const char *name, AVOption **o_out){
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
240 int64_t intnum=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
241 double num=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
242 int den=1;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
243
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
244 av_get_number(obj, name, o_out, &num, &den, &intnum);
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
245 return num*intnum/den;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
246 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
247
2876
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
248 int av_opt_show(void *obj, void *av_log_obj){
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
249 AVOption *opt=NULL;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
250
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
251 if(!obj)
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
252 return -1;
2876
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
253
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
254 av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass**)obj)->class_name);
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
255
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
256 while((opt= av_next_option(obj, opt))){
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
257 if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM)))
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
258 continue;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
259
2876
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
260 av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name);
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
261 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
262 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
263 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
264 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.');
8026edf6a349 avoid stdio.h
michael
parents: 2875
diff changeset
265 av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.');
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
266
2888
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
267 if(opt->help)
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
268 av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
771fae923356 dont print NULL
michael
parents: 2880
diff changeset
269 av_log(av_log_obj, AV_LOG_INFO, "\n");
2873
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
270 }
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
271 return 0;
55809f38eb63 AVOption API improvments
michael
parents: 2865
diff changeset
272 }