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