summaryrefslogtreecommitdiffstats
path: root/dll_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'dll_init.c')
-rw-r--r--dll_init.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/dll_init.c b/dll_init.c
new file mode 100644
index 0000000000..dac4e12d9d
--- /dev/null
+++ b/dll_init.c
@@ -0,0 +1,164 @@
+// ACM audio and VfW video codecs initialization
+// based on the avifile library [http://divx.euro.ru]
+
+int init_audio_codec(){
+ HRESULT ret;
+ WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext;
+ unsigned long srcsize=0;
+
+ if(verbose) printf("======= Win32 (ACM) AUDIO Codec init =======\n");
+
+ avi_header.srcstream=NULL;
+
+// if(in_fmt->nSamplesPerSec==0){ printf("Bad WAVE header!\n");exit(1); }
+// MSACM_RegisterAllDrivers();
+
+ avi_header.wf.nChannels=in_fmt->nChannels;
+ avi_header.wf.nSamplesPerSec=in_fmt->nSamplesPerSec;
+ avi_header.wf.nAvgBytesPerSec=2*avi_header.wf.nSamplesPerSec*avi_header.wf.nChannels;
+ avi_header.wf.wFormatTag=WAVE_FORMAT_PCM;
+ avi_header.wf.nBlockAlign=2*in_fmt->nChannels;
+ avi_header.wf.wBitsPerSample=16;
+ avi_header.wf.cbSize=0;
+
+ win32_codec_name = avi_header.audio_codec;
+ ret=acmStreamOpen(&avi_header.srcstream,(HACMDRIVER)NULL,
+ in_fmt,&avi_header.wf,
+ NULL,0,0,0);
+ if(ret){
+ if(ret==ACMERR_NOTPOSSIBLE)
+ printf("ACM_Decoder: Unappropriate audio format\n");
+ else
+ printf("ACM_Decoder: acmStreamOpen error %d", ret);
+ avi_header.srcstream=NULL;
+ return 0;
+ }
+ if(verbose) printf("Audio codec opened OK! ;-)\n");
+
+ srcsize=in_fmt->nBlockAlign;
+ acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_SOURCE);
+ if(srcsize<OUTBURST) srcsize=OUTBURST;
+ avi_header.audio_out_minsize=srcsize; // audio output min. size
+ if(verbose) printf("Audio ACM output buffer min. size: %d\n",srcsize);
+
+ acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION);
+ avi_header.audio_in_minsize=srcsize; // audio input min. size
+ if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize);
+
+ return 1;
+}
+
+
+int init_video_codec(int outfmt){
+ HRESULT ret;
+
+ if(verbose) printf("======= Win32 (VFW) VIDEO Codec init =======\n");
+
+ memset(&avi_header.o_bih, 0, sizeof(BITMAPINFOHEADER));
+ avi_header.o_bih.biSize = sizeof(BITMAPINFOHEADER);
+
+ win32_codec_name = avi_header.video_codec;
+ avi_header.hic = ICOpen( 0x63646976, avi_header.bih.biCompression, ICMODE_FASTDECOMPRESS);
+// avi_header.hic = ICOpen( 0x63646976, avi_header.bih.biCompression, ICMODE_DECOMPRESS);
+ if(!avi_header.hic){
+ printf("ICOpen failed! unknown codec / wrong parameters?\n");
+ return 0;
+ }
+
+// avi_header.bih.biBitCount=32;
+
+ ret = ICDecompressGetFormat(avi_header.hic, &avi_header.bih, &avi_header.o_bih);
+ if(ret){
+ printf("ICDecompressGetFormat failed: Error %d\n", ret);
+ return 0;
+ }
+ if(verbose) printf("ICDecompressGetFormat OK\n");
+
+// printf("ICM_DECOMPRESS_QUERY=0x%X",ICM_DECOMPRESS_QUERY);
+
+// avi_header.o_bih.biWidth=avi_header.bih.biWidth;
+// avi_header.o_bih.biCompression = 0x32315659; // mmioFOURCC('U','Y','V','Y');
+// ret=ICDecompressGetFormatSize(avi_header.hic,&avi_header.o_bih);
+// avi_header.o_bih.biCompression = 3; //0x32315659;
+// avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y');
+// avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y');
+// avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2');
+// avi_header.o_bih.biPlanes=3;
+// avi_header.o_bih.biBitCount=16;
+
+ if(outfmt==IMGFMT_YUY2)
+ avi_header.o_bih.biBitCount=16;
+ else
+ avi_header.o_bih.biBitCount=outfmt&0xFF;// //24;
+
+ avi_header.o_bih.biSizeImage=avi_header.o_bih.biWidth*avi_header.o_bih.biHeight*(avi_header.o_bih.biBitCount/8);
+
+ if(!avi_header.flipped)
+ avi_header.o_bih.biHeight=-avi_header.bih.biHeight; // flip image!
+
+ if(outfmt==IMGFMT_YUY2 && !avi_header.yuv_hack_needed)
+ avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2');
+
+// avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y');
+
+
+ if(verbose) {
+ printf("Starting decompression, format:\n");
+ printf(" biSize %d\n", avi_header.bih.biSize);
+ printf(" biWidth %d\n", avi_header.bih.biWidth);
+ printf(" biHeight %d\n", avi_header.bih.biHeight);
+ printf(" biPlanes %d\n", avi_header.bih.biPlanes);
+ printf(" biBitCount %d\n", avi_header.bih.biBitCount);
+ printf(" biCompression %d='%.4s'\n", avi_header.bih.biCompression, &avi_header.bih.biCompression);
+ printf(" biSizeImage %d\n", avi_header.bih.biSizeImage);
+ printf("Dest fmt:\n");
+ printf(" biSize %d\n", avi_header.o_bih.biSize);
+ printf(" biWidth %d\n", avi_header.o_bih.biWidth);
+ printf(" biHeight %d\n", avi_header.o_bih.biHeight);
+ printf(" biPlanes %d\n", avi_header.o_bih.biPlanes);
+ printf(" biBitCount %d\n", avi_header.o_bih.biBitCount);
+ printf(" biCompression %d='%.4s'\n", avi_header.o_bih.biCompression, &avi_header.o_bih.biCompression);
+ printf(" biSizeImage %d\n", avi_header.o_bih.biSizeImage);
+ }
+
+ ret = ICDecompressQuery(avi_header.hic, &avi_header.bih, &avi_header.o_bih);
+ if(ret){
+ printf("ICDecompressQuery failed: Error %d\n", ret);
+ return 0;
+ }
+ if(verbose) printf("ICDecompressQuery OK\n");
+
+
+ ret = ICDecompressBegin(avi_header.hic, &avi_header.bih, &avi_header.o_bih);
+ if(ret){
+ printf("ICDecompressBegin failed: Error %d\n", ret);
+ return 0;
+ }
+
+#if 0
+
+//avi_header.hic
+//ICSendMessage(HIC hic,unsigned int msg,long lParam1,long lParam2)
+{ int i;
+ for(i=73;i<256;i++){
+ printf("Calling ICM_USER+%d function...",i);fflush(stdout);
+ ret = ICSendMessage(avi_header.hic,ICM_USER+i,NULL,NULL);
+ printf(" ret=%d\n",ret);
+ }
+}
+#endif
+
+ avi_header.our_out_buffer = malloc(avi_header.o_bih.biSizeImage);
+ if(!avi_header.our_out_buffer){
+ printf("not enough memory for decoded picture buffer (%d bytes)\n", avi_header.o_bih.biSizeImage);
+ return 0;
+ }
+
+ if(outfmt==IMGFMT_YUY2 && avi_header.yuv_hack_needed)
+ avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2');
+
+// avi_header.our_in_buffer=malloc(avi_header.video.dwSuggestedBufferSize); // FIXME!!!!
+
+ if(verbose) printf("VIDEO CODEC Init OK!!! ;-)\n");
+ return 1;
+}