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