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