Mercurial > mplayer.hg
annotate dll_init.c @ 491:2313c6ea006f
YV12 is working again
author | arpi_esp |
---|---|
date | Tue, 17 Apr 2001 21:00:46 +0000 |
parents | 2bb59b7c748a |
children | 8511095c5283 |
rev | line source |
---|---|
1 | 1 // ACM audio and VfW video codecs initialization |
2 // based on the avifile library [http://divx.euro.ru] | |
3 | |
296 | 4 int init_acm_audio_codec(sh_audio_t *sh_audio){ |
1 | 5 HRESULT ret; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
6 WAVEFORMATEX *in_fmt=sh_audio->wf; |
1 | 7 unsigned long srcsize=0; |
8 | |
9 if(verbose) printf("======= Win32 (ACM) AUDIO Codec init =======\n"); | |
10 | |
291 | 11 sh_audio->srcstream=NULL; |
1 | 12 |
13 // if(in_fmt->nSamplesPerSec==0){ printf("Bad WAVE header!\n");exit(1); } | |
14 // MSACM_RegisterAllDrivers(); | |
15 | |
291 | 16 sh_audio->o_wf.nChannels=in_fmt->nChannels; |
17 sh_audio->o_wf.nSamplesPerSec=in_fmt->nSamplesPerSec; | |
18 sh_audio->o_wf.nAvgBytesPerSec=2*sh_audio->o_wf.nSamplesPerSec*sh_audio->o_wf.nChannels; | |
19 sh_audio->o_wf.wFormatTag=WAVE_FORMAT_PCM; | |
20 sh_audio->o_wf.nBlockAlign=2*in_fmt->nChannels; | |
21 sh_audio->o_wf.wBitsPerSample=16; | |
22 sh_audio->o_wf.cbSize=0; | |
1 | 23 |
303 | 24 win32_codec_name = sh_audio->codec->dll; |
291 | 25 ret=acmStreamOpen(&sh_audio->srcstream,(HACMDRIVER)NULL, |
26 in_fmt,&sh_audio->o_wf, | |
1 | 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); | |
291 | 33 sh_audio->srcstream=NULL; |
1 | 34 return 0; |
35 } | |
36 if(verbose) printf("Audio codec opened OK! ;-)\n"); | |
37 | |
38 srcsize=in_fmt->nBlockAlign; | |
291 | 39 acmStreamSize(sh_audio->srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_SOURCE); |
1 | 40 if(srcsize<OUTBURST) srcsize=OUTBURST; |
291 | 41 sh_audio->audio_out_minsize=srcsize; // audio output min. size |
1 | 42 if(verbose) printf("Audio ACM output buffer min. size: %d\n",srcsize); |
43 | |
291 | 44 acmStreamSize(sh_audio->srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION); |
45 sh_audio->audio_in_minsize=srcsize; // audio input min. size | |
1 | 46 if(verbose) printf("Audio ACM input buffer min. size: %d\n",srcsize); |
47 | |
291 | 48 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; |
49 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); | |
50 sh_audio->a_in_buffer_len=0; | |
92 | 51 |
1 | 52 return 1; |
53 } | |
54 | |
291 | 55 int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int len){ |
92 | 56 ACMSTREAMHEADER ash; |
57 HRESULT hr; | |
58 DWORD srcsize=0; | |
291 | 59 acmStreamSize(sh_audio->srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION); |
60 if(verbose>=3)printf("acm says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_size,len); | |
61 // if(srcsize==0) srcsize=((WAVEFORMATEX *)&sh_audio->o_wf_ext)->nBlockAlign; | |
62 if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! | |
63 if(sh_audio->a_in_buffer_len<srcsize){ | |
64 sh_audio->a_in_buffer_len+= | |
65 demux_read_data(sh_audio->ds,&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len], | |
66 srcsize-sh_audio->a_in_buffer_len); | |
92 | 67 } |
68 memset(&ash, 0, sizeof(ash)); | |
69 ash.cbStruct=sizeof(ash); | |
70 ash.fdwStatus=0; | |
71 ash.dwUser=0; | |
291 | 72 ash.pbSrc=sh_audio->a_in_buffer; |
73 ash.cbSrcLength=sh_audio->a_in_buffer_len; | |
92 | 74 ash.pbDst=a_buffer; |
75 ash.cbDstLength=len; | |
291 | 76 hr=acmStreamPrepareHeader(sh_audio->srcstream,&ash,0); |
92 | 77 if(hr){ |
78 printf("ACM_Decoder: acmStreamPrepareHeader error %d\n",hr); | |
79 return -1; | |
80 } | |
291 | 81 hr=acmStreamConvert(sh_audio->srcstream,&ash,0); |
92 | 82 if(hr){ |
83 printf("ACM_Decoder: acmStreamConvert error %d\n",hr); | |
84 return -1; | |
85 } | |
86 //printf("ACM convert %d -> %d (buf=%d)\n",ash.cbSrcLengthUsed,ash.cbDstLengthUsed,a_in_buffer_len); | |
291 | 87 if(ash.cbSrcLengthUsed>=sh_audio->a_in_buffer_len){ |
88 sh_audio->a_in_buffer_len=0; | |
92 | 89 } else { |
291 | 90 sh_audio->a_in_buffer_len-=ash.cbSrcLengthUsed; |
91 memcpy(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[ash.cbSrcLengthUsed],sh_audio->a_in_buffer_len); | |
92 | 92 } |
93 len=ash.cbDstLengthUsed; | |
291 | 94 hr=acmStreamUnprepareHeader(sh_audio->srcstream,&ash,0); |
92 | 95 if(hr){ |
96 printf("ACM_Decoder: acmStreamUnprepareHeader error %d\n",hr); | |
97 } | |
98 return len; | |
99 } | |
100 | |
101 | |
1 | 102 |
303 | 103 int init_video_codec(){ |
1 | 104 HRESULT ret; |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
105 int yuv=0; |
303 | 106 unsigned int outfmt=sh_video->codec->outfmt[sh_video->outfmtidx]; |
1 | 107 |
108 if(verbose) printf("======= Win32 (VFW) VIDEO Codec init =======\n"); | |
109 | |
291 | 110 memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); |
111 sh_video->o_bih.biSize = sizeof(BITMAPINFOHEADER); | |
1 | 112 |
303 | 113 win32_codec_name = sh_video->codec->dll; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
114 sh_video->hic = ICOpen( 0x63646976, sh_video->bih->biCompression, ICMODE_FASTDECOMPRESS); |
291 | 115 // sh_video->hic = ICOpen( 0x63646976, sh_video->bih.biCompression, ICMODE_DECOMPRESS); |
116 if(!sh_video->hic){ | |
1 | 117 printf("ICOpen failed! unknown codec / wrong parameters?\n"); |
118 return 0; | |
119 } | |
120 | |
291 | 121 // sh_video->bih.biBitCount=32; |
1 | 122 |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
123 ret = ICDecompressGetFormat(sh_video->hic, sh_video->bih, &sh_video->o_bih); |
1 | 124 if(ret){ |
125 printf("ICDecompressGetFormat failed: Error %d\n", ret); | |
126 return 0; | |
127 } | |
128 if(verbose) printf("ICDecompressGetFormat OK\n"); | |
129 | |
130 // printf("ICM_DECOMPRESS_QUERY=0x%X",ICM_DECOMPRESS_QUERY); | |
131 | |
291 | 132 // sh_video->o_bih.biWidth=sh_video->bih.biWidth; |
133 // sh_video->o_bih.biCompression = 0x32315659; // mmioFOURCC('U','Y','V','Y'); | |
134 // ret=ICDecompressGetFormatSize(sh_video->hic,&sh_video->o_bih); | |
135 // sh_video->o_bih.biCompression = 3; //0x32315659; | |
136 // sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
137 // sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
138 // sh_video->o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
139 // sh_video->o_bih.biPlanes=3; | |
140 // sh_video->o_bih.biBitCount=16; | |
1 | 141 |
408 | 142 |
143 switch (outfmt) { | |
144 | |
145 /* planar format */ | |
146 case IMGFMT_YV12: | |
147 case IMGFMT_I420: | |
148 case IMGFMT_IYUV: | |
149 sh_video->o_bih.biBitCount=12; | |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
150 yuv=1; |
467 | 151 break; |
1 | 152 |
408 | 153 /* packed format */ |
154 case IMGFMT_YUY2: | |
155 case IMGFMT_UYVY: | |
156 case IMGFMT_YVYU: | |
157 sh_video->o_bih.biBitCount=16; | |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
158 yuv=1; |
408 | 159 break; |
303 | 160 |
408 | 161 /* rgb/bgr format */ |
162 case IMGFMT_RGB8: | |
163 case IMGFMT_BGR8: | |
164 sh_video->o_bih.biBitCount=8; | |
165 break; | |
1 | 166 |
408 | 167 case IMGFMT_RGB15: |
168 case IMGFMT_RGB16: | |
169 case IMGFMT_BGR15: | |
170 case IMGFMT_BGR16: | |
171 sh_video->o_bih.biBitCount=16; | |
172 break; | |
173 | |
174 case IMGFMT_RGB24: | |
175 case IMGFMT_BGR24: | |
176 sh_video->o_bih.biBitCount=24; | |
177 break; | |
178 | |
179 case IMGFMT_RGB32: | |
180 case IMGFMT_BGR32: | |
181 sh_video->o_bih.biBitCount=32; | |
182 break; | |
1 | 183 |
408 | 184 default: |
185 printf("unsupported image format: 0x%x\n", outfmt); | |
186 return 0; | |
187 } | |
188 | |
189 sh_video->o_bih.biSizeImage = sh_video->o_bih.biWidth * sh_video->o_bih.biHeight * (sh_video->o_bih.biBitCount/8); | |
1 | 190 |
408 | 191 if(!(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_FLIP)) { |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
192 sh_video->o_bih.biHeight=-sh_video->bih->biHeight; // flip image! |
408 | 193 } |
1 | 194 |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
195 if(yuv && !(sh_video->codec->outflags[sh_video->outfmtidx] & CODECS_FLAG_YUVHACK)) |
408 | 196 sh_video->o_bih.biCompression = outfmt; |
1 | 197 |
198 if(verbose) { | |
199 printf("Starting decompression, format:\n"); | |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
200 printf(" biSize %d\n", sh_video->bih->biSize); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
201 printf(" biWidth %d\n", sh_video->bih->biWidth); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
202 printf(" biHeight %d\n", sh_video->bih->biHeight); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
203 printf(" biPlanes %d\n", sh_video->bih->biPlanes); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
204 printf(" biBitCount %d\n", sh_video->bih->biBitCount); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
205 printf(" biCompression 0x%x ('%.4s')\n", sh_video->bih->biCompression, &sh_video->bih->biCompression); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
206 printf(" biSizeImage %d\n", sh_video->bih->biSizeImage); |
1 | 207 printf("Dest fmt:\n"); |
291 | 208 printf(" biSize %d\n", sh_video->o_bih.biSize); |
209 printf(" biWidth %d\n", sh_video->o_bih.biWidth); | |
210 printf(" biHeight %d\n", sh_video->o_bih.biHeight); | |
211 printf(" biPlanes %d\n", sh_video->o_bih.biPlanes); | |
212 printf(" biBitCount %d\n", sh_video->o_bih.biBitCount); | |
408 | 213 printf(" biCompression 0x%x ('%.4s')\n", sh_video->o_bih.biCompression, &sh_video->o_bih.biCompression); |
291 | 214 printf(" biSizeImage %d\n", sh_video->o_bih.biSizeImage); |
1 | 215 } |
216 | |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
217 ret = ICDecompressQuery(sh_video->hic, sh_video->bih, &sh_video->o_bih); |
1 | 218 if(ret){ |
219 printf("ICDecompressQuery failed: Error %d\n", ret); | |
220 return 0; | |
221 } | |
222 if(verbose) printf("ICDecompressQuery OK\n"); | |
223 | |
224 | |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
225 ret = ICDecompressBegin(sh_video->hic, sh_video->bih, &sh_video->o_bih); |
1 | 226 if(ret){ |
227 printf("ICDecompressBegin failed: Error %d\n", ret); | |
228 return 0; | |
229 } | |
230 | |
231 #if 0 | |
232 | |
291 | 233 //sh_video->hic |
1 | 234 //ICSendMessage(HIC hic,unsigned int msg,long lParam1,long lParam2) |
235 { int i; | |
236 for(i=73;i<256;i++){ | |
237 printf("Calling ICM_USER+%d function...",i);fflush(stdout); | |
291 | 238 ret = ICSendMessage(sh_video->hic,ICM_USER+i,NULL,NULL); |
1 | 239 printf(" ret=%d\n",ret); |
240 } | |
241 } | |
242 #endif | |
243 | |
414 | 244 sh_video->our_out_buffer = shmem_alloc(sh_video->o_bih.biSizeImage); |
291 | 245 if(!sh_video->our_out_buffer){ |
246 printf("not enough memory for decoded picture buffer (%d bytes)\n", sh_video->o_bih.biSizeImage); | |
1 | 247 return 0; |
248 } | |
249 | |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
250 if(yuv && sh_video->codec->outflags[sh_video->outfmtidx] & CODECS_FLAG_YUVHACK) |
469 | 251 sh_video->o_bih.biCompression = outfmt; |
1 | 252 |
253 // avi_header.our_in_buffer=malloc(avi_header.video.dwSuggestedBufferSize); // FIXME!!!! | |
254 | |
255 if(verbose) printf("VIDEO CODEC Init OK!!! ;-)\n"); | |
256 return 1; | |
257 } |