Mercurial > mplayer.hg
annotate codec-cfg.c @ 26110:69790f7caffa
configure: Set CONFIG_ENCODERS=yes in config.mak unconditionally
config.h already had "#define CONFIG_ENCODERS 1" unconditionally, but
the config.mak value depended on whether MEncoder was enabled.
Encoders need to be enabled as some encoder code is used by MPlayer
too. The inconsistent values broke compilation with --disable-mencoder
after libavcodec Makefile made compilation of i386/dsputilenc_mmx.o
depend on the config.mak value.
author | uau |
---|---|
date | Mon, 03 Mar 2008 03:02:36 +0000 |
parents | 895fe730fa52 |
children | 762918acfe06 |
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++) |
25247 | 740 if ( codecs[i].name ) { |
741 if( codecs[i].name ) | |
742 free(codecs[i].name); | |
743 if( codecs[i].info ) | |
744 free(codecs[i].info); | |
745 if( codecs[i].comment ) | |
746 free(codecs[i].comment); | |
747 if( codecs[i].dll ) | |
748 free(codecs[i].dll); | |
749 if( codecs[i].drv ) | |
750 free(codecs[i].drv); | |
13807
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 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
821 void stringset_init(stringset_t *set) { |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
822 *set = calloc(1, sizeof(char *)); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
823 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
824 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
825 void stringset_free(stringset_t *set) { |
25663 | 826 int count = 0; |
827 while ((*set)[count]) free((*set)[count++]); | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
828 free(*set); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
829 *set = NULL; |
7505 | 830 } |
831 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
832 void stringset_add(stringset_t *set, const char *str) { |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
833 int count = 0; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
834 while ((*set)[count]) count++; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
835 count++; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
836 *set = realloc(*set, sizeof(char *) * (count + 1)); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
837 (*set)[count - 1] = strdup(str); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
838 (*set)[count] = NULL; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
839 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
840 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
841 int stringset_test(stringset_t *set, const char *str) { |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
842 stringset_t s; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
843 for (s = *set; *s; s++) |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
844 if (strcmp(*s, str) == 0) |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
845 return 1; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
846 return 0; |
5325
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 |
1983 | 849 void list_codecs(int audioflag){ |
2050 | 850 int i; |
1983 | 851 codecs_t *c; |
852 | |
853 if (audioflag) { | |
854 i = nr_acodecs; | |
855 c = audio_codecs; | |
7193 | 856 mp_msg(MSGT_CODECCFG,MSGL_INFO,"ac: afm: status: info: [lib/dll]\n"); |
1983 | 857 } else { |
858 i = nr_vcodecs; | |
859 c = video_codecs; | |
7193 | 860 mp_msg(MSGT_CODECCFG,MSGL_INFO,"vc: vfm: status: info: [lib/dll]\n"); |
1983 | 861 } |
2050 | 862 if(!i) return; |
1983 | 863 for (/* NOTHING */; i--; c++) { |
1984 | 864 char* s="unknown "; |
865 switch(c->status){ | |
866 case CODECS_STATUS_WORKING: s="working ";break; | |
867 case CODECS_STATUS_PROBLEMS: s="problems";break; | |
868 case CODECS_STATUS_NOT_WORKING: s="crashing";break; | |
869 case CODECS_STATUS_UNTESTED: s="untested";break; | |
870 } | |
1983 | 871 if(c->dll) |
7193 | 872 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s [%s]\n",c->name,c->drv,s,c->info,c->dll); |
1983 | 873 else |
7193 | 874 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s\n",c->name,c->drv,s,c->info); |
1983 | 875 |
876 } | |
877 | |
878 } | |
879 | |
880 | |
881 | |
607 | 882 #ifdef CODECS2HTML |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
883 /* |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
884 * Fake out GUI references when building the codecs2html utility. |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
885 */ |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
886 #ifdef HAVE_NEW_GUI |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
887 void gtkMessageBox( int type,char * str ) { return; } |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
888 int use_gui = 0; |
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
889 #endif |
607 | 890 |
891 void wrapline(FILE *f2,char *s){ | |
892 int c; | |
893 if(!s){ | |
894 fprintf(f2,"-"); | |
895 return; | |
896 } | |
897 while((c=*s++)){ | |
898 if(c==',') fprintf(f2,"<br>"); else fputc(c,f2); | |
899 } | |
900 } | |
901 | |
902 void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){ | |
903 int c,d; | |
904 while((c=fgetc(f1))>=0){ | |
905 if(c!='%'){ | |
906 fputc(c,f2); | |
907 continue; | |
908 } | |
909 d=fgetc(f1); | |
910 | |
911 switch(d){ | |
912 case '.': | |
613 | 913 return; // end of section |
607 | 914 case 'n': |
915 wrapline(f2,codec->name); break; | |
916 case 'i': | |
917 wrapline(f2,codec->info); break; | |
918 case 'c': | |
919 wrapline(f2,codec->comment); break; | |
920 case 'd': | |
921 wrapline(f2,codec->dll); break; | |
922 case 'D': | |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
923 fprintf(f2,"%c",!strcmp(codec->drv,"dshow")?'+':'-'); break; |
607 | 924 case 'F': |
925 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
|
926 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
|
927 fprintf(f2,"%s%.4s",d?"<br>":"",(codec->fourcc[d]==0xFFFFFFFF || codec->fourcc[d]<0x20202020)?!d?"-":"":(char*) &codec->fourcc[d]); |
607 | 928 break; |
929 case 'f': | |
930 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
931 if(codec->fourcc[d]!=0xFFFFFFFF) | |
932 fprintf(f2,"%s0x%X",d?"<br>":"",codec->fourcc[d]); | |
933 break; | |
934 case 'Y': | |
935 for(d=0;d<CODECS_MAX_OUTFMT;d++) | |
936 if(codec->outfmt[d]!=0xFFFFFFFF){ | |
937 for (c=0; fmt_table[c].name; c++) | |
938 if(fmt_table[c].num==codec->outfmt[d]) break; | |
939 if(fmt_table[c].name) | |
940 fprintf(f2,"%s%s",d?"<br>":"",fmt_table[c].name); | |
941 } | |
942 break; | |
943 default: | |
944 fputc(c,f2); | |
945 fputc(d,f2); | |
946 } | |
947 } | |
948 | |
949 } | |
950 | |
951 void skiphtml(FILE *f1){ | |
952 int c,d; | |
953 while((c=fgetc(f1))>=0){ | |
954 if(c!='%'){ | |
955 continue; | |
956 } | |
957 d=fgetc(f1); | |
958 if(d=='.') return; // end of section | |
959 } | |
960 } | |
961 | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
962 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
|
963 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
964 printf("{ "); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
965 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
966 if(abs(*a)<256) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
967 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
968 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
969 printf("0x%X%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
970 printf(" }"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
971 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
972 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
973 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
|
974 { |
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 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
977 if((*a)<10) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
978 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
979 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
980 printf("0x%02x%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
981 printf(" }"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
982 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
983 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
984 static void print_string(const char* s) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
985 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
986 if (!s) printf("NULL"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
987 else printf("\"%s\"", s); |
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 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
990 int main(int argc, char* argv[]) |
607 | 991 { |
4027 | 992 codecs_t *cl; |
607 | 993 FILE *f1; |
994 FILE *f2; | |
995 int c,d,i; | |
996 int pos; | |
997 int section=-1; | |
998 int nr_codecs; | |
999 int win32=-1; | |
1000 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
|
1001 int win32ex=-1; |
607 | 1002 |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1003 /* |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1004 * 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
|
1005 * etc/codecs.conf |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1006 */ |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1007 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
|
1008 exit(1); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1009 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1010 if (argc > 1) { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1011 int i, j; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1012 const char* nm[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1013 codecs_t* cod[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1014 int nr[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1015 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1016 nm[0] = "builtin_video_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1017 cod[0] = video_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1018 nr[0] = nr_vcodecs; |
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[1] = "builtin_audio_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1021 cod[1] = audio_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1022 nr[1] = nr_acodecs; |
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 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
|
1025 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1026 for (i=0; i<2; i++) { |
25662 | 1027 printf("const codecs_t %s[] = {\n", nm[i]); |
8472 | 1028 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
|
1029 printf("{"); |
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 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
|
1032 printf(", /* fourcc */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1033 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1034 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
|
1035 printf(", /* fourccmap */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1036 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1037 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
|
1038 printf(", /* outfmt */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1039 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1040 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
|
1041 printf(", /* outflags */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1042 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1043 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
|
1044 printf(", /* infmt */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1045 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1046 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
|
1047 printf(", /* inflags */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1048 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1049 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
|
1050 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
|
1051 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
|
1052 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
|
1053 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
|
1054 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1055 printf("{ 0x%08lx, %hu, %hu,", |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1056 cod[i][j].guid.f1, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1057 cod[i][j].guid.f2, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1058 cod[i][j].guid.f3); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1059 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
|
1060 printf(" }, /* GUID */\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1061 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
|
1062 cod[i][j].flags, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1063 cod[i][j].status, |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1064 cod[i][j].cpuflags); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1065 if (j < nr[i]) printf(",\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1066 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1067 printf("};\n\n"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1068 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1069 exit(0); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1070 } |
607 | 1071 |
10859 | 1072 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
|
1073 f2=fopen("DOCS/codecs-status.html","wb"); if(!f2) exit(1); |
607 | 1074 |
1075 while((c=fgetc(f1))>=0){ | |
1076 if(c!='%'){ | |
1077 fputc(c,f2); | |
1078 continue; | |
1079 } | |
1080 d=fgetc(f1); | |
1081 if(d>='0' && d<='9'){ | |
1082 // begin section | |
1083 section=d-'0'; | |
17762 | 1084 //printf("BEGIN %d\n",section); |
607 | 1085 if(section>=5){ |
1086 // audio | |
4027 | 1087 cl = audio_codecs; |
607 | 1088 nr_codecs = nr_acodecs; |
1089 dshow=7;win32=4; | |
1090 } else { | |
1091 // video | |
4027 | 1092 cl = video_codecs; |
607 | 1093 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
|
1094 dshow=4;win32=2;win32ex=6; |
607 | 1095 } |
1096 pos=ftell(f1); | |
1097 for(i=0;i<nr_codecs;i++){ | |
1098 fseek(f1,pos,SEEK_SET); | |
1099 switch(section){ | |
1100 case 0: | |
1101 case 5: | |
1102 if(cl[i].status==CODECS_STATUS_WORKING) | |
8211 | 1103 // if(!(!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) |
607 | 1104 parsehtml(f1,f2,&cl[i],section,dshow); |
1105 break; | |
8211 | 1106 #if 0 |
607 | 1107 case 1: |
1108 case 6: | |
1109 if(cl[i].status==CODECS_STATUS_WORKING) | |
8211 | 1110 if((!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm"))) |
607 | 1111 parsehtml(f1,f2,&cl[i],section,dshow); |
1112 break; | |
8211 | 1113 #endif |
607 | 1114 case 2: |
1115 case 7: | |
1116 if(cl[i].status==CODECS_STATUS_PROBLEMS) | |
1117 parsehtml(f1,f2,&cl[i],section,dshow); | |
1118 break; | |
1119 case 3: | |
1120 case 8: | |
1121 if(cl[i].status==CODECS_STATUS_NOT_WORKING) | |
1122 parsehtml(f1,f2,&cl[i],section,dshow); | |
1123 break; | |
1124 case 4: | |
1125 case 9: | |
1126 if(cl[i].status==CODECS_STATUS_UNTESTED) | |
1127 parsehtml(f1,f2,&cl[i],section,dshow); | |
1128 break; | |
1129 default: | |
1130 printf("Warning! unimplemented section: %d\n",section); | |
1131 } | |
1132 } | |
1133 fseek(f1,pos,SEEK_SET); | |
1134 skiphtml(f1); | |
1135 //void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){ | |
1136 | |
1137 continue; | |
1138 } | |
1139 fputc(c,f2); | |
1140 fputc(d,f2); | |
1141 } | |
1142 | |
1143 fclose(f2); | |
1144 fclose(f1); | |
1145 return 0; | |
1146 } | |
1147 | |
1148 #endif | |
1149 | |
297 | 1150 #ifdef TESTING |
1151 int main(void) | |
1152 { | |
4676 | 1153 codecs_t *c; |
328 | 1154 int i,j, nr_codecs, state; |
297 | 1155 |
4676 | 1156 if (!(parse_codec_cfg("etc/codecs.conf"))) |
319 | 1157 return 0; |
4676 | 1158 if (!video_codecs) |
328 | 1159 printf("no videoconfig.\n"); |
4676 | 1160 if (!audio_codecs) |
328 | 1161 printf("no audioconfig.\n"); |
1162 | |
1163 printf("videocodecs:\n"); | |
4676 | 1164 c = video_codecs; |
328 | 1165 nr_codecs = nr_vcodecs; |
1166 state = 0; | |
1167 next: | |
1168 if (c) { | |
4676 | 1169 printf("number of %scodecs: %d\n", state==0?"video":"audio", |
1170 nr_codecs); | |
328 | 1171 for(i=0;i<nr_codecs;i++, c++){ |
4676 | 1172 printf("\n============== %scodec %02d ===============\n", |
1173 state==0?"video":"audio",i); | |
328 | 1174 printf("name='%s'\n",c->name); |
1175 printf("info='%s'\n",c->info); | |
1176 printf("comment='%s'\n",c->comment); | |
1177 printf("dll='%s'\n",c->dll); | |
361 | 1178 printf("flags=%X driver=%d status=%d cpuflags=%d\n", |
1179 c->flags, c->driver, c->status, c->cpuflags); | |
300 | 1180 |
328 | 1181 for(j=0;j<CODECS_MAX_FOURCC;j++){ |
1182 if(c->fourcc[j]!=0xFFFFFFFF){ | |
361 | 1183 printf("fourcc %02d: %08X (%.4s) ===> %08X (%.4s)\n",j,c->fourcc[j],(char *) &c->fourcc[j],c->fourccmap[j],(char *) &c->fourccmap[j]); |
328 | 1184 } |
1185 } | |
1186 | |
1187 for(j=0;j<CODECS_MAX_OUTFMT;j++){ | |
1188 if(c->outfmt[j]!=0xFFFFFFFF){ | |
361 | 1189 printf("outfmt %02d: %08X (%.4s) flags: %d\n",j,c->outfmt[j],(char *) &c->outfmt[j],c->outflags[j]); |
328 | 1190 } |
1191 } | |
300 | 1192 |
4676 | 1193 for(j=0;j<CODECS_MAX_INFMT;j++){ |
1194 if(c->infmt[j]!=0xFFFFFFFF){ | |
1195 printf("infmt %02d: %08X (%.4s) flags: %d\n",j,c->infmt[j],(char *) &c->infmt[j],c->inflags[j]); | |
1196 } | |
1197 } | |
1198 | |
328 | 1199 printf("GUID: %08lX %04X %04X",c->guid.f1,c->guid.f2,c->guid.f3); |
1200 for(j=0;j<8;j++) printf(" %02X",c->guid.f4[j]); | |
1201 printf("\n"); | |
300 | 1202 |
328 | 1203 |
1204 } | |
1205 } | |
1206 if (!state) { | |
1207 printf("audiocodecs:\n"); | |
4676 | 1208 c = audio_codecs; |
328 | 1209 nr_codecs = nr_acodecs; |
1210 state = 1; | |
1211 goto next; | |
1212 } | |
297 | 1213 return 0; |
1214 } | |
1215 | |
1216 #endif |