Mercurial > mplayer.hg
annotate dll_init.c @ 4218:3931c41f740a
Added new syncengine thanks to a new previously undocumented feature of the em8300, this might fix playback on both slow and fast machines (more testing needed). This also requires users to get the em8300 driver from cvs until the next version is released (will probably happen this weekend)
Added lots of comments, should be pretty easy to understand most of the internals now
Added lots of brackets to if's for's while's etc, this is not a cosmetical thing but rather due to the fact I got some very odd bugs with else's since I didn't properly use brackets (and it's the K&R standard to have brackets everywhere)
Fixed some bugs that would occur when disabling libmp1e
Switched to default to the new naming scheme of device nodes, the driver will slowly switch over to this state, if it can't find devices under the new name it will try the old naming scheme
I stopped opening devices in non-blocking mode, it would break the new syncengine which tries to burst data to the device (alot of times meaning it will fill the fifo pretty fast which would previously result in jerkyness on fast machines)
The device now sets the initial state of the pts and speed (probably not needed, but assumption is the mother of all fuckups =)
Keep the control interface open during the entire duration of the libvo device, we might need this to flush video buffers on seeking (currently not implemented, therefore seeking is broken)
This is beta stuff to the driver, I will get some users to test it for me and do my best to fix seeking as soon as possible...
author | mswitch |
---|---|
date | Thu, 17 Jan 2002 10:33:47 +0000 |
parents | ba98028ddc27 |
children | 683a0585420c |
rev | line source |
---|---|
2775 | 1 |
2 #include "config.h" | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
3 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
4 #include <stdio.h> |
2775 | 5 #ifdef HAVE_MALLOC_H |
6 #include <malloc.h> | |
7 #endif | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
8 #include <stdlib.h> |
1430 | 9 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
10 |
1567 | 11 #include "mp_msg.h" |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1653
diff
changeset
|
12 #include "help_mp.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
13 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
14 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
15 #include "demuxer.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
16 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
17 #include "loader.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
18 //#include "wine/mmreg.h" |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1297
diff
changeset
|
19 #include "wine/vfw.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
20 #include "wine/avifmt.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
21 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
22 #include "codec-cfg.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
23 #include "stheader.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
24 |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
25 #include "dll_init.h" |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
26 |
2897 | 27 #ifdef USE_LIBVO2 |
28 #include "libvo2/img_format.h" | |
29 #else | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
30 #include "libvo/img_format.h" |
2897 | 31 #endif |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
32 #include "linux/shmem.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
489
diff
changeset
|
33 |
2087 | 34 extern int divx_quality; |
35 | |
1 | 36 // ACM audio and VfW video codecs initialization |
37 // based on the avifile library [http://divx.euro.ru] | |
38 | |
296 | 39 int init_acm_audio_codec(sh_audio_t *sh_audio){ |
1 | 40 HRESULT ret; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
41 WAVEFORMATEX *in_fmt=sh_audio->wf; |
3725 | 42 unsigned int srcsize=0; |
1 | 43 |
1567 | 44 mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (ACM) AUDIO Codec init =======\n"); |
1 | 45 |
291 | 46 sh_audio->srcstream=NULL; |
1 | 47 |
291 | 48 sh_audio->o_wf.nChannels=in_fmt->nChannels; |
49 sh_audio->o_wf.nSamplesPerSec=in_fmt->nSamplesPerSec; | |
50 sh_audio->o_wf.nAvgBytesPerSec=2*sh_audio->o_wf.nSamplesPerSec*sh_audio->o_wf.nChannels; | |
51 sh_audio->o_wf.wFormatTag=WAVE_FORMAT_PCM; | |
52 sh_audio->o_wf.nBlockAlign=2*in_fmt->nChannels; | |
53 sh_audio->o_wf.wBitsPerSample=16; | |
3437
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
54 // sh_audio->o_wf.wBitsPerSample=in_fmt->wBitsPerSample; |
291 | 55 sh_audio->o_wf.cbSize=0; |
1 | 56 |
3437
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
57 if(verbose) { |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
58 printf("Input format:\n"); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
59 printf(" wFormatTag %d\n", in_fmt->wFormatTag); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
60 printf(" nChannels %d\n", in_fmt->nChannels); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
61 printf(" nSamplesPerSec %ld\n", in_fmt->nSamplesPerSec); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
62 printf(" nAvgBytesPerSec %d\n", in_fmt->nAvgBytesPerSec); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
63 printf(" nBlockAlign %d\n", in_fmt->nBlockAlign); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
64 printf(" wBitsPerSample %d\n", in_fmt->wBitsPerSample); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
65 printf(" cbSize %d\n", in_fmt->cbSize); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
66 printf("Output fmt:\n"); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
67 printf(" wFormatTag %d\n", sh_audio->o_wf.wFormatTag); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
68 printf(" nChannels %d\n", sh_audio->o_wf.nChannels); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
69 printf(" nSamplesPerSec %ld\n", sh_audio->o_wf.nSamplesPerSec); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
70 printf(" nAvgBytesPerSec %d\n", sh_audio->o_wf.nAvgBytesPerSec); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
71 printf(" nBlockAlign %d\n", sh_audio->o_wf.nBlockAlign); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
72 printf(" wBitsPerSample %d\n", sh_audio->o_wf.wBitsPerSample); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
73 printf(" cbSize %d\n", sh_audio->o_wf.cbSize); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
74 } |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
75 |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
76 |
303 | 77 win32_codec_name = sh_audio->codec->dll; |
291 | 78 ret=acmStreamOpen(&sh_audio->srcstream,(HACMDRIVER)NULL, |
79 in_fmt,&sh_audio->o_wf, | |
1 | 80 NULL,0,0,0); |
81 if(ret){ | |
82 if(ret==ACMERR_NOTPOSSIBLE) | |
1567 | 83 mp_msg(MSGT_WIN32,MSGL_ERR,"ACM_Decoder: Unappropriate audio format\n"); |
1 | 84 else |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1653
diff
changeset
|
85 mp_msg(MSGT_WIN32,MSGL_ERR,"ACM_Decoder: acmStreamOpen error: %d", (int)ret); |
291 | 86 sh_audio->srcstream=NULL; |
1 | 87 return 0; |
88 } | |
1567 | 89 mp_msg(MSGT_WIN32,MSGL_V,"Audio codec opened OK! ;-)\n"); |
1 | 90 |
631 | 91 acmStreamSize(sh_audio->srcstream, in_fmt->nBlockAlign, &srcsize, ACM_STREAMSIZEF_SOURCE); |
758 | 92 //if(verbose) printf("Audio ACM output buffer min. size: %ld (reported by codec)\n",srcsize); |
746 | 93 srcsize*=2; |
758 | 94 //if(srcsize<MAX_OUTBURST) srcsize=MAX_OUTBURST; |
95 if(!srcsize){ | |
1567 | 96 mp_msg(MSGT_WIN32,MSGL_WARN,"Warning! ACM codec reports srcsize=0\n"); |
758 | 97 srcsize=16384; |
98 } | |
99 // limit srcsize to 4-16kb | |
100 //while(srcsize && srcsize<4096) srcsize*=2; | |
101 //while(srcsize>16384) srcsize/=2; | |
291 | 102 sh_audio->audio_out_minsize=srcsize; // audio output min. size |
1567 | 103 mp_msg(MSGT_WIN32,MSGL_V,"Audio ACM output buffer min. size: %ld\n",srcsize); |
1 | 104 |
746 | 105 acmStreamSize(sh_audio->srcstream, srcsize, &srcsize, ACM_STREAMSIZEF_DESTINATION); |
291 | 106 sh_audio->audio_in_minsize=srcsize; // audio input min. size |
1567 | 107 mp_msg(MSGT_WIN32,MSGL_V,"Audio ACM input buffer min. size: %ld\n",srcsize); |
631 | 108 |
109 if(srcsize<in_fmt->nBlockAlign) srcsize=in_fmt->nBlockAlign; | |
1 | 110 |
631 | 111 sh_audio->a_in_buffer_size=2*sh_audio->audio_in_minsize; |
291 | 112 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); |
113 sh_audio->a_in_buffer_len=0; | |
92 | 114 |
1 | 115 return 1; |
116 } | |
117 | |
758 | 118 int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int minlen,int maxlen){ |
92 | 119 ACMSTREAMHEADER ash; |
120 HRESULT hr; | |
121 DWORD srcsize=0; | |
758 | 122 DWORD len=minlen; |
291 | 123 acmStreamSize(sh_audio->srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION); |
1567 | 124 mp_msg(MSGT_WIN32,MSGL_DBG3,"acm says: srcsize=%ld (buffsize=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_size,len); |
758 | 125 |
126 if(srcsize<sh_audio->wf->nBlockAlign){ | |
127 srcsize=sh_audio->wf->nBlockAlign; | |
128 acmStreamSize(sh_audio->srcstream, srcsize, &len, ACM_STREAMSIZEF_SOURCE); | |
129 if(len>maxlen) len=maxlen; | |
130 } | |
131 | |
291 | 132 // if(srcsize==0) srcsize=((WAVEFORMATEX *)&sh_audio->o_wf_ext)->nBlockAlign; |
133 if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! | |
134 if(sh_audio->a_in_buffer_len<srcsize){ | |
135 sh_audio->a_in_buffer_len+= | |
136 demux_read_data(sh_audio->ds,&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len], | |
137 srcsize-sh_audio->a_in_buffer_len); | |
92 | 138 } |
1567 | 139 mp_msg(MSGT_WIN32,MSGL_DBG3,"acm convert %d -> %d bytes\n",sh_audio->a_in_buffer_len,len); |
92 | 140 memset(&ash, 0, sizeof(ash)); |
141 ash.cbStruct=sizeof(ash); | |
142 ash.fdwStatus=0; | |
143 ash.dwUser=0; | |
291 | 144 ash.pbSrc=sh_audio->a_in_buffer; |
145 ash.cbSrcLength=sh_audio->a_in_buffer_len; | |
92 | 146 ash.pbDst=a_buffer; |
147 ash.cbDstLength=len; | |
291 | 148 hr=acmStreamPrepareHeader(sh_audio->srcstream,&ash,0); |
92 | 149 if(hr){ |
1567 | 150 mp_msg(MSGT_WIN32,MSGL_V,"ACM_Decoder: acmStreamPrepareHeader error %d\n",(int)hr); |
92 | 151 return -1; |
152 } | |
291 | 153 hr=acmStreamConvert(sh_audio->srcstream,&ash,0); |
92 | 154 if(hr){ |
1567 | 155 mp_msg(MSGT_WIN32,MSGL_DBG2,"ACM_Decoder: acmStreamConvert error %d\n",(int)hr); |
3437
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
156 switch(hr) |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
157 { |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
158 case ACMERR_NOTPOSSIBLE: |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
159 case ACMERR_UNPREPARED: |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
160 mp_msg(MSGT_WIN32, MSGL_DBG2, "ACM_Decoder: acmStreamConvert error: probarly not initialized!\n"); |
ae0e2736a5d4
added in/out format debug to acm init like in vfw init (for testing vivo decoder dll :)
alex
parents:
2897
diff
changeset
|
161 } |
631 | 162 // return -1; |
92 | 163 } |
1407 | 164 if(verbose>1) |
1567 | 165 mp_msg(MSGT_WIN32,MSGL_DBG2,"acm converted %d -> %d\n",ash.cbSrcLengthUsed,ash.cbDstLengthUsed); |
291 | 166 if(ash.cbSrcLengthUsed>=sh_audio->a_in_buffer_len){ |
167 sh_audio->a_in_buffer_len=0; | |
92 | 168 } else { |
291 | 169 sh_audio->a_in_buffer_len-=ash.cbSrcLengthUsed; |
170 memcpy(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[ash.cbSrcLengthUsed],sh_audio->a_in_buffer_len); | |
92 | 171 } |
172 len=ash.cbDstLengthUsed; | |
291 | 173 hr=acmStreamUnprepareHeader(sh_audio->srcstream,&ash,0); |
92 | 174 if(hr){ |
1567 | 175 mp_msg(MSGT_WIN32,MSGL_V,"ACM_Decoder: acmStreamUnprepareHeader error %d\n",(int)hr); |
92 | 176 } |
177 return len; | |
178 } | |
179 | |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
180 int init_vfw_video_codec(sh_video_t *sh_video,int ex){ |
1 | 181 HRESULT ret; |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
182 int yuv=0; |
303 | 183 unsigned int outfmt=sh_video->codec->outfmt[sh_video->outfmtidx]; |
2679 | 184 char *temp; |
185 int temp_len; | |
2087 | 186 int i; |
1 | 187 |
1567 | 188 mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (VFW) VIDEO Codec init =======\n"); |
1 | 189 |
291 | 190 memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER)); |
191 sh_video->o_bih.biSize = sizeof(BITMAPINFOHEADER); | |
1 | 192 |
303 | 193 win32_codec_name = sh_video->codec->dll; |
746 | 194 // sh_video->hic = ICOpen( 0x63646976, sh_video->bih->biCompression, ICMODE_FASTDECOMPRESS); |
195 sh_video->hic = ICOpen( 0x63646976, sh_video->bih->biCompression, ICMODE_DECOMPRESS); | |
291 | 196 if(!sh_video->hic){ |
1567 | 197 mp_msg(MSGT_WIN32,MSGL_ERR,"ICOpen failed! unknown codec / wrong parameters?\n"); |
1 | 198 return 0; |
199 } | |
200 | |
2679 | 201 // sh_video->bih->biBitCount=32; |
202 | |
203 temp_len = ICDecompressGetFormatSize(sh_video->hic, sh_video->bih); | |
204 | |
205 if (temp_len < sh_video->o_bih.biSize) | |
206 temp_len = sh_video->o_bih.biSize; | |
207 | |
208 temp = malloc(temp_len); | |
209 printf("ICDecompressGetFormatSize ret: %d\n", temp_len); | |
210 | |
211 #if 0 | |
212 { | |
213 ICINFO icinfo; | |
214 ret = ICGetInfo(sh_video->hic, &icinfo, sizeof(ICINFO)); | |
215 printf("%d - %d - %d\n", ret, icinfo.dwSize, sizeof(ICINFO)); | |
216 printf("Compressor type: %.4x\n", icinfo.fccType); | |
217 printf("Compressor subtype: %.4x\n", icinfo.fccHandler); | |
218 printf("Compressor flags: %lu, version %lu, ICM version: %lu\n", | |
219 icinfo.dwFlags, icinfo.dwVersion, icinfo.dwVersionICM); | |
220 printf("Compressor name: %s\n", icinfo.szName); | |
221 printf("Compressor description: %s\n", icinfo.szDescription); | |
222 | |
223 printf("Flags:"); | |
224 if (icinfo.dwFlags & VIDCF_QUALITY) | |
225 printf(" quality"); | |
226 if (icinfo.dwFlags & VIDCF_FASTTEMPORALD) | |
227 printf(" fast-decompr"); | |
228 if (icinfo.dwFlags & VIDCF_QUALITYTIME) | |
229 printf(" temp-quality"); | |
230 printf("\n"); | |
231 } | |
232 #endif | |
1 | 233 |
2087 | 234 // Note: DivX.DLL overwrites 4 bytes _AFTER_ the o_bih header, so it corrupts |
235 // the sh_video struct content. We call it with an 1024-byte temp space and | |
236 // then copy out the data we need: | |
2679 | 237 memset(temp,0x77,temp_len); |
2885 | 238 // memcpy(temp,sh_video->bih,sizeof(BITMAPINFOHEADER)); |
239 // sh_video->o_bih.biSize = temp_len; | |
2087 | 240 |
241 ret = ICDecompressGetFormat(sh_video->hic, sh_video->bih, temp); | |
2679 | 242 if(ret < 0){ |
1567 | 243 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressGetFormat failed: Error %d\n", (int)ret); |
2679 | 244 for (i=0; i < temp_len; i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02x ", temp[i]); |
1 | 245 return 0; |
246 } | |
1567 | 247 mp_msg(MSGT_WIN32,MSGL_V,"ICDecompressGetFormat OK\n"); |
1 | 248 |
2087 | 249 memcpy(&sh_video->o_bih,temp,sizeof(sh_video->o_bih)); |
2679 | 250 |
251 if (temp_len > sizeof(sh_video->o_bih)) | |
252 { | |
253 mp_msg(MSGT_WIN32, MSGL_V, "Extra info in o_bih (%d bytes)!\n", | |
254 temp_len-sizeof(sh_video->o_bih)); | |
255 for(i=sizeof(sh_video->o_bih);i<temp_len;i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02X ",temp[i]); | |
256 } | |
257 free(temp); | |
1 | 258 // printf("ICM_DECOMPRESS_QUERY=0x%X",ICM_DECOMPRESS_QUERY); |
259 | |
291 | 260 // sh_video->o_bih.biWidth=sh_video->bih.biWidth; |
261 // sh_video->o_bih.biCompression = 0x32315659; // mmioFOURCC('U','Y','V','Y'); | |
262 // ret=ICDecompressGetFormatSize(sh_video->hic,&sh_video->o_bih); | |
263 // sh_video->o_bih.biCompression = 3; //0x32315659; | |
264 // sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
265 // sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
266 // sh_video->o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
267 // sh_video->o_bih.biPlanes=3; | |
268 // sh_video->o_bih.biBitCount=16; | |
1 | 269 |
713 | 270 #if 0 |
271 // workaround for pegasus MJPEG: | |
272 if(!sh_video->o_bih.biWidth) sh_video->o_bih.biWidth=sh_video->bih->biWidth; | |
273 if(!sh_video->o_bih.biHeight) sh_video->o_bih.biHeight=sh_video->bih->biHeight; | |
274 if(!sh_video->o_bih.biPlanes) sh_video->o_bih.biPlanes=sh_video->bih->biPlanes; | |
275 #endif | |
408 | 276 |
277 switch (outfmt) { | |
278 | |
279 /* planar format */ | |
280 case IMGFMT_YV12: | |
281 case IMGFMT_I420: | |
282 case IMGFMT_IYUV: | |
283 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
|
284 yuv=1; |
467 | 285 break; |
1 | 286 |
408 | 287 /* packed format */ |
288 case IMGFMT_YUY2: | |
289 case IMGFMT_UYVY: | |
290 case IMGFMT_YVYU: | |
291 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
|
292 yuv=1; |
408 | 293 break; |
303 | 294 |
408 | 295 /* rgb/bgr format */ |
296 case IMGFMT_RGB8: | |
297 case IMGFMT_BGR8: | |
298 sh_video->o_bih.biBitCount=8; | |
299 break; | |
1 | 300 |
408 | 301 case IMGFMT_RGB15: |
302 case IMGFMT_RGB16: | |
303 case IMGFMT_BGR15: | |
304 case IMGFMT_BGR16: | |
305 sh_video->o_bih.biBitCount=16; | |
306 break; | |
307 | |
308 case IMGFMT_RGB24: | |
309 case IMGFMT_BGR24: | |
310 sh_video->o_bih.biBitCount=24; | |
311 break; | |
312 | |
313 case IMGFMT_RGB32: | |
314 case IMGFMT_BGR32: | |
315 sh_video->o_bih.biBitCount=32; | |
316 break; | |
1 | 317 |
408 | 318 default: |
1567 | 319 mp_msg(MSGT_WIN32,MSGL_ERR,"unsupported image format: 0x%x\n", outfmt); |
408 | 320 return 0; |
321 } | |
322 | |
323 sh_video->o_bih.biSizeImage = sh_video->o_bih.biWidth * sh_video->o_bih.biHeight * (sh_video->o_bih.biBitCount/8); | |
713 | 324 |
408 | 325 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
|
326 sh_video->o_bih.biHeight=-sh_video->bih->biHeight; // flip image! |
408 | 327 } |
1 | 328 |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
329 if(yuv && !(sh_video->codec->outflags[sh_video->outfmtidx] & CODECS_FLAG_YUVHACK)) |
408 | 330 sh_video->o_bih.biCompression = outfmt; |
759 | 331 else |
332 sh_video->o_bih.biCompression = 0; | |
1 | 333 |
334 if(verbose) { | |
335 printf("Starting decompression, format:\n"); | |
603 | 336 printf(" biSize %ld\n", sh_video->bih->biSize); |
337 printf(" biWidth %ld\n", sh_video->bih->biWidth); | |
338 printf(" biHeight %ld\n", sh_video->bih->biHeight); | |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
414
diff
changeset
|
339 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
|
340 printf(" biBitCount %d\n", sh_video->bih->biBitCount); |
603 | 341 printf(" biCompression 0x%lx ('%.4s')\n", sh_video->bih->biCompression, (char *)&sh_video->bih->biCompression); |
342 printf(" biSizeImage %ld\n", sh_video->bih->biSizeImage); | |
1 | 343 printf("Dest fmt:\n"); |
603 | 344 printf(" biSize %ld\n", sh_video->o_bih.biSize); |
345 printf(" biWidth %ld\n", sh_video->o_bih.biWidth); | |
346 printf(" biHeight %ld\n", sh_video->o_bih.biHeight); | |
291 | 347 printf(" biPlanes %d\n", sh_video->o_bih.biPlanes); |
348 printf(" biBitCount %d\n", sh_video->o_bih.biBitCount); | |
603 | 349 printf(" biCompression 0x%lx ('%.4s')\n", sh_video->o_bih.biCompression, (char *)&sh_video->o_bih.biCompression); |
350 printf(" biSizeImage %ld\n", sh_video->o_bih.biSizeImage); | |
1 | 351 } |
352 | |
1297 | 353 ret = ex ? |
354 ICDecompressQueryEx(sh_video->hic, sh_video->bih, &sh_video->o_bih) : | |
355 ICDecompressQuery(sh_video->hic, sh_video->bih, &sh_video->o_bih); | |
1 | 356 if(ret){ |
1567 | 357 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressQuery failed: Error %d\n", (int)ret); |
2714 | 358 // return 0; |
359 } else | |
1567 | 360 mp_msg(MSGT_WIN32,MSGL_V,"ICDecompressQuery OK\n"); |
1 | 361 |
1297 | 362 ret = ex ? |
363 ICDecompressBeginEx(sh_video->hic, sh_video->bih, &sh_video->o_bih) : | |
364 ICDecompressBegin(sh_video->hic, sh_video->bih, &sh_video->o_bih); | |
1 | 365 if(ret){ |
1567 | 366 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressBegin failed: Error %d\n", (int)ret); |
2876 | 367 // return 0; |
1 | 368 } |
369 | |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
370 sh_video->our_out_buffer = (char*)memalign(64,sh_video->o_bih.biSizeImage); |
291 | 371 if(!sh_video->our_out_buffer){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1653
diff
changeset
|
372 mp_msg(MSGT_WIN32,MSGL_ERR,MSGTR_NoMemForDecodedImage, sh_video->o_bih.biSizeImage); |
1 | 373 return 0; |
374 } | |
375 | |
489
2bb59b7c748a
BGR modes with VfW codecs fixed - biCompression must be 0 for BGR...
arpi_esp
parents:
469
diff
changeset
|
376 if(yuv && sh_video->codec->outflags[sh_video->outfmtidx] & CODECS_FLAG_YUVHACK) |
469 | 377 sh_video->o_bih.biCompression = outfmt; |
1 | 378 |
379 // avi_header.our_in_buffer=malloc(avi_header.video.dwSuggestedBufferSize); // FIXME!!!! | |
2087 | 380 |
381 ICSendMessage(sh_video->hic, ICM_USER+80, (long)(&divx_quality) ,NULL); | |
382 | |
1567 | 383 mp_msg(MSGT_WIN32,MSGL_V,"VIDEO CODEC Init OK!!! ;-)\n"); |
1 | 384 return 1; |
385 } | |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
386 |
2087 | 387 int vfw_set_postproc(sh_video_t* sh_video,int quality){ |
388 // Works only with opendivx/divx4 based DLL | |
389 return ICSendMessage(sh_video->hic, ICM_USER+80, (long)(&quality) ,NULL); | |
390 } | |
391 | |
2049
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
392 int vfw_decode_video(sh_video_t* sh_video,void* start,int in_size,int drop_frame,int ex){ |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
393 HRESULT ret; |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
394 |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
395 sh_video->bih->biSizeImage = in_size; |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
396 |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
397 if(ex) |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
398 ret = ICDecompressEx(sh_video->hic, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
399 ( (sh_video->ds->flags&1) ? 0 : ICDECOMPRESS_NOTKEYFRAME ) | |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
400 ( (drop_frame==2 && !(sh_video->ds->flags&1))?(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL):0 ) , |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
401 sh_video->bih, start, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
402 &sh_video->o_bih, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
403 drop_frame ? 0 : sh_video->our_out_buffer); |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
404 else |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
405 ret = ICDecompress(sh_video->hic, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
406 ( (sh_video->ds->flags&1) ? 0 : ICDECOMPRESS_NOTKEYFRAME ) | |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
407 ( (drop_frame==2 && !(sh_video->ds->flags&1))?(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL):0 ) , |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
408 sh_video->bih, start, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
409 &sh_video->o_bih, |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
410 drop_frame ? 0 : sh_video->our_out_buffer); |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
411 |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
412 return (int)ret; |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
413 } |
df41903fd7d7
VfW stuff moved to dll_init, warnings fixed, using dll_init.h
arpi
parents:
1973
diff
changeset
|
414 |