diff options
Diffstat (limited to 'codec-cfg.c')
-rw-r--r-- | codec-cfg.c | 1990 |
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; + } |