Mercurial > mplayer.hg
comparison dll_init.c @ 1:3b5f5d1c5041
Initial revision
author | arpi_esp |
---|---|
date | Sat, 24 Feb 2001 20:28:24 +0000 |
parents | |
children | 92776006958f |
comparison
equal
deleted
inserted
replaced
0:c1bb2c071d63 | 1:3b5f5d1c5041 |
---|---|
1 // ACM audio and VfW video codecs initialization | |
2 // based on the avifile library [http://divx.euro.ru] | |
3 | |
4 int init_audio_codec(){ | |
5 HRESULT ret; | |
6 WAVEFORMATEX *in_fmt=(WAVEFORMATEX*)&avi_header.wf_ext; | |
7 unsigned long srcsize=0; | |
8 | |
9 if(verbose) printf("======= Win32 (ACM) AUDIO Codec init =======\n"); | |
10 | |
11 avi_header.srcstream=NULL; | |
12 | |
13 // if(in_fmt->nSamplesPerSec==0){ printf("Bad WAVE header!\n");exit(1); } | |
14 // MSACM_RegisterAllDrivers(); | |
15 | |
16 avi_header.wf.nChannels=in_fmt->nChannels; | |
17 avi_header.wf.nSamplesPerSec=in_fmt->nSamplesPerSec; | |
18 avi_header.wf.nAvgBytesPerSec=2*avi_header.wf.nSamplesPerSec*avi_header.wf.nChannels; | |
19 avi_header.wf.wFormatTag=WAVE_FORMAT_PCM; | |
20 avi_header.wf.nBlockAlign=2*in_fmt->nChannels; | |
21 avi_header.wf.wBitsPerSample=16; | |
22 avi_header.wf.cbSize=0; | |
23 | |
24 win32_codec_name = avi_header.audio_codec; | |
25 ret=acmStreamOpen(&avi_header.srcstream,(HACMDRIVER)NULL, | |
26 in_fmt,&avi_header.wf, | |
27 NULL,0,0,0); | |
28 if(ret){ | |
29 if(ret==ACMERR_NOTPOSSIBLE) | |
30 printf("ACM_Decoder: Unappropriate audio format\n"); | |
31 else | |
32 printf("ACM_Decoder: acmStreamOpen error %d", ret); | |
33 avi_header.srcstream=NULL; | |
34 return 0; | |
35 } | |
36 if(verbose) printf("Audio codec opened OK! ;-)\n"); | |
37 | |
38 srcsize=in_fmt->nBlockAlign; | |
39 acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_SOURCE); | |
40 if(srcsize<OUTBURST) srcsize=OUTBURST; | |
41 avi_header.audio_out_minsize=srcsize; // audio output min. size | |
42 if(verbose) printf("Audio ACM output buffer min. size: %d\n",srcsize); | |
43 | |
44 acmStreamSize(avi_header.srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION); | |
45 avi_header.audio_in_minsize=srcsize; // audio input min. size | |
46 if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize); | |
47 | |
48 return 1; | |
49 } | |
50 | |
51 | |
52 int init_video_codec(int outfmt){ | |
53 HRESULT ret; | |
54 | |
55 if(verbose) printf("======= Win32 (VFW) VIDEO Codec init =======\n"); | |
56 | |
57 memset(&avi_header.o_bih, 0, sizeof(BITMAPINFOHEADER)); | |
58 avi_header.o_bih.biSize = sizeof(BITMAPINFOHEADER); | |
59 | |
60 win32_codec_name = avi_header.video_codec; | |
61 avi_header.hic = ICOpen( 0x63646976, avi_header.bih.biCompression, ICMODE_FASTDECOMPRESS); | |
62 // avi_header.hic = ICOpen( 0x63646976, avi_header.bih.biCompression, ICMODE_DECOMPRESS); | |
63 if(!avi_header.hic){ | |
64 printf("ICOpen failed! unknown codec / wrong parameters?\n"); | |
65 return 0; | |
66 } | |
67 | |
68 // avi_header.bih.biBitCount=32; | |
69 | |
70 ret = ICDecompressGetFormat(avi_header.hic, &avi_header.bih, &avi_header.o_bih); | |
71 if(ret){ | |
72 printf("ICDecompressGetFormat failed: Error %d\n", ret); | |
73 return 0; | |
74 } | |
75 if(verbose) printf("ICDecompressGetFormat OK\n"); | |
76 | |
77 // printf("ICM_DECOMPRESS_QUERY=0x%X",ICM_DECOMPRESS_QUERY); | |
78 | |
79 // avi_header.o_bih.biWidth=avi_header.bih.biWidth; | |
80 // avi_header.o_bih.biCompression = 0x32315659; // mmioFOURCC('U','Y','V','Y'); | |
81 // ret=ICDecompressGetFormatSize(avi_header.hic,&avi_header.o_bih); | |
82 // avi_header.o_bih.biCompression = 3; //0x32315659; | |
83 // avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
84 // avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
85 // avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
86 // avi_header.o_bih.biPlanes=3; | |
87 // avi_header.o_bih.biBitCount=16; | |
88 | |
89 if(outfmt==IMGFMT_YUY2) | |
90 avi_header.o_bih.biBitCount=16; | |
91 else | |
92 avi_header.o_bih.biBitCount=outfmt&0xFF;// //24; | |
93 | |
94 avi_header.o_bih.biSizeImage=avi_header.o_bih.biWidth*avi_header.o_bih.biHeight*(avi_header.o_bih.biBitCount/8); | |
95 | |
96 if(!avi_header.flipped) | |
97 avi_header.o_bih.biHeight=-avi_header.bih.biHeight; // flip image! | |
98 | |
99 if(outfmt==IMGFMT_YUY2 && !avi_header.yuv_hack_needed) | |
100 avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
101 | |
102 // avi_header.o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
103 | |
104 | |
105 if(verbose) { | |
106 printf("Starting decompression, format:\n"); | |
107 printf(" biSize %d\n", avi_header.bih.biSize); | |
108 printf(" biWidth %d\n", avi_header.bih.biWidth); | |
109 printf(" biHeight %d\n", avi_header.bih.biHeight); | |
110 printf(" biPlanes %d\n", avi_header.bih.biPlanes); | |
111 printf(" biBitCount %d\n", avi_header.bih.biBitCount); | |
112 printf(" biCompression %d='%.4s'\n", avi_header.bih.biCompression, &avi_header.bih.biCompression); | |
113 printf(" biSizeImage %d\n", avi_header.bih.biSizeImage); | |
114 printf("Dest fmt:\n"); | |
115 printf(" biSize %d\n", avi_header.o_bih.biSize); | |
116 printf(" biWidth %d\n", avi_header.o_bih.biWidth); | |
117 printf(" biHeight %d\n", avi_header.o_bih.biHeight); | |
118 printf(" biPlanes %d\n", avi_header.o_bih.biPlanes); | |
119 printf(" biBitCount %d\n", avi_header.o_bih.biBitCount); | |
120 printf(" biCompression %d='%.4s'\n", avi_header.o_bih.biCompression, &avi_header.o_bih.biCompression); | |
121 printf(" biSizeImage %d\n", avi_header.o_bih.biSizeImage); | |
122 } | |
123 | |
124 ret = ICDecompressQuery(avi_header.hic, &avi_header.bih, &avi_header.o_bih); | |
125 if(ret){ | |
126 printf("ICDecompressQuery failed: Error %d\n", ret); | |
127 return 0; | |
128 } | |
129 if(verbose) printf("ICDecompressQuery OK\n"); | |
130 | |
131 | |
132 ret = ICDecompressBegin(avi_header.hic, &avi_header.bih, &avi_header.o_bih); | |
133 if(ret){ | |
134 printf("ICDecompressBegin failed: Error %d\n", ret); | |
135 return 0; | |
136 } | |
137 | |
138 #if 0 | |
139 | |
140 //avi_header.hic | |
141 //ICSendMessage(HIC hic,unsigned int msg,long lParam1,long lParam2) | |
142 { int i; | |
143 for(i=73;i<256;i++){ | |
144 printf("Calling ICM_USER+%d function...",i);fflush(stdout); | |
145 ret = ICSendMessage(avi_header.hic,ICM_USER+i,NULL,NULL); | |
146 printf(" ret=%d\n",ret); | |
147 } | |
148 } | |
149 #endif | |
150 | |
151 avi_header.our_out_buffer = malloc(avi_header.o_bih.biSizeImage); | |
152 if(!avi_header.our_out_buffer){ | |
153 printf("not enough memory for decoded picture buffer (%d bytes)\n", avi_header.o_bih.biSizeImage); | |
154 return 0; | |
155 } | |
156 | |
157 if(outfmt==IMGFMT_YUY2 && avi_header.yuv_hack_needed) | |
158 avi_header.o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
159 | |
160 // avi_header.our_in_buffer=malloc(avi_header.video.dwSuggestedBufferSize); // FIXME!!!! | |
161 | |
162 if(verbose) printf("VIDEO CODEC Init OK!!! ;-)\n"); | |
163 return 1; | |
164 } |