2 * Copyright 1998 Marcus Meissner
12 #include "wine/winestring.h"
14 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(msvideo)
18 /****************************************************************************
19 * VideoForWindowsVersion [MSVFW.2][MSVIDEO.2]
20 * Returns the version in major.minor form.
21 * In Windows95 this returns 0x040003b6 (4.950)
24 VideoForWindowsVersion(void) {
25 return 0x040003B6; /* 4.950 */
28 /****************************************************************************
29 * VideoCapDriverDescAndVer [MSVIDEO.22]
32 VideoCapDriverDescAndVer(WORD nr,LPVOID buf1,WORD buf1len,LPVOID buf2,WORD buf2len) {
33 FIXME("(%d,%p,%d,%p,%d), stub!\n",nr,buf1,buf1len,buf2,buf2len);
37 /* system.ini: [drivers] */
39 /**************************************************************************
41 * Get information about an installable compressor. Return TRUE if there
46 DWORD fccType, /* [in] type of compressor ('vidc') */
47 DWORD fccHandler, /* [in] <n>th compressor */
48 ICINFO *lpicinfo /* [out] information about compressor */
50 char type[5],buf[2000];
52 memcpy(type,&fccType,4);type[4]=0;
53 TRACE("(%s,%ld,%p).\n",type,fccHandler,lpicinfo);
54 /* does OpenDriver/CloseDriver */
55 lpicinfo->dwSize = sizeof(ICINFO);
56 lpicinfo->fccType = fccType;
57 lpicinfo->dwFlags = 0;
58 if (GetPrivateProfileStringA("drivers32",NULL,NULL,buf,2000,"system.ini")) {
61 if (!lstrncmpiA(type,s,4)) {
63 lpicinfo->fccHandler = mmioStringToFOURCCA(s+5,0);
67 s=s+lstrlenA(s)+1; /* either next char or \0 */
73 /**************************************************************************
75 * Opens an installable compressor. Return special handle.
78 ICOpen(DWORD fccType,DWORD fccHandler,UINT wMode) {
79 char type[5],handler[5],codecname[20];
84 memcpy(type,&fccType,4);type[4]=0;
85 memcpy(handler,&fccHandler,4);handler[4]=0;
86 TRACE("(%s,%s,0x%08lx)\n",type,handler,(DWORD)wMode);
87 sprintf(codecname,"%s.%s",type,handler);
89 /* Well, lParam2 is in fact a LPVIDEO_OPEN_PARMS, but it has the
90 * same layout as ICOPEN
92 icopen.fccType = fccType;
93 icopen.fccHandler = fccHandler;
94 icopen.dwSize = sizeof(ICOPEN);
95 icopen.dwFlags = wMode;
96 /* FIXME: do we need to fill out the rest too? */
97 hdrv=OpenDriverA(codecname,"drivers32",(LPARAM)&icopen);
99 if (!strcasecmp(type,"vids")) {
100 sprintf(codecname,"vidc.%s",handler);
101 fccType = mmioFOURCC('v','i','d','c');
103 hdrv=OpenDriverA(codecname,"drivers32",(LPARAM)&icopen);
107 whic = HeapAlloc(GetProcessHeap(),0,sizeof(WINE_HIC));
109 whic->driverproc= NULL;
110 whic->private = ICSendMessage((HIC)whic,DRV_OPEN,0,(LPARAM)&icopen);
113 HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode,
114 FARPROC lpfnHandler) {
115 char type[5],handler[5];
119 memcpy(type,&fccType,4);type[4]=0;
120 memcpy(handler,&fccHandler,4);handler[4]=0;
121 FIXME("(%s,%s,%d,%p), stub!\n",type,handler,wMode,lpfnHandler);
122 hic = ICOpen(fccType,fccHandler,wMode);
125 whic = (WINE_HIC*)hic;
126 whic->driverproc = lpfnHandler;
132 ICGetInfo(HIC hic,ICINFO *picinfo,DWORD cb) {
135 TRACE("(0x%08lx,%p,%ld)\n",(DWORD)hic,picinfo,cb);
136 ret = ICSendMessage(hic,ICM_GETINFO,(DWORD)picinfo,cb);
137 TRACE(" -> 0x%08lx\n",ret);
143 DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn,
144 LPBITMAPINFOHEADER lpbiOut, WORD wMode
146 char type[5],handler[5];
151 case ICMODE_FASTCOMPRESS:
152 case ICMODE_COMPRESS:
153 querymsg = ICM_COMPRESS_QUERY;
155 case ICMODE_DECOMPRESS:
156 case ICMODE_FASTDECOMPRESS:
157 querymsg = ICM_DECOMPRESS_QUERY;
160 querymsg = ICM_DRAW_QUERY;
163 FIXME("Unknown mode (%d)\n",wMode);
167 /* Easy case: handler/type match, we just fire a query and return */
168 hic = ICOpen(fccType,fccHandler,wMode);
170 if (!ICSendMessage(hic,querymsg,(DWORD)lpbiIn,(DWORD)lpbiOut))
174 type[4]='\0';memcpy(type,&fccType,4);
175 handler[4]='\0';memcpy(handler,&fccHandler,4);
176 if (fccType==streamtypeVIDEO) {
177 hic = ICLocate(ICTYPE_VIDEO,fccHandler,lpbiIn,lpbiOut,wMode);
181 FIXME("(%s,%s,%p,%p,0x%04x),unhandled!\n",type,handler,lpbiIn,lpbiOut,wMode);
185 HIC VFWAPI ICGetDisplayFormat(
186 HIC hic,LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut,
187 INT depth,INT dx,INT dy
192 FIXME("(0x%08lx,%p,%p,%d,%d,%d),stub!\n",(DWORD)hic,lpbiIn,lpbiOut,depth,dx,dy);
194 tmphic=ICLocate(ICTYPE_VIDEO,0,lpbiIn,NULL,ICMODE_DECOMPRESS);
198 if ((dy == lpbiIn->biHeight) || (dx == lpbiIn->biWidth))
199 dy = dx = 0; /* no resize needed */
200 /* Can we decompress it ? */
201 lres = ICDecompressQuery(tmphic,lpbiIn,NULL);
203 goto errout; /* no, sorry */
204 ICDecompressGetFormat(hic,lpbiIn,lpbiOut);
206 lpbiOut->biCompression = 0;
207 lpbiOut->biSize = sizeof(*lpbiOut);
212 depth = GetDeviceCaps(hdc,12)*GetDeviceCaps(hdc,14);
214 if (depth==15) depth = 16;
215 if (depth<8) depth = 8;
216 /* more constraints and tests */
218 if (lpbiIn->biBitCount == 8)
230 HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData,
231 LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid,
232 LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality,
233 LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev
237 iccmp.dwFlags = dwFlags;
239 iccmp.lpbiOutput = lpbiOutput;
240 iccmp.lpOutput = lpData;
241 iccmp.lpbiInput = lpbiInput;
242 iccmp.lpInput = lpBits;
244 iccmp.lpckid = lpckid;
245 iccmp.lpdwFlags = lpdwFlags;
246 iccmp.lFrameNum = lFrameNum;
247 iccmp.dwFrameSize = dwFrameSize;
248 iccmp.dwQuality = dwQuality;
249 iccmp.lpbiPrev = lpbiPrev;
250 iccmp.lpPrev = lpPrev;
251 return ICSendMessage(hic,ICM_COMPRESS,(LPARAM)&iccmp,sizeof(iccmp));
255 ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits) {
258 icd.dwFlags = dwFlags;
259 icd.lpbiInput = lpbiFormat;
260 icd.lpInput = lpData;
262 icd.lpbiOutput = lpbi;
263 icd.lpOutput = lpBits;
265 return ICSendMessage(hic,ICM_DECOMPRESS,(LPARAM)&icd,sizeof(icd));
269 ICSendMessage(HIC hic,UINT msg,DWORD lParam1,DWORD lParam2) {
271 WINE_HIC *whic = (WINE_HIC*)hic;
273 #define XX(x) case x: TRACE("(0x%08lx,"#x",0x%08lx,0x%08lx)\n",(DWORD)hic,lParam1,lParam2);break;
278 XX(ICM_COMPRESS_FRAMES_INFO)
279 XX(ICM_COMPRESS_GET_FORMAT)
280 XX(ICM_COMPRESS_GET_SIZE)
281 XX(ICM_COMPRESS_QUERY)
282 XX(ICM_COMPRESS_BEGIN)
285 XX(ICM_DECOMPRESS_GET_FORMAT)
286 XX(ICM_DECOMPRESS_QUERY)
287 XX(ICM_DECOMPRESS_BEGIN)
289 XX(ICM_DECOMPRESS_END)
290 XX(ICM_DECOMPRESS_SET_PALETTE)
291 XX(ICM_DECOMPRESS_GET_PALETTE)
294 XX(ICM_DRAW_GET_PALETTE)
304 XX(ICM_DRAW_RENDERBUFFER)
305 XX(ICM_DRAW_START_PLAY)
306 XX(ICM_DRAW_STOP_PLAY)
307 XX(ICM_DRAW_SUGGESTFORMAT)
308 XX(ICM_DRAW_CHANGEPALETTE)
309 XX(ICM_GETBUFFERSWANTED)
310 XX(ICM_GETDEFAULTKEYFRAMERATE)
311 XX(ICM_DECOMPRESSEX_BEGIN)
312 XX(ICM_DECOMPRESSEX_QUERY)
314 XX(ICM_DECOMPRESSEX_END)
315 XX(ICM_SET_STATUS_PROC)
317 FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx)\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2);
320 if (whic->driverproc) {
321 FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx), calling %p\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2,whic->driverproc);
322 ret = whic->driverproc(whic->hdrv,1,msg,lParam1,lParam2);
325 ret = SendDriverMessage(whic->hdrv,msg,lParam1,lParam2);
326 TRACE(" -> 0x%08lx\n",ret);
330 DWORD VFWAPIV ICDrawBegin(
332 DWORD dwFlags,/* flags */
333 HPALETTE hpal, /* palette to draw with */
334 HWND hwnd, /* window to draw to */
335 HDC hdc, /* HDC to draw to */
336 INT xDst, /* destination rectangle */
340 LPBITMAPINFOHEADER lpbi, /* format of frame to draw */
341 INT xSrc, /* source rectangle */
345 DWORD dwRate, /* frames/second = (dwRate/dwScale) */
349 icdb.dwFlags = dwFlags;
362 icdb.dwRate = dwRate;
363 icdb.dwScale = dwScale;
364 return ICSendMessage(hic,ICM_DRAW_BEGIN,(LPARAM)&icdb,sizeof(icdb));
367 DWORD VFWAPIV ICDraw(
368 HIC hic,DWORD dwFlags,LPVOID lpFormat,LPVOID lpData,DWORD cbData,
373 icd.dwFlags = dwFlags;
374 icd.lpFormat = lpFormat;
378 return ICSendMessage(hic,ICM_DRAW,(LPARAM)&icd,sizeof(icd));
381 LRESULT WINAPI ICClose(HIC hic) {
382 WINE_HIC *whic = (WINE_HIC*)hic;
383 TRACE("(%d).\n",hic);
384 /* FIXME: correct? */
385 CloseDriver(whic->hdrv,0,0);
386 HeapFree(GetProcessHeap(),0,whic);
390 HANDLE /* HDRAWDIB */ WINAPI
391 DrawDibOpen( void ) {
397 DrawDibClose( HANDLE /*HDRAWDIB*/ hDib ) {
402 BOOL VFWAPI DrawDibBegin(HANDLE /*HDRAWDIB*/ hdd,
406 LPBITMAPINFOHEADER lpbi,
410 FIXME("(%d,0x%lx,%d,%d,%p,%d,%d,0x%08lx), stub!\n",
411 hdd,(DWORD)hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,(DWORD)wFlags
418 DrawDibSetPalette(HANDLE /*HDRAWDIB*/ hdd, HPALETTE hpal) {
419 FIXME("(%d,%d),stub!\n",hdd,hpal);
423 UINT VFWAPI DrawDibRealize(HANDLE /*HDRAWDIB*/ hdd, HDC hdc, BOOL fBackground) {
424 FIXME("(0x%08lx,0x%08lx,%d),stub!\n",(DWORD)hdd,(DWORD)hdc,fBackground);
429 HWND VFWAPIV MCIWndCreate (HWND hwndParent, HINSTANCE hInstance,
430 DWORD dwStyle,LPVOID szFile)
431 { FIXME("%x %x %lx %p\n",hwndParent, hInstance, dwStyle, szFile);
434 HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance,
435 DWORD dwStyle,LPCSTR szFile)
436 { FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, szFile);
439 HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance,
440 DWORD dwStyle,LPCWSTR szFile)
441 { FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, debugstr_w(szFile));