diff options
-rw-r--r-- | DOCS/codecs.conf | 81 | ||||
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | cfg-mplayer.h | 4 | ||||
-rw-r--r-- | codec-cfg.c | 110 | ||||
-rw-r--r-- | codec-cfg.h | 8 | ||||
-rw-r--r-- | dec_audio.c | 140 | ||||
-rw-r--r-- | dll_init.c | 15 | ||||
-rw-r--r-- | libvo/vo_x11.c | 11 | ||||
-rw-r--r-- | mplayer.c | 246 | ||||
-rw-r--r-- | stheader.h | 10 |
10 files changed, 296 insertions, 335 deletions
diff --git a/DOCS/codecs.conf b/DOCS/codecs.conf index 5defd8c576..93beaa281d 100644 --- a/DOCS/codecs.conf +++ b/DOCS/codecs.conf @@ -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,48 +15,48 @@ videocodec mpeg4 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 +videocodec divxds 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 + driver dshow + dll "divx_c32.ax" + guid 0x82CCd3E0, 0xF71A, 0x11D0, 0x9f, 0xe5, 0x00, 0x60, 0x97, 0x78, 0xaa, 0xaa + 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 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 - + 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 @@ videocodec indeo4 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 @@ videocodec indeo3 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 @@ videocodec i263 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 @@ videocodec mjpeg 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 @@ videocodec wmv1 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 @@ audiocodec msgsm 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 @@ -22,8 +22,8 @@ PRG_CFG = codec-cfg 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 @@ $(PRG_TV): .depend tvision.o $(OBJS) $(COMMONLIBS) $(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) diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 00c0809b42..b99ecc77ea 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -34,8 +34,8 @@ struct config conf[]={ {"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}, diff --git a/codec-cfg.c b/codec-cfg.c index 6e56589f02..88c5cd5351 100644 --- a/codec-cfg.c +++ b/codec-cfg.c @@ -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 @@ ret_eol: 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 @@ int add_to_fourcc(char *s, char *alias, unsigned int *fourcc, 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_format(char *s, unsigned int *fourcc, unsigned int *fourccmap) } -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 @@ int add_to_out(char *sfmt, char *sflags, unsigned int *outfmt, 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 @@ short get_driver(char *s,int audioflag) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ codecs_t *parse_codec_cfg(char *cfgfile) 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 @@ eof_out: 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) { diff --git a/codec-cfg.h b/codec-cfg.h index 6e983fbace..a596d63335 100644 --- a/codec-cfg.h +++ b/codec-cfg.h @@ -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 @@ typedef struct { 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 diff --git a/dec_audio.c b/dec_audio.c index c5e369da5c..780ce0be1a 100644 --- a/dec_audio.c +++ b/dec_audio.c @@ -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 @@ if(has_audio==4){ 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; - - 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; + printf("DShow_audio: channs=%d rate=%d\n",sh_audio->channels,sh_audio->samplerate); - 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 @@ if(has_audio==2){ // 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(has_audio==3){ 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 @@ if(has_audio==1){ // 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 diff --git a/dll_init.c b/dll_init.c index 62f62f0eea..232cb41db0 100644 --- a/dll_init.c +++ b/dll_init.c @@ -21,7 +21,7 @@ int init_acm_audio_codec(sh_audio_t *sh_audio){ 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 acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int len){ -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 @@ int init_video_codec(int outfmt){ 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 @@ int init_video_codec(int outfmt){ 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!!!! diff --git a/libvo/vo_x11.c b/libvo/vo_x11.c index 1e6294a99f..49c5c61f44 100644 --- a/libvo/vo_x11.c +++ b/libvo/vo_x11.c @@ -514,11 +514,16 @@ static uint32_t draw_frame( uint8_t *src[] ) 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; } @@ -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 @@ typedef struct { 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 @@ static const int frameratecode2framerate[16] = { 60*10000, 0,0,0,0,0,0,0 }; -#include "codecs.c" - //**************************************************************************// // Audio codecs: //**************************************************************************// @@ -409,7 +389,7 @@ int stream_type; 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 @@ if(!filename){ } } +// 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(file_format==DEMUXER_TYPE_UNKNOWN){ 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 @@ switch(file_format){ } 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 @@ switch(file_format){ // 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 @@ switch(file_format){ 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 @@ switch(file_format){ 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 @@ switch(file_format){ 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 @@ switch(file_format){ 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 @@ switch(file_format){ 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("Search |