Autosyncing with Wine HEAD

svn path=/trunk/; revision=26499
This commit is contained in:
The Wine Synchronizer 2007-04-25 08:21:59 +00:00
parent 9e6fba7c97
commit b0d8e30526
21 changed files with 1127 additions and 228 deletions

View file

@ -1,22 +0,0 @@
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = msvfw32.dll
IMPORTS = winmm comctl32 version user32 gdi32 advapi32 kernel32 ntdll
ALTNAMES = msvideo.dll
EXTRALIBS = $(LIBUNICODE)
SPEC_SRCS16 = $(ALTNAMES:.dll=.spec)
C_SRCS = \
mciwnd.c \
msvideo_main.c \
drawdib.c
C_SRCS16 = \
msvideo16.c
@MAKE_DLL_RULES@
### Dependencies:

View file

@ -13,18 +13,22 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
* *
* FIXME: Some flags are ignored * FIXME: Some flags are ignored
* *
* Handle palettes * Handle palettes
*/ */
#include <stdarg.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include "msvideo_private.h"
#include "windef.h"
#include "winbase.h"
#include "wingdi.h" #include "wingdi.h"
#include "winuser.h" #include "winuser.h"
#include "vfw.h"
#include "wine/debug.h" #include "wine/debug.h"
@ -49,7 +53,7 @@ typedef struct tagWINE_HDD {
struct tagWINE_HDD* next; struct tagWINE_HDD* next;
} WINE_HDD; } WINE_HDD;
int num_colours(LPBITMAPINFOHEADER lpbi) static int num_colours(const BITMAPINFOHEADER *lpbi)
{ {
if(lpbi->biClrUsed) if(lpbi->biClrUsed)
return lpbi->biClrUsed; return lpbi->biClrUsed;
@ -131,16 +135,10 @@ BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd)
whdd->hpal = 0; /* Do not free this */ whdd->hpal = 0; /* Do not free this */
whdd->hdc = 0; whdd->hdc = 0;
if (whdd->lpbi) HeapFree(GetProcessHeap(), 0, whdd->lpbi);
{ whdd->lpbi = NULL;
HeapFree(GetProcessHeap(), 0, whdd->lpbi); HeapFree(GetProcessHeap(), 0, whdd->lpbiOut);
whdd->lpbi = NULL; whdd->lpbiOut = NULL;
}
if (whdd->lpbiOut)
{
HeapFree(GetProcessHeap(), 0, whdd->lpbiOut);
whdd->lpbiOut = NULL;
}
whdd->begun = FALSE; whdd->begun = FALSE;
@ -184,10 +182,10 @@ BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
BOOL ret = TRUE; BOOL ret = TRUE;
WINE_HDD *whdd; WINE_HDD *whdd;
TRACE("(%p,%p,%d,%d,%p,%d,%d,0x%08lx)\n", TRACE("(%p,%p,%d,%d,%p,%d,%d,0x%08x)\n",
hdd, hdc, dxDst, dyDst, lpbi, dxSrc, dySrc, (DWORD)wFlags); hdd, hdc, dxDst, dyDst, lpbi, dxSrc, dySrc, (DWORD)wFlags);
TRACE("lpbi: %ld,%ld/%ld,%d,%d,%ld,%ld,%ld,%ld,%ld,%ld\n", TRACE("lpbi: %d,%d/%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
lpbi->biSize, lpbi->biWidth, lpbi->biHeight, lpbi->biPlanes, lpbi->biSize, lpbi->biWidth, lpbi->biHeight, lpbi->biPlanes,
lpbi->biBitCount, lpbi->biCompression, lpbi->biSizeImage, lpbi->biBitCount, lpbi->biCompression, lpbi->biSizeImage,
lpbi->biXPelsPerMeter, lpbi->biYPelsPerMeter, lpbi->biClrUsed, lpbi->biXPelsPerMeter, lpbi->biYPelsPerMeter, lpbi->biClrUsed,
@ -208,7 +206,7 @@ BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
whdd->hic = ICOpen(ICTYPE_VIDEO, lpbi->biCompression, ICMODE_DECOMPRESS); whdd->hic = ICOpen(ICTYPE_VIDEO, lpbi->biCompression, ICMODE_DECOMPRESS);
if (!whdd->hic) if (!whdd->hic)
{ {
WARN("Could not open IC. biCompression == 0x%08lx\n", lpbi->biCompression); WARN("Could not open IC. biCompression == 0x%08x\n", lpbi->biCompression);
ret = FALSE; ret = FALSE;
} }
@ -236,8 +234,8 @@ BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
if (ICDecompressBegin(whdd->hic, lpbi, whdd->lpbiOut) != ICERR_OK) if (ICDecompressBegin(whdd->hic, lpbi, whdd->lpbiOut) != ICERR_OK)
ret = FALSE; ret = FALSE;
TRACE("biSizeImage == %ld\n", whdd->lpbiOut->biSizeImage); TRACE("biSizeImage == %d\n", whdd->lpbiOut->biSizeImage);
TRACE("biCompression == %ld\n", whdd->lpbiOut->biCompression); TRACE("biCompression == %d\n", whdd->lpbiOut->biCompression);
TRACE("biBitCount == %d\n", whdd->lpbiOut->biBitCount); TRACE("biBitCount == %d\n", whdd->lpbiOut->biBitCount);
} }
} }
@ -256,13 +254,17 @@ BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
/*whdd->lpvbuf = HeapAlloc(GetProcessHeap(), 0, whdd->lpbiOut->biSizeImage);*/ /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(), 0, whdd->lpbiOut->biSizeImage);*/
whdd->hMemDC = CreateCompatibleDC(hdc); whdd->hMemDC = CreateCompatibleDC(hdc);
TRACE("Creating: %ld, %p\n", whdd->lpbiOut->biSize, whdd->lpvbits); TRACE("Creating: %d, %p\n", whdd->lpbiOut->biSize, whdd->lpvbits);
whdd->hDib = CreateDIBSection(whdd->hMemDC, (BITMAPINFO *)whdd->lpbiOut, DIB_RGB_COLORS, &(whdd->lpvbits), 0, 0); whdd->hDib = CreateDIBSection(whdd->hMemDC, (BITMAPINFO *)whdd->lpbiOut, DIB_RGB_COLORS, &(whdd->lpvbits), 0, 0);
if (!whdd->hDib) if (whdd->hDib)
{ {
TRACE("Error: %ld\n", GetLastError()); TRACE("Created: %p,%p\n", whdd->hDib, whdd->lpvbits);
}
else
{
ret = FALSE;
TRACE("Error: %d\n", GetLastError());
} }
TRACE("Created: %p,%p\n", whdd->hDib, whdd->lpvbits);
whdd->hOldDib = SelectObject(whdd->hMemDC, whdd->hDib); whdd->hOldDib = SelectObject(whdd->hMemDC, whdd->hDib);
} }
@ -282,11 +284,8 @@ BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
{ {
if (whdd->hic) if (whdd->hic)
ICClose(whdd->hic); ICClose(whdd->hic);
if (whdd->lpbiOut) HeapFree(GetProcessHeap(), 0, whdd->lpbiOut);
{ whdd->lpbiOut = NULL;
HeapFree(GetProcessHeap(), 0, whdd->lpbiOut);
whdd->lpbiOut = NULL;
}
} }
return ret; return ret;
@ -305,14 +304,16 @@ BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc,
WINE_HDD *whdd; WINE_HDD *whdd;
BOOL ret = TRUE; BOOL ret = TRUE;
TRACE("(%p,%p,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n", TRACE("(%p,%p,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08x)\n",
hdd, hdc, xDst, yDst, dxDst, dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, (DWORD)wFlags); hdd, hdc, xDst, yDst, dxDst, dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, (DWORD)wFlags);
whdd = MSVIDEO_GetHddPtr(hdd); whdd = MSVIDEO_GetHddPtr(hdd);
if (!whdd) return FALSE; if (!whdd) return FALSE;
if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME | DDF_UPDATE | DDF_DONTDRAW)) TRACE("whdd=%p\n", whdd);
FIXME("wFlags == 0x%08lx not handled\n", (DWORD)wFlags);
if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME | DDF_UPDATE | DDF_DONTDRAW | DDF_BACKGROUNDPAL))
FIXME("wFlags == 0x%08x not handled\n", (DWORD)wFlags);
if (!lpBits) if (!lpBits)
{ {
@ -341,15 +342,17 @@ BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc,
if (!(wFlags & DDF_UPDATE)) if (!(wFlags & DDF_UPDATE))
{ {
DWORD biSizeImage = lpbi->biSizeImage;
/* biSizeImage may be set to 0 for BI_RGB (uncompressed) bitmaps */ /* biSizeImage may be set to 0 for BI_RGB (uncompressed) bitmaps */
if ((lpbi->biCompression == BI_RGB) && (lpbi->biSizeImage == 0)) if ((lpbi->biCompression == BI_RGB) && (biSizeImage == 0))
lpbi->biSizeImage = ((lpbi->biWidth * lpbi->biBitCount + 31) / 32) * 4 * lpbi->biHeight; biSizeImage = ((lpbi->biWidth * lpbi->biBitCount + 31) / 32) * 4 * lpbi->biHeight;
if (lpbi->biCompression) if (lpbi->biCompression)
{ {
DWORD flags = 0; DWORD flags = 0;
TRACE("Compression == 0x%08lx\n", lpbi->biCompression); TRACE("Compression == 0x%08x\n", lpbi->biCompression);
if (wFlags & DDF_NOTKEYFRAME) if (wFlags & DDF_NOTKEYFRAME)
flags |= ICDECOMPRESS_NOTKEYFRAME; flags |= ICDECOMPRESS_NOTKEYFRAME;
@ -358,11 +361,16 @@ BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc,
} }
else else
{ {
memcpy(whdd->lpvbits, lpBits, lpbi->biSizeImage); memcpy(whdd->lpvbits, lpBits, biSizeImage);
} }
} }
if (!(wFlags & DDF_DONTDRAW) && whdd->hpal) if (!(wFlags & DDF_DONTDRAW) && whdd->hpal)
SelectPalette(hdc, whdd->hpal, FALSE); {
if ((wFlags & DDF_BACKGROUNDPAL) && ! (wFlags & DDF_SAME_HDC))
SelectPalette(hdc, whdd->hpal, TRUE);
else
SelectPalette(hdc, whdd->hpal, FALSE);
}
if (!(StretchBlt(whdd->hdc, xDst, yDst, dxDst, dyDst, whdd->hMemDC, xSrc, ySrc, dxSrc, dySrc, SRCCOPY))) if (!(StretchBlt(whdd->hdc, xDst, yDst, dxDst, dyDst, whdd->hMemDC, xSrc, ySrc, dxSrc, dySrc, SRCCOPY)))
ret = FALSE; ret = FALSE;
@ -374,7 +382,7 @@ BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc,
* DrawDibStart [MSVFW32.@] * DrawDibStart [MSVFW32.@]
*/ */
BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) { BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) {
FIXME("(%p, %ld), stub\n", hdd, rate); FIXME("(%p, %d), stub\n", hdd, rate);
return TRUE; return TRUE;
} }
@ -386,6 +394,15 @@ BOOL VFWAPI DrawDibStop(HDRAWDIB hdd) {
return TRUE; return TRUE;
} }
/***********************************************************************
* DrawDibChangePalette [MSVFW32.@]
*/
BOOL VFWAPI DrawDibChangePalette(HDRAWDIB hdd, int iStart, int iLen, LPPALETTEENTRY lppe)
{
FIXME("(%p, 0x%08x, 0x%08x, %p), stub\n", hdd, iStart, iLen, lppe);
return TRUE;
}
/*********************************************************************** /***********************************************************************
* DrawDibSetPalette [MSVFW32.@] * DrawDibSetPalette [MSVFW32.@]
*/ */
@ -409,6 +426,15 @@ BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal)
return TRUE; return TRUE;
} }
/***********************************************************************
* DrawDibGetBuffer [MSVFW32.@]
*/
LPVOID VFWAPI DrawDibGetBuffer(HDRAWDIB hdd, LPBITMAPINFOHEADER lpbi, DWORD dwSize, DWORD dwFlags)
{
FIXME("(%p, %p, 0x%08x, 0x%08x), stub\n", hdd, lpbi, dwSize, dwFlags);
return NULL;
}
/*********************************************************************** /***********************************************************************
* DrawDibGetPalette [MSVFW32.@] * DrawDibGetPalette [MSVFW32.@]
*/ */
@ -455,6 +481,18 @@ UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground)
return ret; return ret;
} }
/***********************************************************************
* DrawDibTime [MSVFW32.@]
*/
BOOL VFWAPI DrawDibTime(HDRAWDIB hdd, LPDRAWDIBTIME lpddtime)
{
FIXME("(%p, %p) stub\n", hdd, lpddtime);
return FALSE;
}
/***********************************************************************
* DrawDibProfileDisplay [MSVFW32.@]
*/
DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi) DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi)
{ {
FIXME("(%p) stub\n", lpbi); FIXME("(%p) stub\n", lpbi);

View file

@ -14,7 +14,7 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
* *
* FIXME: * FIXME:
* Add support for all remaining MCI_ commands and MCIWNDM_ messages. * Add support for all remaining MCI_ commands and MCIWNDM_ messages.
@ -104,7 +104,7 @@ BOOL VFWAPIV MCIWndRegisterClass(void)
HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance,
DWORD dwStyle, LPCWSTR szFile) DWORD dwStyle, LPCWSTR szFile)
{ {
TRACE("%p %p %lx %s\n", hwndParent, hInstance, dwStyle, debugstr_w(szFile)); TRACE("%p %p %x %s\n", hwndParent, hInstance, dwStyle, debugstr_w(szFile));
MCIWndRegisterClass(); MCIWndRegisterClass();
@ -244,7 +244,7 @@ static void MCIWND_UpdateState(MCIWndInfo *mwi)
strcatW(buffer, r_braceW); strcatW(buffer, r_braceW);
} }
TRACE("=> '%s'\n", debugstr_w(buffer)); TRACE("=> %s\n", debugstr_w(buffer));
SetWindowTextW(mwi->hWnd, buffer); SetWindowTextW(mwi->hWnd, buffer);
} }
@ -429,6 +429,21 @@ static LRESULT mci_get_devcaps(MCIWndInfo *mwi, UINT cap)
return mci_devcaps.dwReturn; return mci_devcaps.dwReturn;
} }
static LRESULT MCIWND_KeyDown(MCIWndInfo *mwi, UINT key)
{
TRACE("%p, key %04x\n", mwi->hWnd, key);
switch(key)
{
case VK_ESCAPE:
SendMessageW(mwi->hWnd, MCI_STOP, 0, 0);
return 0;
default:
return 0;
}
}
static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{ {
MCIWndInfo *mwi; MCIWndInfo *mwi;
@ -477,6 +492,9 @@ static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lPa
case WM_COMMAND: case WM_COMMAND:
return MCIWND_Command(mwi, wParam, lParam); return MCIWND_Command(mwi, wParam, lParam);
case WM_KEYDOWN:
return MCIWND_KeyDown(mwi, wParam);
case WM_NCACTIVATE: case WM_NCACTIVATE:
if (mwi->uTimer) if (mwi->uTimer)
{ {
@ -735,7 +753,7 @@ end_of_mci_open:
MCIWND_notify_error(mwi); MCIWND_notify_error(mwi);
return 0; return 0;
} }
TRACE("MCIWNDM_GETLENGTH: %ld\n", mci_status.dwReturn); TRACE("MCIWNDM_GETLENGTH: %d\n", mci_status.dwReturn);
return mci_status.dwReturn; return mci_status.dwReturn;
} }
@ -752,7 +770,7 @@ end_of_mci_open:
MCIWND_notify_error(mwi); MCIWND_notify_error(mwi);
return 0; return 0;
} }
TRACE("MCIWNDM_GETSTART: %ld\n", mci_status.dwReturn); TRACE("MCIWNDM_GETSTART: %d\n", mci_status.dwReturn);
return mci_status.dwReturn; return mci_status.dwReturn;
} }
@ -1010,7 +1028,7 @@ end_of_mci_open:
return mwi->lasterror; return mwi->lasterror;
case MCIWNDM_RETURNSTRINGW: case MCIWNDM_RETURNSTRINGW:
strncpyW((LPWSTR)lParam, mwi->return_string, wParam); lstrcpynW((LPWSTR)lParam, mwi->return_string, wParam);
TRACE("MCIWNDM_RETURNTRINGW %s\n", debugstr_wn((LPWSTR)lParam, wParam)); TRACE("MCIWNDM_RETURNTRINGW %s\n", debugstr_wn((LPWSTR)lParam, wParam));
return mwi->lasterror; return mwi->lasterror;
@ -1048,7 +1066,7 @@ end_of_mci_open:
return 0; return 0;
case MCIWNDM_GETSTYLES: case MCIWNDM_GETSTYLES:
TRACE("MCIWNDM_GETSTYLES: %08lx\n", mwi->dwStyle & 0xffff); TRACE("MCIWNDM_GETSTYLES: %08x\n", mwi->dwStyle & 0xffff);
return mwi->dwStyle & 0xffff; return mwi->dwStyle & 0xffff;
case MCIWNDM_GETDEVICEA: case MCIWNDM_GETDEVICEA:
@ -1095,7 +1113,7 @@ end_of_mci_open:
case MCIWNDM_GETFILENAMEW: case MCIWNDM_GETFILENAMEW:
TRACE("MCIWNDM_GETFILENAMEW: %s\n", debugstr_w(mwi->lpName)); TRACE("MCIWNDM_GETFILENAMEW: %s\n", debugstr_w(mwi->lpName));
if (mwi->lpName) if (mwi->lpName)
strncpyW((LPWSTR)lParam, mwi->lpName, wParam); lstrcpynW((LPWSTR)lParam, mwi->lpName, wParam);
return 0; return 0;
case MCIWNDM_GETTIMEFORMATA: case MCIWNDM_GETTIMEFORMATA:
@ -1328,11 +1346,8 @@ end_of_mci_open:
mwi->mode = MCI_MODE_NOT_READY; mwi->mode = MCI_MODE_NOT_READY;
mwi->position = -1; mwi->position = -1;
if (mwi->lpName) HeapFree(GetProcessHeap(), 0, mwi->lpName);
{ mwi->lpName = NULL;
HeapFree(GetProcessHeap(), 0, mwi->lpName);
mwi->lpName = NULL;
}
MCIWND_UpdateState(mwi); MCIWND_UpdateState(mwi);
GetClientRect(hWnd, &rc); GetClientRect(hWnd, &rc);

View file

@ -1,22 +1,25 @@
<module name="msvfw32" type="win32dll" baseaddress="${BASEADDRESS_MSVFW32}" installbase="system32" installname="msvfw32.dll" allowwarnings="true"> <module name="msvfw32" type="win32dll" baseaddress="${BASEADDRESS_MSVFW32}" installbase="system32" installname="msvfw32.dll" allowwarnings="true">
<importlibrary definition="msvfw32.spec.def" /> <importlibrary definition="msvfw32.spec.def" />
<include base="msvfw32">.</include>
<include base="ReactOS">include/reactos/wine</include> <include base="ReactOS">include/reactos/wine</include>
<define name="__REACTOS__" /> <define name="__REACTOS__" />
<define name="__WINESRC__" />
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="_WIN32_IE">0x600</define> <define name="_WIN32_IE">0x600</define>
<define name="_WIN32_WINNT">0x501</define> <define name="_WIN32_WINNT">0x501</define>
<define name="WINVER">0x501</define> <define name="WINVER">0x501</define>
<library>wine</library> <library>wine</library>
<library>winmm</library> <library>winmm</library>
<library>gdi32</library>
<library>comctl32</library> <library>comctl32</library>
<library>kernel32</library> <library>version</library>
<library>advapi32</library>
<library>user32</library> <library>user32</library>
<library>gdi32</library>
<library>advapi32</library>
<library>kernel32</library>
<library>ntdll</library> <library>ntdll</library>
<file>drawdib.c</file>
<file>mciwnd.c</file> <file>mciwnd.c</file>
<file>msvfw32.rc</file>
<file>msvideo_main.c</file> <file>msvideo_main.c</file>
<file>drawdib.c</file>
<file>rsrc.rc</file>
<file>msvfw32.spec</file> <file>msvfw32.spec</file>
</module> </module>

View file

@ -1,5 +0,0 @@
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "MSvideo support\0"
#define REACTOS_STR_INTERNAL_NAME "msvfw32\0"
#define REACTOS_STR_ORIGINAL_FILENAME "msvfw32.dll\0"
#include <reactos/version.rc>

View file

@ -4,11 +4,11 @@
2 stdcall VideoForWindowsVersion() 2 stdcall VideoForWindowsVersion()
@ stdcall DrawDibBegin(long long long long ptr long long long) @ stdcall DrawDibBegin(long long long long ptr long long long)
@ stub DrawDibChangePalette @ stdcall DrawDibChangePalette(long long long ptr)
@ stdcall DrawDibClose(long) @ stdcall DrawDibClose(long)
@ stdcall DrawDibDraw(long long long long long long ptr ptr long long long long long) @ stdcall DrawDibDraw(long long long long long long ptr ptr long long long long long)
@ stdcall DrawDibEnd(long) @ stdcall DrawDibEnd(long)
@ stub DrawDibGetBuffer @ stdcall DrawDibGetBuffer(long ptr long long)
@ stdcall DrawDibGetPalette(long) @ stdcall DrawDibGetPalette(long)
@ stdcall DrawDibOpen() @ stdcall DrawDibOpen()
@ stdcall DrawDibProfileDisplay(ptr) @ stdcall DrawDibProfileDisplay(ptr)
@ -16,8 +16,8 @@
@ stdcall DrawDibSetPalette(long long) @ stdcall DrawDibSetPalette(long long)
@ stdcall DrawDibStart(long long) @ stdcall DrawDibStart(long long)
@ stdcall DrawDibStop(long) @ stdcall DrawDibStop(long)
@ stub DrawDibTime @ stdcall DrawDibTime(long ptr)
@ stub GetOpenFileNamePreview @ stdcall GetOpenFileNamePreview(ptr) GetOpenFileNamePreviewA
@ stdcall GetOpenFileNamePreviewA(ptr) @ stdcall GetOpenFileNamePreviewA(ptr)
@ stdcall GetOpenFileNamePreviewW(ptr) @ stdcall GetOpenFileNamePreviewW(ptr)
@ stdcall GetSaveFileNamePreviewA(ptr) @ stdcall GetSaveFileNamePreviewA(ptr)
@ -40,10 +40,10 @@
@ stdcall ICOpen(long long long) @ stdcall ICOpen(long long long)
@ stdcall ICOpenFunction(long long long ptr) @ stdcall ICOpenFunction(long long long ptr)
@ stdcall ICRemove(long long long) @ stdcall ICRemove(long long long)
@ stdcall ICSendMessage(long long long long) @ stdcall ICSendMessage(long long ptr ptr)
@ stub ICSeqCompressFrame @ stdcall ICSeqCompressFrame(ptr long ptr ptr ptr)
@ stub ICSeqCompressFrameEnd @ stdcall ICSeqCompressFrameEnd(ptr)
@ stub ICSeqCompressFrameStart @ stdcall ICSeqCompressFrameStart(ptr ptr)
@ cdecl MCIWndCreate (long long long str) MCIWndCreateA @ cdecl MCIWndCreate (long long long str) MCIWndCreateA
@ cdecl MCIWndCreateA (long long long str) @ cdecl MCIWndCreateA (long long long str)
@ cdecl MCIWndCreateW (long long long wstr) @ cdecl MCIWndCreateW (long long long wstr)

View file

@ -0,0 +1,52 @@
/*
* Copyright 2005 Dmitry Timoshkov
* Copyright 2005 Henning Gerhardt
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Video Compression"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "OK",IDOK,129,2,49,14
PUSHBUTTON "Abbrechen",IDCANCEL,129,18,49,14
LTEXT "&Komprimierer:",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Kon&figurieren...",882,129,36,49,14
PUSHBUTTON "&Über...",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "Komprimierungsqualität:",886,9,34,80,8
CONTROL "&Key Frame aller",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "frames",889,103,62,26,10
CONTROL "&Datenrate",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Vollständige Frames (Unkomprimiert)"
}

View file

@ -0,0 +1,51 @@
/*
* Copyright 2005 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Video Compression"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "OK",IDOK,129,2,49,14
PUSHBUTTON "Cancel",IDCANCEL,129,18,49,14
LTEXT "&Compressor:",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Con&figure...",882,129,36,49,14
PUSHBUTTON "&About...",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "Compression &Quality:",886,9,34,80,8
CONTROL "&Key Frame Every",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "frames",889,103,62,26,10
CONTROL "&Data Rate",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Full Frames (Uncompressed)"
}

View file

@ -0,0 +1,51 @@
/*
* Copyright 2006 Jonathan Ernst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Compression vidéo"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "OK",IDOK,129,2,49,14
PUSHBUTTON "Annuler",IDCANCEL,129,18,49,14
LTEXT "&Compresseur :",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Con&figurer...",882,129,36,49,14
PUSHBUTTON "À &propos",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "&Qualité de compression :",886,9,34,80,8
CONTROL "Image &clé toutes les",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "images",889,103,62,26,10
CONTROL "&Débit de données",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "Kio/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Images complètes (non compressées)"
}

View file

@ -0,0 +1,51 @@
/*
* Copyright 2006 Andras Kovacs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Video tömörítés"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "OK",IDOK,129,2,49,14
PUSHBUTTON "Mégse",IDCANCEL,129,18,49,14
LTEXT "&Tömörítõ:",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Beállí&tás...",882,129,36,49,14
PUSHBUTTON "&About...",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "Tömörítési minõsé&g:",886,9,34,80,8
CONTROL "&Kulcs képkocka minden",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "képkockánként",889,103,62,26,10
CONTROL "A&dat arány",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Teljes képkockák (tömörítetlen)"
}

View file

@ -0,0 +1,52 @@
/*
* Copyright 2005 Dmitry Timoshkov
* Copyright 2005,2006 YunSong Hwang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_KOREAN, SUBLANG_NEUTRAL
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "비디오 압축"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "확인",IDOK,129,2,49,14
PUSHBUTTON "취소",IDCANCEL,129,18,49,14
LTEXT "압축(&C):",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "설정(&F)...",882,129,36,49,14
PUSHBUTTON "정보(&A)...",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "압축 품질(&Q):",886,9,34,80,8
CONTROL "모든 키 프레임(&K)",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "프레임",889,103,62,26,10
CONTROL "데이타 전송율(&D)",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "전채 프레임(비압축)"
}

View file

@ -0,0 +1,51 @@
/*
* Copyright 2005 Alexander N. Sørnes <alex@thehandofagony.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Videokomprimering"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "OK",IDOK,129,2,49,14
PUSHBUTTON "Avbryt",IDCANCEL,129,18,49,14
LTEXT "&Komprimerer:",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "&Oppsett . . .",882,129,36,49,14
PUSHBUTTON "O&m . . .",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "Komprimeringskvalite&t:",886,9,34,80,8
CONTROL "Nø&kkelbilde for hvert",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "bilde",889,103,62,26,10
CONTROL "&Datahastighet",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/s",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Fulle bilder (ukomprimert)"
}

View file

@ -0,0 +1,52 @@
/*
* Copyright 2005 Dmitry Timoshkov
* Copyright 2006 Mikolaj Zalewski
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 207, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Kompresja wideo"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "&OK",IDOK,146,2,52,14
PUSHBUTTON "&Anuluj",IDCANCEL,146,18,52,14
LTEXT "Typ &kompresji:",-1,9,6,128,8
COMBOBOX 880,9,16,128,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Kon&figuruj...",882,146,36,52,14
PUSHBUTTON "&Informacje...",883,146,52,52,14
SCROLLBAR 884,9,44,128,9,WS_TABSTOP
LTEXT "&JakoϾ kompresji:",886,9,34,97,8
CONTROL "&Ramka kluczowa co",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,81,12
EDITTEXT 888,88,60,22,12
LTEXT "ramek",889,114,62,31,10
CONTROL "&Strumieñ",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,81,12
EDITTEXT 895,88,76,22,12
LTEXT "KB/sec",896,114,78,31,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Pe³ne ramki (bez kompresji)"
}

View file

@ -0,0 +1,53 @@
/*
* Turkish Resources
*
* Copyright 2006 Fatih Aþýcý
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Vidyo Sýkýþtýrma"
FONT 8, "MS Shell Dlg"
{
DEFPUSHBUTTON "Tamam",IDOK,129,2,49,14
PUSHBUTTON "Ýptal",IDCANCEL,129,18,49,14
LTEXT "&Sýkýþtýrýcý:",-1,9,6,105,8
COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
PUSHBUTTON "Ya&pýlandýr...",882,129,36,49,14
PUSHBUTTON "&Hakkýnda...",883,129,52,49,14
SCROLLBAR 884,9,44,111,9,WS_TABSTOP
LTEXT "Sýkýþtýrma &Kalitesi:",886,9,34,80,8
CONTROL "&Key Frame Every",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
EDITTEXT 888,78,60,22,12
LTEXT "frames",889,103,62,26,10
CONTROL "&Veri Oraný",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
EDITTEXT 895,78,76,22,12
LTEXT "KB/sec",896,102,78,26,10
}
STRINGTABLE DISCARDABLE
{
IDS_FULLFRAMES "Tüm Çerçeveler (Sýkýþtýrýlmamýþ)"
}

View file

@ -0,0 +1,14 @@
Index: msvideo_private.h
===================================================================
--- msvideo_private.h (revision 25690)
+++ msvideo_private.h (working copy)
@@ -19,6 +19,9 @@
#ifndef __WINE_MSVIDEO_PRIVATE_H
#define __WINE_MSVIDEO_PRIVATE_H
+/* Installable Compressor Manager */
+#define ICVERSION 0x0104
+
#define ICM_CHOOSE_COMPRESSOR 1
#define IDC_COMP_LIST 880
#define IDS_FULLFRAMES 901

View file

@ -1,4 +1,6 @@
#1 pascal WEP(word)
2 pascal VideoForWindowsVersion() VideoForWindowsVersion 2 pascal VideoForWindowsVersion() VideoForWindowsVersion
3 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain
20 stub VIDEOGETNUMDEVS 20 stub VIDEOGETNUMDEVS
21 stub VIDEOGETERRORTEXT 21 stub VIDEOGETERRORTEXT
22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16 22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16
@ -64,5 +66,3 @@
251 stub _MCIWNDREGISTERCLASS 251 stub _MCIWNDREGISTERCLASS
252 stub GETOPENFILENAMEPREVIEW 252 stub GETOPENFILENAMEPREVIEW
253 stub GETSAVEFILENAMEPREVIEW 253 stub GETSAVEFILENAMEPREVIEW
300 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain

View file

@ -16,18 +16,21 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#define COM_NO_WINDOWS_H #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "msvideo_private.h" #include "windef.h"
#include "winbase.h"
#include "winver.h" #include "winver.h"
#include "winnls.h" #include "winnls.h"
#include "winreg.h" #include "winreg.h"
#include "winuser.h"
#include "vfw16.h" #include "vfw16.h"
#include "msvideo_private.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(msvideo); WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
@ -118,7 +121,7 @@ BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate)
/************************************************************************* /*************************************************************************
* DrawDibStop [MSVIDEO.119] * DrawDibStop [MSVIDEO.119]
*/ */
BOOL16 DrawDibStop16(HDRAWDIB16 hdd) BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd)
{ {
return DrawDibStop(HDRAWDIB_32(hdd)); return DrawDibStop(HDRAWDIB_32(hdd));
} }
@ -151,7 +154,7 @@ LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist
lpData = HeapAlloc(GetProcessHeap(), 0, cb); lpData = HeapAlloc(GetProcessHeap(), 0, cb);
TRACE("0x%08lx, %u, %u, ...)\n", (DWORD) hic, msg, cb); TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb);
for (i = 0; i < cb / sizeof(WORD); i++) for (i = 0; i < cb / sizeof(WORD); i++)
{ {
@ -172,7 +175,7 @@ LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb)
{ {
LRESULT ret; LRESULT ret;
TRACE("(0x%08lx,%p,%ld)\n", (DWORD) hic, picinfo, cb); TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb);
ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb); ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb);
TRACE(" -> 0x%08lx\n", ret); TRACE(" -> 0x%08lx\n", ret);
return ret; return ret;
@ -203,7 +206,7 @@ DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags,
ICCOMPRESS iccmp; ICCOMPRESS iccmp;
SEGPTR seg_iccmp; SEGPTR seg_iccmp;
TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags, TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags,
lpbiOutput, lpData, lpbiInput, lpBits); lpbiOutput, lpData, lpbiInput, lpBits);
iccmp.dwFlags = dwFlags; iccmp.dwFlags = dwFlags;
@ -237,7 +240,7 @@ DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags,
SEGPTR segptr; SEGPTR segptr;
DWORD ret; DWORD ret;
TRACE("(0x%08lx,%ld,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat, TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat,
lpData, lpbi, lpBits); lpData, lpbi, lpBits);
icd.dwFlags = dwFlags; icd.dwFlags = dwFlags;
@ -276,7 +279,7 @@ DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */
ICDRAWBEGIN16 icdb; ICDRAWBEGIN16 icdb;
SEGPTR seg_icdb; SEGPTR seg_icdb;
TRACE ("(0x%08lx,%ld,0x%08lx,0x%08lx,0x%08lx,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n", TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
(DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc, (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc,
xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate,
dwScale); dwScale);
@ -315,7 +318,7 @@ DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags,
ICDRAW icd; ICDRAW icd;
SEGPTR seg_icd; SEGPTR seg_icd;
TRACE("(0x%08lx,0x%08lx,%p,%p,%ld,%ld)\n", (DWORD) hic, dwFlags, TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags,
lpFormat, lpData, cbData, lTime); lpFormat, lpData, cbData, lTime);
icd.dwFlags = dwFlags; icd.dwFlags = dwFlags;
icd.lpFormat = lpFormat; icd.lpFormat = lpFormat;
@ -670,12 +673,12 @@ BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo)
static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2) static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2)
{ {
WINE_HIC* whic; WINE_HIC* whic;
LRESULT ret = 0;
WORD args[8]; WORD args[8];
whic = MSVIDEO_GetHicPtr(hic); whic = MSVIDEO_GetHicPtr(hic);
if (whic) if (whic)
{ {
DWORD ret = 0;
switch (msg) switch (msg)
{ {
case DRV_OPEN: case DRV_OPEN:
@ -698,9 +701,9 @@ static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD l
UnMapLS(lp2); UnMapLS(lp2);
break; break;
} }
return ret;
} }
else ret = ICERR_BADHANDLE; else return ICERR_BADHANDLE;
return ret;
} }
/*********************************************************************** /***********************************************************************
@ -730,6 +733,7 @@ LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lPara
if (whic->driverproc16) if (whic->driverproc16)
{ {
WORD args[8]; WORD args[8];
DWORD result;
/* FIXME: original code was passing hdrv first and hic second */ /* FIXME: original code was passing hdrv first and hic second */
/* but this doesn't match what IC_Callback3216 does */ /* but this doesn't match what IC_Callback3216 does */
@ -741,7 +745,8 @@ LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lPara
args[2] = LOWORD(lParam1); args[2] = LOWORD(lParam1);
args[1] = HIWORD(lParam2); args[1] = HIWORD(lParam2);
args[0] = LOWORD(lParam2); args[0] = LOWORD(lParam2);
WOWCallback16Ex( (DWORD)whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); WOWCallback16Ex( (DWORD)whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &result );
ret = result;
} }
else else
{ {
@ -762,6 +767,7 @@ LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lPara
DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len, DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
LPSTR buf2, WORD buf2len) LPSTR buf2, WORD buf2len)
{ {
static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription";
DWORD verhandle; DWORD verhandle;
DWORD infosize; DWORD infosize;
UINT subblocklen; UINT subblocklen;
@ -787,7 +793,7 @@ DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
if (strncasecmp(buf, "vid", 3)) continue; if (strncasecmp(buf, "vid", 3)) continue;
if (nr--) continue; if (nr--) continue;
fnLen = sizeof(fn); fnLen = sizeof(fn);
lRet = RegQueryValueExA(hKey, buf, 0, 0, fn, &fnLen); lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen);
if (lRet == ERROR_SUCCESS) found = TRUE; if (lRet == ERROR_SUCCESS) found = TRUE;
break; break;
} }
@ -821,37 +827,37 @@ DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
infobuf = HeapAlloc(GetProcessHeap(), 0, infosize); infobuf = HeapAlloc(GetProcessHeap(), 0, infosize);
if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf))
{ {
char vbuf[200];
/* Yes, two space behind : */ /* Yes, two space behind : */
/* FIXME: test for buflen */ /* FIXME: test for buflen */
sprintf(vbuf, "Version: %d.%d.%d.%d\n", snprintf(buf2, buf2len, "Version: %d.%d.%d.%d\n",
((WORD*)infobuf)[0x0f], ((WORD*)infobuf)[0x0f],
((WORD*)infobuf)[0x0e], ((WORD*)infobuf)[0x0e],
((WORD*)infobuf)[0x11], ((WORD*)infobuf)[0x11],
((WORD*)infobuf)[0x10] ((WORD*)infobuf)[0x10]
); );
TRACE("version of %s is %s\n", fn, vbuf); TRACE("version of %s is %s\n", fn, buf2);
strncpy(buf2, vbuf, buf2len);
} }
else else
{ {
TRACE("GetFileVersionInfoA failed for %s.\n", fn); TRACE("GetFileVersionInfoA failed for %s.\n", fn);
strncpy(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/ lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/
} }
/* FIXME: language problem? */ /* FIXME: language problem? */
if (VerQueryValueA( infobuf, if (VerQueryValueA( infobuf,
"\\StringFileInfo\\040904E4\\FileDescription", version_info_spec,
&subblock, &subblock,
&subblocklen &subblocklen
)) ))
{ {
UINT copylen = min(subblocklen,buf1len-1);
memcpy(buf1, subblock, copylen);
buf1[copylen] = '\0';
TRACE("VQA returned %s\n", (LPCSTR)subblock); TRACE("VQA returned %s\n", (LPCSTR)subblock);
strncpy(buf1, subblock, buf1len);
} }
else else
{ {
TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n"); TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
strncpy(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/ lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/
} }
HeapFree(GetProcessHeap(), 0, infobuf); HeapFree(GetProcessHeap(), 0, infobuf);
return 0; return 0;
@ -884,7 +890,7 @@ static LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1,
} }
/************************************************************************** /**************************************************************************
* DllEntryPoint (MSVIDEO.300) * DllEntryPoint (MSVIDEO.3)
* *
* MSVIDEO DLL entry point * MSVIDEO DLL entry point
* *

View file

@ -2,6 +2,7 @@
* Copyright 1998 Marcus Meissner * Copyright 1998 Marcus Meissner
* Copyright 2000 Bradley Baetz * Copyright 2000 Bradley Baetz
* Copyright 2003 Michael Günnewig * Copyright 2003 Michael Günnewig
* Copyright 2005 Dmitry Timoshkov
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -15,7 +16,7 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
* *
* FIXME: This all assumes 32 bit codecs * FIXME: This all assumes 32 bit codecs
* Win95 appears to prefer 32 bit codecs, even from 16 bit code. * Win95 appears to prefer 32 bit codecs, even from 16 bit code.
@ -25,17 +26,19 @@
* - no thread safety * - no thread safety
*/ */
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "msvideo_private.h" #include "windef.h"
#include "winbase.h"
#include "winreg.h"
#include "winnls.h" #include "winnls.h"
#include "wingdi.h" #include "wingdi.h"
#include "winuser.h" #include "winuser.h"
#include "winreg.h" #include "commdlg.h"
#include "vfw.h"
#include "windowsx.h" #include "msvideo_private.h"
#include "wine/debug.h" #include "wine/debug.h"
/* Drivers32 settings */ /* Drivers32 settings */
@ -78,7 +81,7 @@ HMODULE MSVFW32_hModule;
BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
{ {
TRACE("%p,%lx,%p\n", hinst, reason, reserved); TRACE("%p,%x,%p\n", hinst, reason, reserved);
switch(reason) switch(reason)
{ {
@ -116,14 +119,15 @@ static BOOL enum_drivers(DWORD fccType, enum_handler_t handler, void* param)
lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey);
if (lRet == ERROR_SUCCESS) if (lRet == ERROR_SUCCESS)
{ {
RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); DWORD numkeys;
for (i = 0; i < cnt; i++) RegQueryInfoKeyA( hKey, 0, 0, 0, &numkeys, 0, 0, 0, 0, 0, 0, 0);
for (i = 0; i < numkeys; i++)
{ {
bufLen = sizeof(buf) / sizeof(buf[0]); bufLen = sizeof(buf) / sizeof(buf[0]);
lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite);
if (lRet != ERROR_SUCCESS) continue; if (lRet != ERROR_SUCCESS) continue;
if (strncasecmp(buf, fccTypeStr, 5) || buf[9] != '=') continue; if (strncasecmp(buf, fccTypeStr, 5) || buf[9] != '=') continue;
if ((result = handler(buf, i, param))) break; if ((result = handler(buf, cnt++, param))) break;
} }
RegCloseKey( hKey ); RegCloseKey( hKey );
} }
@ -132,10 +136,11 @@ static BOOL enum_drivers(DWORD fccType, enum_handler_t handler, void* param)
/* if that didn't work, go through the values in system.ini */ /* if that didn't work, go through the values in system.ini */
if (GetPrivateProfileSectionA("drivers32", buf, sizeof(buf), "system.ini")) if (GetPrivateProfileSectionA("drivers32", buf, sizeof(buf), "system.ini"))
{ {
for (s = buf; *s; cnt++, s += strlen(s) + 1) for (s = buf; *s; s += strlen(s) + 1)
{ {
TRACE("got %s\n", s);
if (strncasecmp(s, fccTypeStr, 5) || s[9] != '=') continue; if (strncasecmp(s, fccTypeStr, 5) || s[9] != '=') continue;
if ((result = handler(s, cnt, param))) break; if ((result = handler(s, cnt++, param))) break;
} }
} }
@ -175,11 +180,10 @@ static BOOL ICInfo_enum_handler(const char *drv, int nr, void *param)
if ((lpicinfo->fccHandler != nr) && (lpicinfo->fccHandler != fccHandler)) if ((lpicinfo->fccHandler != nr) && (lpicinfo->fccHandler != fccHandler))
return FALSE; return FALSE;
lpicinfo->fccType = mmioStringToFOURCCA(drv, 0);
lpicinfo->fccHandler = fccHandler; lpicinfo->fccHandler = fccHandler;
lpicinfo->dwFlags = 0; lpicinfo->dwFlags = 0;
lpicinfo->dwVersion = 0; lpicinfo->dwVersion = 0;
lpicinfo->dwVersionICM = 0x104; lpicinfo->dwVersionICM = ICVERSION;
lpicinfo->szName[0] = 0; lpicinfo->szName[0] = 0;
lpicinfo->szDescription[0] = 0; lpicinfo->szDescription[0] = 0;
MultiByteToWideChar(CP_ACP, 0, drv + 10, -1, lpicinfo->szDriver, MultiByteToWideChar(CP_ACP, 0, drv + 10, -1, lpicinfo->szDriver,
@ -200,9 +204,10 @@ static BOOL ICInfo_enum_handler(const char *drv, int nr, void *param)
*/ */
BOOL VFWAPI ICInfo( DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo) BOOL VFWAPI ICInfo( DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo)
{ {
TRACE("(%s,%s/%08lx,%p)\n", TRACE("(%s,%s/%08x,%p)\n",
wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), fccHandler, lpicinfo); wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), fccHandler, lpicinfo);
lpicinfo->fccType = fccType;
lpicinfo->fccHandler = fccHandler; lpicinfo->fccHandler = fccHandler;
return enum_drivers(fccType, ICInfo_enum_handler, lpicinfo); return enum_drivers(fccType, ICInfo_enum_handler, lpicinfo);
} }
@ -258,8 +263,8 @@ BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDe
reg_driver_list = driver; reg_driver_list = driver;
return TRUE; return TRUE;
oom: oom:
if (driver) HeapFree(GetProcessHeap(), 0, driver); HeapFree(GetProcessHeap(), 0, driver);
return FALSE; return FALSE;
} }
@ -269,6 +274,7 @@ BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDe
BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags) BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags)
{ {
reg_driver** pdriver; reg_driver** pdriver;
reg_driver* drv;
TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wFlags); TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wFlags);
@ -283,10 +289,10 @@ BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags)
return FALSE; return FALSE;
/* Remove the driver from the list */ /* Remove the driver from the list */
drv = *pdriver;
*pdriver = (*pdriver)->next; *pdriver = (*pdriver)->next;
if ((*pdriver)->name) HeapFree(GetProcessHeap(), 0, drv->name);
HeapFree(GetProcessHeap(), 0, (*pdriver)->name); HeapFree(GetProcessHeap(), 0, drv);
HeapFree(GetProcessHeap(), 0, *pdriver);
return TRUE; return TRUE;
} }
@ -343,20 +349,7 @@ HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode)
hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen); hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen);
if (!hdrv) if (!hdrv)
{ return 0;
if (fccType == streamtypeVIDEO)
{
codecname[0] = 'v';
codecname[1] = 'i';
codecname[2] = 'd';
codecname[3] = 'c';
fccType = ICTYPE_VIDEO;
hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen);
}
if (!hdrv)
return 0;
}
} else { } else {
/* The driver has been registered at runtime with its name */ /* The driver has been registered at runtime with its name */
hdrv = OpenDriver(driver->name, NULL, (LPARAM)&icopen); hdrv = OpenDriver(driver->name, NULL, (LPARAM)&icopen);
@ -400,13 +393,13 @@ HIC MSVIDEO_OpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode,
ICOPEN icopen; ICOPEN icopen;
WINE_HIC* whic; WINE_HIC* whic;
TRACE("(%s,%s,%d,%p,%08lx)\n", TRACE("(%s,%s,%d,%p,%08x)\n",
wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wMode, lpfnHandler, lpfnHandler16); wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wMode, lpfnHandler, lpfnHandler16);
icopen.dwSize = sizeof(ICOPEN); icopen.dwSize = sizeof(ICOPEN);
icopen.fccType = fccType; icopen.fccType = fccType;
icopen.fccHandler = fccHandler; icopen.fccHandler = fccHandler;
icopen.dwVersion = 0x00001000; /* FIXME */ icopen.dwVersion = ICVERSION;
icopen.dwFlags = wMode; icopen.dwFlags = wMode;
icopen.dwError = 0; icopen.dwError = 0;
icopen.pV1Reserved = NULL; icopen.pV1Reserved = NULL;
@ -436,9 +429,9 @@ HIC MSVIDEO_OpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode,
/* return value is not checked */ /* return value is not checked */
MSVIDEO_SendMessage(whic, DRV_ENABLE, 0L, 0L); MSVIDEO_SendMessage(whic, DRV_ENABLE, 0L, 0L);
whic->driverId = (DWORD)MSVIDEO_SendMessage(whic, DRV_OPEN, 0, (DWORD)&icopen); whic->driverId = (DWORD)MSVIDEO_SendMessage(whic, DRV_OPEN, 0, (DWORD_PTR)&icopen);
/* FIXME: What should we put here? */ /* FIXME: What should we put here? */
whic->hdrv = (HDRVR)0; whic->hdrv = NULL;
if (whic->driverId == 0) if (whic->driverId == 0)
{ {
@ -468,7 +461,7 @@ LRESULT VFWAPI ICGetInfo(HIC hic, ICINFO *picinfo, DWORD cb)
LRESULT ret; LRESULT ret;
WINE_HIC* whic = MSVIDEO_GetHicPtr(hic); WINE_HIC* whic = MSVIDEO_GetHicPtr(hic);
TRACE("(%p,%p,%ld)\n", hic, picinfo, cb); TRACE("(%p,%p,%d)\n", hic, picinfo, cb);
whic = MSVIDEO_GetHicPtr(hic); whic = MSVIDEO_GetHicPtr(hic);
if (!whic) return ICERR_BADHANDLE; if (!whic) return ICERR_BADHANDLE;
@ -477,11 +470,11 @@ LRESULT VFWAPI ICGetInfo(HIC hic, ICINFO *picinfo, DWORD cb)
/* (WS) The field szDriver should be initialized because the driver /* (WS) The field szDriver should be initialized because the driver
* is not obliged and often will not do it. Some applications, like * is not obliged and often will not do it. Some applications, like
* VirtualDub, rely on this field and will occasionally crash if it * VirtualDub, rely on this field and will occasionally crash if it
* goes unitialized. * goes uninitialized.
*/ */
if (cb >= sizeof(ICINFO)) picinfo->szDriver[0] = '\0'; if (cb >= sizeof(ICINFO)) picinfo->szDriver[0] = '\0';
ret = ICSendMessage(hic, ICM_GETINFO, (DWORD)picinfo, cb); ret = ICSendMessage(hic, ICM_GETINFO, (DWORD_PTR)picinfo, cb);
/* (WS) When szDriver was not supplied by the driver itself, apparently /* (WS) When szDriver was not supplied by the driver itself, apparently
* Windows will set its value equal to the driver file name. This can * Windows will set its value equal to the driver file name. This can
@ -517,7 +510,7 @@ static HIC try_driver(driver_info_t *info)
if ((hic = ICOpen(info->fccType, info->fccHandler, info->wMode))) if ((hic = ICOpen(info->fccType, info->fccHandler, info->wMode)))
{ {
if (!ICSendMessage(hic, info->querymsg, (DWORD)info->lpbiIn, (DWORD)info->lpbiOut)) if (!ICSendMessage(hic, info->querymsg, (DWORD_PTR)info->lpbiIn, (DWORD_PTR)info->lpbiOut))
return hic; return hic;
ICClose(hic); ICClose(hic);
} }
@ -610,14 +603,14 @@ HIC VFWAPI ICGetDisplayFormat(
if (ICDecompressQuery(tmphic,lpbiIn,NULL) != 0) if (ICDecompressQuery(tmphic,lpbiIn,NULL) != 0)
goto errout; /* no, sorry */ goto errout; /* no, sorry */
ICDecompressGetFormat(tmphic,lpbiIn,lpbiOut); ICSendMessage(tmphic, ICM_DECOMPRESS_GET_FORMAT, (DWORD_PTR)lpbiIn, (DWORD_PTR)lpbiOut);
if (lpbiOut->biCompression != 0) { if (lpbiOut->biCompression != 0) {
FIXME("Ooch, how come decompressor outputs compressed data (%ld)??\n", FIXME("Ooch, how come decompressor outputs compressed data (%d)??\n",
lpbiOut->biCompression); lpbiOut->biCompression);
} }
if (lpbiOut->biSize < sizeof(*lpbiOut)) { if (lpbiOut->biSize < sizeof(*lpbiOut)) {
FIXME("Ooch, size of output BIH is too small (%ld)\n", FIXME("Ooch, size of output BIH is too small (%d)\n",
lpbiOut->biSize); lpbiOut->biSize);
lpbiOut->biSize = sizeof(*lpbiOut); lpbiOut->biSize = sizeof(*lpbiOut);
} }
@ -655,7 +648,7 @@ ICCompress(
{ {
ICCOMPRESS iccmp; ICCOMPRESS iccmp;
TRACE("(%p,%ld,%p,%p,%p,%p,...)\n",hic,dwFlags,lpbiOutput,lpData,lpbiInput,lpBits); TRACE("(%p,%d,%p,%p,%p,%p,...)\n",hic,dwFlags,lpbiOutput,lpData,lpbiInput,lpBits);
iccmp.dwFlags = dwFlags; iccmp.dwFlags = dwFlags;
@ -671,7 +664,7 @@ ICCompress(
iccmp.dwQuality = dwQuality; iccmp.dwQuality = dwQuality;
iccmp.lpbiPrev = lpbiPrev; iccmp.lpbiPrev = lpbiPrev;
iccmp.lpPrev = lpPrev; iccmp.lpPrev = lpPrev;
return ICSendMessage(hic,ICM_COMPRESS,(DWORD)&iccmp,sizeof(iccmp)); return ICSendMessage(hic,ICM_COMPRESS,(DWORD_PTR)&iccmp,sizeof(iccmp));
} }
/*********************************************************************** /***********************************************************************
@ -683,9 +676,9 @@ DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,
ICDECOMPRESS icd; ICDECOMPRESS icd;
DWORD ret; DWORD ret;
TRACE("(%p,%ld,%p,%p,%p,%p)\n",hic,dwFlags,lpbiFormat,lpData,lpbi,lpBits); TRACE("(%p,%d,%p,%p,%p,%p)\n",hic,dwFlags,lpbiFormat,lpData,lpbi,lpBits);
TRACE("lpBits[0] == %lx\n",((LPDWORD)lpBits)[0]); TRACE("lpBits[0] == %x\n",((LPDWORD)lpBits)[0]);
icd.dwFlags = dwFlags; icd.dwFlags = dwFlags;
icd.lpbiInput = lpbiFormat; icd.lpbiInput = lpbiFormat;
@ -694,45 +687,307 @@ DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,
icd.lpbiOutput = lpbi; icd.lpbiOutput = lpbi;
icd.lpOutput = lpBits; icd.lpOutput = lpBits;
icd.ckid = 0; icd.ckid = 0;
ret = ICSendMessage(hic,ICM_DECOMPRESS,(DWORD)&icd,sizeof(ICDECOMPRESS)); ret = ICSendMessage(hic,ICM_DECOMPRESS,(DWORD_PTR)&icd,sizeof(ICDECOMPRESS));
TRACE("lpBits[0] == %lx\n",((LPDWORD)lpBits)[0]); TRACE("lpBits[0] == %x\n",((LPDWORD)lpBits)[0]);
TRACE("-> %ld\n",ret); TRACE("-> %d\n",ret);
return ret; return ret;
} }
struct choose_compressor
{
UINT flags;
LPCSTR title;
COMPVARS cv;
};
struct codec_info
{
HIC hic;
ICINFO icinfo;
};
static BOOL enum_compressors(HWND list, COMPVARS *pcv, BOOL enum_all)
{
UINT id, total = 0;
ICINFO icinfo;
id = 0;
while (ICInfo(pcv->fccType, id, &icinfo))
{
struct codec_info *ic;
DWORD idx;
HIC hic;
id++;
hic = ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_COMPRESS);
if (hic)
{
/* for unknown reason fccHandler reported by the driver
* doesn't always work, use the one returned by ICInfo instead.
*/
DWORD fccHandler = icinfo.fccHandler;
if (!enum_all && pcv->lpbiIn)
{
if (ICCompressQuery(hic, pcv->lpbiIn, NULL) != ICERR_OK)
{
TRACE("fccHandler %s doesn't support input DIB format %d\n",
wine_dbgstr_fcc(icinfo.fccHandler), pcv->lpbiIn->bmiHeader.biCompression);
ICClose(hic);
continue;
}
}
ICGetInfo(hic, &icinfo, sizeof(icinfo));
icinfo.fccHandler = fccHandler;
idx = SendMessageW(list, CB_ADDSTRING, 0, (LPARAM)icinfo.szDescription);
ic = HeapAlloc(GetProcessHeap(), 0, sizeof(struct codec_info));
memcpy(&ic->icinfo, &icinfo, sizeof(ICINFO));
ic->hic = hic;
SendMessageW(list, CB_SETITEMDATA, idx, (LPARAM)ic);
}
total++;
}
return total != 0;
}
static INT_PTR CALLBACK icm_choose_compressor_dlgproc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_INITDIALOG:
{
struct codec_info *ic;
WCHAR buf[128];
struct choose_compressor *choose_comp = (struct choose_compressor *)lparam;
SetWindowLongPtrW(hdlg, DWLP_USER, lparam);
/* FIXME */
choose_comp->flags &= ~(ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME);
if (choose_comp->title)
SetWindowTextA(hdlg, choose_comp->title);
if (!(choose_comp->flags & ICMF_CHOOSE_DATARATE))
{
ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_CHECKBOX), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_DATARATE), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_KB), SW_HIDE);
}
if (!(choose_comp->flags & ICMF_CHOOSE_KEYFRAME))
{
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_CHECKBOX), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_FRAMES), SW_HIDE);
}
/* FIXME */
EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_SCROLL), FALSE);
EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_TXT), FALSE);
/*if (!(choose_comp->flags & ICMF_CHOOSE_PREVIEW))
ShowWindow(GetDlgItem(hdlg, IDC_PREVIEW), SW_HIDE);*/
LoadStringW(MSVFW32_hModule, IDS_FULLFRAMES, buf, 128);
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_ADDSTRING, 0, (LPARAM)buf);
ic = HeapAlloc(GetProcessHeap(), 0, sizeof(struct codec_info));
ic->icinfo.fccType = streamtypeVIDEO;
ic->icinfo.fccHandler = comptypeDIB;
ic->hic = 0;
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETITEMDATA, 0, (LPARAM)ic);
enum_compressors(GetDlgItem(hdlg, IDC_COMP_LIST), &choose_comp->cv, choose_comp->flags & ICMF_CHOOSE_ALLCOMPRESSORS);
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETCURSEL, 0, 0);
SetFocus(GetDlgItem(hdlg, IDC_COMP_LIST));
SetWindowLongPtrW(hdlg, DWLP_USER, (ULONG_PTR)choose_comp);
break;
}
case WM_COMMAND:
switch (LOWORD(wparam))
{
case IDC_COMP_LIST:
{
INT cur_sel;
struct codec_info *ic;
BOOL can_configure = FALSE, can_about = FALSE;
struct choose_compressor *choose_comp;
if (HIWORD(wparam) != CBN_SELCHANGE && HIWORD(wparam) != CBN_SETFOCUS)
break;
choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER);
cur_sel = SendMessageW((HWND)lparam, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW((HWND)lparam, CB_GETITEMDATA, cur_sel, 0);
if (ic && ic->hic)
{
if (ICQueryConfigure(ic->hic) == DRVCNF_OK)
can_configure = TRUE;
if (ICQueryAbout(ic->hic) == DRVCNF_OK)
can_about = TRUE;
}
EnableWindow(GetDlgItem(hdlg, IDC_CONFIGURE), can_configure);
EnableWindow(GetDlgItem(hdlg, IDC_ABOUT), can_about);
if (choose_comp->flags & ICMF_CHOOSE_DATARATE)
{
/* FIXME */
}
if (choose_comp->flags & ICMF_CHOOSE_KEYFRAME)
{
/* FIXME */
}
break;
}
case IDC_CONFIGURE:
case IDC_ABOUT:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT cur_sel;
struct codec_info *ic;
if (HIWORD(wparam) != BN_CLICKED)
break;
cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0);
if (ic && ic->hic)
{
if (LOWORD(wparam) == IDC_CONFIGURE)
ICConfigure(ic->hic, hdlg);
else
ICAbout(ic->hic, hdlg);
}
break;
}
case IDOK:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT cur_sel;
struct codec_info *ic;
if (HIWORD(wparam) != BN_CLICKED)
break;
cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0);
if (ic)
{
struct choose_compressor *choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER);
choose_comp->cv.hic = ic->hic;
choose_comp->cv.fccType = ic->icinfo.fccType;
choose_comp->cv.fccHandler = ic->icinfo.fccHandler;
/* FIXME: fill everything else */
/* prevent closing the codec handle below */
ic->hic = 0;
}
}
/* fall through */
case IDCANCEL:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT idx = 0;
if (HIWORD(wparam) != BN_CLICKED)
break;
while (1)
{
struct codec_info *ic;
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, idx++, 0);
if (!ic || (LONG_PTR)ic == CB_ERR) break;
if (ic->hic) ICClose(ic->hic);
HeapFree(GetProcessHeap(), 0, ic);
}
EndDialog(hdlg, LOWORD(wparam) == IDOK);
break;
}
default:
break;
}
break;
default:
break;
}
return FALSE;
}
/*********************************************************************** /***********************************************************************
* ICCompressorChoose [MSVFW32.@] * ICCompressorChoose [MSVFW32.@]
*/ */
BOOL VFWAPI ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn, BOOL VFWAPI ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn,
LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle) LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle)
{ {
FIXME("(%p,0x%X,%p,%p,%p,%s),stub!\n",hwnd,uiFlags,pvIn,lpData,pc,lpszTitle); struct choose_compressor choose_comp;
BOOL ret;
if (pc == NULL || pc->cbSize != sizeof(COMPVARS)) TRACE("(%p,%08x,%p,%p,%p,%s)\n", hwnd, uiFlags, pvIn, lpData, pc, lpszTitle);
return FALSE;
if ((pc->dwFlags & ICMF_COMPVARS_VALID) == 0) { if (!pc || pc->cbSize != sizeof(COMPVARS))
pc->dwFlags = 0; return FALSE;
pc->fccType = pc->fccHandler = 0;
pc->hic = NULL;
pc->lpbiOut = NULL;
pc->lpBitsOut = pc->lpBitsPrev = pc->lpState = NULL;
pc->lQ = ICQUALITY_DEFAULT;
pc->lKey = -1;
pc->lDataRate = 300; /* kB */
pc->lpState = NULL;
pc->cbState = 0;
}
if (pc->fccType == 0)
pc->fccType = ICTYPE_VIDEO;
/* FIXME */ if (!(pc->dwFlags & ICMF_COMPVARS_VALID))
{
pc->dwFlags = 0;
pc->fccType = pc->fccHandler = 0;
pc->hic = NULL;
pc->lpbiIn = NULL;
pc->lpbiOut = NULL;
pc->lpBitsOut = pc->lpBitsPrev = pc->lpState = NULL;
pc->lQ = ICQUALITY_DEFAULT;
pc->lKey = -1;
pc->lDataRate = 300; /* kB */
pc->lpState = NULL;
pc->cbState = 0;
}
if (pc->fccType == 0)
pc->fccType = ICTYPE_VIDEO;
return FALSE; choose_comp.cv = *pc;
choose_comp.flags = uiFlags;
choose_comp.title = lpszTitle;
ret = DialogBoxParamW(MSVFW32_hModule, MAKEINTRESOURCEW(ICM_CHOOSE_COMPRESSOR), hwnd,
icm_choose_compressor_dlgproc, (LPARAM)&choose_comp);
if (ret)
{
*pc = choose_comp.cv;
pc->dwFlags |= ICMF_COMPVARS_VALID;
}
return ret;
} }
@ -748,22 +1003,14 @@ void VFWAPI ICCompressorFree(PCOMPVARS pc)
ICClose(pc->hic); ICClose(pc->hic);
pc->hic = NULL; pc->hic = NULL;
} }
if (pc->lpbiOut != NULL) { HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
GlobalFreePtr(pc->lpbiOut); pc->lpbiIn = NULL;
pc->lpbiOut = NULL; HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
} pc->lpBitsOut = NULL;
if (pc->lpBitsOut != NULL) { HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
GlobalFreePtr(pc->lpBitsOut); pc->lpBitsPrev = NULL;
pc->lpBitsOut = NULL; HeapFree(GetProcessHeap(), 0, pc->lpState);
} pc->lpState = NULL;
if (pc->lpBitsPrev != NULL) {
GlobalFreePtr(pc->lpBitsPrev);
pc->lpBitsPrev = NULL;
}
if (pc->lpState != NULL) {
GlobalFreePtr(pc->lpBitsPrev);
pc->lpState = NULL;
}
pc->dwFlags = 0; pc->dwFlags = 0;
} }
} }
@ -774,7 +1021,7 @@ void VFWAPI ICCompressorFree(PCOMPVARS pc)
* *
* *
*/ */
LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD lParam1, DWORD lParam2) LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD_PTR lParam1, DWORD_PTR lParam2)
{ {
LRESULT ret; LRESULT ret;
@ -839,7 +1086,7 @@ LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD lParam1, DWORD lPara
XX(ICM_DECOMPRESSEX_END); XX(ICM_DECOMPRESSEX_END);
XX(ICM_SET_STATUS_PROC); XX(ICM_SET_STATUS_PROC);
default: default:
FIXME("(%p,0x%08lx,0x%08lx,0x%08lx) unknown message\n",whic,(DWORD)msg,lParam1,lParam2); FIXME("(%p,0x%08x,0x%08lx,0x%08lx) unknown message\n",whic,(DWORD)msg,lParam1,lParam2);
} }
#undef XX #undef XX
@ -858,7 +1105,7 @@ LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD lParam1, DWORD lPara
/*********************************************************************** /***********************************************************************
* ICSendMessage [MSVFW32.@] * ICSendMessage [MSVFW32.@]
*/ */
LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2) LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD_PTR lParam1, DWORD_PTR lParam2)
{ {
WINE_HIC* whic = MSVIDEO_GetHicPtr(hic); WINE_HIC* whic = MSVIDEO_GetHicPtr(hic);
@ -890,7 +1137,7 @@ DWORD VFWAPIV ICDrawBegin(
ICDRAWBEGIN icdb; ICDRAWBEGIN icdb;
TRACE("(%p,%ld,%p,%p,%p,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n", TRACE("(%p,%d,%p,%p,%p,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst,
lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale); lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale);
@ -909,7 +1156,7 @@ DWORD VFWAPIV ICDrawBegin(
icdb.dySrc = dySrc; icdb.dySrc = dySrc;
icdb.dwRate = dwRate; icdb.dwRate = dwRate;
icdb.dwScale = dwScale; icdb.dwScale = dwScale;
return ICSendMessage(hic,ICM_DRAW_BEGIN,(DWORD)&icdb,sizeof(icdb)); return ICSendMessage(hic,ICM_DRAW_BEGIN,(DWORD_PTR)&icdb,sizeof(icdb));
} }
/*********************************************************************** /***********************************************************************
@ -918,7 +1165,7 @@ DWORD VFWAPIV ICDrawBegin(
DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime) { DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime) {
ICDRAW icd; ICDRAW icd;
TRACE("(%p,%ld,%p,%p,%ld,%ld)\n",hic,dwFlags,lpFormat,lpData,cbData,lTime); TRACE("(%p,%d,%p,%p,%d,%d)\n",hic,dwFlags,lpFormat,lpData,cbData,lTime);
icd.dwFlags = dwFlags; icd.dwFlags = dwFlags;
icd.lpFormat = lpFormat; icd.lpFormat = lpFormat;
@ -926,7 +1173,7 @@ DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWO
icd.cbData = cbData; icd.cbData = cbData;
icd.lTime = lTime; icd.lTime = lTime;
return ICSendMessage(hic,ICM_DRAW,(DWORD)&icd,sizeof(icd)); return ICSendMessage(hic,ICM_DRAW,(DWORD_PTR)&icd,sizeof(icd));
} }
/*********************************************************************** /***********************************************************************
@ -977,7 +1224,7 @@ HANDLE VFWAPI ICImageCompress(
LPBITMAPINFO lpbiOut, LONG lQuality, LPBITMAPINFO lpbiOut, LONG lQuality,
LONG* plSize) LONG* plSize)
{ {
FIXME("(%p,%08x,%p,%p,%p,%ld,%p)\n", FIXME("(%p,%08x,%p,%p,%p,%d,%p)\n",
hic, uiFlags, lpbiIn, lpBits, lpbiOut, lQuality, plSize); hic, uiFlags, lpbiIn, lpBits, lpbiOut, lQuality, plSize);
return NULL; return NULL;
@ -995,7 +1242,7 @@ HANDLE VFWAPI ICImageDecompress(
BYTE* pMem = NULL; BYTE* pMem = NULL;
BOOL bReleaseIC = FALSE; BOOL bReleaseIC = FALSE;
BYTE* pHdr = NULL; BYTE* pHdr = NULL;
LONG cbHdr = 0; ULONG cbHdr = 0;
BOOL bSucceeded = FALSE; BOOL bSucceeded = FALSE;
BOOL bInDecompress = FALSE; BOOL bInDecompress = FALSE;
DWORD biSizeImage; DWORD biSizeImage;
@ -1047,7 +1294,7 @@ HANDLE VFWAPI ICImageDecompress(
cbHdr = ICDecompressGetFormatSize(hic,lpbiIn); cbHdr = ICDecompressGetFormatSize(hic,lpbiIn);
if ( cbHdr < sizeof(BITMAPINFOHEADER) ) if ( cbHdr < sizeof(BITMAPINFOHEADER) )
goto err; goto err;
pHdr = (BYTE*)HeapAlloc(GetProcessHeap(),0,cbHdr+sizeof(RGBQUAD)*256); pHdr = HeapAlloc(GetProcessHeap(),0,cbHdr+sizeof(RGBQUAD)*256);
if ( pHdr == NULL ) if ( pHdr == NULL )
goto err; goto err;
ZeroMemory( pHdr, cbHdr+sizeof(RGBQUAD)*256 ); ZeroMemory( pHdr, cbHdr+sizeof(RGBQUAD)*256 );
@ -1081,7 +1328,7 @@ HANDLE VFWAPI ICImageDecompress(
goto err; goto err;
bInDecompress = TRUE; bInDecompress = TRUE;
TRACE( "cbHdr %ld, biSizeImage %ld\n", cbHdr, biSizeImage ); TRACE( "cbHdr %d, biSizeImage %d\n", cbHdr, biSizeImage );
hMem = GlobalAlloc( GMEM_MOVEABLE|GMEM_ZEROINIT, cbHdr + biSizeImage ); hMem = GlobalAlloc( GMEM_MOVEABLE|GMEM_ZEROINIT, cbHdr + biSizeImage );
if ( hMem == NULL ) if ( hMem == NULL )
@ -1104,8 +1351,7 @@ err:
ICDecompressEnd( hic ); ICDecompressEnd( hic );
if ( bReleaseIC ) if ( bReleaseIC )
ICClose(hic); ICClose(hic);
if ( pHdr != NULL ) HeapFree(GetProcessHeap(),0,pHdr);
HeapFree(GetProcessHeap(),0,pHdr);
if ( pMem != NULL ) if ( pMem != NULL )
GlobalUnlock( hMem ); GlobalUnlock( hMem );
if ( !bSucceeded && hMem != NULL ) if ( !bSucceeded && hMem != NULL )
@ -1116,6 +1362,156 @@ err:
return (HANDLE)hMem; return (HANDLE)hMem;
} }
/***********************************************************************
* ICSeqCompressFrame [MSVFW32.@]
*/
LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL *pfKey, LONG *plSize)
{
ICCOMPRESS* icComp = (ICCOMPRESS *)pc->lpState;
DWORD ret;
TRACE("(%p, 0x%08x, %p, %p, %p)\n", pc, uiFlags, lpBits, pfKey, plSize);
if (pc->cbState != sizeof(ICCOMPRESS))
{
ERR("Invalid cbState %i\n", pc->cbState);
return NULL;
}
if (!pc->lKeyCount++)
icComp->dwFlags = ICCOMPRESS_KEYFRAME;
else
{
if (pc->lKey && pc->lKeyCount == (pc->lKey - 1))
/* No key frames if pc->lKey == 0 */
pc->lKeyCount = 0;
icComp->dwFlags = 0;
}
icComp->lpInput = lpBits;
icComp->lFrameNum = pc->lFrame++;
icComp->lpOutput = pc->lpBitsOut;
icComp->lpPrev = pc->lpBitsPrev;
ret = ICSendMessage(pc->hic, ICM_COMPRESS, (DWORD_PTR)icComp, sizeof(icComp));
if (icComp->dwFlags & AVIIF_KEYFRAME)
{
pc->lKeyCount = 1;
*pfKey = TRUE;
TRACE("Key frame\n");
}
else
*pfKey = FALSE;
*plSize = icComp->lpbiOutput->biSizeImage;
TRACE(" -- 0x%08x\n", ret);
if (ret == ICERR_OK)
{
LPVOID oldprev, oldout;
/* We shift Prev and Out, so we don't have to allocate and release memory */
oldprev = pc->lpBitsPrev;
oldout = pc->lpBitsOut;
pc->lpBitsPrev = oldout;
pc->lpBitsOut = oldprev;
TRACE("returning: %p\n", icComp->lpOutput);
return icComp->lpOutput;
}
return NULL;
}
/***********************************************************************
* ICSeqCompressFrameEnd [MSVFW32.@]
*/
void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc)
{
DWORD ret;
TRACE("(%p)\n", pc);
ret = ICSendMessage(pc->hic, ICM_COMPRESS_END, 0, 0);
TRACE(" -- %x\n", ret);
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
HeapFree(GetProcessHeap(), 0, pc->lpState);
pc->lpbiIn = pc->lpBitsPrev = pc->lpBitsOut = pc->lpState = NULL;
}
/***********************************************************************
* ICSeqCompressFrameStart [MSVFW32.@]
*/
BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn)
{
/* I'm ignoring bmiColors as I don't know what to do with it,
* it doesn't appear to be used though
*/
DWORD ret;
pc->lpbiIn = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFO));
if (!pc->lpbiIn)
return FALSE;
memcpy(pc->lpbiIn, lpbiIn, sizeof(BITMAPINFO));
pc->lpBitsPrev = HeapAlloc(GetProcessHeap(), 0, pc->lpbiIn->bmiHeader.biSizeImage);
if (!pc->lpBitsPrev)
{
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
return FALSE;
}
pc->lpState = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS));
if (!pc->lpState)
{
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
return FALSE;
}
pc->cbState = sizeof(ICCOMPRESS);
pc->lpBitsOut = HeapAlloc(GetProcessHeap(), 0, pc->lpbiOut->bmiHeader.biSizeImage);
if (!pc->lpBitsOut)
{
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
HeapFree(GetProcessHeap(), 0, pc->lpState);
return FALSE;
}
TRACE("Compvars:\n"
"\tpc:\n"
"\tsize: %i\n"
"\tflags: %i\n"
"\thic: %p\n"
"\ttype: %x\n"
"\thandler: %x\n"
"\tin/out: %p/%p\n"
"key/data/quality: %i/%i/%i\n",
pc->cbSize, pc->dwFlags, pc->hic, pc->fccType, pc->fccHandler,
pc->lpbiIn, pc->lpbiOut, pc->lKey, pc->lDataRate, pc->lQ);
ret = ICSendMessage(pc->hic, ICM_COMPRESS_BEGIN, (DWORD_PTR)pc->lpbiIn, (DWORD_PTR)pc->lpbiOut);
TRACE(" -- %x\n", ret);
if (ret == ICERR_OK)
{
ICCOMPRESS* icComp = (ICCOMPRESS *)pc->lpState;
/* Initialise some variables */
pc->lFrame = 0; pc->lKeyCount = 0;
icComp->lpbiOutput = &pc->lpbiOut->bmiHeader;
icComp->lpbiInput = &pc->lpbiIn->bmiHeader;
icComp->lpckid = NULL;
icComp->dwFrameSize = 0;
icComp->dwQuality = pc->lQ;
icComp->lpbiPrev = &pc->lpbiIn->bmiHeader;
return TRUE;
}
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
HeapFree(GetProcessHeap(), 0, pc->lpState);
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
pc->lpBitsPrev = pc->lpbiIn = pc->lpState = pc->lpBitsOut = NULL;
return FALSE;
}
/***********************************************************************
* GetFileNamePreview [MSVFW32.@]
*/
static BOOL GetFileNamePreview(LPVOID lpofn,BOOL bSave,BOOL bUnicode) static BOOL GetFileNamePreview(LPVOID lpofn,BOOL bSave,BOOL bUnicode)
{ {
CHAR szFunctionName[20]; CHAR szFunctionName[20];

View file

@ -13,20 +13,18 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#ifndef __WINE_MSVIDEO_PRIVATE_H #ifndef __WINE_MSVIDEO_PRIVATE_H
#define __WINE_MSVIDEO_PRIVATE_H #define __WINE_MSVIDEO_PRIVATE_H
#define COM_NO_WINDOWS_H /* Installable Compressor Manager */
#include <stdarg.h> #define ICVERSION 0x0104
#include "windef.h"
#include "winbase.h" #define ICM_CHOOSE_COMPRESSOR 1
#include "wingdi.h" #define IDC_COMP_LIST 880
#include "winuser.h" #define IDS_FULLFRAMES 901
#include "commdlg.h"
#include "vfw.h"
/* HIC struct (same layout as Win95 one) */ /* HIC struct (same layout as Win95 one) */
typedef struct tagWINE_HIC { typedef struct tagWINE_HIC {
@ -48,7 +46,7 @@ typedef struct tagWINE_HIC {
} WINE_HIC; } WINE_HIC;
HIC MSVIDEO_OpenFunction(DWORD, DWORD, UINT, DRIVERPROC, DWORD); HIC MSVIDEO_OpenFunction(DWORD, DWORD, UINT, DRIVERPROC, DWORD);
LRESULT MSVIDEO_SendMessage(WINE_HIC*, UINT, DWORD, DWORD); LRESULT MSVIDEO_SendMessage(WINE_HIC*, UINT, DWORD_PTR, DWORD_PTR);
WINE_HIC* MSVIDEO_GetHicPtr(HIC); WINE_HIC* MSVIDEO_GetHicPtr(HIC);
extern LRESULT (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM); extern LRESULT (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM);
@ -62,4 +60,17 @@ extern LRESULT (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM);
#define HDRAWDIB_16(h32) (LOWORD(h32)) #define HDRAWDIB_16(h32) (LOWORD(h32))
#define HIC_16(h32) (LOWORD(h32)) #define HIC_16(h32) (LOWORD(h32))
#define IDC_CONFIGURE 882
#define IDC_ABOUT 883
#define IDC_QUALITY_SCROLL 884
#define IDC_QUALITY_TXT 886
#define IDC_KEYFRAME_CHECKBOX 887
#define IDC_KEYFRAME 888
#define IDC_KEYFRAME_FRAMES 889
#define IDC_DATARATE_CHECKBOX 894
#define IDC_DATARATE 895
#define IDC_DATARATE_KB 896
#endif /* __WINE_MSVIDEO_PRIVATE_H */ #endif /* __WINE_MSVIDEO_PRIVATE_H */

View file

@ -0,0 +1,30 @@
/*
* Copyright 2005 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
#include "winuser.h"
#include "msvideo_private.h"
#include "msvfw32_De.rc"
#include "msvfw32_En.rc"
#include "msvfw32_Fr.rc"
#include "msvfw32_Hu.rc"
#include "msvfw32_Ko.rc"
#include "msvfw32_No.rc"
#include "msvfw32_Pl.rc"
#include "msvfw32_Tr.rc"

View file

@ -13,7 +13,7 @@
* *
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#ifndef __WINE_VFW16_H #ifndef __WINE_VFW16_H