summaryrefslogtreecommitdiffstats
path: root/dll_init.c
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-12 01:09:35 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-12 01:09:35 +0000
commit18b80426e8b647c5ba269608def0269cb6a7d27c (patch)
treef2fdbd4aa896bf681520cae57e9edc309db69a22 /dll_init.c
parent8a22dd0a5288444acb9b84a6e58ee223062db1de (diff)
downloadmpv-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.c55
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;