Mercurial > mplayer.hg
annotate codec-cfg.c @ 35801:98693cc5df48
Exit GUI if we can't return to the skin we started with.
If there are errors in both the selected skin and the skin
we started with, there's nothing we can do but exit.
author | ib |
---|---|
date | Sat, 26 Jan 2013 00:34:43 +0000 |
parents | d206960484fe |
children | 23ae72ee9c04 |
rev | line source |
---|---|
319 | 1 /* |
2 * codec.conf parser | |
4676 | 3 * |
22501 | 4 * to compile test application: |
5 * cc -I. -DTESTING -o codec-cfg-test codec-cfg.c mp_msg.o osdep/getch2.o -ltermcap | |
15303 | 6 * to compile CODECS2HTML: |
33246 | 7 * gcc -DCODECS2HTML -o codecs2html codec-cfg.c |
4676 | 8 * |
9 * TODO: implement informat in CODECS2HTML too | |
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
10 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
11 * Copyright (C) 2001 Szabolcs Berecz <szabi@inf.elte.hu> |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
12 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
13 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
14 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
15 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
16 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
17 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
18 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
19 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
20 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
23 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
24 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
25 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
26 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
30115
diff
changeset
|
27 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
319 | 28 */ |
303 | 29 |
319 | 30 #define DEBUG |
303 | 31 |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
32 //disable asserts |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
33 #define NDEBUG |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
34 |
297 | 35 #include <stdio.h> |
36 #include <stdlib.h> | |
37 #include <fcntl.h> | |
38 #include <unistd.h> | |
39 #include <errno.h> | |
40 #include <ctype.h> | |
41 #include <assert.h> | |
42 #include <string.h> | |
43 | |
5284
0a58c2ef1da1
added missing #include config.h, removed LIBVO2 ifdef.
arpi
parents:
5263
diff
changeset
|
44 #include "config.h" |
5937 | 45 #include "mp_msg.h" |
17841
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
46 #ifdef CODECS2HTML |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
47 #ifdef __GNUC__ |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
48 #define mp_msg(t, l, m, args...) fprintf(stderr, m, ##args) |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
49 #else |
23910
8fcfdfcd6c41
C99 varargs in macros can not be empty, adjust definition so it compiles
reimar
parents:
23806
diff
changeset
|
50 #define mp_msg(t, l, ...) fprintf(stderr, __VA_ARGS__) |
17841
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
51 #endif |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
52 #endif |
5284
0a58c2ef1da1
added missing #include config.h, removed LIBVO2 ifdef.
arpi
parents:
5263
diff
changeset
|
53 |
13619 | 54 #include "help_mp.h" |
55 | |
33561
1ff6737f2177
Avoid including aviheader.h only for mmioFOURCC, it has too many
reimar
parents:
33364
diff
changeset
|
56 #include "libavutil/avutil.h" |
35712
d206960484fe
Add a number of missing libavutil header #includes.
diego
parents:
35245
diff
changeset
|
57 #include "libavutil/common.h" |
15305 | 58 #include "libmpcodecs/img_format.h" |
297 | 59 #include "codec-cfg.h" |
60 | |
31406
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
61 #ifdef CODECS2HTML |
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
62 #define CODEC_CFG_MIN 20100000 |
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
63 #else |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
64 #include "codecs.conf.h" |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
65 #endif |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
66 |
5937 | 67 #define PRINT_LINENUM mp_msg(MSGT_CODECCFG,MSGL_ERR," at line %d\n", line_num) |
328 | 68 |
31077 | 69 #define MAX_NR_TOKEN 16 |
297 | 70 |
31077 | 71 #define MAX_LINE_LEN 1000 |
297 | 72 |
31077 | 73 #define RET_EOF -1 |
74 #define RET_EOL -2 | |
297 | 75 |
31077 | 76 #define TYPE_VIDEO 0 |
77 #define TYPE_AUDIO 1 | |
297 | 78 |
31406
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
79 static int codecs_conf_release; |
11759
29eea271490e
add -codecs-file for selecting a specific codecs.conf on the comand line
attila
parents:
11388
diff
changeset
|
80 char * codecs_file = NULL; |
29eea271490e
add -codecs-file for selecting a specific codecs.conf on the comand line
attila
parents:
11388
diff
changeset
|
81 |
303 | 82 static int add_to_fourcc(char *s, char *alias, unsigned int *fourcc, |
31077 | 83 unsigned int *map) |
297 | 84 { |
31077 | 85 int i, j, freeslots; |
86 unsigned int tmp; | |
319 | 87 |
31077 | 88 /* find first unused slot */ |
89 for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++) | |
90 /* NOTHING */; | |
91 freeslots = CODECS_MAX_FOURCC - i; | |
92 if (!freeslots) | |
93 goto err_out_too_many; | |
319 | 94 |
31077 | 95 do { |
33561
1ff6737f2177
Avoid including aviheader.h only for mmioFOURCC, it has too many
reimar
parents:
33364
diff
changeset
|
96 tmp = MKTAG(s[0], s[1], s[2], s[3]); |
31077 | 97 for (j = 0; j < i; j++) |
98 if (tmp == fourcc[j]) | |
99 goto err_out_duplicated; | |
100 fourcc[i] = tmp; | |
33561
1ff6737f2177
Avoid including aviheader.h only for mmioFOURCC, it has too many
reimar
parents:
33364
diff
changeset
|
101 map[i] = alias ? MKTAG(alias[0], alias[1], alias[2], alias[3]) : tmp; |
31077 | 102 s += 4; |
103 i++; | |
104 } while ((*(s++) == ',') && --freeslots); | |
319 | 105 |
31077 | 106 if (!freeslots) |
107 goto err_out_too_many; | |
108 if (*(--s) != '\0') | |
109 goto err_out_parse_error; | |
110 return 1; | |
328 | 111 err_out_duplicated: |
31077 | 112 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFourcc); |
113 return 0; | |
328 | 114 err_out_too_many: |
31077 | 115 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs); |
116 return 0; | |
361 | 117 err_out_parse_error: |
31077 | 118 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
119 return 0; | |
319 | 120 } |
121 | |
7770 | 122 static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int *fourccmap) |
319 | 123 { |
31077 | 124 int i, j; |
125 char *endptr; | |
297 | 126 |
31077 | 127 /* find first unused slot */ |
128 for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++) | |
129 /* NOTHING */; | |
130 if (i == CODECS_MAX_FOURCC) { | |
131 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs); | |
132 return 0; | |
133 } | |
297 | 134 |
31077 | 135 fourcc[i]=strtoul(s,&endptr,0); |
136 if (*endptr != '\0') { | |
137 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDNotNumber); | |
138 return 0; | |
139 } | |
7770 | 140 |
31077 | 141 if(alias){ |
142 fourccmap[i]=strtoul(alias,&endptr,0); | |
143 if (*endptr != '\0') { | |
144 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDAliasNotNumber); | |
145 return 0; | |
146 } | |
147 } else | |
148 fourccmap[i]=fourcc[i]; | |
7770 | 149 |
31077 | 150 for (j = 0; j < i; j++) |
151 if (fourcc[j] == fourcc[i]) { | |
152 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFID); | |
153 return 0; | |
154 } | |
300 | 155 |
31077 | 156 return 1; |
297 | 157 } |
158 | |
31159 | 159 static const struct { |
160 const char *name; | |
161 const unsigned int num; | |
162 } fmt_table[] = { | |
163 // note: due to parser deficiencies/simplicity, if one format | |
164 // name matches the beginning of another, the longer one _must_ | |
165 // come first in this list. | |
34191 | 166 {"YV12", IMGFMT_YV12}, |
167 {"I420", IMGFMT_I420}, | |
168 {"IYUV", IMGFMT_IYUV}, | |
169 {"NV12", IMGFMT_NV12}, | |
170 {"NV21", IMGFMT_NV21}, | |
171 {"YVU9", IMGFMT_YVU9}, | |
172 {"IF09", IMGFMT_IF09}, | |
173 {"444P16LE", IMGFMT_444P16_LE}, | |
174 {"444P16BE", IMGFMT_444P16_BE}, | |
175 {"444P10LE", IMGFMT_444P10_LE}, | |
176 {"444P10BE", IMGFMT_444P10_BE}, | |
177 {"422P16LE", IMGFMT_422P16_LE}, | |
178 {"422P16BE", IMGFMT_422P16_BE}, | |
179 {"420P16LE", IMGFMT_420P16_LE}, | |
180 {"420P16BE", IMGFMT_420P16_BE}, | |
181 {"444P16", IMGFMT_444P16}, | |
34923
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
182 {"444P14", IMGFMT_444P14}, |
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
183 {"444P12", IMGFMT_444P12}, |
34191 | 184 {"444P10", IMGFMT_444P10}, |
185 {"444P9", IMGFMT_444P9}, | |
186 {"422P16", IMGFMT_422P16}, | |
34923
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
187 {"422P14", IMGFMT_422P14}, |
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
188 {"422P12", IMGFMT_422P12}, |
34191 | 189 {"422P10", IMGFMT_422P10}, |
34436 | 190 {"422P9", IMGFMT_422P9}, |
34191 | 191 {"420P16", IMGFMT_420P16}, |
34923
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
192 {"420P14", IMGFMT_420P14}, |
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
193 {"420P12", IMGFMT_420P12}, |
34191 | 194 {"420P10", IMGFMT_420P10}, |
195 {"420P9", IMGFMT_420P9}, | |
196 {"420A", IMGFMT_420A}, | |
197 {"444P", IMGFMT_444P}, | |
34565 | 198 {"444A", IMGFMT_444A}, |
34191 | 199 {"422P", IMGFMT_422P}, |
34805
0eba64545a27
Improve Avid Meridien (AVUI) decoding with FFmpeg.
cehoyos
parents:
34793
diff
changeset
|
200 {"422A", IMGFMT_422A}, |
34191 | 201 {"411P", IMGFMT_411P}, |
202 {"440P", IMGFMT_440P}, | |
203 {"Y800", IMGFMT_Y800}, | |
34932
19212dea7a97
Add missing aequivalents for PIX_FMT_GRAY8A and PIX_FMT_GRAY16*.
cehoyos
parents:
34923
diff
changeset
|
204 {"Y8A", IMGFMT_Y8A}, |
34191 | 205 {"Y8", IMGFMT_Y8}, |
34932
19212dea7a97
Add missing aequivalents for PIX_FMT_GRAY8A and PIX_FMT_GRAY16*.
cehoyos
parents:
34923
diff
changeset
|
206 {"Y16LE", IMGFMT_Y16_LE}, |
19212dea7a97
Add missing aequivalents for PIX_FMT_GRAY8A and PIX_FMT_GRAY16*.
cehoyos
parents:
34923
diff
changeset
|
207 {"Y16BE", IMGFMT_Y16_BE}, |
34934 | 208 {"Y16", IMGFMT_Y16}, |
408 | 209 |
34191 | 210 {"YUY2", IMGFMT_YUY2}, |
211 {"UYVY", IMGFMT_UYVY}, | |
212 {"YVYU", IMGFMT_YVYU}, | |
408 | 213 |
34572 | 214 {"RGB64LE", IMGFMT_RGB64LE}, |
215 {"RGB64BE", IMGFMT_RGB64BE}, | |
34191 | 216 {"RGB48LE", IMGFMT_RGB48LE}, |
217 {"RGB48BE", IMGFMT_RGB48BE}, | |
218 {"RGB4", IMGFMT_RGB4}, | |
219 {"RGB8", IMGFMT_RGB8}, | |
220 {"RGB15", IMGFMT_RGB15}, | |
221 {"RGB16", IMGFMT_RGB16}, | |
222 {"RGB24", IMGFMT_RGB24}, | |
223 {"RGB32", IMGFMT_RGB32}, | |
34501 | 224 {"RGBA", IMGFMT_RGBA}, |
34939
79c374e70653
Allow specifying ARGB and ABGR colour-spaces in codecs.conf.
cehoyos
parents:
34934
diff
changeset
|
225 {"ARGB", IMGFMT_ARGB}, |
34191 | 226 {"BGR4", IMGFMT_BGR4}, |
227 {"BGR8", IMGFMT_BGR8}, | |
34793
1ce075a9932b
Support new colour spaces for FFmpeg camstudio decoding on big-endian.
cehoyos
parents:
34572
diff
changeset
|
228 {"BGR15LE", IMGFMT_BGR15LE}, |
34191 | 229 {"BGR15", IMGFMT_BGR15}, |
230 {"BGR16", IMGFMT_BGR16}, | |
231 {"BGR24", IMGFMT_BGR24}, | |
232 {"BGR32", IMGFMT_BGR32}, | |
34509
bdca973d87a5
Fix 32-bit targa playback with current FFmpeg on big-endian.
cehoyos
parents:
34501
diff
changeset
|
233 {"BGRA", IMGFMT_BGRA}, |
34939
79c374e70653
Allow specifying ARGB and ABGR colour-spaces in codecs.conf.
cehoyos
parents:
34934
diff
changeset
|
234 {"ABGR", IMGFMT_ABGR}, |
34191 | 235 {"RGB1", IMGFMT_RGB1}, |
236 {"BGR1", IMGFMT_BGR1}, | |
237 {"GBR24P", IMGFMT_GBR24P}, | |
34923
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
238 {"GBR12P", IMGFMT_GBR12P}, |
eb76937af57e
Support FFmpeg pix_fmts YUV4xxP12*, YUV4xxP14*, GBR12P* and GBR14P*.
cehoyos
parents:
34805
diff
changeset
|
239 {"GBR14P", IMGFMT_GBR14P}, |
1871 | 240 |
34191 | 241 {"MPES", IMGFMT_MPEGPES}, |
242 {"ZRMJPEGNI", IMGFMT_ZRMJPEGNI}, | |
243 {"ZRMJPEGIT", IMGFMT_ZRMJPEGIT}, | |
244 {"ZRMJPEGIB", IMGFMT_ZRMJPEGIB}, | |
10316 | 245 |
34191 | 246 {"IDCT_MPEG2", IMGFMT_XVMC_IDCT_MPEG2}, |
247 {"MOCO_MPEG2", IMGFMT_XVMC_MOCO_MPEG2}, | |
10316 | 248 |
34191 | 249 {"VDPAU_MPEG1", IMGFMT_VDPAU_MPEG1}, |
250 {"VDPAU_MPEG2", IMGFMT_VDPAU_MPEG2}, | |
251 {"VDPAU_H264", IMGFMT_VDPAU_H264}, | |
252 {"VDPAU_WMV3", IMGFMT_VDPAU_WMV3}, | |
253 {"VDPAU_VC1", IMGFMT_VDPAU_VC1}, | |
254 {"VDPAU_MPEG4", IMGFMT_VDPAU_MPEG4}, | |
28516
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
255 |
31159 | 256 {NULL, 0} |
257 }; | |
408 | 258 |
607 | 259 |
4675 | 260 static int add_to_inout(char *sfmt, char *sflags, unsigned int *outfmt, |
31077 | 261 unsigned char *outflags) |
607 | 262 { |
263 | |
31077 | 264 static char *flagstr[] = { |
265 "flip", | |
266 "noflip", | |
267 "yuvhack", | |
268 "query", | |
269 "static", | |
270 NULL | |
271 }; | |
299 | 272 |
31077 | 273 int i, j, freeslots; |
274 unsigned char flags; | |
297 | 275 |
31077 | 276 for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++) |
277 /* NOTHING */; | |
278 freeslots = CODECS_MAX_OUTFMT - i; | |
279 if (!freeslots) | |
280 goto err_out_too_many; | |
297 | 281 |
31077 | 282 flags = 0; |
283 if(sflags) { | |
284 do { | |
285 for (j = 0; flagstr[j] != NULL; j++) | |
286 if (!strncmp(sflags, flagstr[j], | |
287 strlen(flagstr[j]))) | |
288 break; | |
289 if (flagstr[j] == NULL) | |
290 goto err_out_parse_error; | |
291 flags|=(1<<j); | |
292 sflags+=strlen(flagstr[j]); | |
293 } while (*(sflags++) == ','); | |
361 | 294 |
31077 | 295 if (*(--sflags) != '\0') |
296 goto err_out_parse_error; | |
297 } | |
297 | 298 |
31077 | 299 do { |
300 for (j = 0; fmt_table[j].name != NULL; j++) | |
301 if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name))) | |
302 break; | |
303 if (fmt_table[j].name == NULL) | |
304 goto err_out_parse_error; | |
305 outfmt[i] = fmt_table[j].num; | |
306 outflags[i] = flags; | |
307 ++i; | |
308 sfmt+=strlen(fmt_table[j].name); | |
309 } while ((*(sfmt++) == ',') && --freeslots); | |
319 | 310 |
31077 | 311 if (!freeslots) |
312 goto err_out_too_many; | |
319 | 313 |
31077 | 314 if (*(--sfmt) != '\0') |
315 goto err_out_parse_error; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
316 |
31077 | 317 return 1; |
328 | 318 err_out_too_many: |
31077 | 319 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyOut); |
320 return 0; | |
361 | 321 err_out_parse_error: |
31077 | 322 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
323 return 0; | |
297 | 324 } |
325 | |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
326 #if 0 |
303 | 327 static short get_driver(char *s,int audioflag) |
297 | 328 { |
31077 | 329 static char *audiodrv[] = { |
330 "null", | |
331 "mp3lib", | |
332 "pcm", | |
333 "libac3", | |
334 "acm", | |
335 "alaw", | |
336 "msgsm", | |
337 "dshow", | |
338 "dvdpcm", | |
339 "hwac3", | |
340 "libvorbis", | |
341 "ffmpeg", | |
342 "libmad", | |
343 "msadpcm", | |
344 "liba52", | |
345 "g72x", | |
346 "imaadpcm", | |
347 "dk4adpcm", | |
348 "dk3adpcm", | |
349 "roqaudio", | |
350 "faad", | |
351 "realaud", | |
352 "libdv", | |
353 NULL | |
354 }; | |
355 static char *videodrv[] = { | |
356 "null", | |
357 "libmpeg2", | |
358 "vfw", | |
359 "dshow", | |
360 "ffmpeg", | |
361 "vfwex", | |
362 "raw", | |
363 "msrle", | |
364 "xanim", | |
365 "msvidc", | |
366 "fli", | |
367 "cinepak", | |
368 "qtrle", | |
369 "nuv", | |
370 "cyuv", | |
371 "qtsmc", | |
372 "ducktm1", | |
373 "roqvideo", | |
374 "qtrpza", | |
375 "mpng", | |
376 "ijpg", | |
377 "zlib", | |
378 "mpegpes", | |
379 "zrmjpeg", | |
380 "realvid", | |
381 "xvid", | |
382 "libdv", | |
383 NULL | |
384 }; | |
385 char **drv=audioflag?audiodrv:videodrv; | |
386 int i; | |
6863 | 387 |
31077 | 388 for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i; |
301 | 389 |
31077 | 390 return -1; |
297 | 391 } |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
392 #endif |
297 | 393 |
328 | 394 static int validate_codec(codecs_t *c, int type) |
319 | 395 { |
31077 | 396 unsigned int i; |
397 char *tmp_name = c->name; | |
328 | 398 |
31077 | 399 for (i = 0; i < strlen(tmp_name) && isalnum(tmp_name[i]); i++) |
400 /* NOTHING */; | |
3408 | 401 |
31077 | 402 if (i < strlen(tmp_name)) { |
403 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_InvalidCodecName, c->name); | |
404 return 0; | |
405 } | |
3408 | 406 |
31077 | 407 if (!c->info) |
408 c->info = strdup(c->name); | |
3408 | 409 |
410 #if 0 | |
31077 | 411 if (c->fourcc[0] == 0xffffffff) { |
412 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksFourcc, c->name); | |
413 return 0; | |
414 } | |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
415 #endif |
3408 | 416 |
31077 | 417 if (!c->drv) { |
418 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksDriver, c->name); | |
419 return 0; | |
420 } | |
3408 | 421 |
422 #if 0 | |
32394
914208d188b9
Remove #warning preprocessor directives or replace them by suitable comments.
diego
parents:
31409
diff
changeset
|
423 //FIXME: codec->driver == 4;... <- this should not be put in here... |
914208d188b9
Remove #warning preprocessor directives or replace them by suitable comments.
diego
parents:
31409
diff
changeset
|
424 //FIXME: Where are they defined ???????????? |
31077 | 425 if (!c->dll && (c->driver == 4 || |
426 (c->driver == 2 && type == TYPE_VIDEO))) { | |
427 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsDLL, c->name); | |
428 return 0; | |
429 } | |
32394
914208d188b9
Remove #warning preprocessor directives or replace them by suitable comments.
diego
parents:
31409
diff
changeset
|
430 // FIXME: Can guid.f1 be 0? How does one know that it was not given? |
31077 | 431 // if (!(codec->flags & CODECS_FLAG_AUDIO) && codec->driver == 4) |
328 | 432 |
31077 | 433 if (type == TYPE_VIDEO) |
434 if (c->outfmt[0] == 0xffffffff) { | |
435 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsOutfmt, c->name); | |
436 return 0; | |
437 } | |
329 | 438 #endif |
31077 | 439 return 1; |
319 | 440 } |
441 | |
442 static int add_comment(char *s, char **d) | |
443 { | |
31077 | 444 int pos; |
319 | 445 |
31077 | 446 if (!*d) |
447 pos = 0; | |
448 else { | |
449 pos = strlen(*d); | |
450 (*d)[pos++] = '\n'; | |
451 } | |
452 if (!(*d = realloc(*d, pos + strlen(s) + 1))) { | |
453 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantAllocateComment); | |
454 return 0; | |
455 } | |
456 strcpy(*d + pos, s); | |
457 return 1; | |
319 | 458 } |
297 | 459 |
361 | 460 static short get_cpuflags(char *s) |
461 { | |
31077 | 462 static char *flagstr[] = { |
463 "mmx", | |
464 "sse", | |
465 "3dnow", | |
466 NULL | |
467 }; | |
468 int i; | |
469 short flags = 0; | |
361 | 470 |
31077 | 471 do { |
472 for (i = 0; flagstr[i]; i++) | |
473 if (!strncmp(s, flagstr[i], strlen(flagstr[i]))) | |
474 break; | |
475 if (!flagstr[i]) | |
476 goto err_out_parse_error; | |
477 flags |= 1<<i; | |
478 s += strlen(flagstr[i]); | |
479 } while (*(s++) == ','); | |
361 | 480 |
31077 | 481 if (*(--s) != '\0') |
482 goto err_out_parse_error; | |
361 | 483 |
31077 | 484 return flags; |
361 | 485 err_out_parse_error: |
31077 | 486 return 0; |
361 | 487 } |
488 | |
328 | 489 static FILE *fp; |
490 static int line_num = 0; | |
491 static char *line; | |
492 static char *token[MAX_NR_TOKEN]; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
493 static int read_nextline = 1; |
328 | 494 |
495 static int get_token(int min, int max) | |
297 | 496 { |
31077 | 497 static int line_pos; |
498 int i; | |
499 char c; | |
328 | 500 |
31077 | 501 if (max >= MAX_NR_TOKEN) { |
502 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_GetTokenMaxNotLessThanMAX_NR_TOKEN); | |
503 goto out_eof; | |
504 } | |
328 | 505 |
31077 | 506 memset(token, 0x00, sizeof(*token) * max); |
328 | 507 |
31077 | 508 if (read_nextline) { |
509 if (!fgets(line, MAX_LINE_LEN, fp)) | |
510 goto out_eof; | |
511 line_pos = 0; | |
512 ++line_num; | |
513 read_nextline = 0; | |
514 } | |
515 for (i = 0; i < max; i++) { | |
516 while (isspace(line[line_pos])) | |
517 ++line_pos; | |
518 if (line[line_pos] == '\0' || line[line_pos] == '#' || | |
519 line[line_pos] == ';') { | |
520 read_nextline = 1; | |
521 if (i >= min) | |
522 goto out_ok; | |
523 goto out_eol; | |
524 } | |
525 token[i] = line + line_pos; | |
526 c = line[line_pos]; | |
527 if (c == '"' || c == '\'') { | |
528 token[i]++; | |
529 while (line[++line_pos] != c && line[line_pos]) | |
530 /* NOTHING */; | |
531 } else { | |
532 for (/* NOTHING */; !isspace(line[line_pos]) && | |
533 line[line_pos]; line_pos++) | |
534 /* NOTHING */; | |
535 } | |
536 if (!line[line_pos]) { | |
537 read_nextline = 1; | |
538 if (i >= min - 1) | |
539 goto out_ok; | |
540 goto out_eol; | |
541 } | |
542 line[line_pos] = '\0'; | |
543 line_pos++; | |
544 } | |
328 | 545 out_ok: |
31077 | 546 return i; |
328 | 547 out_eof: |
31077 | 548 read_nextline = 1; |
549 return RET_EOF; | |
328 | 550 out_eol: |
31077 | 551 return RET_EOL; |
328 | 552 } |
553 | |
554 static codecs_t *video_codecs=NULL; | |
555 static codecs_t *audio_codecs=NULL; | |
556 static int nr_vcodecs = 0; | |
557 static int nr_acodecs = 0; | |
558 | |
18980
ed69754aa58d
Marks several string parameters as const when they are not modified in the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18034
diff
changeset
|
559 int parse_codec_cfg(const char *cfgfile) |
328 | 560 { |
31077 | 561 codecs_t *codec = NULL; // current codec |
562 codecs_t **codecsp = NULL;// points to audio_codecs or to video_codecs | |
563 char *endptr; // strtoul()... | |
564 int *nr_codecsp; | |
565 int codec_type; /* TYPE_VIDEO/TYPE_AUDIO */ | |
566 int tmp, i; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
567 |
31077 | 568 // in case we call it a second time |
569 codecs_uninit_free(); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
570 |
31077 | 571 nr_vcodecs = 0; |
572 nr_acodecs = 0; | |
297 | 573 |
31077 | 574 if(cfgfile==NULL) { |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
575 #ifdef CODECS2HTML |
31077 | 576 return 0; |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
577 #else |
31077 | 578 video_codecs = builtin_video_codecs; |
579 audio_codecs = builtin_audio_codecs; | |
580 nr_vcodecs = sizeof(builtin_video_codecs)/sizeof(codecs_t); | |
581 nr_acodecs = sizeof(builtin_audio_codecs)/sizeof(codecs_t); | |
582 return 1; | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
583 #endif |
31077 | 584 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
585 |
33844
77bf38091051
Clarify console output when reading optional configuration files.
diego
parents:
33843
diff
changeset
|
586 mp_msg(MSGT_CODECCFG, MSGL_V, "Reading optional codecs config file %s: ", cfgfile); |
297 | 587 |
31077 | 588 if ((fp = fopen(cfgfile, "r")) == NULL) { |
33844
77bf38091051
Clarify console output when reading optional configuration files.
diego
parents:
33843
diff
changeset
|
589 mp_msg(MSGT_CODECCFG, MSGL_V, "%s\n", strerror(errno)); |
31077 | 590 return 0; |
591 } | |
297 | 592 |
31077 | 593 if ((line = malloc(MAX_LINE_LEN + 1)) == NULL) { |
594 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantGetMemoryForLine, strerror(errno)); | |
595 return 0; | |
596 } | |
597 read_nextline = 1; | |
297 | 598 |
31077 | 599 /* |
600 * this only catches release lines at the start of | |
601 * codecs.conf, before audiocodecs and videocodecs. | |
602 */ | |
603 while ((tmp = get_token(1, 1)) == RET_EOL) | |
604 /* NOTHING */; | |
605 if (tmp == RET_EOF) | |
606 goto out; | |
607 if (!strcmp(token[0], "release")) { | |
608 if (get_token(1, 2) < 0) | |
609 goto err_out_parse_error; | |
610 tmp = atoi(token[0]); | |
611 if (tmp < CODEC_CFG_MIN) | |
612 goto err_out_release_num; | |
31406
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
613 codecs_conf_release = tmp; |
31077 | 614 while ((tmp = get_token(1, 1)) == RET_EOL) |
615 /* NOTHING */; | |
616 if (tmp == RET_EOF) | |
617 goto out; | |
618 } else | |
619 goto err_out_release_num; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
620 |
31077 | 621 /* |
622 * check if the next block starts with 'audiocodec' or | |
623 * with 'videocodec' | |
624 */ | |
625 if (!strcmp(token[0], "audiocodec") || !strcmp(token[0], "videocodec")) | |
626 goto loop_enter; | |
627 goto err_out_parse_error; | |
328 | 628 |
31077 | 629 while ((tmp = get_token(1, 1)) != RET_EOF) { |
630 if (tmp == RET_EOL) | |
631 continue; | |
632 if (!strcmp(token[0], "audiocodec") || | |
633 !strcmp(token[0], "videocodec")) { | |
634 if (!validate_codec(codec, codec_type)) | |
635 goto err_out_not_valid; | |
636 loop_enter: | |
637 if (*token[0] == 'v') { | |
638 codec_type = TYPE_VIDEO; | |
639 nr_codecsp = &nr_vcodecs; | |
640 codecsp = &video_codecs; | |
641 } else if (*token[0] == 'a') { | |
642 codec_type = TYPE_AUDIO; | |
643 nr_codecsp = &nr_acodecs; | |
644 codecsp = &audio_codecs; | |
361 | 645 #ifdef DEBUG |
31077 | 646 } else { |
647 mp_msg(MSGT_CODECCFG,MSGL_ERR,"picsba\n"); | |
648 goto err_out; | |
361 | 649 #endif |
31077 | 650 } |
651 if (!(*codecsp = realloc(*codecsp, | |
652 sizeof(codecs_t) * (*nr_codecsp + 2)))) { | |
653 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantReallocCodecsp, strerror(errno)); | |
654 goto err_out; | |
655 } | |
656 codec=*codecsp + *nr_codecsp; | |
657 ++*nr_codecsp; | |
658 memset(codec,0,sizeof(codecs_t)); | |
659 memset(codec->fourcc, 0xff, sizeof(codec->fourcc)); | |
660 memset(codec->outfmt, 0xff, sizeof(codec->outfmt)); | |
661 memset(codec->infmt, 0xff, sizeof(codec->infmt)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
662 |
31077 | 663 if (get_token(1, 1) < 0) |
664 goto err_out_parse_error; | |
665 for (i = 0; i < *nr_codecsp - 1; i++) { | |
666 if(( (*codecsp)[i].name!=NULL) && | |
667 (!strcmp(token[0], (*codecsp)[i].name)) ) { | |
668 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNameNotUnique, token[0]); | |
669 goto err_out_print_linenum; | |
670 } | |
671 } | |
672 if (!(codec->name = strdup(token[0]))) { | |
673 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupName, strerror(errno)); | |
674 goto err_out; | |
675 } | |
676 } else if (!strcmp(token[0], "info")) { | |
677 if (codec->info || get_token(1, 1) < 0) | |
678 goto err_out_parse_error; | |
679 if (!(codec->info = strdup(token[0]))) { | |
680 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupInfo, strerror(errno)); | |
681 goto err_out; | |
682 } | |
683 } else if (!strcmp(token[0], "comment")) { | |
684 if (get_token(1, 1) < 0) | |
685 goto err_out_parse_error; | |
686 add_comment(token[0], &codec->comment); | |
687 } else if (!strcmp(token[0], "fourcc")) { | |
688 if (get_token(1, 2) < 0) | |
689 goto err_out_parse_error; | |
690 if (!add_to_fourcc(token[0], token[1], | |
691 codec->fourcc, | |
692 codec->fourccmap)) | |
693 goto err_out_print_linenum; | |
694 } else if (!strcmp(token[0], "format")) { | |
695 if (get_token(1, 2) < 0) | |
696 goto err_out_parse_error; | |
697 if (!add_to_format(token[0], token[1], | |
698 codec->fourcc,codec->fourccmap)) | |
699 goto err_out_print_linenum; | |
700 } else if (!strcmp(token[0], "driver")) { | |
701 if (get_token(1, 1) < 0) | |
702 goto err_out_parse_error; | |
703 if (!(codec->drv = strdup(token[0]))) { | |
704 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDriver, strerror(errno)); | |
705 goto err_out; | |
706 } | |
707 } else if (!strcmp(token[0], "dll")) { | |
708 if (get_token(1, 1) < 0) | |
709 goto err_out_parse_error; | |
710 if (!(codec->dll = strdup(token[0]))) { | |
711 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDLL, strerror(errno)); | |
712 goto err_out; | |
713 } | |
714 } else if (!strcmp(token[0], "guid")) { | |
715 if (get_token(11, 11) < 0) | |
716 goto err_out_parse_error; | |
717 codec->guid.f1=strtoul(token[0],&endptr,0); | |
718 if ((*endptr != ',' || *(endptr + 1) != '\0') && | |
719 *endptr != '\0') | |
720 goto err_out_parse_error; | |
721 codec->guid.f2=strtoul(token[1],&endptr,0); | |
722 if ((*endptr != ',' || *(endptr + 1) != '\0') && | |
723 *endptr != '\0') | |
724 goto err_out_parse_error; | |
725 codec->guid.f3=strtoul(token[2],&endptr,0); | |
726 if ((*endptr != ',' || *(endptr + 1) != '\0') && | |
727 *endptr != '\0') | |
728 goto err_out_parse_error; | |
729 for (i = 0; i < 8; i++) { | |
730 codec->guid.f4[i]=strtoul(token[i + 3],&endptr,0); | |
731 if ((*endptr != ',' || *(endptr + 1) != '\0') && | |
732 *endptr != '\0') | |
733 goto err_out_parse_error; | |
734 } | |
735 } else if (!strcmp(token[0], "out")) { | |
736 if (get_token(1, 2) < 0) | |
737 goto err_out_parse_error; | |
738 if (!add_to_inout(token[0], token[1], codec->outfmt, | |
739 codec->outflags)) | |
740 goto err_out_print_linenum; | |
741 } else if (!strcmp(token[0], "in")) { | |
742 if (get_token(1, 2) < 0) | |
743 goto err_out_parse_error; | |
744 if (!add_to_inout(token[0], token[1], codec->infmt, | |
745 codec->inflags)) | |
746 goto err_out_print_linenum; | |
747 } else if (!strcmp(token[0], "flags")) { | |
748 if (get_token(1, 1) < 0) | |
749 goto err_out_parse_error; | |
750 if (!strcmp(token[0], "seekable")) | |
751 codec->flags |= CODECS_FLAG_SEEKABLE; | |
752 else | |
753 if (!strcmp(token[0], "align16")) | |
754 codec->flags |= CODECS_FLAG_ALIGN16; | |
755 else | |
35245 | 756 if (!strcmp(token[0], "dummy")) |
757 codec->flags |= CODECS_FLAG_DUMMY; | |
758 else | |
31077 | 759 goto err_out_parse_error; |
760 } else if (!strcmp(token[0], "status")) { | |
761 if (get_token(1, 1) < 0) | |
762 goto err_out_parse_error; | |
763 if (!strcasecmp(token[0], "working")) | |
764 codec->status = CODECS_STATUS_WORKING; | |
765 else if (!strcasecmp(token[0], "crashing")) | |
766 codec->status = CODECS_STATUS_NOT_WORKING; | |
767 else if (!strcasecmp(token[0], "untested")) | |
768 codec->status = CODECS_STATUS_UNTESTED; | |
769 else if (!strcasecmp(token[0], "buggy")) | |
770 codec->status = CODECS_STATUS_PROBLEMS; | |
771 else | |
772 goto err_out_parse_error; | |
773 } else if (!strcmp(token[0], "cpuflags")) { | |
774 if (get_token(1, 1) < 0) | |
775 goto err_out_parse_error; | |
776 if (!(codec->cpuflags = get_cpuflags(token[0]))) | |
777 goto err_out_parse_error; | |
778 } else | |
779 goto err_out_parse_error; | |
780 } | |
781 if (!validate_codec(codec, codec_type)) | |
782 goto err_out_not_valid; | |
783 mp_msg(MSGT_CODECCFG,MSGL_INFO,MSGTR_AudioVideoCodecTotals, nr_acodecs, nr_vcodecs); | |
784 if(video_codecs) video_codecs[nr_vcodecs].name = NULL; | |
785 if(audio_codecs) audio_codecs[nr_acodecs].name = NULL; | |
297 | 786 out: |
31077 | 787 free(line); |
788 line=NULL; | |
789 fclose(fp); | |
790 return 1; | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
791 |
328 | 792 err_out_parse_error: |
31077 | 793 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
361 | 794 err_out_print_linenum: |
31077 | 795 PRINT_LINENUM; |
297 | 796 err_out: |
31077 | 797 codecs_uninit_free(); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
798 |
31077 | 799 free(line); |
800 line=NULL; | |
801 line_num = 0; | |
802 fclose(fp); | |
803 return 0; | |
328 | 804 err_out_not_valid: |
31077 | 805 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecDefinitionIncorrect); |
806 goto err_out_print_linenum; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
807 err_out_release_num: |
31077 | 808 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_OutdatedCodecsConf); |
809 goto err_out_print_linenum; | |
297 | 810 } |
811 | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
812 static void codecs_free(codecs_t* codecs,int count) { |
31077 | 813 int i; |
814 for ( i = 0; i < count; i++) | |
815 if ( codecs[i].name ) { | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
816 free(codecs[i].name); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
817 free(codecs[i].info); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
818 free(codecs[i].comment); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
819 free(codecs[i].dll); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
820 free(codecs[i].drv); |
31077 | 821 } |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32394
diff
changeset
|
822 free(codecs); |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
823 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
824 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17120
diff
changeset
|
825 void codecs_uninit_free(void) { |
31077 | 826 if (video_codecs) |
827 codecs_free(video_codecs,nr_vcodecs); | |
828 video_codecs=NULL; | |
829 if (audio_codecs) | |
830 codecs_free(audio_codecs,nr_acodecs); | |
831 audio_codecs=NULL; | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
832 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
833 |
332 | 834 codecs_t *find_audio_codec(unsigned int fourcc, unsigned int *fourccmap, |
31077 | 835 codecs_t *start, int force) |
328 | 836 { |
31077 | 837 return find_codec(fourcc, fourccmap, start, 1, force); |
328 | 838 } |
839 | |
332 | 840 codecs_t *find_video_codec(unsigned int fourcc, unsigned int *fourccmap, |
31077 | 841 codecs_t *start, int force) |
328 | 842 { |
31077 | 843 return find_codec(fourcc, fourccmap, start, 0, force); |
328 | 844 } |
845 | |
332 | 846 codecs_t* find_codec(unsigned int fourcc,unsigned int *fourccmap, |
31077 | 847 codecs_t *start, int audioflag, int force) |
328 | 848 { |
31077 | 849 int i, j; |
850 codecs_t *c; | |
328 | 851 |
628 | 852 #if 0 |
31077 | 853 if (start) { |
854 for (/* NOTHING */; start->name; start++) { | |
855 for (j = 0; j < CODECS_MAX_FOURCC; j++) { | |
856 if (start->fourcc[j] == fourcc) { | |
857 if (fourccmap) | |
858 *fourccmap = start->fourccmap[j]; | |
859 return start; | |
860 } | |
861 } | |
862 } | |
863 } else | |
628 | 864 #endif |
31077 | 865 { |
866 if (audioflag) { | |
867 i = nr_acodecs; | |
868 c = audio_codecs; | |
869 } else { | |
870 i = nr_vcodecs; | |
871 c = video_codecs; | |
872 } | |
873 if(!i) return NULL; | |
874 for (/* NOTHING */; i--; c++) { | |
875 if(start && c<=start) continue; | |
876 for (j = 0; j < CODECS_MAX_FOURCC; j++) { | |
35245 | 877 if (c->fourcc[j]==fourcc || c->flags & CODECS_FLAG_DUMMY) { |
31077 | 878 if (fourccmap) |
879 *fourccmap = c->fourccmap[j]; | |
880 return c; | |
881 } | |
882 } | |
883 if (force) return c; | |
884 } | |
885 } | |
886 return NULL; | |
303 | 887 } |
888 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
889 void stringset_init(stringset_t *set) { |
31077 | 890 *set = calloc(1, sizeof(char *)); |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
891 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
892 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
893 void stringset_free(stringset_t *set) { |
31077 | 894 int count = 0; |
895 while ((*set)[count]) free((*set)[count++]); | |
896 free(*set); | |
897 *set = NULL; | |
7505 | 898 } |
899 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
900 void stringset_add(stringset_t *set, const char *str) { |
31077 | 901 int count = 0; |
902 while ((*set)[count]) count++; | |
903 count++; | |
904 *set = realloc(*set, sizeof(char *) * (count + 1)); | |
905 (*set)[count - 1] = strdup(str); | |
906 (*set)[count] = NULL; | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
907 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
908 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
909 int stringset_test(stringset_t *set, const char *str) { |
31077 | 910 stringset_t s; |
911 for (s = *set; *s; s++) | |
912 if (strcmp(*s, str) == 0) | |
913 return 1; | |
914 return 0; | |
5325
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
915 } |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
916 |
1983 | 917 void list_codecs(int audioflag){ |
31077 | 918 int i; |
919 codecs_t *c; | |
1983 | 920 |
31077 | 921 if (audioflag) { |
922 i = nr_acodecs; | |
923 c = audio_codecs; | |
924 mp_msg(MSGT_CODECCFG,MSGL_INFO,"ac: afm: status: info: [lib/dll]\n"); | |
925 } else { | |
926 i = nr_vcodecs; | |
927 c = video_codecs; | |
928 mp_msg(MSGT_CODECCFG,MSGL_INFO,"vc: vfm: status: info: [lib/dll]\n"); | |
929 } | |
930 if(!i) return; | |
931 for (/* NOTHING */; i--; c++) { | |
932 char* s="unknown "; | |
933 switch(c->status){ | |
934 case CODECS_STATUS_WORKING: s="working ";break; | |
935 case CODECS_STATUS_PROBLEMS: s="problems";break; | |
936 case CODECS_STATUS_NOT_WORKING: s="crashing";break; | |
937 case CODECS_STATUS_UNTESTED: s="untested";break; | |
938 } | |
939 if(c->dll) | |
940 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s [%s]\n",c->name,c->drv,s,c->info,c->dll); | |
941 else | |
942 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s\n",c->name,c->drv,s,c->info); | |
943 } | |
1983 | 944 } |
945 | |
946 | |
607 | 947 #ifdef CODECS2HTML |
31408 | 948 static void wrapline(FILE *f2,char *s){ |
607 | 949 int c; |
950 if(!s){ | |
951 fprintf(f2,"-"); | |
952 return; | |
953 } | |
954 while((c=*s++)){ | |
955 if(c==',') fprintf(f2,"<br>"); else fputc(c,f2); | |
956 } | |
957 } | |
958 | |
31409 | 959 static void parsehtml(FILE *f1,FILE *f2,codecs_t *codec){ |
31077 | 960 int c,d; |
961 while((c=fgetc(f1))>=0){ | |
962 if(c!='%'){ | |
963 fputc(c,f2); | |
964 continue; | |
965 } | |
966 d=fgetc(f1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
967 |
31077 | 968 switch(d){ |
969 case '.': | |
970 return; // end of section | |
971 case 'n': | |
972 wrapline(f2,codec->name); break; | |
973 case 'i': | |
974 wrapline(f2,codec->info); break; | |
975 case 'c': | |
976 wrapline(f2,codec->comment); break; | |
977 case 'd': | |
978 wrapline(f2,codec->dll); break; | |
979 case 'D': | |
980 fprintf(f2,"%c",!strcmp(codec->drv,"dshow")?'+':'-'); break; | |
981 case 'F': | |
982 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
983 if(!d || codec->fourcc[d]!=0xFFFFFFFF) | |
984 fprintf(f2,"%s%.4s",d?"<br>":"",(codec->fourcc[d]==0xFFFFFFFF || codec->fourcc[d]<0x20202020)?!d?"-":"":(char*) &codec->fourcc[d]); | |
985 break; | |
986 case 'f': | |
987 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
988 if(codec->fourcc[d]!=0xFFFFFFFF) | |
989 fprintf(f2,"%s0x%X",d?"<br>":"",codec->fourcc[d]); | |
990 break; | |
991 case 'Y': | |
992 for(d=0;d<CODECS_MAX_OUTFMT;d++) | |
993 if(codec->outfmt[d]!=0xFFFFFFFF){ | |
994 for (c=0; fmt_table[c].name; c++) | |
995 if(fmt_table[c].num==codec->outfmt[d]) break; | |
996 if(fmt_table[c].name) | |
997 fprintf(f2,"%s%s",d?"<br>":"",fmt_table[c].name); | |
998 } | |
999 break; | |
1000 default: | |
1001 fputc(c,f2); | |
1002 fputc(d,f2); | |
607 | 1003 } |
31077 | 1004 } |
607 | 1005 } |
1006 | |
1007 void skiphtml(FILE *f1){ | |
31077 | 1008 int c,d; |
1009 while((c=fgetc(f1))>=0){ | |
1010 if(c!='%'){ | |
1011 continue; | |
607 | 1012 } |
31077 | 1013 d=fgetc(f1); |
1014 if(d=='.') return; // end of section | |
1015 } | |
607 | 1016 } |
1017 | |
29115
1e78a310487e
Change type of first argument of the print_int_array function from int to
diego
parents:
28747
diff
changeset
|
1018 static void print_int_array(const unsigned int* a, int size) |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1019 { |
31077 | 1020 printf("{ "); |
1021 while (size--) | |
1022 if(abs(*a)<256) | |
1023 printf("%d%s", *a++, size?", ":""); | |
1024 else | |
1025 printf("0x%X%s", *a++, size?", ":""); | |
1026 printf(" }"); | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1027 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1028 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1029 static void print_char_array(const unsigned char* a, int size) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1030 { |
31077 | 1031 printf("{ "); |
1032 while (size--) | |
1033 if((*a)<10) | |
1034 printf("%d%s", *a++, size?", ":""); | |
1035 else | |
1036 printf("0x%02x%s", *a++, size?", ":""); | |
1037 printf(" }"); | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1038 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1039 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1040 static void print_string(const char* s) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1041 { |
31077 | 1042 if (!s) printf("NULL"); |
1043 else printf("\"%s\"", s); | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1044 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1045 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1046 int main(int argc, char* argv[]) |
607 | 1047 { |
31077 | 1048 codecs_t *cl; |
1049 FILE *f1; | |
1050 FILE *f2; | |
1051 int c,d,i; | |
1052 int pos; | |
1053 int section=-1; | |
1054 int nr_codecs; | |
1055 int win32=-1; | |
1056 int dshow=-1; | |
1057 int win32ex=-1; | |
607 | 1058 |
31077 | 1059 /* |
1060 * Take path to codecs.conf from command line, or fall back on | |
1061 * etc/codecs.conf | |
1062 */ | |
1063 if (!(nr_codecs = parse_codec_cfg((argc>1)?argv[1]:"etc/codecs.conf"))) | |
1064 exit(1); | |
31406
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
1065 if (codecs_conf_release < CODEC_CFG_MIN) |
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
1066 exit(1); |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1067 |
31077 | 1068 if (argc > 1) { |
1069 int i, j; | |
1070 const char* nm[2]; | |
1071 codecs_t* cod[2]; | |
1072 int nr[2]; | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1073 |
31077 | 1074 nm[0] = "builtin_video_codecs"; |
1075 cod[0] = video_codecs; | |
1076 nr[0] = nr_vcodecs; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1077 |
31077 | 1078 nm[1] = "builtin_audio_codecs"; |
1079 cod[1] = audio_codecs; | |
1080 nr[1] = nr_acodecs; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1081 |
31077 | 1082 printf("/* GENERATED FROM %s, DO NOT EDIT! */\n\n",argv[1]); |
31407 | 1083 printf("#include <stddef.h>\n"); |
1084 printf("#include \"codec-cfg.h\"\n\n"); | |
31406
0fd1b3f1fe69
Auto-update CODEC_CFG_MIN value to release value in etc/codecs.conf.
reimar
parents:
31159
diff
changeset
|
1085 printf("#define CODEC_CFG_MIN %i\n\n", codecs_conf_release); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1086 |
31077 | 1087 for (i=0; i<2; i++) { |
1088 printf("const codecs_t %s[] = {\n", nm[i]); | |
1089 for (j = 0; j < nr[i]; j++) { | |
1090 printf("{"); | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1091 |
31077 | 1092 print_int_array(cod[i][j].fourcc, CODECS_MAX_FOURCC); |
1093 printf(", /* fourcc */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1094 |
31077 | 1095 print_int_array(cod[i][j].fourccmap, CODECS_MAX_FOURCC); |
1096 printf(", /* fourccmap */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1097 |
31077 | 1098 print_int_array(cod[i][j].outfmt, CODECS_MAX_OUTFMT); |
1099 printf(", /* outfmt */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1100 |
31077 | 1101 print_char_array(cod[i][j].outflags, CODECS_MAX_OUTFMT); |
1102 printf(", /* outflags */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1103 |
31077 | 1104 print_int_array(cod[i][j].infmt, CODECS_MAX_INFMT); |
1105 printf(", /* infmt */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1106 |
31077 | 1107 print_char_array(cod[i][j].inflags, CODECS_MAX_INFMT); |
1108 printf(", /* inflags */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1109 |
31077 | 1110 print_string(cod[i][j].name); printf(", /* name */\n"); |
1111 print_string(cod[i][j].info); printf(", /* info */\n"); | |
1112 print_string(cod[i][j].comment); printf(", /* comment */\n"); | |
1113 print_string(cod[i][j].dll); printf(", /* dll */\n"); | |
1114 print_string(cod[i][j].drv); printf(", /* drv */\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1115 |
31077 | 1116 printf("{ 0x%08lx, %hu, %hu,", |
1117 cod[i][j].guid.f1, | |
1118 cod[i][j].guid.f2, | |
1119 cod[i][j].guid.f3); | |
1120 print_char_array(cod[i][j].guid.f4, sizeof(cod[i][j].guid.f4)); | |
1121 printf(" }, /* GUID */\n"); | |
1122 printf("%hd /* flags */, %hd /* status */, %hd /* cpuflags */ }\n", | |
1123 cod[i][j].flags, | |
1124 cod[i][j].status, | |
1125 cod[i][j].cpuflags); | |
1126 if (j < nr[i]) printf(",\n"); | |
607 | 1127 } |
31077 | 1128 printf("};\n\n"); |
1129 } | |
1130 exit(0); | |
1131 } | |
1132 | |
1133 f1=fopen("DOCS/tech/codecs-in.html","rb"); if(!f1) exit(1); | |
1134 f2=fopen("DOCS/codecs-status.html","wb"); if(!f2) exit(1); | |
1135 | |
1136 while((c=fgetc(f1))>=0){ | |
1137 if(c!='%'){ | |
1138 fputc(c,f2); | |
1139 continue; | |
1140 } | |
1141 d=fgetc(f1); | |
1142 if(d>='0' && d<='9'){ | |
1143 // begin section | |
1144 section=d-'0'; | |
1145 //printf("BEGIN %d\n",section); | |
1146 if(section>=5){ | |
1147 // audio | |
1148 cl = audio_codecs; | |
1149 nr_codecs = nr_acodecs; | |
1150 dshow=7;win32=4; | |
1151 } else { | |
1152 // video | |
1153 cl = video_codecs; | |
1154 nr_codecs = nr_vcodecs; | |
1155 dshow=4;win32=2;win32ex=6; | |
1156 } | |
1157 pos=ftell(f1); | |
1158 for(i=0;i<nr_codecs;i++){ | |
1159 fseek(f1,pos,SEEK_SET); | |
1160 switch(section){ | |
1161 case 0: | |
1162 case 5: | |
1163 if(cl[i].status==CODECS_STATUS_WORKING) | |
1164 // if(!(!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) | |
31409 | 1165 parsehtml(f1,f2,&cl[i]); |
31077 | 1166 break; |
8211 | 1167 #if 0 |
31077 | 1168 case 1: |
1169 case 6: | |
1170 if(cl[i].status==CODECS_STATUS_WORKING) | |
1171 if((!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) | |
31409 | 1172 parsehtml(f1,f2,&cl[i]); |
31077 | 1173 break; |
1174 #endif | |
1175 case 2: | |
1176 case 7: | |
1177 if(cl[i].status==CODECS_STATUS_PROBLEMS) | |
31409 | 1178 parsehtml(f1,f2,&cl[i]); |
31077 | 1179 break; |
1180 case 3: | |
1181 case 8: | |
1182 if(cl[i].status==CODECS_STATUS_NOT_WORKING) | |
31409 | 1183 parsehtml(f1,f2,&cl[i]); |
31077 | 1184 break; |
1185 case 4: | |
1186 case 9: | |
1187 if(cl[i].status==CODECS_STATUS_UNTESTED) | |
31409 | 1188 parsehtml(f1,f2,&cl[i]); |
31077 | 1189 break; |
1190 default: | |
1191 printf("Warning! unimplemented section: %d\n",section); | |
607 | 1192 } |
31077 | 1193 } |
1194 fseek(f1,pos,SEEK_SET); | |
1195 skiphtml(f1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1196 |
31077 | 1197 continue; |
607 | 1198 } |
31077 | 1199 fputc(c,f2); |
1200 fputc(d,f2); | |
1201 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1202 |
31077 | 1203 fclose(f2); |
1204 fclose(f1); | |
1205 return 0; | |
607 | 1206 } |
1207 | |
1208 #endif | |
1209 | |
297 | 1210 #ifdef TESTING |
1211 int main(void) | |
1212 { | |
31077 | 1213 codecs_t *c; |
1214 int i,j, nr_codecs, state; | |
297 | 1215 |
31077 | 1216 if (!(parse_codec_cfg("etc/codecs.conf"))) |
1217 return 0; | |
1218 if (!video_codecs) | |
1219 printf("no videoconfig.\n"); | |
1220 if (!audio_codecs) | |
1221 printf("no audioconfig.\n"); | |
328 | 1222 |
31077 | 1223 printf("videocodecs:\n"); |
1224 c = video_codecs; | |
1225 nr_codecs = nr_vcodecs; | |
1226 state = 0; | |
328 | 1227 next: |
31077 | 1228 if (c) { |
1229 printf("number of %scodecs: %d\n", state==0?"video":"audio", | |
1230 nr_codecs); | |
1231 for(i=0;i<nr_codecs;i++, c++){ | |
1232 printf("\n============== %scodec %02d ===============\n", | |
1233 state==0?"video":"audio",i); | |
1234 printf("name='%s'\n",c->name); | |
1235 printf("info='%s'\n",c->info); | |
1236 printf("comment='%s'\n",c->comment); | |
1237 printf("dll='%s'\n",c->dll); | |
1238 /* printf("flags=%X driver=%d status=%d cpuflags=%d\n", | |
1239 c->flags, c->driver, c->status, c->cpuflags); */ | |
1240 printf("flags=%X status=%d cpuflags=%d\n", | |
1241 c->flags, c->status, c->cpuflags); | |
300 | 1242 |
31077 | 1243 for(j=0;j<CODECS_MAX_FOURCC;j++){ |
1244 if(c->fourcc[j]!=0xFFFFFFFF){ | |
1245 printf("fourcc %02d: %08X (%.4s) ===> %08X (%.4s)\n",j,c->fourcc[j],(char *) &c->fourcc[j],c->fourccmap[j],(char *) &c->fourccmap[j]); | |
1246 } | |
1247 } | |
328 | 1248 |
31077 | 1249 for(j=0;j<CODECS_MAX_OUTFMT;j++){ |
1250 if(c->outfmt[j]!=0xFFFFFFFF){ | |
1251 printf("outfmt %02d: %08X (%.4s) flags: %d\n",j,c->outfmt[j],(char *) &c->outfmt[j],c->outflags[j]); | |
1252 } | |
1253 } | |
300 | 1254 |
31077 | 1255 for(j=0;j<CODECS_MAX_INFMT;j++){ |
1256 if(c->infmt[j]!=0xFFFFFFFF){ | |
1257 printf("infmt %02d: %08X (%.4s) flags: %d\n",j,c->infmt[j],(char *) &c->infmt[j],c->inflags[j]); | |
1258 } | |
1259 } | |
4676 | 1260 |
31077 | 1261 printf("GUID: %08lX %04X %04X",c->guid.f1,c->guid.f2,c->guid.f3); |
1262 for(j=0;j<8;j++) printf(" %02X",c->guid.f4[j]); | |
1263 printf("\n"); | |
300 | 1264 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29115
diff
changeset
|
1265 |
31077 | 1266 } |
1267 } | |
1268 if (!state) { | |
1269 printf("audiocodecs:\n"); | |
1270 c = audio_codecs; | |
1271 nr_codecs = nr_acodecs; | |
1272 state = 1; | |
1273 goto next; | |
1274 } | |
1275 return 0; | |
297 | 1276 } |
1277 | |
1278 #endif |