comparison 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
comparison
equal deleted inserted replaced
91:315979891f2d 92:92776006958f
1 // ACM audio and VfW video codecs initialization 1 // ACM audio and VfW video codecs initialization
2 // based on the avifile library [http://divx.euro.ru] 2 // based on the avifile library [http://divx.euro.ru]
3
4 static char* a_in_buffer=NULL;
5 static int a_in_buffer_len=0;
6 static int a_in_buffer_size=0;
3 7
4 int init_audio_codec(){ 8 int init_audio_codec(){
5 HRESULT ret; 9 HRESULT ret;
6 WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext; 10 WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext;
7 unsigned long srcsize=0; 11 unsigned long srcsize=0;
43 47
44 acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION); 48 acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION);
45 avi_header.audio_in_minsize=srcsize; // audio input min. size 49 avi_header.audio_in_minsize=srcsize; // audio input min. size
46 if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize); 50 if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize);
47 51
52 a_in_buffer_size=avi_header.audio_in_minsize;
53 a_in_buffer=malloc(a_in_buffer_size);
54 a_in_buffer_len=0;
55
48 return 1; 56 return 1;
49 } 57 }
58
59 int acm_decode_audio(void* a_buffer,int len){
60 ACMSTREAMHEADER ash;
61 HRESULT hr;
62 DWORD srcsize=0;
63 acmStreamSize(avi_header.srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION);
64 if(verbose>=3)printf("acm says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,a_in_buffer_size,len);
65 // if(srcsize==0) srcsize=((WAVEFORMATEX *)&avi_header.wf_ext)->nBlockAlign;
66 if(srcsize>a_in_buffer_size) srcsize=a_in_buffer_size; // !!!!!!
67 if(a_in_buffer_len<srcsize){
68 a_in_buffer_len+=
69 demux_read_data(d_audio,&a_in_buffer[a_in_buffer_len],
70 srcsize-a_in_buffer_len);
71 }
72 memset(&ash, 0, sizeof(ash));
73 ash.cbStruct=sizeof(ash);
74 ash.fdwStatus=0;
75 ash.dwUser=0;
76 ash.pbSrc=a_in_buffer;
77 ash.cbSrcLength=a_in_buffer_len;
78 ash.pbDst=a_buffer;
79 ash.cbDstLength=len;
80 hr=acmStreamPrepareHeader(avi_header.srcstream,&ash,0);
81 if(hr){
82 printf("ACM_Decoder: acmStreamPrepareHeader error %d\n",hr);
83 return -1;
84 }
85 hr=acmStreamConvert(avi_header.srcstream,&ash,0);
86 if(hr){
87 printf("ACM_Decoder: acmStreamConvert error %d\n",hr);
88 return -1;
89 }
90 //printf("ACM convert %d -> %d (buf=%d)\n",ash.cbSrcLengthUsed,ash.cbDstLengthUsed,a_in_buffer_len);
91 if(ash.cbSrcLengthUsed>=a_in_buffer_len){
92 a_in_buffer_len=0;
93 } else {
94 a_in_buffer_len-=ash.cbSrcLengthUsed;
95 memcpy(a_in_buffer,&a_in_buffer[ash.cbSrcLengthUsed],a_in_buffer_len);
96 }
97 len=ash.cbDstLengthUsed;
98 hr=acmStreamUnprepareHeader(avi_header.srcstream,&ash,0);
99 if(hr){
100 printf("ACM_Decoder: acmStreamUnprepareHeader error %d\n",hr);
101 }
102 return len;
103 }
104
50 105
51 106
52 int init_video_codec(int outfmt){ 107 int init_video_codec(int outfmt){
53 HRESULT ret; 108 HRESULT ret;
54 109