⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codec-cfg.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
		} 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;out:	free(line);	line=NULL;	fclose(fp);	return 1;err_out_parse_error:	mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_ParseError);err_out_print_linenum:	PRINT_LINENUM;err_out:	codecs_uninit_free();	free(line);	line=NULL;	line_num = 0;	fclose(fp);	return 0;err_out_not_valid:	mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_CodecDefinitionIncorrect);	goto err_out_print_linenum;err_out_release_num:	mp_msg(MSGT_CODECCFG,MSGL_ERR,MSGTR_OutdatedCodecsConf);	goto err_out_print_linenum;}static void codecs_free(codecs_t* codecs,int count) {	int i;		for ( i = 0; i < count; i++)			if ( (codecs[i]).name ) {				if( (codecs[i]).name )					free((codecs[i]).name);				if( (codecs[i]).info )					free((codecs[i]).info);				if( (codecs[i]).comment )					free((codecs[i]).comment);				if( (codecs[i]).dll )					free((codecs[i]).dll);				if( (codecs[i]).drv )					free((codecs[i]).drv);			}		if (codecs)			free(codecs);}void codecs_uninit_free() {	if (video_codecs)	codecs_free(video_codecs,nr_vcodecs);	video_codecs=NULL;	if (audio_codecs)	codecs_free(audio_codecs,nr_acodecs);	audio_codecs=NULL;}codecs_t *find_audio_codec(unsigned int fourcc, unsigned int *fourccmap,		codecs_t *start){	return find_codec(fourcc, fourccmap, start, 1);}codecs_t *find_video_codec(unsigned int fourcc, unsigned int *fourccmap,		codecs_t *start){	return find_codec(fourcc, fourccmap, start, 0);}codecs_t* find_codec(unsigned int fourcc,unsigned int *fourccmap,		codecs_t *start, int audioflag){	int i, j;	codecs_t *c;#if 0	if (start) {		for (/* NOTHING */; start->name; start++) {			for (j = 0; j < CODECS_MAX_FOURCC; j++) {				if (start->fourcc[j] == fourcc) {					if (fourccmap)						*fourccmap = start->fourccmap[j];					return start;				}			}		}	} else #endif        {		if (audioflag) {			i = nr_acodecs;			c = audio_codecs;		} else {			i = nr_vcodecs;			c = video_codecs;		}		if(!i) return NULL;		for (/* NOTHING */; i--; c++) {                        if(start && c<=start) continue;			for (j = 0; j < CODECS_MAX_FOURCC; j++) {				// FIXME: do NOT hardwire 'null' name here:				if (c->fourcc[j]==fourcc || !strcmp(c->drv,"null")) {					if (fourccmap)						*fourccmap = c->fourccmap[j];					return c;				}			}		}	}	return NULL;}void select_codec(char* codecname,int audioflag){	int i;	codecs_t *c;//	printf("select_codec('%s')\n",codecname);	if (audioflag) {		i = nr_acodecs;		c = audio_codecs;	} else {		i = nr_vcodecs;		c = video_codecs;	}	if(i)	for (/* NOTHING */; i--; c++)	    if(!strcmp(c->name,codecname))		c->flags|=CODECS_FLAG_SELECTED;}void codecs_reset_selection(int audioflag){	int i;	codecs_t *c;	if (audioflag) {		i = nr_acodecs;		c = audio_codecs;	} else {		i = nr_vcodecs;		c = video_codecs;	}	if(i)	for (/* NOTHING */; i--; c++)		c->flags&=(~CODECS_FLAG_SELECTED);}void list_codecs(int audioflag){	int i;	codecs_t *c;		if (audioflag) {			i = nr_acodecs;			c = audio_codecs;			mp_msg(MSGT_CODECCFG,MSGL_INFO,"ac:         afm:      status:   info:  [lib/dll]\n");		} else {			i = nr_vcodecs;			c = video_codecs;			mp_msg(MSGT_CODECCFG,MSGL_INFO,"vc:         vfm:      status:   info:  [lib/dll]\n");		}		if(!i) return;		for (/* NOTHING */; i--; c++) {			char* s="unknown ";			switch(c->status){			  case CODECS_STATUS_WORKING:     s="working ";break;			  case CODECS_STATUS_PROBLEMS:    s="problems";break;			  case CODECS_STATUS_NOT_WORKING: s="crashing";break;			  case CODECS_STATUS_UNTESTED:    s="untested";break;			}			if(c->dll)			  mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s  %s  [%s]\n",c->name,c->drv,s,c->info,c->dll);			else			  mp_msg(MSGT_CODECCFG,MSGL_INFO,"%-11s %-9s %s  %s\n",c->name,c->drv,s,c->info);					}}#ifdef CODECS2HTML/* * Fake out GUI references when building the codecs2html utility. */#ifdef HAVE_NEW_GUIvoid gtkMessageBox( int type,char * str ) { return; }int use_gui = 0;#endifvoid wrapline(FILE *f2,char *s){    int c;    if(!s){        fprintf(f2,"-");        return;    }    while((c=*s++)){        if(c==',') fprintf(f2,"<br>"); else fputc(c,f2);    }}void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){        int c,d;        while((c=fgetc(f1))>=0){            if(c!='%'){                fputc(c,f2);                continue;            }            d=fgetc(f1);                        switch(d){            case '.':                return; // end of section            case 'n':                wrapline(f2,codec->name); break;            case 'i':                wrapline(f2,codec->info); break;            case 'c':                wrapline(f2,codec->comment); break;            case 'd':                wrapline(f2,codec->dll); break;            case 'D':                fprintf(f2,"%c",!strcmp(codec->drv,"dshow")?'+':'-'); break;            case 'F':                for(d=0;d<CODECS_MAX_FOURCC;d++)                    if(!d || codec->fourcc[d]!=0xFFFFFFFF)                        fprintf(f2,"%s%.4s",d?"<br>":"",(codec->fourcc[d]==0xFFFFFFFF || codec->fourcc[d]<0x20202020)?!d?"-":"":(char*) &codec->fourcc[d]);                break;            case 'f':                for(d=0;d<CODECS_MAX_FOURCC;d++)                    if(codec->fourcc[d]!=0xFFFFFFFF)                        fprintf(f2,"%s0x%X",d?"<br>":"",codec->fourcc[d]);                break;            case 'Y':                for(d=0;d<CODECS_MAX_OUTFMT;d++)                    if(codec->outfmt[d]!=0xFFFFFFFF){		        for (c=0; fmt_table[c].name; c++)                            if(fmt_table[c].num==codec->outfmt[d]) break;                        if(fmt_table[c].name)                            fprintf(f2,"%s%s",d?"<br>":"",fmt_table[c].name);                    }                break;            default:                fputc(c,f2);                fputc(d,f2);            }        }}void skiphtml(FILE *f1){        int c,d;        while((c=fgetc(f1))>=0){            if(c!='%'){                continue;            }            d=fgetc(f1);            if(d=='.') return; // end of section        }}static void print_int_array(const int* a, int size){	printf("{ ");	while (size--)	    if(abs(*a)<256)		printf("%d%s", *a++, size?", ":"");	    else		printf("0x%X%s", *a++, size?", ":"");	printf(" }");}static void print_char_array(const unsigned char* a, int size){	printf("{ ");	while (size--) 	    if((*a)<10)		printf("%d%s", *a++, size?", ":"");	    else		printf("0x%02x%s", *a++, size?", ":"");	printf(" }");}static void print_string(const char* s){	if (!s) printf("NULL");	else printf("\"%s\"", s);}int main(int argc, char* argv[]){	codecs_t *cl;        FILE *f1;        FILE *f2;        int c,d,i;        int pos;        int section=-1;        int nr_codecs;        int win32=-1;        int dshow=-1;        int win32ex=-1;	/*	 * Take path to codecs.conf from command line, or fall back on	 * etc/codecs.conf	 */	if (!(nr_codecs = parse_codec_cfg((argc>1)?argv[1]:"etc/codecs.conf")))		exit(1);	if (argc > 1) {		int i, j;		const char* nm[2];		codecs_t* cod[2];		int nr[2];		nm[0] = "builtin_video_codecs";		cod[0] = video_codecs;		nr[0] = nr_vcodecs;				nm[1] = "builtin_audio_codecs";		cod[1] = audio_codecs;		nr[1] = nr_acodecs;				printf("/* GENERATED FROM %s, DO NOT EDIT! */\n\n",argv[1]);				for (i=0; i<2; i++) {		  	printf("codecs_t %s[] = {\n", nm[i]);			for (j = 0; j < nr[i]; j++) {			  	printf("{");				print_int_array(cod[i][j].fourcc, CODECS_MAX_FOURCC);				printf(", /* fourcc */\n");								print_int_array(cod[i][j].fourccmap, CODECS_MAX_FOURCC);				printf(", /* fourccmap */\n");								print_int_array(cod[i][j].outfmt, CODECS_MAX_OUTFMT);				printf(", /* outfmt */\n");								print_char_array(cod[i][j].outflags, CODECS_MAX_OUTFMT);				printf(", /* outflags */\n");								print_int_array(cod[i][j].infmt, CODECS_MAX_INFMT);				printf(", /* infmt */\n");								print_char_array(cod[i][j].inflags, CODECS_MAX_INFMT);				printf(", /* inflags */\n");								print_string(cod[i][j].name);    printf(", /* name */\n");				print_string(cod[i][j].info);    printf(", /* info */\n");				print_string(cod[i][j].comment); printf(", /* comment */\n");				print_string(cod[i][j].dll);     printf(", /* dll */\n");				print_string(cod[i][j].drv);     printf(", /* drv */\n");								printf("{ 0x%08lx, %hu, %hu,",				       cod[i][j].guid.f1,				       cod[i][j].guid.f2,				       cod[i][j].guid.f3);				print_char_array(cod[i][j].guid.f4, sizeof(cod[i][j].guid.f4));				printf(" }, /* GUID */\n");				printf("%hd /* flags */, %hd /* status */, %hd /* cpuflags */ }\n",				       cod[i][j].flags,				       cod[i][j].status,				       cod[i][j].cpuflags);				if (j < nr[i]) printf(",\n");			}			printf("};\n\n");		}		exit(0);	}        f1=fopen("DOCS/tech/codecs-in.html","rb"); if(!f1) exit(1);        f2=fopen("DOCS/en/codecs-status.html","wb"); if(!f2) exit(1);                while((c=fgetc(f1))>=0){            if(c!='%'){                fputc(c,f2);                continue;            }            d=fgetc(f1);            if(d>='0' && d<='9'){                // begin section                section=d-'0';                printf("BEGIN %d\n",section);                if(section>=5){                    // audio		    cl = audio_codecs;		    nr_codecs = nr_acodecs;                    dshow=7;win32=4;                } else {                    // video		    cl = video_codecs;		    nr_codecs = nr_vcodecs;                    dshow=4;win32=2;win32ex=6;                }                pos=ftell(f1);                for(i=0;i<nr_codecs;i++){                    fseek(f1,pos,SEEK_SET);                    switch(section){                    case 0:                    case 5:                        if(cl[i].status==CODECS_STATUS_WORKING)//                            if(!(!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm")))                                parsehtml(f1,f2,&cl[i],section,dshow);                        break;#if 0                    case 1:                    case 6:                        if(cl[i].status==CODECS_STATUS_WORKING)                            if((!strcmp(cl[i].drv,"vfw") || !strcmp(cl[i].drv,"dshow") || !strcmp(cl[i].drv,"vfwex") || !strcmp(cl[i].drv,"acm")))                                parsehtml(f1,f2,&cl[i],section,dshow);                        break;#endif                    case 2:                    case 7:                        if(cl[i].status==CODECS_STATUS_PROBLEMS)                            parsehtml(f1,f2,&cl[i],section,dshow);                        break;                    case 3:                    case 8:                        if(cl[i].status==CODECS_STATUS_NOT_WORKING)                            parsehtml(f1,f2,&cl[i],section,dshow);                        break;                    case 4:                    case 9:                        if(cl[i].status==CODECS_STATUS_UNTESTED)                            parsehtml(f1,f2,&cl[i],section,dshow);                        break;                    default:                        printf("Warning! unimplemented section: %d\n",section);                    }                }                fseek(f1,pos,SEEK_SET);                skiphtml(f1);//void parsehtml(FILE *f1,FILE *f2,codecs_t *codec,int section,int dshow){                                continue;            }            fputc(c,f2);            fputc(d,f2);        }                fclose(f2);        fclose(f1);	return 0;}#endif#ifdef TESTINGint main(void){	codecs_t *c;        int i,j, nr_codecs, state;	if (!(parse_codec_cfg("etc/codecs.conf")))		return 0;	if (!video_codecs)		printf("no videoconfig.\n");	if (!audio_codecs)		printf("no audioconfig.\n");	printf("videocodecs:\n");	c = video_codecs;	nr_codecs = nr_vcodecs;	state = 0;next:	if (c) {		printf("number of %scodecs: %d\n", state==0?"video":"audio",		    nr_codecs);		for(i=0;i<nr_codecs;i++, c++){		    printf("\n============== %scodec %02d ===============\n",			state==0?"video":"audio",i);		    printf("name='%s'\n",c->name);		    printf("info='%s'\n",c->info);		    printf("comment='%s'\n",c->comment);		    printf("dll='%s'\n",c->dll);		    printf("flags=%X  driver=%d status=%d cpuflags=%d\n",				    c->flags, c->driver, c->status, c->cpuflags);		    for(j=0;j<CODECS_MAX_FOURCC;j++){		      if(c->fourcc[j]!=0xFFFFFFFF){			  printf("fourcc %02d:  %08X (%.4s) ===> %08X (%.4s)\n",j,c->fourcc[j],(char *) &c->fourcc[j],c->fourccmap[j],(char *) &c->fourccmap[j]);		      }		    }		    for(j=0;j<CODECS_MAX_OUTFMT;j++){		      if(c->outfmt[j]!=0xFFFFFFFF){			  printf("outfmt %02d:  %08X (%.4s)  flags: %d\n",j,c->outfmt[j],(char *) &c->outfmt[j],c->outflags[j]);		      }		    }		    for(j=0;j<CODECS_MAX_INFMT;j++){		      if(c->infmt[j]!=0xFFFFFFFF){			  printf("infmt %02d:  %08X (%.4s)  flags: %d\n",j,c->infmt[j],(char *) &c->infmt[j],c->inflags[j]);		      }		    }		    printf("GUID: %08lX %04X %04X",c->guid.f1,c->guid.f2,c->guid.f3);		    for(j=0;j<8;j++) printf(" %02X",c->guid.f4[j]);		    printf("\n");		    		}	}	if (!state) {		printf("audiocodecs:\n");		c = audio_codecs;		nr_codecs = nr_acodecs;		state = 1;		goto next;	}	return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -