Mercurial > mplayer.hg
annotate codec-cfg.c @ 18049:77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author | iive |
---|---|
date | Thu, 06 Apr 2006 20:04:02 +0000 |
parents | 1dcf0ea2f7ba |
children | ed69754aa58d |
rev | line source |
---|---|
319 | 1 /* |
2 * codec.conf parser | |
3 * by Szabolcs Berecz <szabi@inf.elte.hu> | |
4 * (C) 2001 | |
4676 | 5 * |
6 * to compile tester app: gcc -Iloader/ -DTESTING -o codec-cfg codec-cfg.c | |
15303 | 7 * to compile CODECS2HTML: |
17763 | 8 * gcc -DCODECS2HTML -o codecs2html codec-cfg.c mp_msg.o |
4676 | 9 * |
10 * TODO: implement informat in CODECS2HTML too | |
319 | 11 */ |
303 | 12 |
319 | 13 #define DEBUG |
303 | 14 |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
15 //disable asserts |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
16 #define NDEBUG |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
17 |
297 | 18 #include <stdio.h> |
19 #include <stdlib.h> | |
20 #include <fcntl.h> | |
21 #include <unistd.h> | |
22 #include <errno.h> | |
23 #include <ctype.h> | |
24 #include <assert.h> | |
25 #include <string.h> | |
26 | |
5284
0a58c2ef1da1
added missing #include config.h, removed LIBVO2 ifdef.
arpi
parents:
5263
diff
changeset
|
27 #include "config.h" |
5937 | 28 #include "mp_msg.h" |
17841
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
29 #ifdef CODECS2HTML |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
30 #ifdef __GNUC__ |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
31 #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
|
32 #else |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
33 #define mp_msg(t, l, m, ...) fprintf(stderr, m, __VA_ARGS__) |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
34 #endif |
73db10d5f2e3
remove mp_msg.c dependency when compiling codec-cfg binary.
reimar
parents:
17763
diff
changeset
|
35 #endif |
5284
0a58c2ef1da1
added missing #include config.h, removed LIBVO2 ifdef.
arpi
parents:
5263
diff
changeset
|
36 |
13619 | 37 #include "help_mp.h" |
38 | |
2052 | 39 // for mmioFOURCC: |
12341
0db4a3a5b01d
removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents:
11759
diff
changeset
|
40 #include "libmpdemux/aviheader.h" |
1305
0a8237e28ce0
Use FOURCC macro to encode fcc values. Avoids accessing 32-bit data from
jkeil
parents:
1297
diff
changeset
|
41 |
15305 | 42 #include "libmpcodecs/img_format.h" |
297 | 43 #include "codec-cfg.h" |
44 | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
45 #ifndef CODECS2HTML |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
46 #include "codecs.conf.h" |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
47 #endif |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
48 |
5937 | 49 #define PRINT_LINENUM mp_msg(MSGT_CODECCFG,MSGL_ERR," at line %d\n", line_num) |
328 | 50 |
319 | 51 #define MAX_NR_TOKEN 16 |
297 | 52 |
53 #define MAX_LINE_LEN 1000 | |
54 | |
55 #define RET_EOF -1 | |
56 #define RET_EOL -2 | |
57 | |
328 | 58 #define TYPE_VIDEO 0 |
59 #define TYPE_AUDIO 1 | |
297 | 60 |
11759
29eea271490e
add -codecs-file for selecting a specific codecs.conf on the comand line
attila
parents:
11388
diff
changeset
|
61 char * codecs_file = NULL; |
29eea271490e
add -codecs-file for selecting a specific codecs.conf on the comand line
attila
parents:
11388
diff
changeset
|
62 |
303 | 63 static int add_to_fourcc(char *s, char *alias, unsigned int *fourcc, |
297 | 64 unsigned int *map) |
65 { | |
319 | 66 int i, j, freeslots; |
67 unsigned int tmp; | |
68 | |
69 /* find first unused slot */ | |
70 for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++) | |
71 /* NOTHING */; | |
72 freeslots = CODECS_MAX_FOURCC - i; | |
73 if (!freeslots) | |
328 | 74 goto err_out_too_many; |
319 | 75 |
76 do { | |
1305
0a8237e28ce0
Use FOURCC macro to encode fcc values. Avoids accessing 32-bit data from
jkeil
parents:
1297
diff
changeset
|
77 tmp = mmioFOURCC(s[0], s[1], s[2], s[3]); |
319 | 78 for (j = 0; j < i; j++) |
79 if (tmp == fourcc[j]) | |
328 | 80 goto err_out_duplicated; |
319 | 81 fourcc[i] = tmp; |
2681 | 82 map[i] = alias ? mmioFOURCC(alias[0], alias[1], alias[2], alias[3]) : tmp; |
319 | 83 s += 4; |
84 i++; | |
85 } while ((*(s++) == ',') && --freeslots); | |
86 | |
87 if (!freeslots) | |
328 | 88 goto err_out_too_many; |
319 | 89 if (*(--s) != '\0') |
361 | 90 goto err_out_parse_error; |
319 | 91 return 1; |
328 | 92 err_out_duplicated: |
13619 | 93 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFourcc); |
319 | 94 return 0; |
328 | 95 err_out_too_many: |
13619 | 96 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs); |
361 | 97 return 0; |
98 err_out_parse_error: | |
13619 | 99 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
319 | 100 return 0; |
101 } | |
102 | |
7770 | 103 static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int *fourccmap) |
319 | 104 { |
105 int i, j; | |
361 | 106 char *endptr; |
297 | 107 |
108 /* find first unused slot */ | |
109 for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++) | |
110 /* NOTHING */; | |
111 if (i == CODECS_MAX_FOURCC) { | |
13619 | 112 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs); |
297 | 113 return 0; |
114 } | |
115 | |
7770 | 116 fourcc[i]=strtoul(s,&endptr,0); |
361 | 117 if (*endptr != '\0') { |
13619 | 118 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDNotNumber); |
361 | 119 return 0; |
120 } | |
7770 | 121 |
122 if(alias){ | |
123 fourccmap[i]=strtoul(alias,&endptr,0); | |
124 if (*endptr != '\0') { | |
13619 | 125 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDAliasNotNumber); |
7770 | 126 return 0; |
127 } | |
128 } else | |
129 fourccmap[i]=fourcc[i]; | |
130 | |
319 | 131 for (j = 0; j < i; j++) |
132 if (fourcc[j] == fourcc[i]) { | |
13619 | 133 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFID); |
319 | 134 return 0; |
135 } | |
300 | 136 |
297 | 137 return 1; |
138 } | |
139 | |
408 | 140 static struct { |
141 const char *name; | |
142 const unsigned int num; | |
143 } fmt_table[] = { | |
415 | 144 {"YV12", IMGFMT_YV12}, |
145 {"I420", IMGFMT_I420}, | |
146 {"IYUV", IMGFMT_IYUV}, | |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10520
diff
changeset
|
147 {"NV12", IMGFMT_NV12}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10520
diff
changeset
|
148 {"NV21", IMGFMT_NV21}, |
6489
37fb529873d7
yvu9 support, 0l to me becouse i forget to commit it (0l becouse i've drinken 1litre of bier, yet ;)
alex
parents:
6343
diff
changeset
|
149 {"YVU9", IMGFMT_YVU9}, |
6526 | 150 {"IF09", IMGFMT_IF09}, |
6863 | 151 {"444P", IMGFMT_444P}, |
152 {"422P", IMGFMT_422P}, | |
153 {"411P", IMGFMT_411P}, | |
14170 | 154 {"Y800", IMGFMT_Y800}, |
155 {"Y8", IMGFMT_Y8}, | |
408 | 156 |
415 | 157 {"YUY2", IMGFMT_YUY2}, |
158 {"UYVY", IMGFMT_UYVY}, | |
159 {"YVYU", IMGFMT_YVYU}, | |
408 | 160 |
7770 | 161 {"RGB4", IMGFMT_RGB|4}, |
415 | 162 {"RGB8", IMGFMT_RGB|8}, |
163 {"RGB15", IMGFMT_RGB|15}, | |
164 {"RGB16", IMGFMT_RGB|16}, | |
165 {"RGB24", IMGFMT_RGB|24}, | |
166 {"RGB32", IMGFMT_RGB|32}, | |
7770 | 167 {"BGR4", IMGFMT_BGR|4}, |
415 | 168 {"BGR8", IMGFMT_BGR|8}, |
169 {"BGR15", IMGFMT_BGR|15}, | |
170 {"BGR16", IMGFMT_BGR|16}, | |
171 {"BGR24", IMGFMT_BGR|24}, | |
172 {"BGR32", IMGFMT_BGR|32}, | |
7770 | 173 {"RGB1", IMGFMT_RGB|1}, |
174 {"BGR1", IMGFMT_BGR|1}, | |
1871 | 175 |
176 {"MPES", IMGFMT_MPEGPES}, | |
11388
a9de2f4781dd
updates for new image formats for zoran mjpeg passthrough
rik
parents:
10859
diff
changeset
|
177 {"ZRMJPEGNI", IMGFMT_ZRMJPEGNI}, |
a9de2f4781dd
updates for new image formats for zoran mjpeg passthrough
rik
parents:
10859
diff
changeset
|
178 {"ZRMJPEGIT", IMGFMT_ZRMJPEGIT}, |
a9de2f4781dd
updates for new image formats for zoran mjpeg passthrough
rik
parents:
10859
diff
changeset
|
179 {"ZRMJPEGIB", IMGFMT_ZRMJPEGIB}, |
10316 | 180 |
181 {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2}, | |
182 {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2}, | |
183 | |
415 | 184 {NULL, 0} |
297 | 185 }; |
408 | 186 |
607 | 187 |
4675 | 188 static int add_to_inout(char *sfmt, char *sflags, unsigned int *outfmt, |
607 | 189 unsigned char *outflags) |
190 { | |
191 | |
299 | 192 static char *flagstr[] = { |
193 "flip", | |
194 "noflip", | |
195 "yuvhack", | |
5249 | 196 "query", |
6103 | 197 "static", |
299 | 198 NULL |
199 }; | |
200 | |
319 | 201 int i, j, freeslots; |
297 | 202 unsigned char flags; |
203 | |
204 for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++) | |
205 /* NOTHING */; | |
319 | 206 freeslots = CODECS_MAX_OUTFMT - i; |
207 if (!freeslots) | |
328 | 208 goto err_out_too_many; |
297 | 209 |
319 | 210 flags = 0; |
361 | 211 if(sflags) { |
212 do { | |
213 for (j = 0; flagstr[j] != NULL; j++) | |
214 if (!strncmp(sflags, flagstr[j], | |
215 strlen(flagstr[j]))) | |
216 break; | |
217 if (flagstr[j] == NULL) | |
218 goto err_out_parse_error; | |
219 flags|=(1<<j); | |
220 sflags+=strlen(flagstr[j]); | |
221 } while (*(sflags++) == ','); | |
222 | |
223 if (*(--sflags) != '\0') | |
224 goto err_out_parse_error; | |
225 } | |
297 | 226 |
227 do { | |
408 | 228 for (j = 0; fmt_table[j].name != NULL; j++) |
229 if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name))) | |
297 | 230 break; |
408 | 231 if (fmt_table[j].name == NULL) |
361 | 232 goto err_out_parse_error; |
408 | 233 outfmt[i] = fmt_table[j].num; |
297 | 234 outflags[i] = flags; |
299 | 235 ++i; |
408 | 236 sfmt+=strlen(fmt_table[j].name); |
319 | 237 } while ((*(sfmt++) == ',') && --freeslots); |
238 | |
239 if (!freeslots) | |
328 | 240 goto err_out_too_many; |
319 | 241 |
361 | 242 if (*(--sfmt) != '\0') |
243 goto err_out_parse_error; | |
299 | 244 |
297 | 245 return 1; |
328 | 246 err_out_too_many: |
13619 | 247 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyOut); |
361 | 248 return 0; |
249 err_out_parse_error: | |
13619 | 250 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
319 | 251 return 0; |
297 | 252 } |
253 | |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
254 #if 0 |
303 | 255 static short get_driver(char *s,int audioflag) |
297 | 256 { |
301 | 257 static char *audiodrv[] = { |
1293 | 258 "null", |
301 | 259 "mp3lib", |
260 "pcm", | |
261 "libac3", | |
262 "acm", | |
263 "alaw", | |
264 "msgsm", | |
265 "dshow", | |
401 | 266 "dvdpcm", |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1488
diff
changeset
|
267 "hwac3", |
1828 | 268 "libvorbis", |
1929 | 269 "ffmpeg", |
2415 | 270 "libmad", |
3787 | 271 "msadpcm", |
3400 | 272 "liba52", |
273 "g72x", | |
3787 | 274 "imaadpcm", |
4854
4a6dde59834c
fixed, strengthened, rewrote, and renamed a variety of the ADPCM decoders
melanson
parents:
4676
diff
changeset
|
275 "dk4adpcm", |
4a6dde59834c
fixed, strengthened, rewrote, and renamed a variety of the ADPCM decoders
melanson
parents:
4676
diff
changeset
|
276 "dk3adpcm", |
4450
3da8c5706371
added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
4301
diff
changeset
|
277 "roqaudio", |
5190
59df6b778d78
Beta AAC decoding support, seeking totally broken yet, add philipps mpeg4 video in qt to ffmpeg4 although it's still buggy in decoding
atmos4
parents:
5029
diff
changeset
|
278 "faad", |
6343
d253cf4f43a9
realvideo support by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6200
diff
changeset
|
279 "realaud", |
6927 | 280 "libdv", |
301 | 281 NULL |
282 }; | |
283 static char *videodrv[] = { | |
1293 | 284 "null", |
301 | 285 "libmpeg2", |
286 "vfw", | |
287 "odivx", | |
288 "dshow", | |
1248 | 289 "ffmpeg", |
1297 | 290 "vfwex", |
1349 | 291 "divx4", |
1488 | 292 "raw", |
5193
abea2deab4d6
MPlayer now has a Microsoft RLE decoder to call its own...only supports
melanson
parents:
5190
diff
changeset
|
293 "msrle", |
2379 | 294 "xanim", |
2827
b4d46817f050
ms video1 (cram) codecs by Mike Melanson <melanson@pcisys.net>
arpi
parents:
2681
diff
changeset
|
295 "msvidc", |
3172 | 296 "fli", |
3643
fb9fd7e2dd35
native opensourec Cinepak (CVID) codec by im Ferguson <timf@mail.csse.monash.edu.au>
arpi
parents:
3408
diff
changeset
|
297 "cinepak", |
3687
7fb817c9060b
This commit adds initial support for Quicktime Animation (RLE) video. It
melanson
parents:
3667
diff
changeset
|
298 "qtrle", |
3804
53ed66a4f0bf
NuppelVideo decoder added, based on Panagiotis Issaris' patch
alex
parents:
3798
diff
changeset
|
299 "nuv", |
3969 | 300 "cyuv", |
4227 | 301 "qtsmc", |
4301
8f43b10f387f
added skeleton for Duck Truemotion v1 decoder (doesn't do anything yet)
melanson
parents:
4227
diff
changeset
|
302 "ducktm1", |
4450
3da8c5706371
added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
4301
diff
changeset
|
303 "roqvideo", |
4615
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
4450
diff
changeset
|
304 "qtrpza", |
4656 | 305 "mpng", |
5029 | 306 "ijpg", |
5263 | 307 "zlib", |
5478 | 308 "mpegpes", |
11388
a9de2f4781dd
updates for new image formats for zoran mjpeg passthrough
rik
parents:
10859
diff
changeset
|
309 "zrmjpeg", |
6343
d253cf4f43a9
realvideo support by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6200
diff
changeset
|
310 "realvid", |
6701
522713337297
Support for Xvid using their new api. If divx4 compatiblity is disabeled
albeu
parents:
6565
diff
changeset
|
311 "xvid", |
6927 | 312 "libdv", |
301 | 313 NULL |
314 }; | |
315 char **drv=audioflag?audiodrv:videodrv; | |
316 int i; | |
6863 | 317 |
1293 | 318 for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i; |
301 | 319 |
1293 | 320 return -1; |
297 | 321 } |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
322 #endif |
297 | 323 |
328 | 324 static int validate_codec(codecs_t *c, int type) |
319 | 325 { |
5937 | 326 unsigned int i; |
7770 | 327 char *tmp_name = c->name; |
328 | 328 |
3408 | 329 for (i = 0; i < strlen(tmp_name) && isalnum(tmp_name[i]); i++) |
328 | 330 /* NOTHING */; |
3408 | 331 |
332 if (i < strlen(tmp_name)) { | |
13619 | 333 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_InvalidCodecName, c->name); |
328 | 334 return 0; |
335 } | |
3408 | 336 |
328 | 337 if (!c->info) |
3408 | 338 c->info = strdup(c->name); |
339 | |
340 #if 0 | |
328 | 341 if (c->fourcc[0] == 0xffffffff) { |
13619 | 342 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksFourcc, c->name); |
328 | 343 return 0; |
344 } | |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
345 #endif |
3408 | 346 |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
347 if (!c->drv) { |
13619 | 348 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksDriver, c->name); |
328 | 349 return 0; |
350 } | |
3408 | 351 |
352 #if 0 | |
328 | 353 #warning codec->driver == 4;... <- ezt nem kellene belehegeszteni... |
354 #warning HOL VANNAK DEFINIALVA???????????? | |
355 if (!c->dll && (c->driver == 4 || | |
356 (c->driver == 2 && type == TYPE_VIDEO))) { | |
13619 | 357 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsDLL, c->name); |
328 | 358 return 0; |
359 } | |
360 #warning guid.f1 lehet 0? honnan lehet tudni, hogy nem adtak meg? | |
361 // if (!(codec->flags & CODECS_FLAG_AUDIO) && codec->driver == 4) | |
362 | |
363 if (type == TYPE_VIDEO) | |
364 if (c->outfmt[0] == 0xffffffff) { | |
13619 | 365 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsOutfmt, c->name); |
328 | 366 return 0; |
367 } | |
329 | 368 #endif |
319 | 369 return 1; |
370 } | |
371 | |
372 static int add_comment(char *s, char **d) | |
373 { | |
374 int pos; | |
375 | |
376 if (!*d) | |
377 pos = 0; | |
378 else { | |
379 pos = strlen(*d); | |
380 (*d)[pos++] = '\n'; | |
381 } | |
382 if (!(*d = (char *) realloc(*d, pos + strlen(s) + 1))) { | |
13619 | 383 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantAllocateComment); |
319 | 384 return 0; |
385 } | |
386 strcpy(*d + pos, s); | |
387 return 1; | |
388 } | |
297 | 389 |
361 | 390 static short get_cpuflags(char *s) |
391 { | |
392 static char *flagstr[] = { | |
393 "mmx", | |
394 "sse", | |
395 "3dnow", | |
396 NULL | |
397 }; | |
398 int i; | |
399 short flags = 0; | |
400 | |
401 do { | |
402 for (i = 0; flagstr[i]; i++) | |
403 if (!strncmp(s, flagstr[i], strlen(flagstr[i]))) | |
404 break; | |
405 if (!flagstr[i]) | |
406 goto err_out_parse_error; | |
407 flags |= 1<<i; | |
408 s += strlen(flagstr[i]); | |
409 } while (*(s++) == ','); | |
410 | |
411 if (*(--s) != '\0') | |
412 goto err_out_parse_error; | |
413 | |
414 return flags; | |
415 err_out_parse_error: | |
416 return 0; | |
417 } | |
418 | |
328 | 419 static FILE *fp; |
420 static int line_num = 0; | |
421 static char *line; | |
422 static char *token[MAX_NR_TOKEN]; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
423 static int read_nextline = 1; |
328 | 424 |
425 static int get_token(int min, int max) | |
297 | 426 { |
328 | 427 static int line_pos; |
428 int i; | |
429 char c; | |
430 | |
431 if (max >= MAX_NR_TOKEN) { | |
13619 | 432 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_GetTokenMaxNotLessThanMAX_NR_TOKEN); |
328 | 433 goto out_eof; |
434 } | |
435 | |
436 memset(token, 0x00, sizeof(*token) * max); | |
437 | |
438 if (read_nextline) { | |
439 if (!fgets(line, MAX_LINE_LEN, fp)) | |
440 goto out_eof; | |
441 line_pos = 0; | |
442 ++line_num; | |
443 read_nextline = 0; | |
444 } | |
445 for (i = 0; i < max; i++) { | |
446 while (isspace(line[line_pos])) | |
447 ++line_pos; | |
448 if (line[line_pos] == '\0' || line[line_pos] == '#' || | |
449 line[line_pos] == ';') { | |
450 read_nextline = 1; | |
451 if (i >= min) | |
452 goto out_ok; | |
453 goto out_eol; | |
454 } | |
455 token[i] = line + line_pos; | |
456 c = line[line_pos]; | |
457 if (c == '"' || c == '\'') { | |
458 token[i]++; | |
459 while (line[++line_pos] != c && line[line_pos]) | |
460 /* NOTHING */; | |
461 } else { | |
462 for (/* NOTHING */; !isspace(line[line_pos]) && | |
463 line[line_pos]; line_pos++) | |
464 /* NOTHING */; | |
465 } | |
466 if (!line[line_pos]) { | |
467 read_nextline = 1; | |
468 if (i >= min - 1) | |
469 goto out_ok; | |
470 goto out_eol; | |
471 } | |
472 line[line_pos] = '\0'; | |
473 line_pos++; | |
474 } | |
475 out_ok: | |
476 return i; | |
477 out_eof: | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
478 read_nextline = 1; |
328 | 479 return RET_EOF; |
480 out_eol: | |
481 return RET_EOL; | |
482 } | |
483 | |
484 static codecs_t *video_codecs=NULL; | |
485 static codecs_t *audio_codecs=NULL; | |
486 static int nr_vcodecs = 0; | |
487 static int nr_acodecs = 0; | |
488 | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
489 int parse_codec_cfg(char *cfgfile) |
328 | 490 { |
491 codecs_t *codec = NULL; // current codec | |
492 codecs_t **codecsp = NULL;// points to audio_codecs or to video_codecs | |
335 | 493 char *endptr; // strtoul()... |
328 | 494 int *nr_codecsp; |
495 int codec_type; /* TYPE_VIDEO/TYPE_AUDIO */ | |
297 | 496 int tmp, i; |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
497 |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
498 // in case we call it a second time |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
499 codecs_uninit_free(); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
500 |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
501 nr_vcodecs = 0; |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
502 nr_acodecs = 0; |
297 | 503 |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
504 if(cfgfile==NULL) { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
505 #ifdef CODECS2HTML |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
506 return 0; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
507 #else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
508 video_codecs = builtin_video_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
509 audio_codecs = builtin_audio_codecs; |
8472 | 510 nr_vcodecs = sizeof(builtin_video_codecs)/sizeof(codecs_t); |
511 nr_acodecs = sizeof(builtin_audio_codecs)/sizeof(codecs_t); | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
512 return 1; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
513 #endif |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
514 } |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
515 |
13946 | 516 mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_ReadingFile, cfgfile); |
297 | 517 |
301 | 518 if ((fp = fopen(cfgfile, "r")) == NULL) { |
13946 | 519 mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_CantOpenFileError, cfgfile, strerror(errno)); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
520 return 0; |
297 | 521 } |
522 | |
301 | 523 if ((line = (char *) malloc(MAX_LINE_LEN + 1)) == NULL) { |
13619 | 524 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantGetMemoryForLine, strerror(errno)); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
525 return 0; |
297 | 526 } |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
527 read_nextline = 1; |
297 | 528 |
328 | 529 /* |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
530 * this only catches release lines at the start of |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
531 * codecs.conf, before audiocodecs and videocodecs. |
328 | 532 */ |
533 while ((tmp = get_token(1, 1)) == RET_EOL) | |
534 /* NOTHING */; | |
361 | 535 if (tmp == RET_EOF) |
536 goto out; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
537 if (!strcmp(token[0], "release")) { |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
538 if (get_token(1, 2) < 0) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
539 goto err_out_parse_error; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
540 tmp = atoi(token[0]); |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
541 if (tmp < CODEC_CFG_MIN) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
542 goto err_out_release_num; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
543 while ((tmp = get_token(1, 1)) == RET_EOL) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
544 /* NOTHING */; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
545 if (tmp == RET_EOF) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
546 goto out; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
547 } else |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
548 goto err_out_release_num; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
549 |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
550 /* |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
551 * check if the next block starts with 'audiocodec' or |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
552 * with 'videocodec' |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
553 */ |
361 | 554 if (!strcmp(token[0], "audiocodec") || !strcmp(token[0], "videocodec")) |
328 | 555 goto loop_enter; |
361 | 556 goto err_out_parse_error; |
328 | 557 |
319 | 558 while ((tmp = get_token(1, 1)) != RET_EOF) { |
297 | 559 if (tmp == RET_EOL) |
560 continue; | |
328 | 561 if (!strcmp(token[0], "audiocodec") || |
562 !strcmp(token[0], "videocodec")) { | |
563 if (!validate_codec(codec, codec_type)) | |
564 goto err_out_not_valid; | |
565 loop_enter: | |
566 if (*token[0] == 'v') { | |
567 codec_type = TYPE_VIDEO; | |
568 nr_codecsp = &nr_vcodecs; | |
569 codecsp = &video_codecs; | |
570 } else if (*token[0] == 'a') { | |
571 codec_type = TYPE_AUDIO; | |
572 nr_codecsp = &nr_acodecs; | |
573 codecsp = &audio_codecs; | |
361 | 574 #ifdef DEBUG |
328 | 575 } else { |
5937 | 576 mp_msg(MSGT_CODECCFG,MSGL_ERR,"picsba\n"); |
328 | 577 goto err_out; |
361 | 578 #endif |
328 | 579 } |
580 if (!(*codecsp = (codecs_t *) realloc(*codecsp, | |
332 | 581 sizeof(codecs_t) * (*nr_codecsp + 2)))) { |
13619 | 582 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantReallocCodecsp, strerror(errno)); |
300 | 583 goto err_out; |
584 } | |
328 | 585 codec=*codecsp + *nr_codecsp; |
586 ++*nr_codecsp; | |
300 | 587 memset(codec,0,sizeof(codecs_t)); |
588 memset(codec->fourcc, 0xff, sizeof(codec->fourcc)); | |
589 memset(codec->outfmt, 0xff, sizeof(codec->outfmt)); | |
4675 | 590 memset(codec->infmt, 0xff, sizeof(codec->infmt)); |
300 | 591 |
319 | 592 if (get_token(1, 1) < 0) |
328 | 593 goto err_out_parse_error; |
594 for (i = 0; i < *nr_codecsp - 1; i++) { | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
595 if(( (*codecsp)[i].name!=NULL) && |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
596 (!strcmp(token[0], (*codecsp)[i].name)) ) { |
13619 | 597 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNameNotUnique, token[0]); |
361 | 598 goto err_out_print_linenum; |
319 | 599 } |
600 } | |
328 | 601 if (!(codec->name = strdup(token[0]))) { |
13619 | 602 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupName, strerror(errno)); |
328 | 603 goto err_out; |
604 } | |
319 | 605 } else if (!strcmp(token[0], "info")) { |
328 | 606 if (codec->info || get_token(1, 1) < 0) |
607 goto err_out_parse_error; | |
608 if (!(codec->info = strdup(token[0]))) { | |
13619 | 609 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupInfo, strerror(errno)); |
328 | 610 goto err_out; |
611 } | |
319 | 612 } else if (!strcmp(token[0], "comment")) { |
613 if (get_token(1, 1) < 0) | |
328 | 614 goto err_out_parse_error; |
361 | 615 add_comment(token[0], &codec->comment); |
319 | 616 } else if (!strcmp(token[0], "fourcc")) { |
617 if (get_token(1, 2) < 0) | |
328 | 618 goto err_out_parse_error; |
319 | 619 if (!add_to_fourcc(token[0], token[1], |
300 | 620 codec->fourcc, |
621 codec->fourccmap)) | |
361 | 622 goto err_out_print_linenum; |
319 | 623 } else if (!strcmp(token[0], "format")) { |
7770 | 624 if (get_token(1, 2) < 0) |
328 | 625 goto err_out_parse_error; |
7770 | 626 if (!add_to_format(token[0], token[1], |
627 codec->fourcc,codec->fourccmap)) | |
361 | 628 goto err_out_print_linenum; |
319 | 629 } else if (!strcmp(token[0], "driver")) { |
630 if (get_token(1, 1) < 0) | |
328 | 631 goto err_out_parse_error; |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
632 if (!(codec->drv = strdup(token[0]))) { |
13619 | 633 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDriver, strerror(errno)); |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
634 goto err_out; |
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
635 } |
319 | 636 } else if (!strcmp(token[0], "dll")) { |
637 if (get_token(1, 1) < 0) | |
328 | 638 goto err_out_parse_error; |
639 if (!(codec->dll = strdup(token[0]))) { | |
13619 | 640 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDLL, strerror(errno)); |
328 | 641 goto err_out; |
642 } | |
319 | 643 } else if (!strcmp(token[0], "guid")) { |
328 | 644 if (get_token(11, 11) < 0) |
645 goto err_out_parse_error; | |
335 | 646 codec->guid.f1=strtoul(token[0],&endptr,0); |
361 | 647 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
648 *endptr != '\0') | |
335 | 649 goto err_out_parse_error; |
650 codec->guid.f2=strtoul(token[1],&endptr,0); | |
361 | 651 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
652 *endptr != '\0') | |
335 | 653 goto err_out_parse_error; |
654 codec->guid.f3=strtoul(token[2],&endptr,0); | |
361 | 655 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
656 *endptr != '\0') | |
335 | 657 goto err_out_parse_error; |
658 for (i = 0; i < 8; i++) { | |
659 codec->guid.f4[i]=strtoul(token[i + 3],&endptr,0); | |
361 | 660 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
661 *endptr != '\0') | |
328 | 662 goto err_out_parse_error; |
297 | 663 } |
319 | 664 } else if (!strcmp(token[0], "out")) { |
665 if (get_token(1, 2) < 0) | |
328 | 666 goto err_out_parse_error; |
4675 | 667 if (!add_to_inout(token[0], token[1], codec->outfmt, |
300 | 668 codec->outflags)) |
361 | 669 goto err_out_print_linenum; |
4675 | 670 } else if (!strcmp(token[0], "in")) { |
671 if (get_token(1, 2) < 0) | |
672 goto err_out_parse_error; | |
673 if (!add_to_inout(token[0], token[1], codec->infmt, | |
674 codec->inflags)) | |
675 goto err_out_print_linenum; | |
319 | 676 } else if (!strcmp(token[0], "flags")) { |
677 if (get_token(1, 1) < 0) | |
328 | 678 goto err_out_parse_error; |
321 | 679 if (!strcmp(token[0], "seekable")) |
680 codec->flags |= CODECS_FLAG_SEEKABLE; | |
681 else | |
6565 | 682 if (!strcmp(token[0], "align16")) |
683 codec->flags |= CODECS_FLAG_ALIGN16; | |
684 else | |
328 | 685 goto err_out_parse_error; |
319 | 686 } else if (!strcmp(token[0], "status")) { |
687 if (get_token(1, 1) < 0) | |
328 | 688 goto err_out_parse_error; |
332 | 689 if (!strcasecmp(token[0], "working")) |
316 | 690 codec->status = CODECS_STATUS_WORKING; |
332 | 691 else if (!strcasecmp(token[0], "crashing")) |
316 | 692 codec->status = CODECS_STATUS_NOT_WORKING; |
332 | 693 else if (!strcasecmp(token[0], "untested")) |
316 | 694 codec->status = CODECS_STATUS_UNTESTED; |
332 | 695 else if (!strcasecmp(token[0], "buggy")) |
316 | 696 codec->status = CODECS_STATUS_PROBLEMS; |
697 else | |
328 | 698 goto err_out_parse_error; |
361 | 699 } else if (!strcmp(token[0], "cpuflags")) { |
700 if (get_token(1, 1) < 0) | |
701 goto err_out_parse_error; | |
702 if (!(codec->cpuflags = get_cpuflags(token[0]))) | |
703 goto err_out_parse_error; | |
297 | 704 } else |
328 | 705 goto err_out_parse_error; |
297 | 706 } |
328 | 707 if (!validate_codec(codec, codec_type)) |
708 goto err_out_not_valid; | |
13619 | 709 mp_msg(MSGT_CODECCFG,MSGL_INFO,MSGTR_AudioVideoCodecTotals, nr_acodecs, nr_vcodecs); |
895 | 710 if(video_codecs) video_codecs[nr_vcodecs].name = NULL; |
711 if(audio_codecs) audio_codecs[nr_acodecs].name = NULL; | |
297 | 712 out: |
713 free(line); | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
714 line=NULL; |
297 | 715 fclose(fp); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
716 return 1; |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
717 |
328 | 718 err_out_parse_error: |
13619 | 719 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
361 | 720 err_out_print_linenum: |
297 | 721 PRINT_LINENUM; |
722 err_out: | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
723 codecs_uninit_free(); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
724 |
328 | 725 free(line); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
726 line=NULL; |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
727 line_num = 0; |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
728 fclose(fp); |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
729 return 0; |
328 | 730 err_out_not_valid: |
13619 | 731 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecDefinitionIncorrect); |
361 | 732 goto err_out_print_linenum; |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
733 err_out_release_num: |
13619 | 734 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_OutdatedCodecsConf); |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
735 goto err_out_print_linenum; |
297 | 736 } |
737 | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
738 static void codecs_free(codecs_t* codecs,int count) { |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
739 int i; |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
740 for ( i = 0; i < count; i++) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
741 if ( (codecs[i]).name ) { |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
742 if( (codecs[i]).name ) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
743 free((codecs[i]).name); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
744 if( (codecs[i]).info ) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
745 free((codecs[i]).info); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
746 if( (codecs[i]).comment ) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
747 free((codecs[i]).comment); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
748 if( (codecs[i]).dll ) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
749 free((codecs[i]).dll); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
750 if( (codecs[i]).drv ) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
751 free((codecs[i]).drv); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
752 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
753 if (codecs) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
754 free(codecs); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
755 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
756 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17120
diff
changeset
|
757 void codecs_uninit_free(void) { |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
758 if (video_codecs) |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
759 codecs_free(video_codecs,nr_vcodecs); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
760 video_codecs=NULL; |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
761 if (audio_codecs) |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
762 codecs_free(audio_codecs,nr_acodecs); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
763 audio_codecs=NULL; |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
764 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
765 |
332 | 766 codecs_t *find_audio_codec(unsigned int fourcc, unsigned int *fourccmap, |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
767 codecs_t *start, int force) |
328 | 768 { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
769 return find_codec(fourcc, fourccmap, start, 1, force); |
328 | 770 } |
771 | |
332 | 772 codecs_t *find_video_codec(unsigned int fourcc, unsigned int *fourccmap, |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
773 codecs_t *start, int force) |
328 | 774 { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
775 return find_codec(fourcc, fourccmap, start, 0, force); |
328 | 776 } |
777 | |
332 | 778 codecs_t* find_codec(unsigned int fourcc,unsigned int *fourccmap, |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
779 codecs_t *start, int audioflag, int force) |
328 | 780 { |
781 int i, j; | |
782 codecs_t *c; | |
783 | |
628 | 784 #if 0 |
332 | 785 if (start) { |
786 for (/* NOTHING */; start->name; start++) { | |
787 for (j = 0; j < CODECS_MAX_FOURCC; j++) { | |
788 if (start->fourcc[j] == fourcc) { | |
789 if (fourccmap) | |
790 *fourccmap = start->fourccmap[j]; | |
791 return start; | |
792 } | |
793 } | |
794 } | |
628 | 795 } else |
796 #endif | |
797 { | |
332 | 798 if (audioflag) { |
799 i = nr_acodecs; | |
800 c = audio_codecs; | |
801 } else { | |
802 i = nr_vcodecs; | |
803 c = video_codecs; | |
804 } | |
895 | 805 if(!i) return NULL; |
332 | 806 for (/* NOTHING */; i--; c++) { |
628 | 807 if(start && c<=start) continue; |
332 | 808 for (j = 0; j < CODECS_MAX_FOURCC; j++) { |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
809 // FIXME: do NOT hardwire 'null' name here: |
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
810 if (c->fourcc[j]==fourcc || !strcmp(c->drv,"null")) { |
332 | 811 if (fourccmap) |
812 *fourccmap = c->fourccmap[j]; | |
813 return c; | |
814 } | |
328 | 815 } |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
816 if (force) return c; |
328 | 817 } |
818 } | |
819 return NULL; | |
303 | 820 } |
821 | |
7505 | 822 void select_codec(char* codecname,int audioflag){ |
823 int i; | |
824 codecs_t *c; | |
825 // printf("select_codec('%s')\n",codecname); | |
826 if (audioflag) { | |
827 i = nr_acodecs; | |
828 c = audio_codecs; | |
829 } else { | |
830 i = nr_vcodecs; | |
831 c = video_codecs; | |
832 } | |
833 if(i) | |
834 for (/* NOTHING */; i--; c++) | |
835 if(!strcmp(c->name,codecname)) | |
836 c->flags|=CODECS_FLAG_SELECTED; | |
837 } | |
838 | |
5325
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
839 void codecs_reset_selection(int audioflag){ |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
840 int i; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
841 codecs_t *c; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
842 if (audioflag) { |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
843 i = nr_acodecs; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
844 c = audio_codecs; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
845 } else { |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
846 i = nr_vcodecs; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
847 c = video_codecs; |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
848 } |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
849 if(i) |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
850 for (/* NOTHING */; i--; c++) |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
851 c->flags&=(~CODECS_FLAG_SELECTED); |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
852 } |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
853 |
1983 | 854 void list_codecs(int audioflag){ |
2050 | 855 int i; |
1983 | 856 codecs_t *c; |
857 | |
858 if (audioflag) { | |
859 i = nr_acodecs; | |
860 c = audio_codecs; | |
7193 | 861 mp_msg(MSGT_CODECCFG,MSGL_INFO,"ac: afm: status: info: [lib/dll]\n"); |
1983 | 862 } else { |
863 i = nr_vcodecs; | |
864 c = video_codecs; | |
7193 | 865 mp_msg(MSGT_CODECCFG,MSGL_INFO,"vc: vfm: status: info: [lib/dll]\n"); |
1983 | 866 } |
2050 | 867 if(!i) return; |
1983 | 868 for (/* NOTHING */; i--; c++) { |
1984 | 869 char* s="unknown "; |
870 switch(c->status){ | |
871 case CODECS_STATUS_WORKING: s="working ";break; | |
872 case CODECS_STATUS_PROBLEMS: s="problems";break; | |
873 case CODECS_STATUS_NOT_WORKING: s="crashing";break; | |
874 case CODECS_STATUS_UNTESTED: s="untested";break; | |
875 } | |
1983 | 876 if(c->dll) |
7193 | 877 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s [%s]\n",c->name,c->drv,s,c->info,c->dll); |
1983 | 878 else |
7193 | 879 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s\n",c->name,c->drv,s,c->info); |
1983 | 880 |
881 } | |
882 | |
883 } | |
884 | |
885 | |
886 | |
607 | 887 #ifdef CODECS2HTML |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
888 /* |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
889 * Fake out GUI references when building the codecs2html utility. |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
890 */ |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
891 #ifdef HAVE_NEW_GUI |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
892 void gtkMessageBox( int type,char * str ) { return; } |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
893 int use_gui = 0; |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
894 #endif |
607 | 895 |
896 void wrapline(FILE *f2,char *s){ | |
897 int c; | |
898 if(!s){ | |
899 fprintf(f2,"-"); | |
900 return; | |
901 } | |
902 while((c=*s++)){ | |
903 if(c==',') fprintf(f2,"<br>"); else fputc(c,f2); | |
904 } | |
905 } | |
906 | |
907 void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){ | |
908 int c,d; | |
909 while((c=fgetc(f1))>=0){ | |
910 if(c!='%'){ | |
911 fputc(c,f2); | |
912 continue; | |
913 } | |
914 d=fgetc(f1); | |
915 | |
916 switch(d){ | |
917 case '.': | |
613 | 918 return; // end of section |
607 | 919 case 'n': |
920 wrapline(f2,codec->name); break; | |
921 case 'i': | |
922 wrapline(f2,codec->info); break; | |
923 case 'c': | |
924 wrapline(f2,codec->comment); break; | |
925 case 'd': | |
926 wrapline(f2,codec->dll); break; | |
927 case 'D': | |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
928 fprintf(f2,"%c",!strcmp(codec->drv,"dshow")?'+':'-'); break; |
607 | 929 case 'F': |
930 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
1944
4d8123ae7b4b
Fixed vfwex section, null codec and other fourcc issues and improved codecs-in.html usability.
atmos4
parents:
1929
diff
changeset
|
931 if(!d || codec->fourcc[d]!=0xFFFFFFFF) |
4d8123ae7b4b
Fixed vfwex section, null codec and other fourcc issues and improved codecs-in.html usability.
atmos4
parents:
1929
diff
changeset
|
932 fprintf(f2,"%s%.4s",d?"<br>":"",(codec->fourcc[d]==0xFFFFFFFF || codec->fourcc[d]<0x20202020)?!d?"-":"":(char*) &codec->fourcc[d]); |
607 | 933 break; |
934 case 'f': | |
935 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
936 if(codec->fourcc[d]!=0xFFFFFFFF) | |
937 fprintf(f2,"%s0x%X",d?"<br>":"",codec->fourcc[d]); | |
938 break; | |
939 case 'Y': | |
940 for(d=0;d<CODECS_MAX_OUTFMT;d++) | |
941 if(codec->outfmt[d]!=0xFFFFFFFF){ | |
942 for (c=0; fmt_table[c].name; c++) | |
943 if(fmt_table[c].num==codec->outfmt[d]) break; | |
944 if(fmt_table[c].name) | |
945 fprintf(f2,"%s%s",d?"<br>":"",fmt_table[c].name); | |
946 } | |
947 break; | |
948 default: | |
949 fputc(c,f2); | |
950 fputc(d,f2); | |
951 } | |
952 } | |
953 | |
954 } | |
955 | |
956 void skiphtml(FILE *f1){ | |
957 int c,d; | |
958 while((c=fgetc(f1))>=0){ | |
959 if(c!='%'){ | |
960 continue; | |
961 } | |
962 d=fgetc(f1); | |
963 if(d=='.') return; // end of section | |
964 } | |
965 } | |
966 | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
967 static void print_int_array(const int* a, int size) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
968 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
969 printf("{ "); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
970 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
971 if(abs(*a)<256) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
972 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
973 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
974 printf("0x%X%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
975 printf(" }"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
976 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
977 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
978 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
|
979 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
980 printf("{ "); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
981 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
982 if((*a)<10) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
983 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
984 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
985 printf("0x%02x%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
986 printf(" }"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
987 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
988 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
989 static void print_string(const char* s) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
990 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
991 if (!s) printf("NULL"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
992 else printf("\"%s\"", s); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
993 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
994 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
995 int main(int argc, char* argv[]) |
607 | 996 { |
4027 | 997 codecs_t *cl; |
607 | 998 FILE *f1; |
999 FILE *f2; | |
1000 int c,d,i; | |
1001 int pos; | |
1002 int section=-1; | |
1003 int nr_codecs; | |
1004 int win32=-1; | |
1005 int dshow=-1; | |
1944
4d8123ae7b4b
Fixed vfwex section, null codec and other fourcc issues and improved codecs-in.html usability.
atmos4
parents:
1929
diff
changeset
|
1006 int win32ex=-1; |
607 | 1007 |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1008 /* |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1009 * Take path to codecs.conf from command line, or fall back on |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1010 * etc/codecs.conf |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1011 */ |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1012 if (!(nr_codecs = parse_codec_cfg((argc>1)?argv[1]:"etc/codecs.conf"))) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1013 exit(1); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1014 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1015 if (argc > 1) { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1016 int i, j; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1017 const char* nm[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1018 codecs_t* cod[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1019 int nr[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1020 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1021 nm[0] = "builtin_video_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1022 cod[0] = video_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1023 nr[0] = nr_vcodecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1024 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1025 nm[1] = "builtin_audio_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1026 cod[1] = audio_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1027 nr[1] = nr_acodecs; |
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 printf("/* GENERATED FROM %s, DO NOT EDIT! */\n\n",argv[1]); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1030 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1031 for (i=0; i<2; i++) { |
18034 | 1032 printf("codecs_t %s[] = {\n", nm[i]); |
8472 | 1033 for (j = 0; j < nr[i]; j++) { |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1034 printf("{"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1035 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1036 print_int_array(cod[i][j].fourcc, CODECS_MAX_FOURCC); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1037 printf(", /* fourcc */\n"); |
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 print_int_array(cod[i][j].fourccmap, CODECS_MAX_FOURCC); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1040 printf(", /* fourccmap */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1041 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1042 print_int_array(cod[i][j].outfmt, CODECS_MAX_OUTFMT); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1043 printf(", /* outfmt */\n"); |
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 print_char_array(cod[i][j].outflags, CODECS_MAX_OUTFMT); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1046 printf(", /* outflags */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1047 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1048 print_int_array(cod[i][j].infmt, CODECS_MAX_INFMT); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1049 printf(", /* infmt */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1050 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1051 print_char_array(cod[i][j].inflags, CODECS_MAX_INFMT); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1052 printf(", /* inflags */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1053 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1054 print_string(cod[i][j].name); printf(", /* name */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1055 print_string(cod[i][j].info); printf(", /* info */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1056 print_string(cod[i][j].comment); printf(", /* comment */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1057 print_string(cod[i][j].dll); printf(", /* dll */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1058 print_string(cod[i][j].drv); printf(", /* drv */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1059 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1060 printf("{ 0x%08lx, %hu, %hu,", |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1061 cod[i][j].guid.f1, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1062 cod[i][j].guid.f2, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1063 cod[i][j].guid.f3); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1064 print_char_array(cod[i][j].guid.f4, sizeof(cod[i][j].guid.f4)); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1065 printf(" }, /* GUID */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1066 printf("%hd /* flags */, %hd /* status */, %hd /* cpuflags */ }\n", |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1067 cod[i][j].flags, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1068 cod[i][j].status, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1069 cod[i][j].cpuflags); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1070 if (j < nr[i]) printf(",\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1071 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1072 printf("};\n\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1073 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1074 exit(0); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1075 } |
607 | 1076 |
10859 | 1077 f1=fopen("DOCS/tech/codecs-in.html","rb"); if(!f1) exit(1); |
15315
fd674500a042
codecs-status.html should be written to an existing path.
diego
parents:
15305
diff
changeset
|
1078 f2=fopen("DOCS/codecs-status.html","wb"); if(!f2) exit(1); |
607 | 1079 |
1080 while((c=fgetc(f1))>=0){ | |
1081 if(c!='%'){ | |
1082 fputc(c,f2); | |
1083 continue; | |
1084 } | |
1085 d=fgetc(f1); | |
1086 if(d>='0' && d<='9'){ | |
1087 // begin section | |
1088 section=d-'0'; | |
17762 | 1089 //printf("BEGIN %d\n",section); |
607 | 1090 if(section>=5){ |
1091 // audio | |
4027 | 1092 cl = audio_codecs; |
607 | 1093 nr_codecs = nr_acodecs; |
1094 dshow=7;win32=4; | |
1095 } else { | |
1096 // video | |
4027 | 1097 cl = video_codecs; |
607 | 1098 nr_codecs = nr_vcodecs; |
1944
4d8123ae7b4b
Fixed vfwex section, null codec and other fourcc issues and improved codecs-in.html usability.
atmos4
parents:
1929
diff
changeset
|
1099 dshow=4;win32=2;win32ex=6; |
607 | 1100 } |
1101 pos=ftell(f1); | |
1102 for(i=0;i<nr_codecs;i++){ | |
1103 fseek(f1,pos,SEEK_SET); | |
1104 switch(section){ | |
1105 case 0: | |
1106 case 5: | |
1107 if(cl[i].status==CODECS_STATUS_WORKING) | |
8211 | 1108 // if(!(!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) |
607 | 1109 parsehtml(f1,f2,&cl[i],section,dshow); |
1110 break; | |
8211 | 1111 #if 0 |
607 | 1112 case 1: |
1113 case 6: | |
1114 if(cl[i].status==CODECS_STATUS_WORKING) | |
8211 | 1115 if((!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) |
607 | 1116 parsehtml(f1,f2,&cl[i],section,dshow); |
1117 break; | |
8211 | 1118 #endif |
607 | 1119 case 2: |
1120 case 7: | |
1121 if(cl[i].status==CODECS_STATUS_PROBLEMS) | |
1122 parsehtml(f1,f2,&cl[i],section,dshow); | |
1123 break; | |
1124 case 3: | |
1125 case 8: | |
1126 if(cl[i].status==CODECS_STATUS_NOT_WORKING) | |
1127 parsehtml(f1,f2,&cl[i],section,dshow); | |
1128 break; | |
1129 case 4: | |
1130 case 9: | |
1131 if(cl[i].status==CODECS_STATUS_UNTESTED) | |
1132 parsehtml(f1,f2,&cl[i],section,dshow); | |
1133 break; | |
1134 default: | |
1135 printf("Warning! unimplemented section: %d\n",section); | |
1136 } | |
1137 } | |
1138 fseek(f1,pos,SEEK_SET); | |
1139 skiphtml(f1); | |
1140 //void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){ | |
1141 | |
1142 continue; | |
1143 } | |
1144 fputc(c,f2); | |
1145 fputc(d,f2); | |
1146 } | |
1147 | |
1148 fclose(f2); | |
1149 fclose(f1); | |
1150 return 0; | |
1151 } | |
1152 | |
1153 #endif | |
1154 | |
297 | 1155 #ifdef TESTING |
1156 int main(void) | |
1157 { | |
4676 | 1158 codecs_t *c; |
328 | 1159 int i,j, nr_codecs, state; |
297 | 1160 |
4676 | 1161 if (!(parse_codec_cfg("etc/codecs.conf"))) |
319 | 1162 return 0; |
4676 | 1163 if (!video_codecs) |
328 | 1164 printf("no videoconfig.\n"); |
4676 | 1165 if (!audio_codecs) |
328 | 1166 printf("no audioconfig.\n"); |
1167 | |
1168 printf("videocodecs:\n"); | |
4676 | 1169 c = video_codecs; |
328 | 1170 nr_codecs = nr_vcodecs; |
1171 state = 0; | |
1172 next: | |
1173 if (c) { | |
4676 | 1174 printf("number of %scodecs: %d\n", state==0?"video":"audio", |
1175 nr_codecs); | |
328 | 1176 for(i=0;i<nr_codecs;i++, c++){ |
4676 | 1177 printf("\n============== %scodec %02d ===============\n", |
1178 state==0?"video":"audio",i); | |
328 | 1179 printf("name='%s'\n",c->name); |
1180 printf("info='%s'\n",c->info); | |
1181 printf("comment='%s'\n",c->comment); | |
1182 printf("dll='%s'\n",c->dll); | |
361 | 1183 printf("flags=%X driver=%d status=%d cpuflags=%d\n", |
1184 c->flags, c->driver, c->status, c->cpuflags); | |
300 | 1185 |
328 | 1186 for(j=0;j<CODECS_MAX_FOURCC;j++){ |
1187 if(c->fourcc[j]!=0xFFFFFFFF){ | |
361 | 1188 printf("fourcc %02d: %08X (%.4s) ===> %08X (%.4s)\n",j,c->fourcc[j],(char *) &c->fourcc[j],c->fourccmap[j],(char *) &c->fourccmap[j]); |
328 | 1189 } |
1190 } | |
1191 | |
1192 for(j=0;j<CODECS_MAX_OUTFMT;j++){ | |
1193 if(c->outfmt[j]!=0xFFFFFFFF){ | |
361 | 1194 printf("outfmt %02d: %08X (%.4s) flags: %d\n",j,c->outfmt[j],(char *) &c->outfmt[j],c->outflags[j]); |
328 | 1195 } |
1196 } | |
300 | 1197 |
4676 | 1198 for(j=0;j<CODECS_MAX_INFMT;j++){ |
1199 if(c->infmt[j]!=0xFFFFFFFF){ | |
1200 printf("infmt %02d: %08X (%.4s) flags: %d\n",j,c->infmt[j],(char *) &c->infmt[j],c->inflags[j]); | |
1201 } | |
1202 } | |
1203 | |
328 | 1204 printf("GUID: %08lX %04X %04X",c->guid.f1,c->guid.f2,c->guid.f3); |
1205 for(j=0;j<8;j++) printf(" %02X",c->guid.f4[j]); | |
1206 printf("\n"); | |
300 | 1207 |
328 | 1208 |
1209 } | |
1210 } | |
1211 if (!state) { | |
1212 printf("audiocodecs:\n"); | |
4676 | 1213 c = audio_codecs; |
328 | 1214 nr_codecs = nr_acodecs; |
1215 state = 1; | |
1216 goto next; | |
1217 } | |
297 | 1218 return 0; |
1219 } | |
1220 | |
1221 #endif |