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