2 * Copyright 1998 Marcus Meissner
3 * Copyright 2000 Bradley Baetz
5 * FIXME: This all assumes 32 bit codecs
6 * Win95 appears to prefer 32 bit codecs, even from 16 bit code.
7 * There is the ICOpenFunction16 to worry about still, though.
18 #include "wine/winestring.h"
20 #include "debugtools.h"
23 #include "stackframe.h"
25 DEFAULT_DEBUG_CHANNEL(msvideo);
27 /* ### start build ### */
28 extern LONG CALLBACK MSVIDEO_CallTo16_long_lwwll(FARPROC16,LONG,WORD,WORD,LONG,LONG);
29 /* ### stop build ### */
31 LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2);
32 void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID lpv, LPDWORD lParam1, LPDWORD lParam2);
33 LRESULT MSVIDEO_SendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2, BOOL bFrom32);
35 /***********************************************************************
36 * VideoForWindowsVersion [MSVFW.2][MSVIDEO.2]
37 * Returns the version in major.minor form.
38 * In Windows95 this returns 0x040003b6 (4.950)
40 DWORD WINAPI VideoForWindowsVersion(void) {
41 return 0x040003B6; /* 4.950 */
44 /***********************************************************************
45 * VideoCapDriverDescAndVer [MSVIDEO.22]
47 DWORD WINAPI VideoCapDriverDescAndVer(WORD nr,LPVOID buf1,WORD buf1len,LPVOID buf2,WORD buf2len) {
48 FIXME("(%d,%p,%d,%p,%d), stub!\n",nr,buf1,buf1len,buf2,buf2len);
52 /* system.ini: [drivers] */
54 /***********************************************************************
56 * Get information about an installable compressor. Return TRUE if there
60 DWORD fccType, /* [in] type of compressor ('vidc') */
61 DWORD fccHandler, /* [in] <n>th compressor */
62 ICINFO *lpicinfo) /* [out] information about compressor */
64 char type[5],buf[2000];
66 memcpy(type,&fccType,4);type[4]=0;
67 TRACE("(%s,%ld,%p).\n",type,fccHandler,lpicinfo);
68 /* does OpenDriver/CloseDriver */
69 lpicinfo->dwSize = sizeof(ICINFO);
70 lpicinfo->fccType = fccType;
71 lpicinfo->dwFlags = 0;
72 if (GetPrivateProfileStringA("drivers32",NULL,NULL,buf,2000,"system.ini")) {
75 if (!lstrncmpiA(type,s,4)) {
77 lpicinfo->fccHandler = mmioStringToFOURCCA(s+5,0);
81 s=s+lstrlenA(s)+1; /* either next char or \0 */
87 BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16* /*SEGPTR*/ lpicinfo) {
90 DWORD lParam = (DWORD)lpicinfo;
91 DWORD size = ((ICINFO*)(PTR_SEG_TO_LIN(lpicinfo)))->dwSize;
93 /* Use the mapping functions to map the ICINFO structure */
94 lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO,&lParam,&size);
96 ret = ICInfo(fccType,fccHandler,(ICINFO*)lParam);
98 MSVIDEO_UnmapMsg16To32(ICM_GETINFO,lpv,&lParam,&size);
103 /***********************************************************************
105 * Opens an installable compressor. Return special handle.
107 HIC VFWAPI ICOpen(DWORD fccType,DWORD fccHandler,UINT wMode) {
108 char type[5],handler[5],codecname[20];
114 memcpy(type,&fccType,4);type[4]=0;
115 memcpy(handler,&fccHandler,4);handler[4]=0;
116 TRACE("(%s,%s,0x%08lx)\n",type,handler,(DWORD)wMode);
118 sprintf(codecname,"%s.%s",type,handler);
120 /* Well, lParam2 is in fact a LPVIDEO_OPEN_PARMS, but it has the
121 * same layout as ICOPEN
123 icopen.fccType = fccType;
124 icopen.fccHandler = fccHandler;
125 icopen.dwSize = sizeof(ICOPEN);
126 icopen.dwFlags = wMode;
127 /* FIXME: do we need to fill out the rest too? */
128 hdrv=OpenDriverA(codecname,"drivers32",(LPARAM)&icopen);
130 if (!strcasecmp(type,"vids")) {
131 sprintf(codecname,"vidc.%s",handler);
132 fccType = mmioFOURCC('v','i','d','c');
134 hdrv=OpenDriverA(codecname,"drivers32",(LPARAM)&icopen);
138 /* The handle should be a valid 16-bit handle as well */
139 hic = GlobalAlloc16(GHND,sizeof(WINE_HIC));
140 whic = (WINE_HIC*)GlobalLock16(hic);
142 whic->driverproc= NULL;
145 TRACE("=> 0x%08lx\n",(DWORD)hic);
149 HIC MSVIDEO_OpenFunc(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler, BOOL bFrom32) {
150 char type[5],handler[5],codecname[20];
152 ICOPEN* icopen = SEGPTR_NEW(ICOPEN);
155 memcpy(type,&fccType,4);type[4]=0;
156 memcpy(handler,&fccHandler,4);handler[4]=0;
157 TRACE("(%s,%s,%d,%p,%d)\n",type,handler,wMode,lpfnHandler,bFrom32?32:16);
159 icopen->fccType = fccType;
160 icopen->fccHandler = fccHandler;
161 icopen->dwSize = sizeof(ICOPEN);
162 icopen->dwFlags = wMode;
164 sprintf(codecname,"%s.%s",type,handler);
166 hic = GlobalAlloc16(GHND,sizeof(WINE_HIC));
169 whic = GlobalLock16(hic);
170 whic->driverproc = lpfnHandler;
172 whic->private = bFrom32;
174 /* Now try opening/loading the driver. Taken from DRIVER_AddToList */
175 /* What if the function is used more than once? */
177 if (MSVIDEO_SendMessage(hic,DRV_LOAD,0L,0L,bFrom32) != DRV_SUCCESS) {
178 WARN("DRV_LOAD failed for hic 0x%08lx\n",(DWORD)hic);
182 if (MSVIDEO_SendMessage(hic,DRV_ENABLE,0L,0L,bFrom32) != DRV_SUCCESS) {
183 WARN("DRV_ENABLE failed for hic 0x%08lx\n",(DWORD)hic);
187 whic->hdrv = MSVIDEO_SendMessage(hic,DRV_OPEN,0,(LPARAM)(SEGPTR_GET(icopen)),FALSE);
188 if (whic->hdrv == 0) {
189 WARN("DRV_OPEN failed for hic 0x%08lx\n",(DWORD)hic);
195 TRACE("=> 0x%08lx\n",(DWORD)hic);
199 /***********************************************************************
200 * ICOpenFunction [MSVFW.38]
202 HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler) {
203 return MSVIDEO_OpenFunc(fccType,fccHandler,wMode,lpfnHandler,TRUE);
206 HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) {
207 return (HIC16)ICOpen(fccType, fccHandler, wMode);
210 HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler) {
211 return MSVIDEO_OpenFunc(fccType, fccHandler, wMode, lpfnHandler,FALSE);
214 /***********************************************************************
215 * ICGetInfo [MSVFW.30]
217 LRESULT VFWAPI ICGetInfo(HIC hic,ICINFO *picinfo,DWORD cb) {
220 TRACE("(0x%08lx,%p,%ld)\n",(DWORD)hic,picinfo,cb);
221 ret = ICSendMessage(hic,ICM_GETINFO,(DWORD)picinfo,cb);
222 TRACE(" -> 0x%08lx\n",ret);
226 LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 *picinfo,DWORD cb) {
229 TRACE("(0x%08lx,%p,%ld)\n",(DWORD)hic,picinfo,cb);
230 ret = ICSendMessage16(hic,ICM_GETINFO,(DWORD)picinfo,cb);
231 TRACE(" -> 0x%08lx\n",ret);
235 /***********************************************************************
236 * ICLocate [MSVFW.35]
239 DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn,
240 LPBITMAPINFOHEADER lpbiOut, WORD wMode)
242 char type[5],handler[5];
247 TRACE("(0x%08lx,0x%08lx,%p,%p,0x%04x)\n", fccType, fccHandler, lpbiIn, lpbiOut, wMode);
250 case ICMODE_FASTCOMPRESS:
251 case ICMODE_COMPRESS:
252 querymsg = ICM_COMPRESS_QUERY;
254 case ICMODE_FASTDECOMPRESS:
255 case ICMODE_DECOMPRESS:
256 querymsg = ICM_DECOMPRESS_QUERY;
259 querymsg = ICM_DRAW_QUERY;
262 WARN("Unknown mode (%d)\n",wMode);
266 /* Easy case: handler/type match, we just fire a query and return */
267 hic = ICOpen(fccType,fccHandler,wMode);
269 if (!ICSendMessage(hic,querymsg,(DWORD)lpbiIn,(DWORD)lpbiOut))
274 type[4]='.';memcpy(type,&fccType,4);
275 handler[4]='.';memcpy(handler,&fccHandler,4);
277 /* Now try each driver in turn. 32 bit codecs only. */
278 /* FIXME: Move this to an init routine? */
280 pszBuffer = (LPSTR)HeapAlloc(GetProcessHeap(),0,1024);
281 if (GetPrivateProfileSectionA("drivers32",pszBuffer,1024,"system.ini")) {
284 if (!lstrncmpiA(type,s,5)) {
286 while (*s2 != '\0' && *s2 != '.') s2++;
291 h = ICOpen(fccType,*(DWORD*)s2,wMode);
293 if (!ICSendMessage(h,querymsg,(DWORD)lpbiIn,(DWORD)lpbiOut))
299 s += lstrlenA(s) + 1;
302 HeapFree(GetProcessHeap(),0,pszBuffer);
304 if (fccType==streamtypeVIDEO) {
305 hic = ICLocate(ICTYPE_VIDEO,fccHandler,lpbiIn,lpbiOut,wMode);
310 type[4] = handler[4] = '\0';
311 FIXME("(%.4s,%.4s,%p,%p,0x%04x),unhandled!\n",type,handler,lpbiIn,lpbiOut,wMode);
315 HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn,
316 LPBITMAPINFOHEADER lpbiOut, WORD wFlags) {
317 return (HIC16)ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags);
320 /***********************************************************************
321 * ICGetDisplayFormat [MSVFW.29]
323 HIC VFWAPI ICGetDisplayFormat(
324 HIC hic,LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut,
325 INT depth,INT dx,INT dy)
330 FIXME("(0x%08lx,%p,%p,%d,%d,%d),stub!\n",(DWORD)hic,lpbiIn,lpbiOut,depth,dx,dy);
332 tmphic=ICLocate(ICTYPE_VIDEO,0,lpbiIn,NULL,ICMODE_DECOMPRESS);
336 if ((dy == lpbiIn->biHeight) || (dx == lpbiIn->biWidth))
337 dy = dx = 0; /* no resize needed */
338 /* Can we decompress it ? */
339 lres = ICDecompressQuery(tmphic,lpbiIn,NULL);
341 goto errout; /* no, sorry */
342 ICDecompressGetFormat(tmphic,lpbiIn,lpbiOut);
344 lpbiOut->biCompression = 0;
345 lpbiOut->biSize = sizeof(*lpbiOut);
350 depth = GetDeviceCaps(hdc,12)*GetDeviceCaps(hdc,14);
352 if (depth==15) depth = 16;
353 if (depth<8) depth = 8;
355 if (lpbiIn->biBitCount == 8)
358 TRACE("=> 0x%08lx\n",(DWORD)tmphic);
368 HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn,
369 LPBITMAPINFOHEADER lpbiOut, INT16 depth, INT16 dx, INT16 dy) {
370 return (HIC16)ICGetDisplayFormat(hic,lpbiIn,lpbiOut,depth,dx,dy);
373 /***********************************************************************
374 * ICCompress [MSVFW.23]
378 HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData,
379 LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid,
380 LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality,
381 LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev)
385 TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n",(DWORD)hic,dwFlags,lpbiOutput,lpData,lpbiInput,lpBits);
387 iccmp.dwFlags = dwFlags;
389 iccmp.lpbiOutput = lpbiOutput;
390 iccmp.lpOutput = lpData;
391 iccmp.lpbiInput = lpbiInput;
392 iccmp.lpInput = lpBits;
394 iccmp.lpckid = lpckid;
395 iccmp.lpdwFlags = lpdwFlags;
396 iccmp.lFrameNum = lFrameNum;
397 iccmp.dwFrameSize = dwFrameSize;
398 iccmp.dwQuality = dwQuality;
399 iccmp.lpbiPrev = lpbiPrev;
400 iccmp.lpPrev = lpPrev;
401 return ICSendMessage(hic,ICM_COMPRESS,(DWORD)&iccmp,sizeof(iccmp));
404 DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData,
405 LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, LPDWORD lpckid,
406 LPDWORD lpdwFlags, LONG lFrameNum, DWORD dwFrameSize, DWORD dwQuality,
407 LPBITMAPINFOHEADER lpbiPrev, LPVOID lpPrev) {
410 ICCOMPRESS *iccmp = SEGPTR_NEW(ICCOMPRESS);
412 TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n",(DWORD)hic,dwFlags,lpbiOutput,lpData,lpbiInput,lpBits);
414 iccmp->dwFlags = dwFlags;
416 iccmp->lpbiOutput = lpbiOutput;
417 iccmp->lpOutput = lpData;
418 iccmp->lpbiInput = lpbiInput;
419 iccmp->lpInput = lpBits;
421 iccmp->lpckid = lpckid;
422 iccmp->lpdwFlags = lpdwFlags;
423 iccmp->lFrameNum = lFrameNum;
424 iccmp->dwFrameSize = dwFrameSize;
425 iccmp->dwQuality = dwQuality;
426 iccmp->lpbiPrev = lpbiPrev;
427 iccmp->lpPrev = lpPrev;
428 ret = ICSendMessage16(hic,ICM_COMPRESS,(DWORD)SEGPTR_GET(iccmp),sizeof(ICCOMPRESS));
433 /***********************************************************************
434 * ICDecompress [MSVFW.26]
436 DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,
437 LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits)
442 TRACE("(0x%08lx,%ld,%p,%p,%p,%p)\n",(DWORD)hic,dwFlags,lpbiFormat,lpData,lpbi,lpBits);
444 TRACE("lpBits[0] == %ld\n",((LPDWORD)lpBits)[0]);
446 icd.dwFlags = dwFlags;
447 icd.lpbiInput = lpbiFormat;
448 icd.lpInput = lpData;
450 icd.lpbiOutput = lpbi;
451 icd.lpOutput = lpBits;
453 ret = ICSendMessage(hic,ICM_DECOMPRESS,(DWORD)&icd,sizeof(ICDECOMPRESS));
455 TRACE("lpBits[0] == %ld\n",((LPDWORD)lpBits)[0]);
457 TRACE("-> %ld\n",ret);
462 DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiFormat,
463 LPVOID lpData, LPBITMAPINFOHEADER lpbi, LPVOID lpBits) {
465 ICDECOMPRESS *icd = SEGPTR_NEW(ICDECOMPRESS);
468 TRACE("(0x%08lx,%ld,%p,%p,%p,%p)\n",(DWORD)hic,dwFlags,lpbiFormat,lpData,lpbi,lpBits);
470 icd->dwFlags = dwFlags;
471 icd->lpbiInput = lpbiFormat;
472 icd->lpInput = lpData;
473 icd->lpbiOutput = lpbi;
474 icd->lpOutput = lpBits;
477 ret = ICSendMessage16(hic,ICM_DECOMPRESS,(DWORD)SEGPTR_GET(icd),sizeof(ICDECOMPRESS));
483 #define COPY(x,y) (##x##->##y = ##x##16->##y);
484 #define COPYPTR(x,y) (##x##->##y = PTR_SEG_TO_LIN(##x##16->##y));
486 LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) {
489 ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(),0,sizeof(ICDECOMPRESSEX));
490 ICDECOMPRESSEX16 *icdx16 = (ICDECOMPRESSEX16*)PTR_SEG_TO_LIN(*lParam);
494 COPYPTR(icdx,lpbiSrc);
496 COPYPTR(icdx,lpbiDst);
507 *lParam = (DWORD)(icdx);
511 LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) {
514 TRACE("Mapping %d\n",msg);
524 case ICM_COMPRESS_END:
525 case ICM_DECOMPRESS_END:
526 case ICM_DECOMPRESSEX_END:
530 case ICM_GETDEFAULTQUALITY:
532 *lParam1 = (DWORD)PTR_SEG_TO_LIN(*lParam1);
536 ICINFO *ici = HeapAlloc(GetProcessHeap(),0,sizeof(ICINFO));
539 ici16 = (ICINFO16*)PTR_SEG_TO_LIN(*lParam1);
542 ici->dwSize = sizeof(ICINFO);
544 COPY(ici,fccHandler);
547 COPY(ici,dwVersionICM);
548 lstrcpynAtoW(ici->szName,ici16->szName,16);
549 lstrcpynAtoW(ici->szDescription,ici16->szDescription,128);
550 lstrcpynAtoW(ici->szDriver,ici16->szDriver,128);
552 *lParam1 = (DWORD)(ici);
553 *lParam2 = sizeof(ICINFO);
558 ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(),0,sizeof(ICCOMPRESS));
561 icc16 = (ICCOMPRESS*)PTR_SEG_TO_LIN(*lParam1);
565 COPYPTR(icc,lpbiOutput);
566 COPYPTR(icc,lpOutput);
567 COPYPTR(icc,lpbiInput);
568 COPYPTR(icc,lpInput);
570 COPYPTR(icc,lpdwFlags);
572 COPY(icc,dwFrameSize);
574 COPYPTR(icc,lpbiPrev);
577 *lParam1 = (DWORD)(icc);
578 *lParam2 = sizeof(ICCOMPRESS);
583 ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(),0,sizeof(ICDECOMPRESS));
584 ICDECOMPRESS *icd16; /* Same structure except for the pointers */
586 icd16 = (ICDECOMPRESS*)PTR_SEG_TO_LIN(*lParam1);
590 COPYPTR(icd,lpbiInput);
591 COPYPTR(icd,lpInput);
592 COPYPTR(icd,lpbiOutput);
593 COPYPTR(icd,lpOutput);
596 *lParam1 = (DWORD)(icd);
597 *lParam2 = sizeof(ICDECOMPRESS);
600 case ICM_COMPRESS_BEGIN:
601 case ICM_COMPRESS_GET_FORMAT:
602 case ICM_COMPRESS_GET_SIZE:
603 case ICM_COMPRESS_QUERY:
604 case ICM_DECOMPRESS_GET_FORMAT:
605 case ICM_DECOMPRESS_QUERY:
606 case ICM_DECOMPRESS_BEGIN:
607 case ICM_DECOMPRESS_SET_PALETTE:
608 case ICM_DECOMPRESS_GET_PALETTE:
609 *lParam1 = (DWORD)PTR_SEG_TO_LIN(*lParam1);
610 *lParam2 = (DWORD)PTR_SEG_TO_LIN(*lParam2);
612 case ICM_DECOMPRESSEX_QUERY:
613 if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0))
614 WARN("*lParam2 has unknown value %p\n",(ICDECOMPRESSEX16*)*lParam2);
615 /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16)
616 * This is because of ICMessage(). Special case it?
618 LPVOID* addr = HeapAlloc(GetProcessHeap(),0,2*sizeof(LPVOID));
619 addr[0] = MSVIDEO_MapICDEX16To32(lParam1);
621 addr[1] = MSVIDEO_MapICDEX16To32(lParam2);
628 case ICM_DECOMPRESSEX_BEGIN:
629 case ICM_DECOMPRESSEX:
630 ret = MSVIDEO_MapICDEX16To32(lParam1);
631 *lParam2 = sizeof(ICDECOMPRESSEX);
635 ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAWBEGIN));
636 ICDRAWBEGIN16 *icdb16 = (ICDRAWBEGIN16*)PTR_SEG_TO_LIN(*lParam1);
655 *lParam1 = (DWORD)(icdb);
656 *lParam2 = sizeof(ICDRAWBEGIN);
659 case ICM_DRAW_SUGGESTFORMAT:
661 ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAWSUGGEST));
662 ICDRAWSUGGEST16 *icds16 = (ICDRAWSUGGEST16*)PTR_SEG_TO_LIN(*lParam1);
667 COPYPTR(icds,lpbiIn);
668 COPYPTR(icds,lpbiSuggest);
673 COPY(icds,hicDecompressor);
675 *lParam1 = (DWORD)(icds);
676 *lParam2 = sizeof(ICDRAWSUGGEST);
681 ICDRAW *icd = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAW));
682 ICDRAW *icd16 = (ICDRAW*)PTR_SEG_TO_LIN(*lParam1);
686 COPYPTR(icd,lpFormat);
691 *lParam1 = (DWORD)(icd);
692 *lParam2 = sizeof(ICDRAW);
696 FIXME("%d is not yet handled. Expect a crash.\n",msg);
704 void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) {
705 TRACE("Unmapping %d\n",msg);
707 #define UNCOPY(x,y) (##x##16->##y = ##x##->##y);
712 ICINFO *ici = (ICINFO*)(*lParam1);
713 ICINFO16 *ici16 = (ICINFO16*)data16;
716 UNCOPY(ici,fccHandler);
718 UNCOPY(ici,dwVersion);
719 UNCOPY(ici,dwVersionICM);
720 lstrcpynWtoA(ici16->szName,ici->szName,16);
721 lstrcpynWtoA(ici16->szDescription,ici->szDescription,128);
722 /* This just gives garbage for some reason - BB
723 lstrcpynWtoA(ici16->szDriver,ici->szDriver,128);*/
725 HeapFree(GetProcessHeap(),0,ici);
728 case ICM_DECOMPRESS_QUERY:
731 HeapFree(GetProcessHeap(),0,x[0]);
733 HeapFree(GetProcessHeap(),0,x[1]);
738 case ICM_DECOMPRESSEX_QUERY:
739 case ICM_DECOMPRESSEX_BEGIN:
740 case ICM_DECOMPRESSEX:
742 case ICM_DRAW_SUGGESTFORMAT:
744 HeapFree(GetProcessHeap(),0,data16);
747 ERR("Unmapping unmapped msg %d\n",msg);
752 LRESULT MSVIDEO_SendMessage(HIC hic,UINT msg,DWORD lParam1,DWORD lParam2, BOOL bFrom32) {
754 WINE_HIC *whic = GlobalLock16(hic);
758 #define XX(x) case x: TRACE("(0x%08lx,"#x",0x%08lx,0x%08lx,%d)\n",(DWORD)hic,lParam1,lParam2,bFrom32?32:16);break;
773 XX(ICM_GETDEFAULTQUALITY);
780 XX(ICM_COMPRESS_FRAMES_INFO);
781 XX(ICM_COMPRESS_GET_FORMAT);
782 XX(ICM_COMPRESS_GET_SIZE);
783 XX(ICM_COMPRESS_QUERY);
784 XX(ICM_COMPRESS_BEGIN);
786 XX(ICM_COMPRESS_END);
787 XX(ICM_DECOMPRESS_GET_FORMAT);
788 XX(ICM_DECOMPRESS_QUERY);
789 XX(ICM_DECOMPRESS_BEGIN);
791 XX(ICM_DECOMPRESS_END);
792 XX(ICM_DECOMPRESS_SET_PALETTE);
793 XX(ICM_DECOMPRESS_GET_PALETTE);
796 XX(ICM_DRAW_GET_PALETTE);
800 XX(ICM_DRAW_GETTIME);
803 XX(ICM_DRAW_SETTIME);
804 XX(ICM_DRAW_REALIZE);
806 XX(ICM_DRAW_RENDERBUFFER);
807 XX(ICM_DRAW_START_PLAY);
808 XX(ICM_DRAW_STOP_PLAY);
809 XX(ICM_DRAW_SUGGESTFORMAT);
810 XX(ICM_DRAW_CHANGEPALETTE);
811 XX(ICM_GETBUFFERSWANTED);
812 XX(ICM_GETDEFAULTKEYFRAMERATE);
813 XX(ICM_DECOMPRESSEX_BEGIN);
814 XX(ICM_DECOMPRESSEX_QUERY);
815 XX(ICM_DECOMPRESSEX);
816 XX(ICM_DECOMPRESSEX_END);
817 XX(ICM_SET_STATUS_PROC);
819 FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx,%i) unknown message\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2,bFrom32?32:16);
824 if (whic->driverproc) { /* IC is a function */
825 bDrv32 = whic->private;
827 bDrv32 = ((GetDriverFlags(whic->hdrv) & (WINE_GDF_EXIST|WINE_GDF_16BIT)) == WINE_GDF_EXIST);
832 data16 = MSVIDEO_MapMsg16To32(msg,&lParam1,&lParam2);
835 ERR("Can't do 32->16 mappings\n");
841 if (whic->driverproc) {
843 ret = whic->driverproc(whic->hdrv,hic,msg,lParam1,lParam2);
845 ret = MSVIDEO_CallTo16_long_lwwll((FARPROC16)whic->driverproc,whic->hdrv,hic,msg,lParam1,lParam2);
848 ret = SendDriverMessage(whic->hdrv,msg,lParam1,lParam2);
852 MSVIDEO_UnmapMsg16To32(msg,data16,&lParam1,&lParam2);
857 TRACE(" -> 0x%08lx\n",ret);
861 /***********************************************************************
862 * ICSendMessage [MSVFW.40]
864 LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2) {
865 return MSVIDEO_SendMessage(hic,msg,lParam1,lParam2,TRUE);
868 LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) {
869 return MSVIDEO_SendMessage(hic,msg,lParam1,lParam2,FALSE);
872 LRESULT VFWAPIV ICMessage16(void) {
883 hic = VA_ARG16(valist, HIC16);
884 msg = VA_ARG16(valist, UINT16);
885 cb = VA_ARG16(valist, UINT16);
887 lpData = SEGPTR_ALLOC(cb);
889 TRACE("0x%08lx, %u, %u, ...)\n",(DWORD)hic,msg,cb);
891 for(i=0;i<cb/sizeof(WORD);i++) {
892 lpData[i] = VA_ARG16(valist, WORD);
896 ret = ICSendMessage16(hic, msg, (DWORD)(SEGPTR_GET(lpData)), (DWORD)cb);
902 /***********************************************************************
903 * ICDrawBegin [MSVFW.28]
905 DWORD VFWAPIV ICDrawBegin(
907 DWORD dwFlags,/* flags */
908 HPALETTE hpal, /* palette to draw with */
909 HWND hwnd, /* window to draw to */
910 HDC hdc, /* HDC to draw to */
911 INT xDst, /* destination rectangle */
915 LPBITMAPINFOHEADER lpbi, /* format of frame to draw */
916 INT xSrc, /* source rectangle */
920 DWORD dwRate, /* frames/second = (dwRate/dwScale) */
925 TRACE("(0x%08lx,%ld,0x%08lx,0x%08lx,0x%08lx,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n",
926 (DWORD)hic, dwFlags, (DWORD)hpal, (DWORD)hwnd, (DWORD)hdc, xDst, yDst, dxDst, dyDst,
927 lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale);
929 icdb.dwFlags = dwFlags;
942 icdb.dwRate = dwRate;
943 icdb.dwScale = dwScale;
944 return ICSendMessage(hic,ICM_DRAW_BEGIN,(DWORD)&icdb,sizeof(icdb));
947 DWORD VFWAPIV ICDrawBegin16(
949 DWORD dwFlags,/* flags */
950 HPALETTE16 hpal, /* palette to draw with */
951 HWND16 hwnd, /* window to draw to */
952 HDC16 hdc, /* HDC to draw to */
953 INT16 xDst, /* destination rectangle */
957 LPBITMAPINFOHEADER /*SEGPTR*/ lpbi, /* format of frame to draw */
958 INT16 xSrc, /* source rectangle */
962 DWORD dwRate, /* frames/second = (dwRate/dwScale) */
966 ICDRAWBEGIN16* icdb = SEGPTR_NEW(ICDRAWBEGIN16); /* SEGPTR for mapper to deal with */
968 TRACE("(0x%08lx,%ld,0x%08lx,0x%08lx,0x%08lx,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n",
969 (DWORD)hic, dwFlags, (DWORD)hpal, (DWORD)hwnd, (DWORD)hdc, xDst, yDst, dxDst, dyDst,
970 lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale);
972 icdb->dwFlags = dwFlags;
980 icdb->lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */
985 icdb->dwRate = dwRate;
986 icdb->dwScale = dwScale;
988 ret = (DWORD)ICSendMessage16(hic,ICM_DRAW_BEGIN,(DWORD)SEGPTR_GET(icdb),sizeof(ICDRAWBEGIN16));
993 /***********************************************************************
996 DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime) {
999 TRACE("(0x%09lx,%ld,%p,%p,%ld,%ld)\n",(DWORD)hic,dwFlags,lpFormat,lpData,cbData,lTime);
1001 icd.dwFlags = dwFlags;
1002 icd.lpFormat = lpFormat;
1003 icd.lpData = lpData;
1004 icd.cbData = cbData;
1007 return ICSendMessage(hic,ICM_DRAW,(DWORD)&icd,sizeof(icd));
1010 DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags, LPVOID /*SEGPTR*/ lpFormat,
1011 LPVOID /*SEGPTR*/ lpData, DWORD cbData, LONG lTime) {
1013 ICDRAW* icd = SEGPTR_NEW(ICDRAW); /* SEGPTR for mapper to deal with */
1015 TRACE("(0x%08lx,0x%08lx,%p,%p,%ld,%ld)\n",(DWORD)hic,dwFlags,lpFormat,lpData,cbData,lTime);
1016 icd->dwFlags = dwFlags;
1017 icd->lpFormat = lpFormat;
1018 icd->lpData = lpData;
1019 icd->cbData = cbData;
1022 return ICSendMessage16(hic,ICM_DRAW,(DWORD)SEGPTR_GET(icd),sizeof(ICDRAW));
1025 /***********************************************************************
1026 * ICClose [MSVFW.22]
1028 LRESULT WINAPI ICClose(HIC hic) {
1029 WINE_HIC *whic = GlobalLock16(hic);
1030 TRACE("(0x%08lx)\n",(DWORD)hic);
1031 if (whic->driverproc) {
1032 ICSendMessage16(hic,DRV_CLOSE,0,0);
1033 ICSendMessage16(hic,DRV_DISABLE,0,0);
1034 ICSendMessage16(hic,DRV_FREE,0,0);
1036 CloseDriver(whic->hdrv,0,0);
1039 GlobalUnlock16(hic);
1044 LRESULT WINAPI ICClose16(HIC16 hic) {
1045 return ICClose(hic);
1048 /***********************************************************************
1049 * MCIWndCreateA [MSVFW.44 & MSVFW.45]
1051 HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance,
1052 DWORD dwStyle,LPCSTR szFile)
1054 FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, szFile);
1058 /***********************************************************************
1059 * MCIWndCreateW [MSVFW.46]
1061 HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance,
1062 DWORD dwStyle,LPCWSTR szFile)
1064 FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, debugstr_w(szFile));