diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-03-12 01:09:35 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-03-12 01:09:35 +0000 |
commit | 18b80426e8b647c5ba269608def0269cb6a7d27c (patch) | |
tree | f2fdbd4aa896bf681520cae57e9edc309db69a22 /dll_init.c | |
parent | 8a22dd0a5288444acb9b84a6e58ee223062db1de (diff) | |
download | mpv-18b80426e8b647c5ba269608def0269cb6a7d27c.tar.bz2 mpv-18b80426e8b647c5ba269608def0269cb6a7d27c.tar.xz |
ACM code cleanup, nosound at ACM error
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@93 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'dll_init.c')
-rw-r--r-- | dll_init.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/dll_init.c b/dll_init.c index dac4e12d9d..deaa29e499 100644 --- a/dll_init.c +++ b/dll_init.c @@ -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 @@ int init_audio_codec(){ 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; |