Mercurial > mplayer.hg
changeset 303:828ec81e0d64
codecs.conf support
author | arpi_esp |
---|---|
date | Sat, 07 Apr 2001 21:27:57 +0000 |
parents | a1fe76547e8f |
children | 662f876d77e9 |
files | DOCS/codecs.conf Makefile cfg-mplayer.h codec-cfg.c codec-cfg.h dec_audio.c dll_init.c libvo/vo_x11.c mplayer.c stheader.h |
diffstat | 10 files changed, 299 insertions(+), 338 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/codecs.conf Sat Apr 07 16:59:51 2001 +0000 +++ b/DOCS/codecs.conf Sat Apr 07 21:27:57 2001 +0000 @@ -2,6 +2,12 @@ ; It is not functional yet! until we finish config loader, ; mplayer will use codecs.c!!! +videocodec mpeg12 + info "MPEG 1 or 2" + format 0x1 + driver libmpeg2 + out YV12 + videocodec mpeg4 info "Microsoft MPEG-4 v1/v2" comment "No postprocessing" @@ -9,21 +15,9 @@ fourcc MP42,mp42 driver vfw dll "mpg4c32.dll" - out YUY2 noflip,yuvhack - out RGB32,RGB24,RGB15 + out YUY2 yuvhack + out BGR32,BGR24,BGR15 -videocodec divx - info "DivX ;-) (MS MPEG-4 v3)" - comment "DivX rulez ;-)" - fourcc MP43,mp43 div3 ; fourcc mapping to div3 - fourcc DIV5,div5 div3 - fourcc DIV6,div6 div4 - fourcc DIV3,div3,DIV4,div3 - driver vfw - dll "divxc32.dll" - out YUY2 noflip,yuvhack - out RGB32,RGB24,RGB15 - videocodec divxds info "DivX ;-) (MS MPEG-4 v3)" comment "DivX rulez ;-)" @@ -34,23 +28,35 @@ driver dshow dll "divx_c32.ax" guid 0x82CCd3E0, 0xF71A, 0x11D0, 0x9f, 0xe5, 0x00, 0x60, 0x97, 0x78, 0xaa, 0xaa - out YUY2 noflip - out RGB32,RGB24,RGB16,RGB15 noflip + out YUY2 + out BGR32,BGR24,BGR16,BGR15 +videocodec divx + info "DivX ;-) (MS MPEG-4 v3)" + comment "DivX rulez ;-)" + fourcc MP43,mp43 div3 ; fourcc mapping to div3 + fourcc DIV5,div5 div3 + fourcc DIV6,div6 div4 + fourcc DIV3,div3,DIV4,div3 + driver vfw + dll "divxc32.dll" + out YUY2 yuvhack + out BGR32,BGR24,BGR15 + videocodec odivx info "OpenDivX (MPEG-4 v2)" fourcc DIVX,divx fourcc DIV1,div1 divx driver odivx - out YV12 noflip + out YV12 videocodec indeo5 info "Intel Indeo 5" fourcc IV50,iv50 driver vfw dll "ir50_32.dll" - out YUY2 noflip - out RGB32,RGB24,RGB15 noflip + out YUY2 + out BGR32,BGR24,BGR15 videocodec indeo4 info "Intel Indeo 4.1" @@ -58,7 +64,7 @@ fourcc IV41,iv41 driver vfw dll "ir41_32.dll" - out RGB24,RGB15 flip + out BGR24,BGR15 flip videocodec indeo3 info "Intel Indeo 3.1/3.2" @@ -67,30 +73,30 @@ fourcc IV32,iv32 driver vfw dll "ir32_32.dll" - out RGB24,RGB15 flip + out BGR24,BGR15 flip videocodec cvid info "Cinepak Video" fourcc cvid driver vfw dll "msvidc32.dll" - out YUY2 noflip - out RGB24,RGB15 noflip + out YUY2 + out BGR24,BGR15 videocodec cram info "CRAM" fourcc cram,CRAM driver vfw dll "msvidc32.dll" - out RGB24,RGB15 noflip + out BGR24,BGR15 videocodec vcr2 info "ATI VCR-2" fourcc VCR2 driver vfw dll "ativcr2.dll" - out YUY2 noflip - out RGB32,RGB24,RGB15 noflip + out YUY2 + out BGR32,BGR24,BGR15 videocodec i263 info "I263" @@ -98,7 +104,7 @@ fourcc I263,i263 driver vfw dll "i263_32.drv" - out RGB32,RGB24,RGB15 noflip + out BGR32,BGR24,BGR15 videocodec mjpeg info "Motion JPEG" @@ -106,8 +112,8 @@ driver vfw dll "mcmjpg32.dll" ; dll "m3jpeg32.dll" - out YUY2 noflip - out RGB32,RGB24,RGB15 noflip + out YUY2 + out BGR32,BGR24,BGR15 videocodec wmv1 info "Windows Media Video 7" @@ -115,8 +121,8 @@ driver dshow dll "wmvds32.ax" guid 0x4facbba1, 0xffd8, 0x4cd7, 0x82, 0x28, 0x61, 0xe2, 0xf6, 0x5c, 0xb1, 0xae - out YUY2 noflip - out RGB32,RGB24,RGB16,RGB15 noflip + out YUY2 + out BGR32,BGR24,BGR16,BGR15 audiocodec divx info "DivX audio (WMA)" @@ -166,6 +172,21 @@ format 0x32 driver msgsm +audiocodec alaw + info "aLaw" + format 0x6 + driver alaw + +audiocodec pcm + info "Uncompressed PCM" + format 0x1 + driver pcm + +audiocodec ac3 + info "AC3" + format 0x2000 + driver libac3 + audiocodec voxware info "VoxWare" format 0x75
--- a/Makefile Sat Apr 07 16:59:51 2001 +0000 +++ b/Makefile Sat Apr 07 21:27:57 2001 +0000 @@ -22,8 +22,8 @@ prefix = /usr/local BINDIR = ${prefix}/bin # BINDIR = /usr/local/bin -SRCS = subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c -OBJS = subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o +SRCS = codec-cfg.c subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c +OBJS = codec-cfg.o subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o CFLAGS = $(OPTFLAGS) -Iloader -Ilibvo # -Wall A_LIBS = -Lmp3lib -lMP3 -Llibac3 -lac3 VO_LIBS = -Llibvo -lvo $(X_LIBS) @@ -77,7 +77,7 @@ $(CC) $(CFLAGS) -o $(PRG_TV) tvision.o $(OBJS) -lm $(TERMCAP_LIB) $(VO_LIBS) $(PRG_CFG): codec-cfg.c codec-cfg.h - $(CC) $(CFLAGS) codec-cfg.c -o $(PRG_CFG) -DTESTING + $(CC) $(CFLAGS) -g codec-cfg.c -o $(PRG_CFG) -DTESTING install: $(PRG) install -g $(GROUP) -o $(OWNER) -m $(PERM) -s $(PRG) $(BINDIR)
--- a/cfg-mplayer.h Sat Apr 07 16:59:51 2001 +0000 +++ b/cfg-mplayer.h Sat Apr 07 21:27:57 2001 +0000 @@ -34,8 +34,8 @@ {"noni", &force_ni, CONF_TYPE_FLAG, 0, 1, 0}, {"aid", &audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 256}, {"vid", &video_id, CONF_TYPE_INT, CONF_RANGE, 0, 256}, - {"auds", &avi_header.audio_codec, CONF_TYPE_STRING, 0, 0, 0}, - {"vids", &avi_header.video_codec, CONF_TYPE_STRING, 0, 0, 0}, +// {"auds", &avi_header.audio_codec, CONF_TYPE_STRING, 0, 0, 0}, +// {"vids", &avi_header.video_codec, CONF_TYPE_STRING, 0, 0, 0}, {"mc", &default_max_pts_correction, CONF_TYPE_FLOAT, CONF_RANGE, 0, 10}, {"fps", &force_fps, CONF_TYPE_FLOAT, CONF_MIN, 0, 0}, {"afm", &audio_format, CONF_TYPE_INT, CONF_RANGE, 1, 6},
--- a/codec-cfg.c Sat Apr 07 16:59:51 2001 +0000 +++ b/codec-cfg.c Sat Apr 07 21:27:57 2001 +0000 @@ -1,3 +1,9 @@ + +//#define DEBUG +#define PRINT_LINENUM +// printf("%s(%d): ", cfgfile, line_num) + + #include <stdio.h> #include <stdlib.h> #include <fcntl.h> @@ -28,16 +34,17 @@ #define RET_EOL -2 #define RET_OK 0 -FILE *fp; -int line_num = 0; -int line_pos; /* line pos */ -int firstdef = 1; -char *line; -char *token; +static FILE *fp; +static int line_num = 0; +static int line_pos; /* line pos */ +static int firstdef = 1; +static char *line; +static char *token; -int nr_codecs = 0; +static codecs_t *codecs=NULL; +static int nr_codecs = 0; -int get_token(void) +static int get_token(void) { static int read_nextline = 1; @@ -88,7 +95,7 @@ return RET_EOL; } -int add_to_fourcc(char *s, char *alias, unsigned int *fourcc, +static int add_to_fourcc(char *s, char *alias, unsigned int *fourcc, unsigned int *map) { int i; @@ -133,7 +140,7 @@ return 1; } -int add_to_format(char *s, unsigned int *fourcc, unsigned int *fourccmap) +static int add_to_format(char *s, unsigned int *fourcc, unsigned int *fourccmap) { // printf("\n-----[%s][%s]-----\n",s,format); @@ -153,7 +160,7 @@ } -int add_to_out(char *sfmt, char *sflags, unsigned int *outfmt, +static int add_to_out(char *sfmt, char *sflags, unsigned int *outfmt, unsigned char *outflags) { static char *fmtstr[] = { @@ -229,7 +236,7 @@ return 1; } -short get_driver(char *s,int audioflag) +static short get_driver(char *s,int audioflag) { static char *audiodrv[] = { "mp3lib", @@ -256,13 +263,11 @@ return 0; } -//#define DEBUG codecs_t *parse_codec_cfg(char *cfgfile) { -#define PRINT_LINENUM printf("%s(%d): ", cfgfile, line_num) - codecs_t *codecs = NULL; // array of codecs +// codecs_t *codecs = NULL; // array of codecs codecs_t *codec = NULL; // currect codec int free_slots = 0; int tmp, i; @@ -309,10 +314,10 @@ state = 0; if (*token == 'a') { /* audiocodec */ - printf("audio"); + //printf("audio"); codec->flags |= CODECS_FLAG_AUDIO; } else if (*token == 'v') { /* videocodec */ - printf("video"); + //printf("video"); codec->flags &= !CODECS_FLAG_AUDIO; } else { printf("itt valami nagyon el van baszva\n"); @@ -322,28 +327,28 @@ goto parse_error_out; codec->name = strdup(token); state |= GOT_NAME; - printf(" %s\n", codec->name); + //printf(" %s\n", codec->name); } else if (!strcmp(token, "info")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("info"); + //printf("info"); if (state & GOT_INFO || get_token() < 0) goto parse_error_out; codec->info = strdup(token); state |= GOT_INFO; - printf(" %s\n", codec->info); + //printf(" %s\n", codec->info); } else if (!strcmp(token, "comment")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("comment"); + //printf("comment"); if (get_token() < 0) goto parse_error_out; #if 1 if (!codec->comment) codec->comment = strdup(token); - printf(" %s\n", codec->comment); + //printf(" %s\n", codec->comment); #else add_comment(token, &codec->comment); printf(" FIXMEEEEEEEEEEEEEEE\n"); @@ -352,11 +357,11 @@ if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("fourcc"); - if (codec->flags & CODECS_FLAG_AUDIO) { - printf("\n'fourcc' in audiocodec definition!\n"); - goto err_out; - } + //printf("fourcc"); +// if (codec->flags & CODECS_FLAG_AUDIO) { +// printf("\n'fourcc' in audiocodec definition!\n"); +// goto err_out; +// } if (get_token() < 0) goto parse_error_out; param1 = strdup(token); @@ -366,49 +371,49 @@ codec->fourccmap)) goto err_out; state |= GOT_FOURCC; - printf(" %s: %s\n", param1, token); + //printf(" %s: %s\n", param1, token); free(param1); } else if (!strcmp(token, "format")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("format"); - if (!(codec->flags & CODECS_FLAG_AUDIO)) { - printf("\n'format' in videocodec definition!\n"); - goto err_out; - } + //printf("format"); +// if (!(codec->flags & CODECS_FLAG_AUDIO)) { +// printf("\n'format' in videocodec definition!\n"); +// goto err_out; +// } if (get_token() < 0) goto parse_error_out; if (!add_to_format(token, codec->fourcc,codec->fourccmap)) goto err_out; state |= GOT_FORMAT; - printf(" %s\n", token); + //printf(" %s\n", token); } else if (!strcmp(token, "driver")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("driver"); + //printf("driver"); if (get_token() < 0) goto parse_error_out; if ((codec->driver = get_driver(token,codec->flags&CODECS_FLAG_AUDIO)) == -1) goto err_out; - printf(" %s\n", token); + //printf(" %s\n", token); } else if (!strcmp(token, "dll")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("dll"); + //printf("dll"); if (get_token() < 0) goto parse_error_out; codec->dll = strdup(token); - printf(" %s\n", codec->dll); + //printf(" %s\n", codec->dll); } else if (!strcmp(token, "guid")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("guid"); + //printf("guid"); if (get_token() < 0) goto parse_error_out; - printf("'%s'",token); + //printf("'%s'",token); codec->guid.f1=strtoul(token,NULL,0); if (get_token() < 0) goto parse_error_out; codec->guid.f2=strtoul(token,NULL,0); @@ -422,7 +427,7 @@ if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("out"); + //printf("out"); if (get_token() < 0) goto parse_error_out; param1 = strdup(token); @@ -430,16 +435,16 @@ if (!add_to_out(param1, token, codec->outfmt, codec->outflags)) goto err_out; - printf(" %s: %s\n", param1, token); + //printf(" %s: %s\n", param1, token); free(param1); } else if (!strcmp(token, "flags")) { if (!(state & GOT_NAME)) goto parse_error_out; PRINT_LINENUM; - printf("flags"); + //printf("flags"); if (get_token() < 0) goto parse_error_out; - printf(" %s\n", token); + //printf(" %s\n", token); } else goto parse_error_out; } @@ -461,6 +466,23 @@ goto out; } +codecs_t* find_codec(unsigned int fourcc,unsigned int *fourccmap,int audioflag){ + int i,j; + for(i=0;i<nr_codecs;i++){ + codecs_t *c=&codecs[i]; + if(!audioflag && (c->flags&CODECS_FLAG_AUDIO)) continue; + if(audioflag && !(c->flags&CODECS_FLAG_AUDIO)) continue; + for(j=0;j<CODECS_MAX_FOURCC;j++){ + if(c->fourcc[j]==fourcc){ + if(fourccmap) *fourccmap=c->fourccmap[j]; + return c; + } + } + } + return NULL; +} + + #ifdef TESTING int main(void) {
--- a/codec-cfg.h Sat Apr 07 16:59:51 2001 +0000 +++ b/codec-cfg.h Sat Apr 07 21:27:57 2001 +0000 @@ -15,14 +15,17 @@ #define CODECS_MAX_FOURCC 16 #define CODECS_MAX_OUTFMT 16 +// Global flags: #define CODECS_FLAG_AUDIO (1<<0) +#define CODECS_FLAG_SEEKABLE (1<<1) +// Outfmt flags: #define CODECS_FLAG_FLIP (1<<0) #define CODECS_FLAG_NOFLIP (1<<1) #define CODECS_FLAG_YUVHACK (1<<2) -#warning nem kellene ket typedef GUID-nak... +//#warning nem kellene ket typedef GUID-nak... typedef struct { unsigned long f1; unsigned short f2; @@ -44,6 +47,7 @@ unsigned char outflags[CODECS_MAX_OUTFMT]; } codecs_t; -codecs_t *parse_codec_cfg(char *cfgfile); +codecs_t* parse_codec_cfg(char *cfgfile); +codecs_t* find_codec(unsigned int fourcc,unsigned int *fourccmap,int audioflag); #endif
--- a/dec_audio.c Sat Apr 07 16:59:51 2001 +0000 +++ b/dec_audio.c Sat Apr 07 21:27:57 2001 +0000 @@ -1,51 +1,16 @@ - -// FIXME: use codec.conf struct here!!! -int detect_audio_format(sh_audio_t *sh_audio){ - int has_audio=0; -// Decide audio format: - switch(sh_audio->wf.wFormatTag){ - case 0: - has_audio=0;break; // disable/no audio - case 6: - avi_header.audio_seekable=1; - has_audio=5;break; // aLaw - case 0x31: - case 0x32: - has_audio=6;break; // MS-GSM - case 0x50: -#ifdef DEFAULT_MPG123 - case 0x55: -#endif - avi_header.audio_seekable=1; - has_audio=1;break; // MPEG - case 0x01: - avi_header.audio_seekable=1; - has_audio=2;break; // PCM - case 0x2000: - avi_header.audio_seekable=1; - has_audio=3;break; // AC3 - default: - avi_header.audio_seekable=0; - has_audio=4; // Win32/ACM - } - if(has_audio==4){ - if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(sh_audio); - if(avi_header.auds_guid) has_audio=7; // force DShow - if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec - if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); - } - if(verbose) printf("detected audio format: %d\n",has_audio); - return has_audio; -} int init_audio(sh_audio_t *sh_audio){ -int has_audio=sh_audio->codec.driver; + +int driver=sh_audio->codec->driver; sh_audio->samplesize=2; +sh_audio->samplerate=0; sh_audio->pcm_bswap=0; + sh_audio->a_buffer_size=16384; // default size, maybe not enough for Win32/ACM +sh_audio->a_buffer=NULL; -if(has_audio==4){ +if(driver==4){ // Win32 ACM audio codec: if(init_acm_audio_codec(sh_audio)){ sh_audio->channels=sh_audio->o_wf.nChannels; @@ -54,69 +19,50 @@ sh_audio->a_buffer_size=sh_audio->audio_out_minsize+OUTBURST; } else { printf("Could not load/initialize Win32/ACM AUDIO codec (missing DLL file?)\n"); - if((sh_audio->wf.wFormatTag)==0x55){ - printf("Audio format is MP3 -> fallback to internal mp3lib/mpg123\n"); - has_audio=1; // fallback to mp3lib - } else - has_audio=0; // nosound + driver=0; } } -if(has_audio==7){ +if(driver==7){ #ifndef USE_DIRECTSHOW printf("Compiled without DirectShow support -> force nosound :(\n"); - has_audio=0; + driver=0; #else // Win32 DShow audio codec: - WAVEFORMATEX *in_fmt=&sh_audio->wf; - sh_audio->o_wf.nChannels=in_fmt->nChannels; - sh_audio->o_wf.nSamplesPerSec=in_fmt->nSamplesPerSec; - sh_audio->o_wf.nAvgBytesPerSec=2*sh_audio->o_wf.nSamplesPerSec*sh_audio->o_wf.nChannels; - sh_audio->o_wf.wFormatTag=WAVE_FORMAT_PCM; - sh_audio->o_wf.nBlockAlign=2*in_fmt->nChannels; - sh_audio->o_wf.wBitsPerSample=16; - sh_audio->o_wf.cbSize=0; + printf("DShow_audio: channs=%d rate=%d\n",sh_audio->channels,sh_audio->samplerate); - if(!DS_AudioDecoder_Open(avi_header.audio_codec,avi_header.auds_guid,in_fmt)){ - sh_audio->channels=sh_audio->o_wf.nChannels; - sh_audio->samplerate=sh_audio->o_wf.nSamplesPerSec; - - sh_audio->audio_in_minsize=2*sh_audio->o_wf.nBlockAlign; + if(DS_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,&sh_audio->wf)){ + printf("ERROR: Could not load/initialize Win32/DirctShow AUDIO codec: %s\n",sh_audio->codec->dll); + driver=0; + } else { + sh_audio->channels=sh_audio->wf.nChannels; + sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; + sh_audio->audio_in_minsize=2*sh_audio->wf.nBlockAlign; if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192; sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); sh_audio->a_in_buffer_len=0; - - } else { - printf("ERROR: Could not load/initialize Win32/DirctShow AUDIO codec: %s\n",avi_header.audio_codec); - if((in_fmt->wFormatTag)==0x55){ - printf("Audio format is MP3 -> fallback to internal mp3lib/mpg123\n"); - has_audio=1; // fallback to mp3lib - } else - printf("Audio disabled! Try to upgrade your w32codec.zip package!!!\n"); - has_audio=0; // nosound } #endif } +if(!driver) return 0; // allocate audio out buffer: sh_audio->a_buffer=malloc(sh_audio->a_buffer_size); memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); sh_audio->a_buffer_len=0; -if(has_audio==4){ +switch(driver){ +case 4: { int ret=acm_decode_audio(sh_audio,sh_audio->a_buffer,sh_audio->a_buffer_size); if(ret<0){ - printf("ACM error %d -> switching to nosound...\n",ret); - has_audio=0; - } else { - sh_audio->a_buffer_len=ret; - printf("ACM decoding test: %d bytes\n",ret); + printf("ACM decoding error: %d\n",ret); + driver=0; } + break; } - -if(has_audio==2){ +case 2: { // if(file_format==DEMUXER_TYPE_AVI){ // FIXME!!!!!!! // AVI PCM Audio: WAVEFORMATEX *h=&sh_audio->wf; @@ -129,8 +75,9 @@ // sh_audio->samplerate=48000; // sh_audio->pcm_bswap=1; // } -} else -if(has_audio==3){ + break; +} +case 3: { // Dolby AC3 audio: ac3_config.fill_buffer_callback = ac3_fill_buffer; ac3_config.num_output_ch = 2; @@ -146,22 +93,26 @@ if(sh_audio->ac3_frame){ sh_audio->samplerate=sh_audio->ac3_frame->sampling_rate; sh_audio->channels=2; - } else has_audio=0; // bad frame -> disable audio -} else -if(has_audio==5){ + } else { + driver=0; // bad frame -> disable audio + } + break; +} +case 5: { // aLaw audio codec: Gen_aLaw_2_Signed(); // init table sh_audio->channels=sh_audio->wf.nChannels; sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; -} else -if(has_audio==6){ + break; +} +case 6: { // MS-GSM audio codec: GSM_Init(); sh_audio->channels=sh_audio->wf.nChannels; sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; + break; } -// must be here for Win32->mp3lib fallbacks -if(has_audio==1){ +case 1: { // MPEG Audio: MP3_Init(); MP3_samplerate=MP3_channels=0; @@ -170,23 +121,30 @@ // printf("]\n"); sh_audio->channels=2; // hack sh_audio->samplerate=MP3_samplerate; + break; +} } if(!sh_audio->channels || !sh_audio->samplerate){ printf("Unknown/missing audio format, using nosound\n"); - has_audio=0; + driver=0; } - sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; + if(!driver){ + if(sh_audio->a_buffer) free(sh_audio->a_buffer); + sh_audio->o_bps=0; + return 0; + } - return has_audio; + sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; + return driver; } // Audio decoding int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){ int len=-1; - switch(sh_audio->codec.driver){ + switch(sh_audio->codec->driver){ case 1: // MPEG layer 2 or 3 len=MP3_DecodeFrame(buf,-1); sh_audio->channels=2; // hack
--- a/dll_init.c Sat Apr 07 16:59:51 2001 +0000 +++ b/dll_init.c Sat Apr 07 21:27:57 2001 +0000 @@ -21,7 +21,7 @@ sh_audio->o_wf.wBitsPerSample=16; sh_audio->o_wf.cbSize=0; - win32_codec_name = avi_header.audio_codec; + win32_codec_name = sh_audio->codec->dll; ret=acmStreamOpen(&sh_audio->srcstream,(HACMDRIVER)NULL, in_fmt,&sh_audio->o_wf, NULL,0,0,0); @@ -100,15 +100,16 @@ -int init_video_codec(int outfmt){ +int init_video_codec(){ HRESULT ret; + unsigned int outfmt=sh_video->codec->outfmt[sh_video->outfmtidx]; if(verbose) printf("======= Win32 (VFW) VIDEO Codec init =======\n"); memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); sh_video->o_bih.biSize = sizeof(BITMAPINFOHEADER); - win32_codec_name = avi_header.video_codec; + win32_codec_name = sh_video->codec->dll; sh_video->hic = ICOpen( 0x63646976, sh_video->bih.biCompression, ICMODE_FASTDECOMPRESS); // sh_video->hic = ICOpen( 0x63646976, sh_video->bih.biCompression, ICMODE_DECOMPRESS); if(!sh_video->hic){ @@ -142,12 +143,14 @@ else sh_video->o_bih.biBitCount=outfmt&0xFF;// //24; + if(sh_video->o_bih.biBitCount==15) ++sh_video->o_bih.biBitCount; + sh_video->o_bih.biSizeImage=sh_video->o_bih.biWidth*sh_video->o_bih.biHeight*(sh_video->o_bih.biBitCount/8); - if(!avi_header.flipped) + if(!(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_FLIP)) sh_video->o_bih.biHeight=-sh_video->bih.biHeight; // flip image! - if(outfmt==IMGFMT_YUY2 && !avi_header.yuv_hack_needed) + if(outfmt==IMGFMT_YUY2 && !(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_YUVHACK)) sh_video->o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); // sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); @@ -205,7 +208,7 @@ return 0; } - if(outfmt==IMGFMT_YUY2 && avi_header.yuv_hack_needed) + if(outfmt==IMGFMT_YUY2 && (sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_YUVHACK)) sh_video->o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); // avi_header.our_in_buffer=malloc(avi_header.video.dwSuggestedBufferSize); // FIXME!!!!
--- a/libvo/vo_x11.c Sat Apr 07 16:59:51 2001 +0000 +++ b/libvo/vo_x11.c Sat Apr 07 21:27:57 2001 +0000 @@ -514,11 +514,16 @@ static uint32_t query_format( uint32_t format ) { if( !vo_init() ) return 0; // Can't open X11 - if( ( format&IMGFMT_BGR_MASK )==IMGFMT_BGR && ( format&0xFF )==vo_depthonscreen ) return 1; + if( ( format&IMGFMT_BGR_MASK )==IMGFMT_BGR ){ + int bpp=format&0xFF; + if( bpp==vo_depthonscreen ) return 1; + if( bpp==15 && vo_depthonscreen==16) return 1; // built-in conversion + if( bpp==24 && vo_depthonscreen==32) return 1; // built-in conversion + } switch( format ) - { + { case IMGFMT_YV12: return 1; - } + } return 0; }
--- a/mplayer.c Sat Apr 07 16:59:51 2001 +0000 +++ b/mplayer.c Sat Apr 07 21:27:57 2001 +0000 @@ -51,13 +51,7 @@ #include "loader.h" #include "wine/avifmt.h" -typedef struct -{ - long f1; - short f2; - short f3; - char f4[8]; -} GUID; +#include "codec-cfg.h" #ifdef USE_DIRECTSHOW #include "DirectShow/DS_VideoDec.h" @@ -186,18 +180,6 @@ int idx_offset; // ennyit kell hozzaadni az index offset ertekekhez // video: unsigned int bitrate; - //===== This stuff will be removed when codec.conf reader is finished! ===== - // video codec info: (filled by codecs.c) - char *video_codec; - char yuv_supported; // 1 if codec support YUY2 output format - char yuv_hack_needed; // requires for divx & mpeg4 - char no_32bpp_support; // requires for INDEO 3.x, 4.x - char flipped; // image is upside-down - GUID* vids_guid; - // audio codec info: (filled by codecs.c) - char *audio_codec; - int audio_seekable; - GUID* auds_guid; } avi_header_t; avi_header_t avi_header; @@ -239,8 +221,6 @@ 60*10000, 0,0,0,0,0,0,0 }; -#include "codecs.c" - //**************************************************************************// // Audio codecs: //**************************************************************************// @@ -409,7 +389,7 @@ stream_t* stream=NULL; int file_format=DEMUXER_TYPE_UNKNOWN; int has_audio=1; // audio 0=no 1=mpeg 2=pcm 3=ac3 4=ACM 5=alaw 6=msgsm 7=DShow -int has_video=0; // video 0=no 1=mpeg 2=win32/VfW 3=OpenDivX 4=w32/DShow +int has_video=1; // video 0=no 1=mpeg 2=win32/VfW 3=OpenDivX 4=w32/DShow // int audio_format=0; // override #ifdef ALSA_TIMER @@ -551,6 +531,11 @@ } } +// check codec.conf +if(!parse_codec_cfg(get_path("codecs.conf"))){ + printf("Warning! Couldn't load codecs.conf!"); +} + if(vcd_track){ //============ Open VideoCD track ============== @@ -600,7 +585,6 @@ if(asf_check_header()){ printf("Detected ASF file format!\n"); file_format=DEMUXER_TYPE_ASF; -// printf("!!! ASF files not (yet) supported !!!\n");exit(1); } } //=============== Try to open as MPEG-PS file: ================= @@ -698,7 +682,6 @@ } else { if(force_ni || abs(a_pos-v_pos)>0x100000){ // distance > 1MB printf("Detected NON-INTERLEAVED AVI file-format!\n"); -// file_format=DEMUXER_TYPE_AVI_NI; // HACK!!!! demuxer->type=DEMUXER_TYPE_AVI_NI; // HACK!!!! pts_from_bps=1; // force BPS sync! } @@ -707,7 +690,6 @@ // no index if(force_ni){ printf("Using NON-INTERLEAVED Broken AVI file-format!\n"); -// file_format=DEMUXER_TYPE_AVI_NI; // HACK!!!! demuxer->type=DEMUXER_TYPE_AVI_NINI; // HACK!!!! avi_header.idx_pos_a= avi_header.idx_pos_v=avi_header.movi_start; @@ -719,11 +701,7 @@ printf("AVI: missing video stream!? contact the author, it may be a bug :(\n"); exit(1); } - has_video=2; - // Decide audio format: - if(audio_format) - has_audio=audio_format; // override type - else if(has_audio) has_audio=detect_audio_format(sh_audio); + sh_video->format=sh_video->bih.biCompression; if(has_audio){ if(verbose) printf("AVI: Searching for audio stream (id:%d)\n",d_audio->id); if(!ds_fill_buffer(d_audio)){ @@ -731,6 +709,7 @@ has_audio=0; } } + if(has_audio) sh_audio->format=sh_audio->wf.wFormatTag; default_fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; break; } @@ -740,26 +719,12 @@ stream_reset(demuxer->stream); stream_seek(demuxer->stream,avi_header.movi_start); avi_header.idx_pos=0; -#if 0 - if(avi_header.idx_size>0){ - // decide index format: - if(avi_header.idx[0].dwChunkOffset<avi_header.movi_start) - avi_header.idx_offset=avi_header.movi_start-4; - else - avi_header.idx_offset=0; - if(verbose) printf("ASF index offset: %d\n",avi_header.idx_offset); - } -#endif demuxer->endpos=avi_header.movi_end; if(!ds_fill_buffer(d_video)){ printf("ASF: missing video stream!? contact the author, it may be a bug :(\n"); exit(1); } - has_video=2; - // Decide audio format: - if(audio_format) - has_audio=audio_format; // override type - else if(has_audio) has_audio=detect_audio_format(sh_audio); + sh_video->format=sh_video->bih.biCompression; if(has_audio){ if(verbose) printf("ASF: Searching for audio stream (id:%d)\n",d_audio->id); if(!ds_fill_buffer(d_audio)){ @@ -767,13 +732,26 @@ has_audio=0; } } + if(has_audio) sh_audio->format=sh_audio->wf.wFormatTag; break; } case DEMUXER_TYPE_MPEG_ES: { - demuxer->audio->type=0; - has_audio=0; // ES streams has no audio channel - has_video=1; // mpeg video - break; + demuxer->audio->type=0; + // Find sequence_header first: + if(verbose) printf("Searching for sequence header... ");fflush(stdout); + while(1){ + int i=sync_video_packet(d_video); + if(i==0x1B3) break; // found it! + if(!i || !skip_video_packet(d_video)){ + if(verbose) printf("NONE :(\n"); + printf("MPEG: FATAL: EOF while searching for sequence header\n"); + exit(1); + } + } + if(verbose) printf("OK!\n"); + sh_video->format=1; // mpeg video + has_audio=0; // ES streams has no audio channel + break; } case DEMUXER_TYPE_MPEG_PS: { if(has_audio) @@ -781,10 +759,27 @@ printf("MPEG: No Audio stream found... ->nosound\n"); has_audio=0; } else { - has_audio=d_audio->type; + switch(d_audio->type){ + case 1: sh_audio->format=0x50;break; // mpeg + case 2: sh_audio->format=0x2;break; // pcm + case 3: sh_audio->format=0x2000;break; // ac3 + default: has_audio=0; // unknown type + } } - if(verbose) printf("detected MPG-PS audio format: %d\n",has_audio); - has_video=1; // mpeg video + if(has_audio) if(verbose) printf("detected MPG-PS audio format: %d\n",sh_audio->format); + // Find sequence_header first: + if(verbose) printf("Searching for sequence header... ");fflush(stdout); + while(1){ + int i=sync_video_packet(d_video); + if(i==0x1B3) break; // found it! + if(!i || !skip_video_packet(d_video)){ + if(verbose) printf("NONE :(\n"); + printf("MPEG: FATAL: EOF while searching for sequence header\n"); + exit(1); + } + } + if(verbose) printf("OK!\n"); + sh_video->format=1; // mpeg video break; } } // switch(file_format) @@ -793,52 +788,56 @@ fflush(stdout); -//================== Init VIDEO (codec & libvo) ========================== - -if(has_video==2){ - if(sh_video->video.fccHandler==mmioFOURCC('d', 'v', 'x', '1')) has_video=3; - if(sh_video->video.fccHandler==mmioFOURCC('d', 'i', 'v', 'x')) has_video=3; - if(sh_video->bih.biCompression==mmioFOURCC('d', 'v', 'x', '1')) has_video=3; - if(sh_video->bih.biCompression==mmioFOURCC('d', 'i', 'v', 'x')) has_video=3; -// if(sh_video->bih.biCompression==mmioFOURCC('D', 'I', 'V', 'X')) has_video=3; // Gabucino +//================== Init AUDIO (codec) ========================== +if(has_audio){ + // Go through the codec.conf and find the best codec... + sh_audio->codec=find_codec(sh_audio->format,NULL,1); + if(!sh_audio->codec){ + printf("Can't find codec for audio format 0x%X !\n",sh_audio->format); + has_audio=0; + } else { + printf("Found audio codec: %s drv=%d (%s)\n",sh_audio->codec->name,sh_audio->codec->driver,sh_audio->codec->info); + has_audio=sh_audio->codec->driver; + } } -if(has_video==2){ - if(!avi_header.video_codec) avi_header.video_codec=get_vids_codec_name(sh_video); - if(verbose) - printf("win32 video codec: '%s' %s%s%s\n",avi_header.video_codec, - avi_header.yuv_supported?"[YUV]":"", - avi_header.yuv_hack_needed?"[hack]":"", - avi_header.flipped?"[FLIP]":"" - ); - if(!avi_header.video_codec) exit(1); // unknown video codec - if(avi_header.vids_guid){ -#ifdef USE_DIRECTSHOW - has_video=4; // switching to DirectShow -#else - printf("MPlayer was compiled without DirectShow support!\n");exit(1); -#endif - } +if(has_audio){ + if(verbose) printf("Initializing audio codec...\n"); + has_audio=init_audio(sh_audio); + if(!has_audio){ + printf("Couldn't initialize audio codec! -> nosound\n"); + } else { + printf("AUDIO: samplerate=%d channels=%d bps=%d\n",has_audio,sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize); + } } +//================== Init VIDEO (codec & libvo) ========================== + +// Go through the codec.conf and find the best codec... +sh_video->codec=find_codec(sh_video->format,(unsigned int*) &sh_video->bih.biCompression,0); +if(!sh_video->codec){ + printf("Can't find codec for video format 0x%X !\n",sh_video->format); + exit(1); +} +has_video=sh_video->codec->driver; + +printf("Found video codec: %s drv=%d (%s)\n",sh_video->codec->name,sh_video->codec->driver,sh_video->codec->info); + +for(i=0;i<CODECS_MAX_OUTFMT;i++){ + out_fmt=sh_video->codec->outfmt[i]; + if(video_out->query_format(out_fmt)) break; +} +if(i>=CODECS_MAX_OUTFMT){ + printf("Sorry, selected video_out device is incompatible with this codec.\n"); + exit(1); +} +sh_video->outfmtidx=i; + switch(has_video){ case 2: { - if(avi_header.yuv_supported && video_out->query_format(IMGFMT_YUY2)) out_fmt=IMGFMT_YUY2; else - if(avi_header.no_32bpp_support && video_out->query_format(IMGFMT_BGR|32)) out_fmt=IMGFMT_BGR|24; else - if(video_out->query_format(IMGFMT_BGR|15)) out_fmt=IMGFMT_BGR|16; else - if(video_out->query_format(IMGFMT_BGR|16)) out_fmt=IMGFMT_BGR|16; else - if(video_out->query_format(IMGFMT_BGR|24)) out_fmt=IMGFMT_BGR|24; else - if(video_out->query_format(IMGFMT_BGR|32)) out_fmt=IMGFMT_BGR|32; else { - printf("Sorry, selected video_out device is incompatible with this codec.\n"); - printf("(It can't show 24bpp or 32bpp RGB images. Try to run X at 24/32bpp!)\n"); -// printf("(cannot convert between YUY2, YV12 and RGB colorspace formats)\n"); - exit(1); - } - //if(verbose) printf("AVI out_fmt=%X\n",out_fmt); - if(verbose) if(out_fmt==IMGFMT_YUY2) printf("Using YUV/YUY2 video output format!\n"); if(!init_video_codec(out_fmt)) exit(1); if(verbose) printf("INFO: Win32 video codec init OK!\n"); - if(out_fmt==(IMGFMT_BGR|16)) out_fmt=IMGFMT_BGR|15; // fix bpp + //if(out_fmt==(IMGFMT_BGR|16)) out_fmt=IMGFMT_BGR|15; // fix bpp FIXME! // calculating video bitrate: avi_header.bitrate=avi_header.movi_end-avi_header.movi_start-avi_header.idx_size*8; @@ -861,24 +860,14 @@ movie_size_y=abs(sh_video->o_bih.biHeight); break; } -#ifdef USE_DIRECTSHOW case 4: { // Win32/DirectShow - if(avi_header.yuv_supported && video_out->query_format(IMGFMT_YUY2)) out_fmt=IMGFMT_YUY2; else -// if(avi_header.no_32bpp_support && video_out->query_format(IMGFMT_BGR|32)) out_fmt=IMGFMT_BGR|24; else - if(video_out->query_format(IMGFMT_BGR|15)) out_fmt=IMGFMT_BGR|15; else - if(video_out->query_format(IMGFMT_BGR|16)) out_fmt=IMGFMT_BGR|16; else - if(video_out->query_format(IMGFMT_BGR|24)) out_fmt=IMGFMT_BGR|24; else - if(video_out->query_format(IMGFMT_BGR|32)) out_fmt=IMGFMT_BGR|32; else { - printf("Sorry, selected video_out device is incompatible with this codec.\n"); - printf("(It can't show 24bpp or 32bpp RGB images. Try to run X at 24/32bpp!)\n"); -// printf("(cannot convert between YUY2, YV12 and RGB colorspace formats)\n"); - exit(1); - } - //if(verbose) printf("AVI out_fmt=%X\n",out_fmt); - if(verbose) if(out_fmt==IMGFMT_YUY2) printf("Using YUV/YUY2 video output format!\n"); +#ifndef USE_DIRECTSHOW + printf("MPlayer was compiled WITHOUT directshow support!\n"); + exit(1); +#else sh_video->our_out_buffer=NULL; - if(DS_VideoDecoder_Open(avi_header.video_codec,avi_header.vids_guid, &sh_video->bih, 0, &sh_video->our_out_buffer)){ - printf("ERROR: Couldn't open required DirectShow codec: %s\n",avi_header.video_codec); + if(DS_VideoDecoder_Open(sh_video->codec->dll,&sh_video->codec->guid, &sh_video->bih, 0, &sh_video->our_out_buffer)){ + printf("ERROR: Couldn't open required DirectShow codec: %s\n",sh_video->codec->dll); printf("Maybe you forget to upgrade your win32 codecs?? It's time to download the new\n"); printf("package from: ftp://thot.banki.hu/esp-team/linux/MPlayer/w32codec.zip !\n"); printf("Or you should disable DShow support: make distclean;make -f Makefile.No-DS\n"); @@ -921,12 +910,6 @@ } #endif case 3: { // OpenDivX - out_fmt=IMGFMT_YV12; - if(!video_out->query_format(out_fmt)) { - printf("Sorry, selected video_out device is incompatible with this codec!\n"); - exit(1); - } - if(verbose) printf("OpenDivX video codec\n"); { DEC_PARAM dec_param; DEC_SET dec_set; @@ -956,29 +939,11 @@ avi_header.bitrate/1024.0f ); // display info: -// movie_size_x=sh_video->bih.biWidth+(divx_quality?0:64); movie_size_x=sh_video->bih.biWidth; movie_size_y=abs(sh_video->bih.biHeight); break; } case 1: { - out_fmt=IMGFMT_YV12; - if(!video_out->query_format(out_fmt)) { - printf("Sorry, selected video_out device is incompatible with this codec!\n"); - exit(1); - } - // Find sequence_header first: - if(verbose) printf("Searching for sequence header... ");fflush(stdout); - while(1){ - int i=sync_video_packet(d_video); - if(i==0x1B3) break; // found it! - if(!i || !skip_video_packet(d_video)){ - if(verbose) printf("NONE :(\n"); - printf("MPEG: FATAL: EOF while searching for sequence header\n"); - exit(1); - } - } - if(verbose) printf("FOUND!\n"); // allocate some shared memory for the video packet buffer: videobuffer=shmem_alloc(VIDEOBUFFER_SIZE); if(!videobuffer){ printf("Cannot allocate shared memory\n");exit(0);} @@ -1017,7 +982,6 @@ picture->bitrate*0.5f, picture->bitrate/16.0f ); // display info: -// movie_size_x=picture->coded_picture_width; movie_size_x=picture->display_picture_width; movie_size_y=picture->display_picture_height; break; @@ -1167,16 +1131,6 @@ current_module="setup_audio"; if(has_audio){ - - if(verbose) printf("Initializing audio codec...\n"); - - sh_audio->codec.driver=has_audio; // FIXME! - has_audio=init_audio(sh_audio); - sh_audio->codec.driver=has_audio; // FIXME! - -if(verbose) printf("Audio: type: %d samplerate=%d channels=%d bps=%d\n",has_audio,sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize); - -if(has_audio){ #ifdef USE_XMMP_AUDIO xmm_Init( &xmm ); xmm.cSound = (XMM_PluginSound *)xmm_PluginRegister( XMMP_AUDIO_DRIVER ); @@ -1247,7 +1201,6 @@ printf("Audio buffer size: %d bytes, delay: %5.3fs\n",audio_buffer_size,buffer_delay); } -} // has_audio if(has_audio){ printf("Audio: type: %d samplerate: %d channels: %d bps: %d\n",has_audio,sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize); @@ -1283,15 +1236,6 @@ printf("Start playing...\n");fflush(stdout); -#if 0 - // ACM debug code -{ DWORD srcsize=0; - DWORD dstsize=16384*8; - int ret=acmStreamSize(avi_header.srcstream,dstsize, &srcsize, ACM_STREAMSIZEF_DESTINATION); - printf("acmStreamSize %d -> %d (err=%d)\n",dstsize,srcsize,ret); -} -#endif - InitTimer(); while(!eof){ @@ -1303,7 +1247,7 @@ // Update buffer if needed unsigned int t=GetTimer(); current_module="decode_audio"; // Enter AUDIO decoder module - sh_audio->codec.driver=has_audio; // FIXME! + sh_audio->codec->driver=has_audio; // FIXME! while(sh_audio->a_buffer_len<OUTBURST && !d_audio->eof){ int ret=decode_audio(sh_audio,&sh_audio->a_buffer[sh_audio->a_buffer_len],sh_audio->a_buffer_size-sh_audio->a_buffer_len); if(ret>0) sh_audio->a_buffer_len+=ret; else break; @@ -1934,7 +1878,7 @@ avi_header.idx_pos_a=avi_header.idx_pos_v= avi_header.idx_pos=audio_chunk_pos; - if(!avi_header.audio_seekable){ + if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){ #if 0 // curr_audio_pos=apos; // selected audio codec can't seek in chunk skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf.nAvgBytesPerSec;
--- a/stheader.h Sat Apr 07 16:59:51 2001 +0000 +++ b/stheader.h Sat Apr 07 21:27:57 2001 +0000 @@ -1,13 +1,16 @@ // Stream headers: +/* typedef struct { int driver; // codec descriptor from codec.conf } codecinfo_t; +*/ typedef struct { demux_stream_t *ds; - codecinfo_t codec; + unsigned int format; + codecs_t *codec; // output format: int samplerate; int samplesize; @@ -36,11 +39,12 @@ typedef struct { demux_stream_t *ds; - codecinfo_t codec; + unsigned int format; + codecs_t *codec; // output format: float fps; float frametime; // 1/fps - unsigned int outfmt; + unsigned int outfmtidx; // unsigned int bitrate; // buffers: char *our_out_buffer;