# HG changeset patch # User arpi_esp # Date 984359375 0 # Node ID 92776006958fa4f6dfe9e37ab9dd1e10b2821faa # Parent 315979891f2d802b819d318f67448f5bb8c0bd60 ACM code cleanup, nosound at ACM error diff -r 315979891f2d -r 92776006958f dll_init.c --- a/dll_init.c Sun Mar 11 23:01:14 2001 +0000 +++ b/dll_init.c Mon Mar 12 01:09:35 2001 +0000 @@ -1,6 +1,10 @@ // ACM audio and VfW video codecs initialization // based on the avifile library [http://divx.euro.ru] +static char* a_in_buffer=NULL; +static int a_in_buffer_len=0; +static int a_in_buffer_size=0; + int init_audio_codec(){ HRESULT ret; WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext; @@ -45,9 +49,60 @@ avi_header.audio_in_minsize=srcsize; // audio input min. size if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize); + a_in_buffer_size=avi_header.audio_in_minsize; + a_in_buffer=malloc(a_in_buffer_size); + a_in_buffer_len=0; + return 1; } +int acm_decode_audio(void* a_buffer,int len){ + ACMSTREAMHEADER ash; + HRESULT hr; + DWORD srcsize=0; + acmStreamSize(avi_header.srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION); + if(verbose>=3)printf("acm says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,a_in_buffer_size,len); +// if(srcsize==0) srcsize=((WAVEFORMATEX *)&avi_header.wf_ext)->nBlockAlign; + if(srcsize>a_in_buffer_size) srcsize=a_in_buffer_size; // !!!!!! + if(a_in_buffer_len %d (buf=%d)\n",ash.cbSrcLengthUsed,ash.cbDstLengthUsed,a_in_buffer_len); + if(ash.cbSrcLengthUsed>=a_in_buffer_len){ + a_in_buffer_len=0; + } else { + a_in_buffer_len-=ash.cbSrcLengthUsed; + memcpy(a_in_buffer,&a_in_buffer[ash.cbSrcLengthUsed],a_in_buffer_len); + } + len=ash.cbDstLengthUsed; + hr=acmStreamUnprepareHeader(avi_header.srcstream,&ash,0); + if(hr){ + printf("ACM_Decoder: acmStreamUnprepareHeader error %d\n",hr); + } + return len; +} + + int init_video_codec(int outfmt){ HRESULT ret; diff -r 315979891f2d -r 92776006958f mplayer.c --- a/mplayer.c Sun Mar 11 23:01:14 2001 +0000 +++ b/mplayer.c Mon Mar 12 01:09:35 2001 +0000 @@ -995,9 +995,6 @@ char* a_buffer=NULL; int a_buffer_len=0; int a_buffer_size=0; -char* a_in_buffer=NULL; -int a_in_buffer_len=0; -int a_in_buffer_size=0; int audio_fd=-1; int pcm_bswap=0; float buffer_delay=0; @@ -1058,9 +1055,6 @@ if(init_audio_codec()){ MP3_channels=avi_header.wf.nChannels; MP3_samplerate=avi_header.wf.nSamplesPerSec; - a_in_buffer_size=avi_header.audio_in_minsize; - a_in_buffer=malloc(a_in_buffer_size); - a_in_buffer_len=0; if(a_buffer_size switching to nosound...\n",ret); + has_audio=0; + } else { + a_buffer_len=ret; + printf("ACM decoding test: %d bytes\n",ret); + } +} + if(has_audio==2){ if(file_format==DEMUXER_TYPE_AVI || file_format==DEMUXER_TYPE_AVI_NI){ // AVI PCM Audio: @@ -1236,12 +1241,14 @@ printf("Start playing...\n");fflush(stdout); -if(0) // ACM debug code +#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(); @@ -1286,12 +1293,12 @@ } case 6: // MS-GSM decoder { unsigned char buf[65]; // 65 bytes / frame - while(a_buffer_len 320 short + while(a_buffer_len 320 short // XA_GSM_Decoder(buf,(unsigned short *) &a_buffer[a_buffer_len]); // decodes 33 byte -> 160 short - a_buffer_len+=2*320; - } + a_buffer_len+=2*320; + } break; } case 3: // AC3 decoder @@ -1306,46 +1313,8 @@ //printf("{3:%d}",avi_header.idx_pos);fflush(stdout); break; case 4: - { ACMSTREAMHEADER ash; - HRESULT hr; - DWORD srcsize=0; - acmStreamSize(avi_header.srcstream,a_buffer_size-a_buffer_len , &srcsize, ACM_STREAMSIZEF_DESTINATION); - if(verbose>=3)printf("acm says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,a_in_buffer_size,a_buffer_size-a_buffer_len); -// if(srcsize==0) srcsize=((WAVEFORMATEX *)&avi_header.wf_ext)->nBlockAlign; - if(srcsize>a_in_buffer_size) srcsize=a_in_buffer_size; // !!!!!! - if(a_in_buffer_len %d (buf=%d)\n",ash.cbSrcLengthUsed,ash.cbDstLengthUsed,a_in_buffer_len); - if(ash.cbSrcLengthUsed>=a_in_buffer_len){ - a_in_buffer_len=0; - } else { - a_in_buffer_len-=ash.cbSrcLengthUsed; - memcpy(a_in_buffer,&a_in_buffer[ash.cbSrcLengthUsed],a_in_buffer_len); - } - a_buffer_len+=ash.cbDstLengthUsed; - hr=acmStreamUnprepareHeader(avi_header.srcstream,&ash,0); - if(hr){ - printf("ACM_Decoder: acmStreamUnprepareHeader error %d\n",hr); - } + { int ret=acm_decode_audio(&a_buffer[a_buffer_len],a_buffer_size-a_buffer_len); + if(ret>0) a_buffer_len+=ret; break; } }