Mercurial > mplayer.hg
annotate libmpcodecs/ad_qtaudio.c @ 8294:8e00b6a9e40b
DMO interfaces (copied/converted(c++->c) from avifile)
author | arpi |
---|---|
date | Tue, 26 Nov 2002 22:54:11 +0000 |
parents | badd24741e4a |
children | e8c51ec86340 |
rev | line source |
---|---|
8008 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <unistd.h> | |
4 #include <inttypes.h> | |
5 | |
6 #include "config.h" | |
7 | |
8159 | 8 #ifdef USE_QTX_CODECS |
8008 | 9 |
10 #include "ad_internal.h" | |
11 #include "bswap.h" | |
12 | |
13 static ad_info_t info = { | |
14 "QuickTime Audio Decoder", | |
15 "qtaudio", | |
16 "A'rpi", | |
17 "Sascha Sommer", | |
18 "uses win32 quicktime DLLs" | |
19 }; | |
20 | |
21 LIBAD_EXTERN(qtaudio) | |
22 | |
23 typedef struct OpaqueSoundConverter* SoundConverter; | |
24 typedef unsigned long OSType; | |
25 typedef unsigned long UnsignedFixed; | |
26 typedef uint8_t Byte; | |
27 typedef struct SoundComponentData { | |
28 long flags; | |
29 OSType format; | |
30 short numChannels; | |
31 short sampleSize; | |
32 UnsignedFixed sampleRate; | |
33 long sampleCount; | |
34 Byte * buffer; | |
35 long reserved; | |
36 }SoundComponentData; | |
37 | |
38 typedef int (__cdecl* LPFUNC1)(long flag); | |
39 typedef int (__cdecl* LPFUNC2)(const SoundComponentData *, const SoundComponentData *,SoundConverter *); | |
40 typedef int (__cdecl* LPFUNC3)(SoundConverter sc); | |
41 typedef int (__cdecl* LPFUNC4)(void); | |
42 typedef int (__cdecl* LPFUNC5)(SoundConverter sc, OSType selector,void * infoPtr); | |
43 typedef int (__cdecl* LPFUNC6)(SoundConverter sc, | |
44 unsigned long inputBytesTarget, | |
45 unsigned long *inputFrames, | |
46 unsigned long *inputBytes, | |
47 unsigned long *outputBytes ); | |
48 typedef int (__cdecl* LPFUNC7)(SoundConverter sc, | |
49 const void *inputPtr, | |
50 unsigned long inputFrames, | |
51 void *outputPtr, | |
52 unsigned long *outputFrames, | |
53 unsigned long *outputBytes ); | |
54 typedef int (__cdecl* LPFUNC8)(SoundConverter sc, | |
55 void *outputPtr, | |
56 unsigned long *outputFrames, | |
57 unsigned long *outputBytes); | |
58 typedef int (__cdecl* LPFUNC9)(SoundConverter sc) ; | |
59 | |
60 static HINSTANCE qtml_dll; | |
61 static LPFUNC1 InitializeQTML; | |
62 static LPFUNC2 SoundConverterOpen; | |
63 static LPFUNC3 SoundConverterClose; | |
64 static LPFUNC4 TerminateQTML; | |
65 static LPFUNC5 SoundConverterSetInfo; | |
66 static LPFUNC6 SoundConverterGetBufferSizes; | |
67 static LPFUNC7 SoundConverterConvertBuffer; | |
68 static LPFUNC8 SoundConverterEndConversion; | |
69 static LPFUNC9 SoundConverterBeginConversion; | |
70 | |
71 #define siDecompressionParams 2002876005 // siDecompressionParams = FOUR_CHAR_CODE('wave') | |
72 | |
73 HMODULE WINAPI LoadLibraryA(LPCSTR); | |
74 FARPROC WINAPI GetProcAddress(HMODULE,LPCSTR); | |
75 int WINAPI FreeLibrary(HMODULE); | |
76 | |
77 static int loader_init() | |
78 { | |
79 | |
8270 | 80 #ifdef USE_WIN32DLL |
81 Setup_LDT_Keeper(); | |
82 #endif | |
8008 | 83 qtml_dll = LoadLibraryA("qtmlClient.dll"); |
84 if( qtml_dll == NULL ) | |
85 { | |
86 printf("failed loading dll\n" ); | |
87 return 1; | |
88 } | |
89 #if 1 | |
90 InitializeQTML = (LPFUNC1)GetProcAddress(qtml_dll,"InitializeQTML"); | |
91 if ( InitializeQTML == NULL ) | |
92 { | |
93 printf("failed geting proc address InitializeQTML\n"); | |
94 return 1; | |
95 } | |
96 SoundConverterOpen = (LPFUNC2)GetProcAddress(qtml_dll,"SoundConverterOpen"); | |
97 if ( SoundConverterOpen == NULL ) | |
98 { | |
99 printf("failed getting proc address SoundConverterOpen\n"); | |
100 return 1; | |
101 } | |
102 SoundConverterClose = (LPFUNC3)GetProcAddress(qtml_dll,"SoundConverterClose"); | |
103 if ( SoundConverterClose == NULL ) | |
104 { | |
105 printf("failed getting proc address SoundConverterClose\n"); | |
106 return 1; | |
107 } | |
108 TerminateQTML = (LPFUNC4)GetProcAddress(qtml_dll,"TerminateQTML"); | |
109 if ( TerminateQTML == NULL ) | |
110 { | |
111 printf("failed getting proc address TerminateQTML\n"); | |
112 return 1; | |
113 } | |
114 SoundConverterSetInfo = (LPFUNC5)GetProcAddress(qtml_dll,"SoundConverterSetInfo"); | |
115 if ( SoundConverterSetInfo == NULL ) | |
116 { | |
117 printf("failed getting proc address SoundConverterSetInfo\n"); | |
118 return 1; | |
119 } | |
120 SoundConverterGetBufferSizes = (LPFUNC6)GetProcAddress(qtml_dll,"SoundConverterGetBufferSizes"); | |
121 if ( SoundConverterGetBufferSizes == NULL ) | |
122 { | |
123 printf("failed getting proc address SoundConverterGetBufferSizes\n"); | |
124 return 1; | |
125 } | |
126 SoundConverterConvertBuffer = (LPFUNC7)GetProcAddress(qtml_dll,"SoundConverterConvertBuffer"); | |
127 if ( SoundConverterConvertBuffer == NULL ) | |
128 { | |
129 printf("failed getting proc address SoundConverterConvertBuffer1\n"); | |
130 return 1; | |
131 } | |
132 SoundConverterEndConversion = (LPFUNC8)GetProcAddress(qtml_dll,"SoundConverterEndConversion"); | |
133 if ( SoundConverterEndConversion == NULL ) | |
134 { | |
135 printf("failed getting proc address SoundConverterEndConversion\n"); | |
136 return 1; | |
137 } | |
138 SoundConverterBeginConversion = (LPFUNC9)GetProcAddress(qtml_dll,"SoundConverterBeginConversion"); | |
139 if ( SoundConverterBeginConversion == NULL ) | |
140 { | |
141 printf("failed getting proc address SoundConverterBeginConversion\n"); | |
142 return 1; | |
143 } | |
144 printf("Standard init done you may now call supported functions\n"); | |
145 #endif | |
146 printf("loader_init DONE???\n"); | |
147 return 0; | |
148 } | |
149 | |
150 static SoundConverter myConverter = NULL; | |
151 static SoundComponentData InputFormatInfo,OutputFormatInfo; | |
152 | |
153 static int InFrameSize; | |
154 static int OutFrameSize; | |
155 | |
156 static int preinit(sh_audio_t *sh){ | |
157 int error; | |
158 unsigned long FramesToGet=0; //how many frames the demuxer has to get | |
159 unsigned long InputBufferSize=0; //size of the input buffer | |
160 unsigned long OutputBufferSize=0; //size of the output buffer | |
161 unsigned long WantedBufferSize=0; //the size you want your buffers to be | |
162 | |
163 printf("win32 libquicktime loader (c) Sascha Sommer\n"); | |
164 | |
165 if(loader_init()) return 0; // failed to load DLL | |
166 | |
167 printf("loader_init DONE!\n"); | |
168 | |
169 #if 1 | |
8159 | 170 error = InitializeQTML(6+16); |
8008 | 171 printf("InitializeQTML:%i\n",error); |
172 if(error) return 0; | |
173 | |
174 OutputFormatInfo.flags = InputFormatInfo.flags = 0; | |
175 OutputFormatInfo.sampleCount = InputFormatInfo.sampleCount = 0; | |
176 OutputFormatInfo.buffer = InputFormatInfo.buffer = NULL; | |
177 OutputFormatInfo.reserved = InputFormatInfo.reserved = 0; | |
178 OutputFormatInfo.numChannels = InputFormatInfo.numChannels = sh->wf->nChannels; | |
8159 | 179 InputFormatInfo.sampleSize = sh->wf->wBitsPerSample; |
180 OutputFormatInfo.sampleSize = 16; | |
8008 | 181 OutputFormatInfo.sampleRate = InputFormatInfo.sampleRate = sh->wf->nSamplesPerSec; |
182 InputFormatInfo.format = bswap_32(sh->format); //1363430706;///*1768775988;//*/1902406962;//qdm2//1768775988;//FOUR_CHAR_CODE('ima4'); | |
183 OutputFormatInfo.format = 1313820229;// FOUR_CHAR_CODE('NONE'); | |
184 | |
185 error = SoundConverterOpen(&InputFormatInfo, &OutputFormatInfo, &myConverter); | |
186 printf("SoundConverterOpen:%i\n",error); | |
187 if(error) return 0; | |
188 | |
189 if(sh->codecdata){ | |
190 error = SoundConverterSetInfo(myConverter,siDecompressionParams,sh->codecdata); | |
191 printf("SoundConverterSetInfo:%i\n",error); | |
192 if(error) return 0; | |
193 } | |
194 | |
195 WantedBufferSize=OutputFormatInfo.numChannels*OutputFormatInfo.sampleRate*2; | |
196 error = SoundConverterGetBufferSizes(myConverter, | |
197 WantedBufferSize,&FramesToGet,&InputBufferSize,&OutputBufferSize); | |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8008
diff
changeset
|
198 printf("SoundConverterGetBufferSizes:%i\n",error); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8008
diff
changeset
|
199 printf("WantedBufferSize = %li\n",WantedBufferSize); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8008
diff
changeset
|
200 printf("InputBufferSize = %li\n",InputBufferSize); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8008
diff
changeset
|
201 printf("OutputBufferSize = %li\n",OutputBufferSize); |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8008
diff
changeset
|
202 printf("FramesToGet = %li\n",FramesToGet); |
8008 | 203 |
204 InFrameSize=InputBufferSize/FramesToGet; | |
205 OutFrameSize=OutputBufferSize/FramesToGet; | |
206 | |
207 printf("FrameSize: %i -> %i\n",InFrameSize,OutFrameSize); | |
208 | |
209 error = SoundConverterBeginConversion(myConverter); | |
210 printf("SoundConverterBeginConversion:%i\n",error); | |
211 if(error) return 0; | |
212 | |
213 sh->audio_out_minsize=OutputBufferSize; | |
214 sh->audio_in_minsize=InputBufferSize; | |
215 | |
216 sh->channels=sh->wf->nChannels; | |
217 sh->samplerate=sh->wf->nSamplesPerSec; | |
8159 | 218 sh->samplesize=2; //(sh->wf->wBitsPerSample+7)/8; |
8008 | 219 |
220 sh->i_bps=sh->wf->nAvgBytesPerSec; | |
221 //InputBufferSize*WantedBufferSize/OutputBufferSize; | |
222 | |
223 #endif | |
8159 | 224 |
225 if(sh->format==0x3343414D){ | |
226 // MACE 3:1 | |
227 sh->ds->ss_div = 2*3; // 1 samples/packet | |
228 sh->ds->ss_mul = sh->channels*2*1; // 1 bytes/packet | |
229 } else | |
230 if(sh->format==0x3643414D){ | |
231 // MACE 6:1 | |
232 sh->ds->ss_div = 2*6; // 1 samples/packet | |
233 sh->ds->ss_mul = sh->channels*2*1; // 1 bytes/packet | |
234 } | |
235 | |
8008 | 236 return 1; // return values: 1=OK 0=ERROR |
237 } | |
238 | |
239 static int init(sh_audio_t *sh_audio){ | |
240 | |
241 return 1; // return values: 1=OK 0=ERROR | |
242 } | |
243 | |
244 static void uninit(sh_audio_t *sh){ | |
245 int error; | |
246 unsigned long ConvertedFrames=0; | |
247 unsigned long ConvertedBytes=0; | |
248 error=SoundConverterEndConversion(myConverter,NULL,&ConvertedFrames,&ConvertedBytes); | |
249 printf("SoundConverterEndConversion:%i\n",error); | |
250 error = SoundConverterClose(myConverter); | |
251 printf("SoundConverterClose:%i\n",error); | |
252 error = TerminateQTML(); | |
253 printf("TerminateQTML:%i\n",error); | |
254 FreeLibrary( qtml_dll ); | |
255 qtml_dll = NULL; | |
256 printf("qt dll loader uninit done\n"); | |
257 } | |
258 | |
259 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen){ | |
260 int error; | |
261 unsigned long FramesToGet=0; //how many frames the demuxer has to get | |
262 unsigned long InputBufferSize=0; //size of the input buffer | |
263 unsigned long ConvertedFrames=0; | |
264 unsigned long ConvertedBytes=0; | |
265 | |
266 FramesToGet=minlen/OutFrameSize; | |
267 if(FramesToGet*OutFrameSize<minlen && | |
268 (FramesToGet+1)*OutFrameSize<=maxlen) ++FramesToGet; | |
269 if(FramesToGet*InFrameSize>sh->a_in_buffer_size) | |
270 FramesToGet=sh->a_in_buffer_size/InFrameSize; | |
271 | |
272 InputBufferSize=FramesToGet*InFrameSize; | |
273 | |
8159 | 274 // printf("FramesToGet = %li (%li -> %li bytes)\n",FramesToGet, |
275 // InputBufferSize, FramesToGet*OutFrameSize); | |
8008 | 276 |
277 if(InputBufferSize>sh->a_in_buffer_len){ | |
278 int x=demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], | |
279 InputBufferSize-sh->a_in_buffer_len); | |
280 if(x>0) sh->a_in_buffer_len+=x; | |
281 if(InputBufferSize>sh->a_in_buffer_len) | |
282 FramesToGet=sh->a_in_buffer_len/InFrameSize; // not enough data! | |
283 } | |
284 | |
8159 | 285 // printf("\nSoundConverterConvertBuffer(myConv=%p,inbuf=%p,frames=%d,outbuf=%p,&convframes=%p,&convbytes=%p)\n", |
286 // myConverter,sh->a_in_buffer,FramesToGet,buf,&ConvertedFrames,&ConvertedBytes); | |
8008 | 287 error = SoundConverterConvertBuffer(myConverter,sh->a_in_buffer, |
288 FramesToGet,buf,&ConvertedFrames,&ConvertedBytes); | |
8159 | 289 // printf("SoundConverterConvertBuffer:%i\n",error); |
290 // printf("ConvertedFrames = %li\n",ConvertedFrames); | |
291 // printf("ConvertedBytes = %li\n",ConvertedBytes); | |
8008 | 292 |
293 InputBufferSize=(ConvertedBytes/OutFrameSize)*InFrameSize; // FIXME!! | |
294 sh->a_in_buffer_len-=InputBufferSize; | |
295 if(sh->a_in_buffer_len<0) sh->a_in_buffer_len=0; // should not happen... | |
296 else if(sh->a_in_buffer_len>0){ | |
297 memcpy(sh->a_in_buffer,&sh->a_in_buffer[InputBufferSize],sh->a_in_buffer_len); | |
298 } | |
299 | |
300 return ConvertedBytes; | |
301 } | |
302 | |
303 static int control(sh_audio_t *sh,int cmd,void* arg, ...){ | |
304 // various optional functions you MAY implement: | |
305 return CONTROL_UNKNOWN; | |
306 } | |
307 | |
308 #endif |