Mercurial > mplayer.hg
annotate codec-cfg.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | 983d33669b6b |
children | 1e78a310487e |
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 | |
28516
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
185 {"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1}, |
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
186 {"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2}, |
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
187 {"VDPAU_H264",IMGFMT_VDPAU_H264}, |
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
188 {"VDPAU_WMV3",IMGFMT_VDPAU_WMV3}, |
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
189 {"VDPAU_VC1",IMGFMT_VDPAU_VC1}, |
79b0bd20433e
Add support for image formats and codecs used by VDPAU
reimar
parents:
27343
diff
changeset
|
190 |
415 | 191 {NULL, 0} |
297 | 192 }; |
408 | 193 |
607 | 194 |
4675 | 195 static int add_to_inout(char *sfmt, char *sflags, unsigned int *outfmt, |
607 | 196 unsigned char *outflags) |
197 { | |
198 | |
299 | 199 static char *flagstr[] = { |
200 "flip", | |
201 "noflip", | |
202 "yuvhack", | |
5249 | 203 "query", |
6103 | 204 "static", |
299 | 205 NULL |
206 }; | |
207 | |
319 | 208 int i, j, freeslots; |
297 | 209 unsigned char flags; |
210 | |
211 for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++) | |
212 /* NOTHING */; | |
319 | 213 freeslots = CODECS_MAX_OUTFMT - i; |
214 if (!freeslots) | |
328 | 215 goto err_out_too_many; |
297 | 216 |
319 | 217 flags = 0; |
361 | 218 if(sflags) { |
219 do { | |
220 for (j = 0; flagstr[j] != NULL; j++) | |
221 if (!strncmp(sflags, flagstr[j], | |
222 strlen(flagstr[j]))) | |
223 break; | |
224 if (flagstr[j] == NULL) | |
225 goto err_out_parse_error; | |
226 flags|=(1<<j); | |
227 sflags+=strlen(flagstr[j]); | |
228 } while (*(sflags++) == ','); | |
229 | |
230 if (*(--sflags) != '\0') | |
231 goto err_out_parse_error; | |
232 } | |
297 | 233 |
234 do { | |
408 | 235 for (j = 0; fmt_table[j].name != NULL; j++) |
236 if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name))) | |
297 | 237 break; |
408 | 238 if (fmt_table[j].name == NULL) |
361 | 239 goto err_out_parse_error; |
408 | 240 outfmt[i] = fmt_table[j].num; |
297 | 241 outflags[i] = flags; |
299 | 242 ++i; |
408 | 243 sfmt+=strlen(fmt_table[j].name); |
319 | 244 } while ((*(sfmt++) == ',') && --freeslots); |
245 | |
246 if (!freeslots) | |
328 | 247 goto err_out_too_many; |
319 | 248 |
361 | 249 if (*(--sfmt) != '\0') |
250 goto err_out_parse_error; | |
299 | 251 |
297 | 252 return 1; |
328 | 253 err_out_too_many: |
13619 | 254 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyOut); |
361 | 255 return 0; |
256 err_out_parse_error: | |
13619 | 257 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
319 | 258 return 0; |
297 | 259 } |
260 | |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
261 #if 0 |
303 | 262 static short get_driver(char *s,int audioflag) |
297 | 263 { |
301 | 264 static char *audiodrv[] = { |
1293 | 265 "null", |
301 | 266 "mp3lib", |
267 "pcm", | |
268 "libac3", | |
269 "acm", | |
270 "alaw", | |
271 "msgsm", | |
272 "dshow", | |
401 | 273 "dvdpcm", |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1488
diff
changeset
|
274 "hwac3", |
1828 | 275 "libvorbis", |
1929 | 276 "ffmpeg", |
2415 | 277 "libmad", |
3787 | 278 "msadpcm", |
3400 | 279 "liba52", |
280 "g72x", | |
3787 | 281 "imaadpcm", |
4854
4a6dde59834c
fixed, strengthened, rewrote, and renamed a variety of the ADPCM decoders
melanson
parents:
4676
diff
changeset
|
282 "dk4adpcm", |
4a6dde59834c
fixed, strengthened, rewrote, and renamed a variety of the ADPCM decoders
melanson
parents:
4676
diff
changeset
|
283 "dk3adpcm", |
4450
3da8c5706371
added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
4301
diff
changeset
|
284 "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
|
285 "faad", |
6343
d253cf4f43a9
realvideo support by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6200
diff
changeset
|
286 "realaud", |
6927 | 287 "libdv", |
301 | 288 NULL |
289 }; | |
290 static char *videodrv[] = { | |
1293 | 291 "null", |
301 | 292 "libmpeg2", |
293 "vfw", | |
294 "dshow", | |
1248 | 295 "ffmpeg", |
1297 | 296 "vfwex", |
1488 | 297 "raw", |
5193
abea2deab4d6
MPlayer now has a Microsoft RLE decoder to call its own...only supports
melanson
parents:
5190
diff
changeset
|
298 "msrle", |
2379 | 299 "xanim", |
2827
b4d46817f050
ms video1 (cram) codecs by Mike Melanson <melanson@pcisys.net>
arpi
parents:
2681
diff
changeset
|
300 "msvidc", |
3172 | 301 "fli", |
3643
fb9fd7e2dd35
native opensourec Cinepak (CVID) codec by im Ferguson <timf@mail.csse.monash.edu.au>
arpi
parents:
3408
diff
changeset
|
302 "cinepak", |
3687
7fb817c9060b
This commit adds initial support for Quicktime Animation (RLE) video. It
melanson
parents:
3667
diff
changeset
|
303 "qtrle", |
3804
53ed66a4f0bf
NuppelVideo decoder added, based on Panagiotis Issaris' patch
alex
parents:
3798
diff
changeset
|
304 "nuv", |
3969 | 305 "cyuv", |
4227 | 306 "qtsmc", |
4301
8f43b10f387f
added skeleton for Duck Truemotion v1 decoder (doesn't do anything yet)
melanson
parents:
4227
diff
changeset
|
307 "ducktm1", |
4450
3da8c5706371
added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
4301
diff
changeset
|
308 "roqvideo", |
4615
b1fe5f58cd82
Added native codec support for QT RPZA data, courtesy of Roberto Togni
melanson
parents:
4450
diff
changeset
|
309 "qtrpza", |
4656 | 310 "mpng", |
5029 | 311 "ijpg", |
5263 | 312 "zlib", |
5478 | 313 "mpegpes", |
11388
a9de2f4781dd
updates for new image formats for zoran mjpeg passthrough
rik
parents:
10859
diff
changeset
|
314 "zrmjpeg", |
6343
d253cf4f43a9
realvideo support by Florian Schneider <flo-mplayer-dev@gmx.net>
arpi
parents:
6200
diff
changeset
|
315 "realvid", |
6701
522713337297
Support for Xvid using their new api. If divx4 compatiblity is disabeled
albeu
parents:
6565
diff
changeset
|
316 "xvid", |
6927 | 317 "libdv", |
301 | 318 NULL |
319 }; | |
320 char **drv=audioflag?audiodrv:videodrv; | |
321 int i; | |
6863 | 322 |
1293 | 323 for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i; |
301 | 324 |
1293 | 325 return -1; |
297 | 326 } |
7180
28677d779205
-afm/-vfm migration from ID (int) to NAME (string) - simplifies code and makes dlopen()'ing possible
arpi
parents:
6927
diff
changeset
|
327 #endif |
297 | 328 |
328 | 329 static int validate_codec(codecs_t *c, int type) |
319 | 330 { |
5937 | 331 unsigned int i; |
7770 | 332 char *tmp_name = c->name; |
328 | 333 |
3408 | 334 for (i = 0; i < strlen(tmp_name) && isalnum(tmp_name[i]); i++) |
328 | 335 /* NOTHING */; |
3408 | 336 |
337 if (i < strlen(tmp_name)) { | |
13619 | 338 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_InvalidCodecName, c->name); |
328 | 339 return 0; |
340 } | |
3408 | 341 |
328 | 342 if (!c->info) |
3408 | 343 c->info = strdup(c->name); |
344 | |
345 #if 0 | |
328 | 346 if (c->fourcc[0] == 0xffffffff) { |
13619 | 347 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksFourcc, c->name); |
328 | 348 return 0; |
349 } | |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
350 #endif |
3408 | 351 |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
352 if (!c->drv) { |
13619 | 353 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksDriver, c->name); |
328 | 354 return 0; |
355 } | |
3408 | 356 |
357 #if 0 | |
24933
4fc6e60dac36
Avoid short forms; has the added benefit of allowing compilation with gcc 2.95
diego
parents:
24928
diff
changeset
|
358 #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
|
359 #warning Where are they defined ???????????? |
328 | 360 if (!c->dll && (c->driver == 4 || |
361 (c->driver == 2 && type == TYPE_VIDEO))) { | |
13619 | 362 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsDLL, c->name); |
328 | 363 return 0; |
364 } | |
24928
62b57875bb28
Replace some Hungarian comments, thanks to Denes Balatoni for the translation.
diego
parents:
23910
diff
changeset
|
365 #warning Can guid.f1 be 0? How does one know that it was not given? |
328 | 366 // if (!(codec->flags & CODECS_FLAG_AUDIO) && codec->driver == 4) |
367 | |
368 if (type == TYPE_VIDEO) | |
369 if (c->outfmt[0] == 0xffffffff) { | |
13619 | 370 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsOutfmt, c->name); |
328 | 371 return 0; |
372 } | |
329 | 373 #endif |
319 | 374 return 1; |
375 } | |
376 | |
377 static int add_comment(char *s, char **d) | |
378 { | |
379 int pos; | |
380 | |
381 if (!*d) | |
382 pos = 0; | |
383 else { | |
384 pos = strlen(*d); | |
385 (*d)[pos++] = '\n'; | |
386 } | |
23806 | 387 if (!(*d = realloc(*d, pos + strlen(s) + 1))) { |
13619 | 388 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantAllocateComment); |
319 | 389 return 0; |
390 } | |
391 strcpy(*d + pos, s); | |
392 return 1; | |
393 } | |
297 | 394 |
361 | 395 static short get_cpuflags(char *s) |
396 { | |
397 static char *flagstr[] = { | |
398 "mmx", | |
399 "sse", | |
400 "3dnow", | |
401 NULL | |
402 }; | |
403 int i; | |
404 short flags = 0; | |
405 | |
406 do { | |
407 for (i = 0; flagstr[i]; i++) | |
408 if (!strncmp(s, flagstr[i], strlen(flagstr[i]))) | |
409 break; | |
410 if (!flagstr[i]) | |
411 goto err_out_parse_error; | |
412 flags |= 1<<i; | |
413 s += strlen(flagstr[i]); | |
414 } while (*(s++) == ','); | |
415 | |
416 if (*(--s) != '\0') | |
417 goto err_out_parse_error; | |
418 | |
419 return flags; | |
420 err_out_parse_error: | |
421 return 0; | |
422 } | |
423 | |
328 | 424 static FILE *fp; |
425 static int line_num = 0; | |
426 static char *line; | |
427 static char *token[MAX_NR_TOKEN]; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
428 static int read_nextline = 1; |
328 | 429 |
430 static int get_token(int min, int max) | |
297 | 431 { |
328 | 432 static int line_pos; |
433 int i; | |
434 char c; | |
435 | |
436 if (max >= MAX_NR_TOKEN) { | |
13619 | 437 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_GetTokenMaxNotLessThanMAX_NR_TOKEN); |
328 | 438 goto out_eof; |
439 } | |
440 | |
441 memset(token, 0x00, sizeof(*token) * max); | |
442 | |
443 if (read_nextline) { | |
444 if (!fgets(line, MAX_LINE_LEN, fp)) | |
445 goto out_eof; | |
446 line_pos = 0; | |
447 ++line_num; | |
448 read_nextline = 0; | |
449 } | |
450 for (i = 0; i < max; i++) { | |
451 while (isspace(line[line_pos])) | |
452 ++line_pos; | |
453 if (line[line_pos] == '\0' || line[line_pos] == '#' || | |
454 line[line_pos] == ';') { | |
455 read_nextline = 1; | |
456 if (i >= min) | |
457 goto out_ok; | |
458 goto out_eol; | |
459 } | |
460 token[i] = line + line_pos; | |
461 c = line[line_pos]; | |
462 if (c == '"' || c == '\'') { | |
463 token[i]++; | |
464 while (line[++line_pos] != c && line[line_pos]) | |
465 /* NOTHING */; | |
466 } else { | |
467 for (/* NOTHING */; !isspace(line[line_pos]) && | |
468 line[line_pos]; line_pos++) | |
469 /* NOTHING */; | |
470 } | |
471 if (!line[line_pos]) { | |
472 read_nextline = 1; | |
473 if (i >= min - 1) | |
474 goto out_ok; | |
475 goto out_eol; | |
476 } | |
477 line[line_pos] = '\0'; | |
478 line_pos++; | |
479 } | |
480 out_ok: | |
481 return i; | |
482 out_eof: | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
483 read_nextline = 1; |
328 | 484 return RET_EOF; |
485 out_eol: | |
486 return RET_EOL; | |
487 } | |
488 | |
489 static codecs_t *video_codecs=NULL; | |
490 static codecs_t *audio_codecs=NULL; | |
491 static int nr_vcodecs = 0; | |
492 static int nr_acodecs = 0; | |
493 | |
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
|
494 int parse_codec_cfg(const char *cfgfile) |
328 | 495 { |
496 codecs_t *codec = NULL; // current codec | |
497 codecs_t **codecsp = NULL;// points to audio_codecs or to video_codecs | |
335 | 498 char *endptr; // strtoul()... |
328 | 499 int *nr_codecsp; |
500 int codec_type; /* TYPE_VIDEO/TYPE_AUDIO */ | |
297 | 501 int tmp, i; |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
502 |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
503 // 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
|
504 codecs_uninit_free(); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
505 |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
506 nr_vcodecs = 0; |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
507 nr_acodecs = 0; |
297 | 508 |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
509 if(cfgfile==NULL) { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
510 #ifdef CODECS2HTML |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
511 return 0; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
512 #else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
513 video_codecs = builtin_video_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
514 audio_codecs = builtin_audio_codecs; |
8472 | 515 nr_vcodecs = sizeof(builtin_video_codecs)/sizeof(codecs_t); |
516 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
|
517 return 1; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
518 #endif |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
519 } |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
520 |
13946 | 521 mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_ReadingFile, cfgfile); |
297 | 522 |
301 | 523 if ((fp = fopen(cfgfile, "r")) == NULL) { |
13946 | 524 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
|
525 return 0; |
297 | 526 } |
527 | |
23806 | 528 if ((line = malloc(MAX_LINE_LEN + 1)) == NULL) { |
13619 | 529 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
|
530 return 0; |
297 | 531 } |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
532 read_nextline = 1; |
297 | 533 |
328 | 534 /* |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
535 * 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
|
536 * codecs.conf, before audiocodecs and videocodecs. |
328 | 537 */ |
538 while ((tmp = get_token(1, 1)) == RET_EOL) | |
539 /* NOTHING */; | |
361 | 540 if (tmp == RET_EOF) |
541 goto out; | |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
542 if (!strcmp(token[0], "release")) { |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
543 if (get_token(1, 2) < 0) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
544 goto err_out_parse_error; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
545 tmp = atoi(token[0]); |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
546 if (tmp < CODEC_CFG_MIN) |
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 while ((tmp = get_token(1, 1)) == RET_EOL) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
549 /* NOTHING */; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
550 if (tmp == RET_EOF) |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
551 goto out; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
552 } else |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
553 goto err_out_release_num; |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
554 |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
555 /* |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
556 * 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
|
557 * with 'videocodec' |
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
558 */ |
361 | 559 if (!strcmp(token[0], "audiocodec") || !strcmp(token[0], "videocodec")) |
328 | 560 goto loop_enter; |
361 | 561 goto err_out_parse_error; |
328 | 562 |
319 | 563 while ((tmp = get_token(1, 1)) != RET_EOF) { |
297 | 564 if (tmp == RET_EOL) |
565 continue; | |
328 | 566 if (!strcmp(token[0], "audiocodec") || |
567 !strcmp(token[0], "videocodec")) { | |
568 if (!validate_codec(codec, codec_type)) | |
569 goto err_out_not_valid; | |
570 loop_enter: | |
571 if (*token[0] == 'v') { | |
572 codec_type = TYPE_VIDEO; | |
573 nr_codecsp = &nr_vcodecs; | |
574 codecsp = &video_codecs; | |
575 } else if (*token[0] == 'a') { | |
576 codec_type = TYPE_AUDIO; | |
577 nr_codecsp = &nr_acodecs; | |
578 codecsp = &audio_codecs; | |
361 | 579 #ifdef DEBUG |
328 | 580 } else { |
5937 | 581 mp_msg(MSGT_CODECCFG,MSGL_ERR,"picsba\n"); |
328 | 582 goto err_out; |
361 | 583 #endif |
328 | 584 } |
23806 | 585 if (!(*codecsp = realloc(*codecsp, |
332 | 586 sizeof(codecs_t) * (*nr_codecsp + 2)))) { |
13619 | 587 mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantReallocCodecsp, strerror(errno)); |
300 | 588 goto err_out; |
589 } | |
328 | 590 codec=*codecsp + *nr_codecsp; |
591 ++*nr_codecsp; | |
300 | 592 memset(codec,0,sizeof(codecs_t)); |
593 memset(codec->fourcc, 0xff, sizeof(codec->fourcc)); | |
594 memset(codec->outfmt, 0xff, sizeof(codec->outfmt)); | |
4675 | 595 memset(codec->infmt, 0xff, sizeof(codec->infmt)); |
300 | 596 |
319 | 597 if (get_token(1, 1) < 0) |
328 | 598 goto err_out_parse_error; |
599 for (i = 0; i < *nr_codecsp - 1; i++) { | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
600 if(( (*codecsp)[i].name!=NULL) && |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
601 (!strcmp(token[0], (*codecsp)[i].name)) ) { |
13619 | 602 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNameNotUnique, token[0]); |
361 | 603 goto err_out_print_linenum; |
319 | 604 } |
605 } | |
328 | 606 if (!(codec->name = strdup(token[0]))) { |
13619 | 607 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupName, strerror(errno)); |
328 | 608 goto err_out; |
609 } | |
319 | 610 } else if (!strcmp(token[0], "info")) { |
328 | 611 if (codec->info || get_token(1, 1) < 0) |
612 goto err_out_parse_error; | |
613 if (!(codec->info = strdup(token[0]))) { | |
13619 | 614 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupInfo, strerror(errno)); |
328 | 615 goto err_out; |
616 } | |
319 | 617 } else if (!strcmp(token[0], "comment")) { |
618 if (get_token(1, 1) < 0) | |
328 | 619 goto err_out_parse_error; |
361 | 620 add_comment(token[0], &codec->comment); |
319 | 621 } else if (!strcmp(token[0], "fourcc")) { |
622 if (get_token(1, 2) < 0) | |
328 | 623 goto err_out_parse_error; |
319 | 624 if (!add_to_fourcc(token[0], token[1], |
300 | 625 codec->fourcc, |
626 codec->fourccmap)) | |
361 | 627 goto err_out_print_linenum; |
319 | 628 } else if (!strcmp(token[0], "format")) { |
7770 | 629 if (get_token(1, 2) < 0) |
328 | 630 goto err_out_parse_error; |
7770 | 631 if (!add_to_format(token[0], token[1], |
632 codec->fourcc,codec->fourccmap)) | |
361 | 633 goto err_out_print_linenum; |
319 | 634 } else if (!strcmp(token[0], "driver")) { |
635 if (get_token(1, 1) < 0) | |
328 | 636 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
|
637 if (!(codec->drv = strdup(token[0]))) { |
13619 | 638 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
|
639 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
|
640 } |
319 | 641 } else if (!strcmp(token[0], "dll")) { |
642 if (get_token(1, 1) < 0) | |
328 | 643 goto err_out_parse_error; |
644 if (!(codec->dll = strdup(token[0]))) { | |
13619 | 645 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDLL, strerror(errno)); |
328 | 646 goto err_out; |
647 } | |
319 | 648 } else if (!strcmp(token[0], "guid")) { |
328 | 649 if (get_token(11, 11) < 0) |
650 goto err_out_parse_error; | |
335 | 651 codec->guid.f1=strtoul(token[0],&endptr,0); |
361 | 652 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
653 *endptr != '\0') | |
335 | 654 goto err_out_parse_error; |
655 codec->guid.f2=strtoul(token[1],&endptr,0); | |
361 | 656 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
657 *endptr != '\0') | |
335 | 658 goto err_out_parse_error; |
659 codec->guid.f3=strtoul(token[2],&endptr,0); | |
361 | 660 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
661 *endptr != '\0') | |
335 | 662 goto err_out_parse_error; |
663 for (i = 0; i < 8; i++) { | |
664 codec->guid.f4[i]=strtoul(token[i + 3],&endptr,0); | |
361 | 665 if ((*endptr != ',' || *(endptr + 1) != '\0') && |
666 *endptr != '\0') | |
328 | 667 goto err_out_parse_error; |
297 | 668 } |
319 | 669 } else if (!strcmp(token[0], "out")) { |
670 if (get_token(1, 2) < 0) | |
328 | 671 goto err_out_parse_error; |
4675 | 672 if (!add_to_inout(token[0], token[1], codec->outfmt, |
300 | 673 codec->outflags)) |
361 | 674 goto err_out_print_linenum; |
4675 | 675 } else if (!strcmp(token[0], "in")) { |
676 if (get_token(1, 2) < 0) | |
677 goto err_out_parse_error; | |
678 if (!add_to_inout(token[0], token[1], codec->infmt, | |
679 codec->inflags)) | |
680 goto err_out_print_linenum; | |
319 | 681 } else if (!strcmp(token[0], "flags")) { |
682 if (get_token(1, 1) < 0) | |
328 | 683 goto err_out_parse_error; |
321 | 684 if (!strcmp(token[0], "seekable")) |
685 codec->flags |= CODECS_FLAG_SEEKABLE; | |
686 else | |
6565 | 687 if (!strcmp(token[0], "align16")) |
688 codec->flags |= CODECS_FLAG_ALIGN16; | |
689 else | |
328 | 690 goto err_out_parse_error; |
319 | 691 } else if (!strcmp(token[0], "status")) { |
692 if (get_token(1, 1) < 0) | |
328 | 693 goto err_out_parse_error; |
332 | 694 if (!strcasecmp(token[0], "working")) |
316 | 695 codec->status = CODECS_STATUS_WORKING; |
332 | 696 else if (!strcasecmp(token[0], "crashing")) |
316 | 697 codec->status = CODECS_STATUS_NOT_WORKING; |
332 | 698 else if (!strcasecmp(token[0], "untested")) |
316 | 699 codec->status = CODECS_STATUS_UNTESTED; |
332 | 700 else if (!strcasecmp(token[0], "buggy")) |
316 | 701 codec->status = CODECS_STATUS_PROBLEMS; |
702 else | |
328 | 703 goto err_out_parse_error; |
361 | 704 } else if (!strcmp(token[0], "cpuflags")) { |
705 if (get_token(1, 1) < 0) | |
706 goto err_out_parse_error; | |
707 if (!(codec->cpuflags = get_cpuflags(token[0]))) | |
708 goto err_out_parse_error; | |
297 | 709 } else |
328 | 710 goto err_out_parse_error; |
297 | 711 } |
328 | 712 if (!validate_codec(codec, codec_type)) |
713 goto err_out_not_valid; | |
13619 | 714 mp_msg(MSGT_CODECCFG,MSGL_INFO,MSGTR_AudioVideoCodecTotals, nr_acodecs, nr_vcodecs); |
895 | 715 if(video_codecs) video_codecs[nr_vcodecs].name = NULL; |
716 if(audio_codecs) audio_codecs[nr_acodecs].name = NULL; | |
297 | 717 out: |
718 free(line); | |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
719 line=NULL; |
297 | 720 fclose(fp); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
721 return 1; |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
722 |
328 | 723 err_out_parse_error: |
13619 | 724 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError); |
361 | 725 err_out_print_linenum: |
297 | 726 PRINT_LINENUM; |
727 err_out: | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
728 codecs_uninit_free(); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
729 |
328 | 730 free(line); |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
731 line=NULL; |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
732 line_num = 0; |
3798
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
733 fclose(fp); |
d1e3ad5bcd8f
fixed few segfaults, make parse_codec_cfg() return int
iive
parents:
3787
diff
changeset
|
734 return 0; |
328 | 735 err_out_not_valid: |
13619 | 736 mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecDefinitionIncorrect); |
361 | 737 goto err_out_print_linenum; |
6200
e604be87613d
codecs.conf versioning - patch by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6103
diff
changeset
|
738 err_out_release_num: |
13619 | 739 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
|
740 goto err_out_print_linenum; |
297 | 741 } |
742 | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
743 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
|
744 int i; |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
745 for ( i = 0; i < count; i++) |
25247 | 746 if ( codecs[i].name ) { |
747 if( codecs[i].name ) | |
748 free(codecs[i].name); | |
749 if( codecs[i].info ) | |
750 free(codecs[i].info); | |
751 if( codecs[i].comment ) | |
752 free(codecs[i].comment); | |
753 if( codecs[i].dll ) | |
754 free(codecs[i].dll); | |
755 if( codecs[i].drv ) | |
756 free(codecs[i].drv); | |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
757 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
758 if (codecs) |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
759 free(codecs); |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
760 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
761 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17120
diff
changeset
|
762 void codecs_uninit_free(void) { |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
763 if (video_codecs) |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
764 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
|
765 video_codecs=NULL; |
13936
589b227e3367
fix crash when a "driver" line is missing in codecs.conf.
reimar
parents:
13807
diff
changeset
|
766 if (audio_codecs) |
13807
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
767 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
|
768 audio_codecs=NULL; |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
769 } |
b014091b4417
Memory Free function Fix, based on patch by Wei Jiang <jiangw98@yahoo.com>
faust3
parents:
13619
diff
changeset
|
770 |
332 | 771 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
|
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, 1, force); |
328 | 775 } |
776 | |
332 | 777 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
|
778 codecs_t *start, int force) |
328 | 779 { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
780 return find_codec(fourcc, fourccmap, start, 0, force); |
328 | 781 } |
782 | |
332 | 783 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
|
784 codecs_t *start, int audioflag, int force) |
328 | 785 { |
786 int i, j; | |
787 codecs_t *c; | |
788 | |
628 | 789 #if 0 |
332 | 790 if (start) { |
791 for (/* NOTHING */; start->name; start++) { | |
792 for (j = 0; j < CODECS_MAX_FOURCC; j++) { | |
793 if (start->fourcc[j] == fourcc) { | |
794 if (fourccmap) | |
795 *fourccmap = start->fourccmap[j]; | |
796 return start; | |
797 } | |
798 } | |
799 } | |
628 | 800 } else |
801 #endif | |
802 { | |
332 | 803 if (audioflag) { |
804 i = nr_acodecs; | |
805 c = audio_codecs; | |
806 } else { | |
807 i = nr_vcodecs; | |
808 c = video_codecs; | |
809 } | |
895 | 810 if(!i) return NULL; |
332 | 811 for (/* NOTHING */; i--; c++) { |
628 | 812 if(start && c<=start) continue; |
332 | 813 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
|
814 // 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
|
815 if (c->fourcc[j]==fourcc || !strcmp(c->drv,"null")) { |
332 | 816 if (fourccmap) |
817 *fourccmap = c->fourccmap[j]; | |
818 return c; | |
819 } | |
328 | 820 } |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
15315
diff
changeset
|
821 if (force) return c; |
328 | 822 } |
823 } | |
824 return NULL; | |
303 | 825 } |
826 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
827 void stringset_init(stringset_t *set) { |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
828 *set = calloc(1, sizeof(char *)); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
829 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
830 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
831 void stringset_free(stringset_t *set) { |
25663 | 832 int count = 0; |
833 while ((*set)[count]) free((*set)[count++]); | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
834 free(*set); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
835 *set = NULL; |
7505 | 836 } |
837 | |
25661
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
838 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
|
839 int count = 0; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
840 while ((*set)[count]) count++; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
841 count++; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
842 *set = realloc(*set, sizeof(char *) * (count + 1)); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
843 (*set)[count - 1] = strdup(str); |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
844 (*set)[count] = NULL; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
845 } |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
846 |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
847 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
|
848 stringset_t s; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
849 for (s = *set; *s; s++) |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
850 if (strcmp(*s, str) == 0) |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
851 return 1; |
293aeec83153
Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents:
25247
diff
changeset
|
852 return 0; |
5325
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
853 } |
9c326f199060
tagging selected codec to avoid trying the same codec several times
arpi
parents:
5284
diff
changeset
|
854 |
1983 | 855 void list_codecs(int audioflag){ |
2050 | 856 int i; |
1983 | 857 codecs_t *c; |
858 | |
859 if (audioflag) { | |
860 i = nr_acodecs; | |
861 c = audio_codecs; | |
7193 | 862 mp_msg(MSGT_CODECCFG,MSGL_INFO,"ac: afm: status: info: [lib/dll]\n"); |
1983 | 863 } else { |
864 i = nr_vcodecs; | |
865 c = video_codecs; | |
7193 | 866 mp_msg(MSGT_CODECCFG,MSGL_INFO,"vc: vfm: status: info: [lib/dll]\n"); |
1983 | 867 } |
2050 | 868 if(!i) return; |
1983 | 869 for (/* NOTHING */; i--; c++) { |
1984 | 870 char* s="unknown "; |
871 switch(c->status){ | |
872 case CODECS_STATUS_WORKING: s="working ";break; | |
873 case CODECS_STATUS_PROBLEMS: s="problems";break; | |
874 case CODECS_STATUS_NOT_WORKING: s="crashing";break; | |
875 case CODECS_STATUS_UNTESTED: s="untested";break; | |
876 } | |
1983 | 877 if(c->dll) |
7193 | 878 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s [%s]\n",c->name,c->drv,s,c->info,c->dll); |
1983 | 879 else |
7193 | 880 mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s %s\n",c->name,c->drv,s,c->info); |
1983 | 881 |
882 } | |
883 | |
884 } | |
885 | |
886 | |
887 | |
607 | 888 #ifdef CODECS2HTML |
889 void wrapline(FILE *f2,char *s){ | |
890 int c; | |
891 if(!s){ | |
892 fprintf(f2,"-"); | |
893 return; | |
894 } | |
895 while((c=*s++)){ | |
896 if(c==',') fprintf(f2,"<br>"); else fputc(c,f2); | |
897 } | |
898 } | |
899 | |
900 void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){ | |
901 int c,d; | |
902 while((c=fgetc(f1))>=0){ | |
903 if(c!='%'){ | |
904 fputc(c,f2); | |
905 continue; | |
906 } | |
907 d=fgetc(f1); | |
908 | |
909 switch(d){ | |
910 case '.': | |
613 | 911 return; // end of section |
607 | 912 case 'n': |
913 wrapline(f2,codec->name); break; | |
914 case 'i': | |
915 wrapline(f2,codec->info); break; | |
916 case 'c': | |
917 wrapline(f2,codec->comment); break; | |
918 case 'd': | |
919 wrapline(f2,codec->dll); break; | |
920 case 'D': | |
8205
5c675b344bfb
This patch goes into the #ifdef CODECS2HTML section of
arpi
parents:
7770
diff
changeset
|
921 fprintf(f2,"%c",!strcmp(codec->drv,"dshow")?'+':'-'); break; |
607 | 922 case 'F': |
923 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
|
924 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
|
925 fprintf(f2,"%s%.4s",d?"<br>":"",(codec->fourcc[d]==0xFFFFFFFF || codec->fourcc[d]<0x20202020)?!d?"-":"":(char*) &codec->fourcc[d]); |
607 | 926 break; |
927 case 'f': | |
928 for(d=0;d<CODECS_MAX_FOURCC;d++) | |
929 if(codec->fourcc[d]!=0xFFFFFFFF) | |
930 fprintf(f2,"%s0x%X",d?"<br>":"",codec->fourcc[d]); | |
931 break; | |
932 case 'Y': | |
933 for(d=0;d<CODECS_MAX_OUTFMT;d++) | |
934 if(codec->outfmt[d]!=0xFFFFFFFF){ | |
935 for (c=0; fmt_table[c].name; c++) | |
936 if(fmt_table[c].num==codec->outfmt[d]) break; | |
937 if(fmt_table[c].name) | |
938 fprintf(f2,"%s%s",d?"<br>":"",fmt_table[c].name); | |
939 } | |
940 break; | |
941 default: | |
942 fputc(c,f2); | |
943 fputc(d,f2); | |
944 } | |
945 } | |
946 | |
947 } | |
948 | |
949 void skiphtml(FILE *f1){ | |
950 int c,d; | |
951 while((c=fgetc(f1))>=0){ | |
952 if(c!='%'){ | |
953 continue; | |
954 } | |
955 d=fgetc(f1); | |
956 if(d=='.') return; // end of section | |
957 } | |
958 } | |
959 | |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
960 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
|
961 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
962 printf("{ "); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
963 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
964 if(abs(*a)<256) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
965 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
966 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
967 printf("0x%X%s", *a++, size?", ":""); |
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 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
970 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
971 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
|
972 { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
973 printf("{ "); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
974 while (size--) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
975 if((*a)<10) |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
976 printf("%d%s", *a++, size?", ":""); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
977 else |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
978 printf("0x%02x%s", *a++, size?", ":""); |
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 } |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
981 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
982 static void print_string(const char* s) |
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 if (!s) printf("NULL"); |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
985 else printf("\"%s\"", s); |
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 int main(int argc, char* argv[]) |
607 | 989 { |
4027 | 990 codecs_t *cl; |
607 | 991 FILE *f1; |
992 FILE *f2; | |
993 int c,d,i; | |
994 int pos; | |
995 int section=-1; | |
996 int nr_codecs; | |
997 int win32=-1; | |
998 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
|
999 int win32ex=-1; |
607 | 1000 |
8467
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1001 /* |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1002 * 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
|
1003 * etc/codecs.conf |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1004 */ |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1005 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
|
1006 exit(1); |
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 if (argc > 1) { |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1009 int i, j; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1010 const char* nm[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1011 codecs_t* cod[2]; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1012 int nr[2]; |
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 nm[0] = "builtin_video_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1015 cod[0] = video_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1016 nr[0] = nr_vcodecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1017 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1018 nm[1] = "builtin_audio_codecs"; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1019 cod[1] = audio_codecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1020 nr[1] = nr_acodecs; |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1021 |
3ca9cc46df5c
Fallback to builtin (generated from etc/codecs.conf at compile time)
arpi
parents:
8211
diff
changeset
|
1022 printf("/* GENERATED FROM %s, DO NOT EDIT! */\n\n",argv[1]); |
26332
762918acfe06
Add missing #includes to pass 'make checkheaders' to codecs.conf.h.
diego
parents:
25663
diff
changeset
|
1023 printf("#include <stddef.h>\n",argv[1]); |
762918acfe06
Add missing #includes to pass 'make checkheaders' to codecs.conf.h.
diego
parents:
25663
diff
changeset
|
1024 printf("#include \"codec-cfg.h\"\n\n",argv[1]); |
8467
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); | |
26848 | 1178 /* printf("flags=%X driver=%d status=%d cpuflags=%d\n", |
1179 c->flags, c->driver, c->status, c->cpuflags); */ | |
1180 printf("flags=%X status=%d cpuflags=%d\n", | |
1181 c->flags, c->status, c->cpuflags); | |
300 | 1182 |
328 | 1183 for(j=0;j<CODECS_MAX_FOURCC;j++){ |
1184 if(c->fourcc[j]!=0xFFFFFFFF){ | |
361 | 1185 printf("fourcc %02d: %08X (%.4s) ===> %08X (%.4s)\n",j,c->fourcc[j],(char *) &c->fourcc[j],c->fourccmap[j],(char *) &c->fourccmap[j]); |
328 | 1186 } |
1187 } | |
1188 | |
1189 for(j=0;j<CODECS_MAX_OUTFMT;j++){ | |
1190 if(c->outfmt[j]!=0xFFFFFFFF){ | |
361 | 1191 printf("outfmt %02d: %08X (%.4s) flags: %d\n",j,c->outfmt[j],(char *) &c->outfmt[j],c->outflags[j]); |
328 | 1192 } |
1193 } | |
300 | 1194 |
4676 | 1195 for(j=0;j<CODECS_MAX_INFMT;j++){ |
1196 if(c->infmt[j]!=0xFFFFFFFF){ | |
1197 printf("infmt %02d: %08X (%.4s) flags: %d\n",j,c->infmt[j],(char *) &c->infmt[j],c->inflags[j]); | |
1198 } | |
1199 } | |
1200 | |
328 | 1201 printf("GUID: %08lX %04X %04X",c->guid.f1,c->guid.f2,c->guid.f3); |
1202 for(j=0;j<8;j++) printf(" %02X",c->guid.f4[j]); | |
1203 printf("\n"); | |
300 | 1204 |
328 | 1205 |
1206 } | |
1207 } | |
1208 if (!state) { | |
1209 printf("audiocodecs:\n"); | |
4676 | 1210 c = audio_codecs; |
328 | 1211 nr_codecs = nr_acodecs; |
1212 state = 1; | |
1213 goto next; | |
1214 } | |
297 | 1215 return 0; |
1216 } | |
1217 | |
1218 #endif |