Mercurial > mplayer.hg
diff dll_init.c @ 92:92776006958f
ACM code cleanup, nosound at ACM error
author | arpi_esp |
---|---|
date | Mon, 12 Mar 2001 01:09:35 +0000 |
parents | 3b5f5d1c5041 |
children | da98e96499bb |
line wrap: on
line diff
--- 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<srcsize){ + a_in_buffer_len+= + demux_read_data(d_audio,&a_in_buffer[a_in_buffer_len], + srcsize-a_in_buffer_len); + } + memset(&ash, 0, sizeof(ash)); + ash.cbStruct=sizeof(ash); + ash.fdwStatus=0; + ash.dwUser=0; + ash.pbSrc=a_in_buffer; + ash.cbSrcLength=a_in_buffer_len; + ash.pbDst=a_buffer; + ash.cbDstLength=len; + hr=acmStreamPrepareHeader(avi_header.srcstream,&ash,0); + if(hr){ + printf("ACM_Decoder: acmStreamPrepareHeader error %d\n",hr); + return -1; + } + hr=acmStreamConvert(avi_header.srcstream,&ash,0); + if(hr){ + printf("ACM_Decoder: acmStreamConvert error %d\n",hr); + return -1; + } + //printf("ACM convert %d -> %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;