summaryrefslogtreecommitdiffstats
path: root/codec-cfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'codec-cfg.c')
-rw-r--r--codec-cfg.c1990
1 files changed, 993 insertions, 997 deletions
diff --git a/codec-cfg.c b/codec-cfg.c
index 5d796275ce..0828e0ea53 100644
--- a/codec-cfg.c
+++ b/codec-cfg.c
@@ -65,393 +65,393 @@
#define PRINT_LINENUM mp_msg(MSGT_CODECCFG,MSGL_ERR," at line %d\n", line_num)
-#define MAX_NR_TOKEN 16
+#define MAX_NR_TOKEN 16
-#define MAX_LINE_LEN 1000
+#define MAX_LINE_LEN 1000
-#define RET_EOF -1
-#define RET_EOL -2
+#define RET_EOF -1
+#define RET_EOL -2
-#define TYPE_VIDEO 0
-#define TYPE_AUDIO 1
+#define TYPE_VIDEO 0
+#define TYPE_AUDIO 1
char * codecs_file = NULL;
static int add_to_fourcc(char *s, char *alias, unsigned int *fourcc,
- unsigned int *map)
+ unsigned int *map)
{
- int i, j, freeslots;
- unsigned int tmp;
-
- /* find first unused slot */
- for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++)
- /* NOTHING */;
- freeslots = CODECS_MAX_FOURCC - i;
- if (!freeslots)
- goto err_out_too_many;
-
- do {
- tmp = mmioFOURCC(s[0], s[1], s[2], s[3]);
- for (j = 0; j < i; j++)
- if (tmp == fourcc[j])
- goto err_out_duplicated;
- fourcc[i] = tmp;
- map[i] = alias ? mmioFOURCC(alias[0], alias[1], alias[2], alias[3]) : tmp;
- s += 4;
- i++;
- } while ((*(s++) == ',') && --freeslots);
-
- if (!freeslots)
- goto err_out_too_many;
- if (*(--s) != '\0')
- goto err_out_parse_error;
- return 1;
+ int i, j, freeslots;
+ unsigned int tmp;
+
+ /* find first unused slot */
+ for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++)
+ /* NOTHING */;
+ freeslots = CODECS_MAX_FOURCC - i;
+ if (!freeslots)
+ goto err_out_too_many;
+
+ do {
+ tmp = mmioFOURCC(s[0], s[1], s[2], s[3]);
+ for (j = 0; j < i; j++)
+ if (tmp == fourcc[j])
+ goto err_out_duplicated;
+ fourcc[i] = tmp;
+ map[i] = alias ? mmioFOURCC(alias[0], alias[1], alias[2], alias[3]) : tmp;
+ s += 4;
+ i++;
+ } while ((*(s++) == ',') && --freeslots);
+
+ if (!freeslots)
+ goto err_out_too_many;
+ if (*(--s) != '\0')
+ goto err_out_parse_error;
+ return 1;
err_out_duplicated:
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFourcc);
- return 0;
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFourcc);
+ return 0;
err_out_too_many:
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs);
- return 0;
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs);
+ return 0;
err_out_parse_error:
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError);
- return 0;
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError);
+ return 0;
}
static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int *fourccmap)
{
- int i, j;
- char *endptr;
-
- /* find first unused slot */
- for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++)
- /* NOTHING */;
- if (i == CODECS_MAX_FOURCC) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs);
- return 0;
- }
-
- fourcc[i]=strtoul(s,&endptr,0);
- if (*endptr != '\0') {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDNotNumber);
- return 0;
- }
-
- if(alias){
- fourccmap[i]=strtoul(alias,&endptr,0);
- if (*endptr != '\0') {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDAliasNotNumber);
- return 0;
- }
- } else
- fourccmap[i]=fourcc[i];
-
- for (j = 0; j < i; j++)
- if (fourcc[j] == fourcc[i]) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFID);
- return 0;
- }
-
- return 1;
+ int i, j;
+ char *endptr;
+
+ /* find first unused slot */
+ for (i = 0; i < CODECS_MAX_FOURCC && fourcc[i] != 0xffffffff; i++)
+ /* NOTHING */;
+ if (i == CODECS_MAX_FOURCC) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyFourccs);
+ return 0;
+ }
+
+ fourcc[i]=strtoul(s,&endptr,0);
+ if (*endptr != '\0') {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDNotNumber);
+ return 0;
+ }
+
+ if(alias){
+ fourccmap[i]=strtoul(alias,&endptr,0);
+ if (*endptr != '\0') {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseErrorFIDAliasNotNumber);
+ return 0;
+ }
+ } else
+ fourccmap[i]=fourcc[i];
+
+ for (j = 0; j < i; j++)
+ if (fourcc[j] == fourcc[i]) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_DuplicateFID);
+ return 0;
+ }
+
+ return 1;
}
- static const struct {
- const char *name;
- const unsigned int num;
- } fmt_table[] = {
- // note: due to parser deficiencies/simplicity, if one format
- // name matches the beginning of another, the longer one _must_
- // come first in this list.
- {"YV12", IMGFMT_YV12},
- {"I420", IMGFMT_I420},
- {"IYUV", IMGFMT_IYUV},
- {"NV12", IMGFMT_NV12},
- {"NV21", IMGFMT_NV21},
- {"YVU9", IMGFMT_YVU9},
- {"IF09", IMGFMT_IF09},
- {"444P16LE", IMGFMT_444P16_LE},
- {"444P16BE", IMGFMT_444P16_BE},
- {"422P16LE", IMGFMT_422P16_LE},
- {"422P16BE", IMGFMT_422P16_BE},
- {"420P16LE", IMGFMT_420P16_LE},
- {"420P16BE", IMGFMT_420P16_BE},
- {"444P16", IMGFMT_444P16},
- {"422P16", IMGFMT_422P16},
- {"420P16", IMGFMT_420P16},
- {"420A", IMGFMT_420A},
- {"444P", IMGFMT_444P},
- {"422P", IMGFMT_422P},
- {"411P", IMGFMT_411P},
- {"440P", IMGFMT_440P},
- {"Y800", IMGFMT_Y800},
- {"Y8", IMGFMT_Y8},
-
- {"YUY2", IMGFMT_YUY2},
- {"UYVY", IMGFMT_UYVY},
- {"YVYU", IMGFMT_YVYU},
-
- {"RGB48LE", IMGFMT_RGB48LE},
- {"RGB48BE", IMGFMT_RGB48BE},
- {"RGB4", IMGFMT_RGB4},
- {"RGB8", IMGFMT_RGB8},
- {"RGB15", IMGFMT_RGB15},
- {"RGB16", IMGFMT_RGB16},
- {"RGB24", IMGFMT_RGB24},
- {"RGB32", IMGFMT_RGB32},
- {"BGR4", IMGFMT_BGR4},
- {"BGR8", IMGFMT_BGR8},
- {"BGR15", IMGFMT_BGR15},
- {"BGR16", IMGFMT_BGR16},
- {"BGR24", IMGFMT_BGR24},
- {"BGR32", IMGFMT_BGR32},
- {"RGB1", IMGFMT_RGB1},
- {"BGR1", IMGFMT_BGR1},
-
- {"MPES", IMGFMT_MPEGPES},
- {"ZRMJPEGNI", IMGFMT_ZRMJPEGNI},
- {"ZRMJPEGIT", IMGFMT_ZRMJPEGIT},
- {"ZRMJPEGIB", IMGFMT_ZRMJPEGIB},
-
- {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2},
- {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2},
-
- {"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1},
- {"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2},
- {"VDPAU_H264",IMGFMT_VDPAU_H264},
- {"VDPAU_WMV3",IMGFMT_VDPAU_WMV3},
- {"VDPAU_VC1",IMGFMT_VDPAU_VC1},
- {"VDPAU_MPEG4",IMGFMT_VDPAU_MPEG4},
-
- {NULL, 0}
- };
+ static const struct {
+ const char *name;
+ const unsigned int num;
+ } fmt_table[] = {
+ // note: due to parser deficiencies/simplicity, if one format
+ // name matches the beginning of another, the longer one _must_
+ // come first in this list.
+ {"YV12", IMGFMT_YV12},
+ {"I420", IMGFMT_I420},
+ {"IYUV", IMGFMT_IYUV},
+ {"NV12", IMGFMT_NV12},
+ {"NV21", IMGFMT_NV21},
+ {"YVU9", IMGFMT_YVU9},
+ {"IF09", IMGFMT_IF09},
+ {"444P16LE", IMGFMT_444P16_LE},
+ {"444P16BE", IMGFMT_444P16_BE},
+ {"422P16LE", IMGFMT_422P16_LE},
+ {"422P16BE", IMGFMT_422P16_BE},
+ {"420P16LE", IMGFMT_420P16_LE},
+ {"420P16BE", IMGFMT_420P16_BE},
+ {"444P16", IMGFMT_444P16},
+ {"422P16", IMGFMT_422P16},
+ {"420P16", IMGFMT_420P16},
+ {"420A", IMGFMT_420A},
+ {"444P", IMGFMT_444P},
+ {"422P", IMGFMT_422P},
+ {"411P", IMGFMT_411P},
+ {"440P", IMGFMT_440P},
+ {"Y800", IMGFMT_Y800},
+ {"Y8", IMGFMT_Y8},
+
+ {"YUY2", IMGFMT_YUY2},
+ {"UYVY", IMGFMT_UYVY},
+ {"YVYU", IMGFMT_YVYU},
+
+ {"RGB48LE", IMGFMT_RGB48LE},
+ {"RGB48BE", IMGFMT_RGB48BE},
+ {"RGB4", IMGFMT_RGB4},
+ {"RGB8", IMGFMT_RGB8},
+ {"RGB15", IMGFMT_RGB15},
+ {"RGB16", IMGFMT_RGB16},
+ {"RGB24", IMGFMT_RGB24},
+ {"RGB32", IMGFMT_RGB32},
+ {"BGR4", IMGFMT_BGR4},
+ {"BGR8", IMGFMT_BGR8},
+ {"BGR15", IMGFMT_BGR15},
+ {"BGR16", IMGFMT_BGR16},
+ {"BGR24", IMGFMT_BGR24},
+ {"BGR32", IMGFMT_BGR32},
+ {"RGB1", IMGFMT_RGB1},
+ {"BGR1", IMGFMT_BGR1},
+
+ {"MPES", IMGFMT_MPEGPES},
+ {"ZRMJPEGNI", IMGFMT_ZRMJPEGNI},
+ {"ZRMJPEGIT", IMGFMT_ZRMJPEGIT},
+ {"ZRMJPEGIB", IMGFMT_ZRMJPEGIB},
+
+ {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2},
+ {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2},
+
+ {"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1},
+ {"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2},
+ {"VDPAU_H264",IMGFMT_VDPAU_H264},
+ {"VDPAU_WMV3",IMGFMT_VDPAU_WMV3},
+ {"VDPAU_VC1",IMGFMT_VDPAU_VC1},
+ {"VDPAU_MPEG4",IMGFMT_VDPAU_MPEG4},
+
+ {NULL, 0}
+ };
static int add_to_inout(char *sfmt, char *sflags, unsigned int *outfmt,
- unsigned char *outflags)
+ unsigned char *outflags)
{
- static char *flagstr[] = {
- "flip",
- "noflip",
- "yuvhack",
- "query",
- "static",
- NULL
- };
-
- int i, j, freeslots;
- unsigned char flags;
-
- for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++)
- /* NOTHING */;
- freeslots = CODECS_MAX_OUTFMT - i;
- if (!freeslots)
- goto err_out_too_many;
-
- flags = 0;
- if(sflags) {
- do {
- for (j = 0; flagstr[j] != NULL; j++)
- if (!strncmp(sflags, flagstr[j],
- strlen(flagstr[j])))
- break;
- if (flagstr[j] == NULL)
- goto err_out_parse_error;
- flags|=(1<<j);
- sflags+=strlen(flagstr[j]);
- } while (*(sflags++) == ',');
-
- if (*(--sflags) != '\0')
- goto err_out_parse_error;
- }
-
- do {
- for (j = 0; fmt_table[j].name != NULL; j++)
- if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name)))
- break;
- if (fmt_table[j].name == NULL)
- goto err_out_parse_error;
- outfmt[i] = fmt_table[j].num;
- outflags[i] = flags;
- ++i;
- sfmt+=strlen(fmt_table[j].name);
- } while ((*(sfmt++) == ',') && --freeslots);
-
- if (!freeslots)
- goto err_out_too_many;
-
- if (*(--sfmt) != '\0')
- goto err_out_parse_error;
-
- return 1;
+ static char *flagstr[] = {
+ "flip",
+ "noflip",
+ "yuvhack",
+ "query",
+ "static",
+ NULL
+ };
+
+ int i, j, freeslots;
+ unsigned char flags;
+
+ for (i = 0; i < CODECS_MAX_OUTFMT && outfmt[i] != 0xffffffff; i++)
+ /* NOTHING */;
+ freeslots = CODECS_MAX_OUTFMT - i;
+ if (!freeslots)
+ goto err_out_too_many;
+
+ flags = 0;
+ if(sflags) {
+ do {
+ for (j = 0; flagstr[j] != NULL; j++)
+ if (!strncmp(sflags, flagstr[j],
+ strlen(flagstr[j])))
+ break;
+ if (flagstr[j] == NULL)
+ goto err_out_parse_error;
+ flags|=(1<<j);
+ sflags+=strlen(flagstr[j]);
+ } while (*(sflags++) == ',');
+
+ if (*(--sflags) != '\0')
+ goto err_out_parse_error;
+ }
+
+ do {
+ for (j = 0; fmt_table[j].name != NULL; j++)
+ if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name)))
+ break;
+ if (fmt_table[j].name == NULL)
+ goto err_out_parse_error;
+ outfmt[i] = fmt_table[j].num;
+ outflags[i] = flags;
+ ++i;
+ sfmt+=strlen(fmt_table[j].name);
+ } while ((*(sfmt++) == ',') && --freeslots);
+
+ if (!freeslots)
+ goto err_out_too_many;
+
+ if (*(--sfmt) != '\0')
+ goto err_out_parse_error;
+
+ return 1;
err_out_too_many:
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyOut);
- return 0;
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_TooManyOut);
+ return 0;
err_out_parse_error:
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError);
- return 0;
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError);
+ return 0;
}
#if 0
static short get_driver(char *s,int audioflag)
{
- static char *audiodrv[] = {
- "null",
- "mp3lib",
- "pcm",
- "libac3",
- "acm",
- "alaw",
- "msgsm",
- "dshow",
- "dvdpcm",
- "hwac3",
- "libvorbis",
- "ffmpeg",
- "libmad",
- "msadpcm",
- "liba52",
- "g72x",
- "imaadpcm",
- "dk4adpcm",
- "dk3adpcm",
- "roqaudio",
- "faad",
- "realaud",
- "libdv",
- NULL
- };
- static char *videodrv[] = {
- "null",
- "libmpeg2",
- "vfw",
- "dshow",
- "ffmpeg",
- "vfwex",
- "raw",
- "msrle",
- "xanim",
- "msvidc",
- "fli",
- "cinepak",
- "qtrle",
- "nuv",
- "cyuv",
- "qtsmc",
- "ducktm1",
- "roqvideo",
- "qtrpza",
- "mpng",
- "ijpg",
- "zlib",
- "mpegpes",
- "zrmjpeg",
- "realvid",
- "xvid",
- "libdv",
- NULL
- };
- char **drv=audioflag?audiodrv:videodrv;
- int i;
-
- for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i;
-
- return -1;
+ static char *audiodrv[] = {
+ "null",
+ "mp3lib",
+ "pcm",
+ "libac3",
+ "acm",
+ "alaw",
+ "msgsm",
+ "dshow",
+ "dvdpcm",
+ "hwac3",
+ "libvorbis",
+ "ffmpeg",
+ "libmad",
+ "msadpcm",
+ "liba52",
+ "g72x",
+ "imaadpcm",
+ "dk4adpcm",
+ "dk3adpcm",
+ "roqaudio",
+ "faad",
+ "realaud",
+ "libdv",
+ NULL
+ };
+ static char *videodrv[] = {
+ "null",
+ "libmpeg2",
+ "vfw",
+ "dshow",
+ "ffmpeg",
+ "vfwex",
+ "raw",
+ "msrle",
+ "xanim",
+ "msvidc",
+ "fli",
+ "cinepak",
+ "qtrle",
+ "nuv",
+ "cyuv",
+ "qtsmc",
+ "ducktm1",
+ "roqvideo",
+ "qtrpza",
+ "mpng",
+ "ijpg",
+ "zlib",
+ "mpegpes",
+ "zrmjpeg",
+ "realvid",
+ "xvid",
+ "libdv",
+ NULL
+ };
+ char **drv=audioflag?audiodrv:videodrv;
+ int i;
+
+ for(i=0;drv[i];i++) if(!strcmp(s,drv[i])) return i;
+
+ return -1;
}
#endif
static int validate_codec(codecs_t *c, int type)
{
- unsigned int i;
- char *tmp_name = c->name;
+ unsigned int i;
+ char *tmp_name = c->name;
- for (i = 0; i < strlen(tmp_name) && isalnum(tmp_name[i]); i++)
- /* NOTHING */;
+ for (i = 0; i < strlen(tmp_name) && isalnum(tmp_name[i]); i++)
+ /* NOTHING */;
- if (i < strlen(tmp_name)) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_InvalidCodecName, c->name);
- return 0;
- }
+ if (i < strlen(tmp_name)) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_InvalidCodecName, c->name);
+ return 0;
+ }
- if (!c->info)
- c->info = strdup(c->name);
+ if (!c->info)
+ c->info = strdup(c->name);
#if 0
- if (c->fourcc[0] == 0xffffffff) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksFourcc, c->name);
- return 0;
- }
+ if (c->fourcc[0] == 0xffffffff) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksFourcc, c->name);
+ return 0;
+ }
#endif
- if (!c->drv) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksDriver, c->name);
- return 0;
- }
+ if (!c->drv) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecLacksDriver, c->name);
+ return 0;
+ }
#if 0
#warning codec->driver == 4;... <- this should not be put in here...
#warning Where are they defined ????????????
- if (!c->dll && (c->driver == 4 ||
- (c->driver == 2 && type == TYPE_VIDEO))) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsDLL, c->name);
- return 0;
- }
+ if (!c->dll && (c->driver == 4 ||
+ (c->driver == 2 && type == TYPE_VIDEO))) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsDLL, c->name);
+ return 0;
+ }
#warning Can guid.f1 be 0? How does one know that it was not given?
-// if (!(codec->flags & CODECS_FLAG_AUDIO) && codec->driver == 4)
+// if (!(codec->flags & CODECS_FLAG_AUDIO) && codec->driver == 4)
- if (type == TYPE_VIDEO)
- if (c->outfmt[0] == 0xffffffff) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsOutfmt, c->name);
- return 0;
- }
+ if (type == TYPE_VIDEO)
+ if (c->outfmt[0] == 0xffffffff) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNeedsOutfmt, c->name);
+ return 0;
+ }
#endif
- return 1;
+ return 1;
}
static int add_comment(char *s, char **d)
{
- int pos;
-
- if (!*d)
- pos = 0;
- else {
- pos = strlen(*d);
- (*d)[pos++] = '\n';
- }
- if (!(*d = realloc(*d, pos + strlen(s) + 1))) {
- mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantAllocateComment);
- return 0;
- }
- strcpy(*d + pos, s);
- return 1;
+ int pos;
+
+ if (!*d)
+ pos = 0;
+ else {
+ pos = strlen(*d);
+ (*d)[pos++] = '\n';
+ }
+ if (!(*d = realloc(*d, pos + strlen(s) + 1))) {
+ mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantAllocateComment);
+ return 0;
+ }
+ strcpy(*d + pos, s);
+ return 1;
}
static short get_cpuflags(char *s)
{
- static char *flagstr[] = {
- "mmx",
- "sse",
- "3dnow",
- NULL
- };
- int i;
- short flags = 0;
-
- do {
- for (i = 0; flagstr[i]; i++)
- if (!strncmp(s, flagstr[i], strlen(flagstr[i])))
- break;
- if (!flagstr[i])
- goto err_out_parse_error;
- flags |= 1<<i;
- s += strlen(flagstr[i]);
- } while (*(s++) == ',');
-
- if (*(--s) != '\0')
- goto err_out_parse_error;
-
- return flags;
+ static char *flagstr[] = {
+ "mmx",
+ "sse",
+ "3dnow",
+ NULL
+ };
+ int i;
+ short flags = 0;
+
+ do {
+ for (i = 0; flagstr[i]; i++)
+ if (!strncmp(s, flagstr[i], strlen(flagstr[i])))
+ break;
+ if (!flagstr[i])
+ goto err_out_parse_error;
+ flags |= 1<<i;
+ s += strlen(flagstr[i]);
+ } while (*(s++) == ',');
+
+ if (*(--s) != '\0')
+ goto err_out_parse_error;
+
+ return flags;
err_out_parse_error:
- return 0;
+ return 0;
}
static FILE *fp;
@@ -462,61 +462,61 @@ static int read_nextline = 1;
static int get_token(int min, int max)
{
- static int line_pos;
- int i;
- char c;
-
- if (max >= MAX_NR_TOKEN) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_GetTokenMaxNotLessThanMAX_NR_TOKEN);
- goto out_eof;
- }
-
- memset(token, 0x00, sizeof(*token) * max);
-
- if (read_nextline) {
- if (!fgets(line, MAX_LINE_LEN, fp))
- goto out_eof;
- line_pos = 0;
- ++line_num;
- read_nextline = 0;
- }
- for (i = 0; i < max; i++) {
- while (isspace(line[line_pos]))
- ++line_pos;
- if (line[line_pos] == '\0' || line[line_pos] == '#' ||
- line[line_pos] == ';') {
- read_nextline = 1;
- if (i >= min)
- goto out_ok;
- goto out_eol;
- }
- token[i] = line + line_pos;
- c = line[line_pos];
- if (c == '"' || c == '\'') {
- token[i]++;
- while (line[++line_pos] != c && line[line_pos])
- /* NOTHING */;
- } else {
- for (/* NOTHING */; !isspace(line[line_pos]) &&
- line[line_pos]; line_pos++)
- /* NOTHING */;
- }
- if (!line[line_pos]) {
- read_nextline = 1;
- if (i >= min - 1)
- goto out_ok;
- goto out_eol;
- }
- line[line_pos] = '\0';
- line_pos++;
- }
+ static int line_pos;
+ int i;
+ char c;
+
+ if (max >= MAX_NR_TOKEN) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_GetTokenMaxNotLessThanMAX_NR_TOKEN);
+ goto out_eof;
+ }
+
+ memset(token, 0x00, sizeof(*token) * max);
+
+ if (read_nextline) {
+ if (!fgets(line, MAX_LINE_LEN, fp))
+ goto out_eof;
+ line_pos = 0;
+ ++line_num;
+ read_nextline = 0;
+ }
+ for (i = 0; i < max; i++) {
+ while (isspace(line[line_pos]))
+ ++line_pos;
+ if (line[line_pos] == '\0' || line[line_pos] == '#' ||
+ line[line_pos] == ';') {
+ read_nextline = 1;
+ if (i >= min)
+ goto out_ok;
+ goto out_eol;
+ }
+ token[i] = line + line_pos;
+ c = line[line_pos];
+ if (c == '"' || c == '\'') {
+ token[i]++;
+ while (line[++line_pos] != c && line[line_pos])
+ /* NOTHING */;
+ } else {
+ for (/* NOTHING */; !isspace(line[line_pos]) &&
+ line[line_pos]; line_pos++)
+ /* NOTHING */;
+ }
+ if (!line[line_pos]) {
+ read_nextline = 1;
+ if (i >= min - 1)
+ goto out_ok;
+ goto out_eol;
+ }
+ line[line_pos] = '\0';
+ line_pos++;
+ }
out_ok:
- return i;
+ return i;
out_eof:
- read_nextline = 1;
- return RET_EOF;
+ read_nextline = 1;
+ return RET_EOF;
out_eol:
- return RET_EOL;
+ return RET_EOL;
}
static codecs_t *video_codecs=NULL;
@@ -526,398 +526,395 @@ static int nr_acodecs = 0;
int parse_codec_cfg(const char *cfgfile)
{
- codecs_t *codec = NULL; // current codec
- codecs_t **codecsp = NULL;// points to audio_codecs or to video_codecs
- char *endptr; // strtoul()...
- int *nr_codecsp;
- int codec_type; /* TYPE_VIDEO/TYPE_AUDIO */
- int tmp, i;
+ codecs_t *codec = NULL; // current codec
+ codecs_t **codecsp = NULL;// points to audio_codecs or to video_codecs
+ char *endptr; // strtoul()...
+ int *nr_codecsp;
+ int codec_type; /* TYPE_VIDEO/TYPE_AUDIO */
+ int tmp, i;
- // in case we call it a second time
- codecs_uninit_free();
+ // in case we call it a second time
+ codecs_uninit_free();
- nr_vcodecs = 0;
- nr_acodecs = 0;
+ nr_vcodecs = 0;
+ nr_acodecs = 0;
- if(cfgfile==NULL) {
+ if(cfgfile==NULL) {
#ifdef CODECS2HTML
- return 0;
+ return 0;
#else
- video_codecs = builtin_video_codecs;
- audio_codecs = builtin_audio_codecs;
- nr_vcodecs = sizeof(builtin_video_codecs)/sizeof(codecs_t);
- nr_acodecs = sizeof(builtin_audio_codecs)/sizeof(codecs_t);
- return 1;
+ video_codecs = builtin_video_codecs;
+ audio_codecs = builtin_audio_codecs;
+ nr_vcodecs = sizeof(builtin_video_codecs)/sizeof(codecs_t);
+ nr_acodecs = sizeof(builtin_audio_codecs)/sizeof(codecs_t);
+ return 1;
#endif
- }
-
- mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_ReadingFile, cfgfile);
-
- if ((fp = fopen(cfgfile, "r")) == NULL) {
- mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_CantOpenFileError, cfgfile, strerror(errno));
- return 0;
- }
-
- if ((line = malloc(MAX_LINE_LEN + 1)) == NULL) {
- mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantGetMemoryForLine, strerror(errno));
- return 0;
- }
- read_nextline = 1;
-
- /*
- * this only catches release lines at the start of
- * codecs.conf, before audiocodecs and videocodecs.
- */
- while ((tmp = get_token(1, 1)) == RET_EOL)
- /* NOTHING */;
- if (tmp == RET_EOF)
- goto out;
- if (!strcmp(token[0], "release")) {
- if (get_token(1, 2) < 0)
- goto err_out_parse_error;
- tmp = atoi(token[0]);
- if (tmp < CODEC_CFG_MIN)
- goto err_out_release_num;
- while ((tmp = get_token(1, 1)) == RET_EOL)
- /* NOTHING */;
- if (tmp == RET_EOF)
- goto out;
- } else
- goto err_out_release_num;
-
- /*
- * check if the next block starts with 'audiocodec' or
- * with 'videocodec'
- */
- if (!strcmp(token[0], "audiocodec") || !strcmp(token[0], "videocodec"))
- goto loop_enter;
- goto err_out_parse_error;
-
- while ((tmp = get_token(1, 1)) != RET_EOF) {
- if (tmp == RET_EOL)
- continue;
- if (!strcmp(token[0], "audiocodec") ||
- !strcmp(token[0], "videocodec")) {
- if (!validate_codec(codec, codec_type))
- goto err_out_not_valid;
- loop_enter:
- if (*token[0] == 'v') {
- codec_type = TYPE_VIDEO;
- nr_codecsp = &nr_vcodecs;
- codecsp = &video_codecs;
- } else if (*token[0] == 'a') {
- codec_type = TYPE_AUDIO;
- nr_codecsp = &nr_acodecs;
- codecsp = &audio_codecs;
+ }
+
+ mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_ReadingFile, cfgfile);
+
+ if ((fp = fopen(cfgfile, "r")) == NULL) {
+ mp_msg(MSGT_CODECCFG,MSGL_V,MSGTR_CantOpenFileError, cfgfile, strerror(errno));
+ return 0;
+ }
+
+ if ((line = malloc(MAX_LINE_LEN + 1)) == NULL) {
+ mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantGetMemoryForLine, strerror(errno));
+ return 0;
+ }
+ read_nextline = 1;
+
+ /*
+ * this only catches release lines at the start of
+ * codecs.conf, before audiocodecs and videocodecs.
+ */
+ while ((tmp = get_token(1, 1)) == RET_EOL)
+ /* NOTHING */;
+ if (tmp == RET_EOF)
+ goto out;
+ if (!strcmp(token[0], "release")) {
+ if (get_token(1, 2) < 0)
+ goto err_out_parse_error;
+ tmp = atoi(token[0]);
+ if (tmp < CODEC_CFG_MIN)
+ goto err_out_release_num;
+ while ((tmp = get_token(1, 1)) == RET_EOL)
+ /* NOTHING */;
+ if (tmp == RET_EOF)
+ goto out;
+ } else
+ goto err_out_release_num;
+
+ /*
+ * check if the next block starts with 'audiocodec' or
+ * with 'videocodec'
+ */
+ if (!strcmp(token[0], "audiocodec") || !strcmp(token[0], "videocodec"))
+ goto loop_enter;
+ goto err_out_parse_error;
+
+ while ((tmp = get_token(1, 1)) != RET_EOF) {
+ if (tmp == RET_EOL)
+ continue;
+ if (!strcmp(token[0], "audiocodec") ||
+ !strcmp(token[0], "videocodec")) {
+ if (!validate_codec(codec, codec_type))
+ goto err_out_not_valid;
+ loop_enter:
+ if (*token[0] == 'v') {
+ codec_type = TYPE_VIDEO;
+ nr_codecsp = &nr_vcodecs;
+ codecsp = &video_codecs;
+ } else if (*token[0] == 'a') {
+ codec_type = TYPE_AUDIO;
+ nr_codecsp = &nr_acodecs;
+ codecsp = &audio_codecs;
#ifdef DEBUG
- } else {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,"picsba\n");
- goto err_out;
+ } else {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,"picsba\n");
+ goto err_out;
#endif
- }
- if (!(*codecsp = realloc(*codecsp,
- sizeof(codecs_t) * (*nr_codecsp + 2)))) {
- mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantReallocCodecsp, strerror(errno));
- goto err_out;
- }
- codec=*codecsp + *nr_codecsp;
- ++*nr_codecsp;
- memset(codec,0,sizeof(codecs_t));
- memset(codec->fourcc, 0xff, sizeof(codec->fourcc));
- memset(codec->outfmt, 0xff, sizeof(codec->outfmt));
- memset(codec->infmt, 0xff, sizeof(codec->infmt));
-
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- for (i = 0; i < *nr_codecsp - 1; i++) {
- if(( (*codecsp)[i].name!=NULL) &&
- (!strcmp(token[0], (*codecsp)[i].name)) ) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNameNotUnique, token[0]);
- goto err_out_print_linenum;
- }
- }
- if (!(codec->name = strdup(token[0]))) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupName, strerror(errno));
- goto err_out;
- }
- } else if (!strcmp(token[0], "info")) {
- if (codec->info || get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!(codec->info = strdup(token[0]))) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupInfo, strerror(errno));
- goto err_out;
- }
- } else if (!strcmp(token[0], "comment")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- add_comment(token[0], &codec->comment);
- } else if (!strcmp(token[0], "fourcc")) {
- if (get_token(1, 2) < 0)
- goto err_out_parse_error;
- if (!add_to_fourcc(token[0], token[1],
- codec->fourcc,
- codec->fourccmap))
- goto err_out_print_linenum;
- } else if (!strcmp(token[0], "format")) {
- if (get_token(1, 2) < 0)
- goto err_out_parse_error;
- if (!add_to_format(token[0], token[1],
- codec->fourcc,codec->fourccmap))
- goto err_out_print_linenum;
- } else if (!strcmp(token[0], "driver")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!(codec->drv = strdup(token[0]))) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDriver, strerror(errno));
- goto err_out;
- }
- } else if (!strcmp(token[0], "dll")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!(codec->dll = strdup(token[0]))) {
- mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupDLL, strerror(errno));
- goto err_out;
- }
- } else if (!strcmp(token[0], "guid")) {
- if (get_token(11, 11) < 0)
- goto err_out_parse_error;
- codec->guid.f1=strtoul(token[0],&endptr,0);
- if ((*endptr != ',' || *(endptr + 1) != '\0') &&
- *endptr != '\0')
- goto err_out_parse_error;
- codec->guid.f2=strtoul(token[1],&endptr,0);
- if ((*endptr != ',' || *(endptr + 1) != '\0') &&
- *endptr != '\0')
- goto err_out_parse_error;
- codec->guid.f3=strtoul(token[2],&endptr,0);
- if ((*endptr != ',' || *(endptr + 1) != '\0') &&
- *endptr != '\0')
- goto err_out_parse_error;
- for (i = 0; i < 8; i++) {
- codec->guid.f4[i]=strtoul(token[i + 3],&endptr,0);
- if ((*endptr != ',' || *(endptr + 1) != '\0') &&
- *endptr != '\0')
- goto err_out_parse_error;
- }
- } else if (!strcmp(token[0], "out")) {
- if (get_token(1, 2) < 0)
- goto err_out_parse_error;
- if (!add_to_inout(token[0], token[1], codec->outfmt,
- codec->outflags))
- goto err_out_print_linenum;
- } else if (!strcmp(token[0], "in")) {
- if (get_token(1, 2) < 0)
- goto err_out_parse_error;
- if (!add_to_inout(token[0], token[1], codec->infmt,
- codec->inflags))
- goto err_out_print_linenum;
- } else if (!strcmp(token[0], "flags")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!strcmp(token[0], "seekable"))
- codec->flags |= CODECS_FLAG_SEEKABLE;
- else
- if (!strcmp(token[0], "align16"))
- codec->flags |= CODECS_FLAG_ALIGN16;
- else
- goto err_out_parse_error;
- } else if (!strcmp(token[0], "status")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!strcasecmp(token[0], "working"))
- codec->status = CODECS_STATUS_WORKING;
- else if (!strcasecmp(token[0], "crashing"))
- codec->status = CODECS_STATUS_NOT_WORKING;
- else if (!strcasecmp(token[0], "untested"))
- codec->status = CODECS_STATUS_UNTESTED;
- else if (!strcasecmp(token[0], "buggy"))
- codec->status = CODECS_STATUS_PROBLEMS;
- else
- goto err_out_parse_error;
- } else if (!strcmp(token[0], "cpuflags")) {
- if (get_token(1, 1) < 0)
- goto err_out_parse_error;
- if (!(codec->cpuflags = get_cpuflags(token[0])))
- goto err_out_parse_error;
- } else
- goto err_out_parse_error;
- }
- if (!validate_codec(codec, codec_type))
- goto err_out_not_valid;
- mp_msg(MSGT_CODECCFG,MSGL_INFO,MSGTR_AudioVideoCodecTotals, nr_acodecs, nr_vcodecs);
- if(video_codecs) video_codecs[nr_vcodecs].name = NULL;
- if(audio_codecs) audio_codecs[nr_acodecs].name = NULL;
+ }
+ if (!(*codecsp = realloc(*codecsp,
+ sizeof(codecs_t) * (*nr_codecsp + 2)))) {
+ mp_msg(MSGT_CODECCFG,MSGL_FATAL,MSGTR_CantReallocCodecsp, strerror(errno));
+ goto err_out;
+ }
+ codec=*codecsp + *nr_codecsp;
+ ++*nr_codecsp;
+ memset(codec,0,sizeof(codecs_t));
+ memset(codec->fourcc, 0xff, sizeof(codec->fourcc));
+ memset(codec->outfmt, 0xff, sizeof(codec->outfmt));
+ memset(codec->infmt, 0xff, sizeof(codec->infmt));
+
+ if (get_token(1, 1) < 0)
+ goto err_out_parse_error;
+ for (i = 0; i < *nr_codecsp - 1; i++) {
+ if(( (*codecsp)[i].name!=NULL) &&
+ (!strcmp(token[0], (*codecsp)[i].name)) ) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecNameNotUnique, token[0]);
+ goto err_out_print_linenum;
+ }
+ }
+ if (!(codec->name = strdup(token[0]))) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupName, strerror(errno));
+ goto err_out;
+ }
+ } else if (!strcmp(token[0], "info")) {
+ if (codec->info || get_token(1, 1) < 0)
+ goto err_out_parse_error;
+ if (!(codec->info = strdup(token[0]))) {
+ mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CantStrdupInfo, strerror(errno));
+ goto err_out;
+