diff win32/vfw.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/vfw.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2394 @@
+/***********************************************************************\
+*                                 vfw.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                 written in the D programming language                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+
+module win32.vfw;
+pragma(lib, "vfw32.lib");
+
+private import
+	win32.commdlg,
+	win32.wingdi,
+	win32.mmsystem,
+	win32.unknwn,
+	win32.w32api,
+	win32.windef,
+	win32.winuser;
+
+extern(Windows) {
+	DWORD VideoForWindowsVersion();
+	LONG InitVFW();
+	LONG TermVFW();
+}
+
+DWORD MKFOURCC(char ch0, char ch1, char ch2, char ch3) {
+	return (cast(DWORD)ch0) | ((cast(DWORD)ch1) << 8) | ((cast(DWORD)ch2) << 16) | ((cast(DWORD)ch3) << 24);
+}
+
+/**
+ * COMPMAN - Installable Compression Manager.
+ */
+
+const ICVERSION = 0x0104;
+
+typedef HANDLE HIC;
+
+const BI_1632 = 0x32333631;
+
+template aviTWOCC(char c0, char c1) {
+	const WORD aviTWOCC = c0 | (c1 << 8);
+}
+
+const ICTYPE_VIDEO	= mmioFOURCC!('v', 'i', 'd', 'c');
+const ICTYPE_AUDIO	= mmioFOURCC!('a', 'u', 'd', 'c');
+
+enum {
+	ICERR_OK			= 0,
+	ICERR_DONTDRAW		= 1,
+	ICERR_NEWPALETTE	= 2,
+	ICERR_GOTOKEYFRAME	= 3,
+	ICERR_STOPDRAWING	= 4,
+}
+
+const ICERR_UNSUPPORTED	= -1;
+const ICERR_BADFORMAT	= -2;
+const ICERR_MEMORY		= -3;
+const ICERR_INTERNAL	= -4;
+const ICERR_BADFLAGS	= -5;
+const ICERR_BADPARAM	= -6;
+const ICERR_BADSIZE		= -7;
+const ICERR_BADHANDLE	= -8;
+const ICERR_CANTUPDATE	= -9;
+const ICERR_ABORT		= -10;
+const ICERR_ERROR		= -100;
+const ICERR_BADBITDEPTH	= -200;
+const ICERR_BADIMAGESIZE = -201;
+
+const ICERR_CUSTOM = -400;
+
+enum {
+	ICMODE_COMPRESS			= 1,
+	ICMODE_DECOMPRESS,
+	ICMODE_FASTDECOMPRESS,
+	ICMODE_QUERY,
+	ICMODE_FASTCOMPRESS,
+	ICMODE_DRAW				= 8,
+}
+
+const ICMODE_INTERNALF_FUNCTION32	= 0x8000;
+const ICMODE_INTERNALF_MASK			= 0x8000;
+
+enum {
+	AVIIF_LIST		= 0x00000001,
+	AVIIF_TWOCC		= 0x00000002,
+	AVIIF_KEYFRAME	= 0x00000010,
+}
+
+const ICQUALITY_LOW		= 0;
+const ICQUALITY_HIGH	= 10000;
+const ICQUALITY_DEFAULT = -1;
+
+enum {
+	ICM_USER			= DRV_USER + 0x0000,
+	ICM_RESERVED_LOW	= DRV_USER + 0x1000,
+	ICM_RESERVED_HIGH	= DRV_USER + 0x2000,
+	ICM_RESERVED		= ICM_RESERVED_LOW,
+}
+
+// messages
+
+enum {
+	ICM_GETSTATE			= ICM_RESERVED + 0,
+	ICM_SETSTATE			= ICM_RESERVED + 1,
+	ICM_GETINFO				= ICM_RESERVED + 2,
+	ICM_CONFIGURE			= ICM_RESERVED + 10,
+	ICM_ABOUT				= ICM_RESERVED + 11,
+	ICM_GETERRORTEXT		= ICM_RESERVED + 12,
+	ICM_GETFORMATNAME		= ICM_RESERVED + 20,
+	ICM_ENUMFORMATS			= ICM_RESERVED + 21,
+	ICM_GETDEFAULTQUALITY	= ICM_RESERVED + 30,
+	ICM_GETQUALITY			= ICM_RESERVED + 31,
+	ICM_SETQUALITY			= ICM_RESERVED + 32,
+	ICM_SET					= ICM_RESERVED + 40,
+	ICM_GET					= ICM_RESERVED + 41,
+}
+
+const ICM_FRAMERATE		= mmioFOURCC!('F','r','m','R');
+const ICM_KEYFRAMERATE	= mmioFOURCC!('K','e','y','R');
+
+// ICM specific messages.
+
+enum {
+	ICM_COMPRESS_GET_FORMAT		= ICM_USER + 4,
+	ICM_COMPRESS_GET_SIZE		= ICM_USER + 5,
+	ICM_COMPRESS_QUERY			= ICM_USER + 6,
+	ICM_COMPRESS_BEGIN			= ICM_USER + 7,
+	ICM_COMPRESS				= ICM_USER + 8,
+	ICM_COMPRESS_END			= ICM_USER + 9,
+	ICM_DECOMPRESS_GET_FORMAT	= ICM_USER + 10,
+	ICM_DECOMPRESS_QUERY		= ICM_USER + 11,
+	ICM_DECOMPRESS_BEGIN		= ICM_USER + 12,
+	ICM_DECOMPRESS				= ICM_USER + 13,
+	ICM_DECOMPRESS_END			= ICM_USER + 14,
+	ICM_DECOMPRESS_SET_PALETTE	= ICM_USER + 29,
+	ICM_DECOMPRESS_GET_PALETTE	= ICM_USER + 30,
+	ICM_DRAW_QUERY				= ICM_USER + 31,
+	ICM_DRAW_BEGIN				= ICM_USER + 15,
+	ICM_DRAW_GET_PALETTE		= ICM_USER + 16,
+	ICM_DRAW_UPDATE				= ICM_USER + 17,
+	ICM_DRAW_START				= ICM_USER + 18,
+	ICM_DRAW_STOP				= ICM_USER + 19,
+	ICM_DRAW_BITS				= ICM_USER + 20,
+	ICM_DRAW_END				= ICM_USER + 21,
+	ICM_DRAW_GETTIME			= ICM_USER + 32,
+	ICM_DRAW					= ICM_USER + 33,
+	ICM_DRAW_WINDOW				= ICM_USER + 34,
+	ICM_DRAW_SETTIME			= ICM_USER + 35,
+	ICM_DRAW_REALIZE			= ICM_USER + 36,
+	ICM_DRAW_FLUSH				= ICM_USER + 37,
+	ICM_DRAW_RENDERBUFFER		= ICM_USER + 38,
+	ICM_DRAW_START_PLAY			= ICM_USER + 39,
+	ICM_DRAW_STOP_PLAY			= ICM_USER + 40,
+	ICM_DRAW_SUGGESTFORMAT		= ICM_USER + 50,
+	ICM_DRAW_CHANGEPALETTE		= ICM_USER + 51,
+	ICM_DRAW_IDLE				= ICM_USER + 52,
+	ICM_GETBUFFERSWANTED		= ICM_USER + 41,
+	ICM_GETDEFAULTKEYFRAMERATE	= ICM_USER + 42,
+	ICM_DECOMPRESSEX_BEGIN		= ICM_USER + 60,
+	ICM_DECOMPRESSEX_QUERY		= ICM_USER + 61,
+	ICM_DECOMPRESSEX			= ICM_USER + 62,
+	ICM_DECOMPRESSEX_END		= ICM_USER + 63,
+	ICM_COMPRESS_FRAMES_INFO	= ICM_USER + 70,
+	ICM_COMPRESS_FRAMES			= ICM_USER + 71,
+	ICM_SET_STATUS_PROC			= ICM_USER + 72,
+}
+
+struct ICOPEN {
+	DWORD	dwSize;
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwVersion;
+	DWORD	dwFlags;
+	LRESULT	dwError;
+	LPVOID	pV1Reserved;
+	LPVOID	pV2Reserved;
+	DWORD	dnDevNode;
+}
+
+struct ICINFO {
+	DWORD	dwSize;
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwVersion;
+	DWORD	dwVersionICM;
+	WCHAR	szName[16];
+	WCHAR	szDescription[128];
+	WCHAR	szDriver[128];
+}
+
+enum {
+	VIDCF_QUALITY			= 0x0001,
+	VIDCF_CRUNCH			= 0x0002,
+	VIDCF_TEMPORAL			= 0x0004,
+	VIDCF_COMPRESSFRAMES	= 0x0008,
+	VIDCF_DRAW				= 0x0010,
+	VIDCF_FASTTEMPORALC		= 0x0020,
+	VIDCF_FASTTEMPORALD		= 0x0080,
+}
+
+const ICCOMPRESS_KEYFRAME = 0x00000001L;
+
+struct ICCOMPRESS {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPVOID				lpOutput;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPVOID				lpInput;
+	LPDWORD				lpckid;
+	LPDWORD				lpdwFlags;
+	LONG				lFrameNum;
+	DWORD				dwFrameSize;
+	DWORD				dwQuality;
+	LPBITMAPINFOHEADER	lpbiPrev;
+	LPVOID				lpPrev;
+}
+
+const ICCOMPRESSFRAMES_PADDING = 0x00000001;
+
+struct ICCOMPRESSFRAMES {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPARAM				lOutput;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPARAM				lInput;
+	LONG				lStartFrame;
+	LONG				lFrameCount;
+	LONG				lQuality;
+	LONG				lDataRate;
+	LONG				lKeyRate;
+	DWORD				dwRate;
+	DWORD				dwScale;    DWORD		dwOverheadPerFrame;
+	DWORD				dwReserved2;
+
+	LONG function(LPARAM lInput, LONG lFrame, LPVOID lpBits, LONG len) GetData;
+	LONG function(LPARAM lOutput, LONG lFrame, LPVOID lpBits, LONG len) PutData;
+}
+
+enum {
+	ICSTATUS_START	= 0,
+	ICSTATUS_STATUS	= 1,
+	ICSTATUS_END	= 2,
+	ICSTATUS_ERROR	= 3,
+	ICSTATUS_YIELD	= 4,
+}
+
+struct ICSETSTATUSPROC {
+	DWORD	dwFlags;
+	LPARAM	lParam;
+	LONG function(LPARAM lParam, UINT message, LONG l) Status;
+}
+
+enum {
+	ICDECOMPRESS_NOTKEYFRAME	= 0x08000000,
+	ICDECOMPRESS_NULLFRAME		= 0x10000000,
+	ICDECOMPRESS_PREROLL		= 0x20000000,
+	ICDECOMPRESS_UPDATE			= 0x40000000,
+	ICDECOMPRESS_HURRYUP		= 0x80000000,
+}
+
+struct ICDECOMPRESS {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPVOID				lpInput;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPVOID				lpOutput;
+	DWORD				ckid;
+}
+
+struct ICDECOMPRESSEX {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER  lpbiSrc;
+	LPVOID				lpSrc;
+	LPBITMAPINFOHEADER	lpbiDst;
+	LPVOID				lpDst;
+	int					xDst;
+	int					yDst;
+	int					dxDst;
+	int					dyDst;
+	int					xSrc;
+	int					ySrc;
+	int					dxSrc;
+	int					dySrc;
+}
+
+enum {
+	ICDRAW_QUERY		= 0x00000001,
+	ICDRAW_FULLSCREEN	= 0x00000002,
+	ICDRAW_HDC			= 0x00000004,
+	ICDRAW_ANIMATE		= 0x00000008,
+	ICDRAW_CONTINUE		= 0x00000010,
+	ICDRAW_MEMORYDC		= 0x00000020,
+	ICDRAW_UPDATING		= 0x00000040,
+	ICDRAW_RENDER		= 0x00000080,
+	ICDRAW_BUFFER		= 0x00000100,
+}
+
+struct ICDRAWBEGIN {
+	DWORD				dwFlags;
+	HPALETTE			hpal;
+	HWND				hwnd;
+	HDC					hdc;
+	int					xDst;
+	int					yDst;
+	int					dxDst;
+	int					dyDst;
+	LPBITMAPINFOHEADER	lpbi;
+	int					xSrc;
+	int					ySrc;
+	int					dxSrc;
+	int					dySrc;
+	DWORD				dwRate;
+	DWORD				dwScale;
+}
+
+enum {
+	ICDRAW_NOTKEYFRAME	= 0x08000000,
+	ICDRAW_NULLFRAME	= 0x10000000,
+	ICDRAW_PREROLL		= 0x20000000,
+	ICDRAW_UPDATE		= 0x40000000,
+	ICDRAW_HURRYUP		= 0x80000000,
+}
+
+struct ICDRAW {
+	DWORD			dwFlags;
+	LPVOID			lpFormat;
+	LPVOID			lpData;
+	DWORD			cbData;
+	LONG			lTime;
+}
+
+struct ICDRAWSUGGEST {
+	LPBITMAPINFOHEADER	lpbiIn;
+	LPBITMAPINFOHEADER	lpbiSuggest;
+	int					dxSrc;
+	int					dySrc;
+	int					dxDst;
+	int					dyDst;
+	HIC					hicDecompressor;
+}
+
+struct ICPALETTE {
+	DWORD			dwFlags;
+	int				iStart;
+	int				iLen;
+	LPPALETTEENTRY	lppe;
+}
+
+
+/**
+ * ICM function declarations
+ */
+
+extern (Windows) {
+	BOOL ICInfo(DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo);
+	BOOL ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags);
+	BOOL ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags);
+	LRESULT ICGetInfo(HIC hic, ICINFO *picinfo, DWORD cb);
+	HIC ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode);
+	HIC ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler);
+	LRESULT ICClose(HIC hic);
+	LRESULT ICSendMessage(HIC hic, UINT msg, DWORD_PTR dw1, DWORD_PTR dw2);
+}
+
+enum {
+	ICINSTALL_FUNCTION	= 0x0001,
+	ICINSTALL_DRIVER	= 0x0002,
+	ICINSTALL_HDRV		= 0x0004,
+	ICINSTALL_UNICODE	= 0x8000,
+	ICINSTALL_DRIVERW	= 0x8002,
+}
+
+// query macros
+
+const ICMF_CONFIGURE_QUERY	= 0x00000001;
+const ICMF_ABOUT_QUERY		= 0x00000001;
+
+DWORD ICQueryAbout(HIC hic) {
+	return ICSendMessage(hic, ICM_ABOUT, -1, ICMF_ABOUT_QUERY) == ICERR_OK;
+}
+
+DWORD ICAbout(HIC hic, HWND hwnd) {
+	return ICSendMessage(hic, ICM_ABOUT, cast(UINT)hwnd, 0);
+}
+
+DWORD ICQueryConfigure(HIC hic) {
+	return (ICSendMessage(hic, ICM_CONFIGURE, -1, ICMF_CONFIGURE_QUERY) == ICERR_OK);
+}
+
+DWORD ICConfigure(HIC hic, HWND hwnd) {
+	return ICSendMessage(hic, ICM_CONFIGURE, cast(UINT)hwnd, 0);
+}
+
+DWORD ICGetState(HIC hic, LPVOID pv, DWORD_PTR cb) {
+	return ICSendMessage(hic, ICM_GETSTATE, cast(DWORD)pv, cast(DWORD)cb);
+}
+
+DWORD ICSetState(HIC hic, LPVOID pv, DWORD_PTR cb) {
+	return ICSendMessage(hic, ICM_SETSTATE, cast(DWORD)pv, cast(DWORD)cb);
+}
+
+DWORD ICGetStateSize(HIC hic) {
+	return ICGetState(hic, null, 0);
+}
+
+DWORD dwICValue;
+
+DWORD ICGetDefaultQuality(HIC hic) {
+	ICSendMessage(hic, ICM_GETDEFAULTQUALITY, cast(DWORD_PTR)&dwICValue, DWORD.sizeof);
+	return dwICValue;
+}
+
+DWORD ICGetDefaultKeyFrameRate(HIC hic) {
+	ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, cast(DWORD_PTR)&dwICValue, DWORD.sizeof);
+	return dwICValue;
+}
+
+DWORD ICDrawWindow(HIC hic, LPVOID prc) {
+	return ICSendMessage(hic, ICM_DRAW_WINDOW, cast(DWORD)prc, RECT.sizeof);
+}
+
+extern (Windows) {
+	DWORD ICCompress(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData,
+		LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, LPDWORD lpckid, LPDWORD lpdwFlags,
+		LONG lFrameNum, DWORD dwFrameSize, DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, LPVOID lpPrev);
+}
+
+LRESULT ICCompressBegin(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_BEGIN, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressQuery(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_QUERY, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressGetFormat(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+DWORD ICCompressGetFormatSize(HIC hic, LPVOID lpbi) {
+	return cast(DWORD)ICCompressGetFormat(hic, lpbi, null);
+}
+DWORD ICCompressGetSize(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return cast(DWORD)ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_COMPRESS_END, 0, 0);
+}
+
+extern (Windows) {
+	DWORD ICDecompress(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, LPBITMAPINFOHEADER lpbi, LPVOID lpBits);
+}
+
+LRESULT ICDecompressBegin(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICDecompressQuery(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_QUERY, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LONG ICDecompressGetFormat(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return cast(LONG)ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LONG ICDecompressGetFormatSize(HIC hic, LPVOID lpbi) {
+	return ICDecompressGetFormat(hic, lpbi, null);
+}
+LRESULT ICDecompressGetPalette(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICDecompressSetPalette(HIC hic, LPVOID lpbiPalette) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, cast(DWORD_PTR)lpbiPalette, 0);
+}
+LRESULT ICDecompressEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0);
+}
+
+LRESULT ICDecompressEx(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc,	LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExBegin(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc, LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExQuery(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc, LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0);
+}
+
+extern (Windows) {
+	DWORD ICDrawBegin(HIC hic, DWORD dwFlags, HPALETTE hpal, HWND hwnd, HDC hdc,
+		int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi,
+		int xSrc, int ySrc, int dxSrc, int dySrc, DWORD dwRate, DWORD dwScale);
+}
+
+extern (Windows) {
+	DWORD ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime);
+}
+
+LRESULT ICDrawSuggestFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut,
+	int dxSrc, int dySrc, int dxDst, int dyDst, HIC hicDecomp) {
+	ICDRAWSUGGEST ic;
+
+	ic.lpbiIn = lpbiIn;
+	ic.lpbiSuggest = lpbiOut;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+	ic.hicDecompressor = hicDecomp;
+
+	return ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDrawQuery(HIC hic, LPVOID lpbiInput) {
+	return ICSendMessage(hic, ICM_DRAW_QUERY, cast(DWORD_PTR)lpbiInput, 0L);
+}
+LRESULT ICDrawChangePalette(HIC hic, LPVOID lpbiInput) {
+	return ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, cast(DWORD_PTR)lpbiInput, 0L);
+}
+LRESULT ICGetBuffersWanted(HIC hic, LPVOID lpdwBuffers) {
+	return ICSendMessage(hic, ICM_GETBUFFERSWANTED, cast(DWORD_PTR)lpdwBuffers, 0);
+}
+LRESULT ICDrawEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_END, 0, 0);
+}
+LRESULT ICDrawStart(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_START, 0, 0);
+}
+LRESULT ICDrawStartPlay(HIC hic, DWORD lFrom, DWORD lTo) {
+	return ICSendMessage(hic, ICM_DRAW_START_PLAY, cast(DWORD_PTR)lFrom, cast(DWORD_PTR)lTo);
+}
+LRESULT ICDrawStop(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_STOP, 0, 0);
+}
+LRESULT ICDrawStopPlay(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0);
+}
+LRESULT ICDrawGetTime(HIC hic, LPVOID lplTime) {
+	return ICSendMessage(hic, ICM_DRAW_GETTIME, cast(DWORD_PTR)lplTime, 0);
+}
+LRESULT ICDrawSetTime(HIC hic, DWORD lTime) {
+	return ICSendMessage(hic, ICM_DRAW_SETTIME, cast(DWORD_PTR)lTime, 0);
+}
+LRESULT ICDrawRealize(HIC hic, HDC hdc, BOOL fBackground) {
+	return ICSendMessage(hic, ICM_DRAW_REALIZE, cast(DWORD_PTR)hdc, cast(DWORD_PTR)fBackground);
+}
+LRESULT ICDrawFlush(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0);
+}
+LRESULT ICDrawRenderBuffer(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0);
+}
+
+LRESULT ICSetStatusProc(HIC hic, DWORD dwFlags, LRESULT lParam, LONG function(LPARAM, UINT, LONG) fpfnStatus) {
+	ICSETSTATUSPROC ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lParam = lParam;
+	ic.Status = fpfnStatus;
+
+	return ICSendMessage(hic, ICM_SET_STATUS_PROC, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+HIC ICDecompressOpen(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut) {
+	return ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS);
+}
+
+HIC ICDrawOpen(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn) {
+	return ICLocate(fccType, fccHandler, lpbiIn, null, ICMODE_DRAW);
+}
+
+extern (Windows) {
+	HIC ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
+	HIC ICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, int BitDepth, int dx, int dy);
+	HANDLE ICImageCompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, LPVOID lpBits, LPBITMAPINFO lpbiOut, LONG lQuality, LONG* plSize);
+	HANDLE ICImageDecompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, LPVOID lpBits, LPBITMAPINFO lpbiOut);
+}
+
+struct COMPVARS {
+	LONG		cbSize = this.sizeof;
+	DWORD		dwFlags;
+	HIC			hic;
+	DWORD               fccType;
+	DWORD               fccHandler;
+	LPBITMAPINFO	lpbiIn;
+	LPBITMAPINFO	lpbiOut;
+	LPVOID		lpBitsOut;
+	LPVOID		lpBitsPrev;
+	LONG		lFrame;
+	LONG		lKey;
+	LONG		lDataRate;
+	LONG		lQ;
+	LONG		lKeyCount;
+	LPVOID		lpState;
+	LONG		cbState;
+}
+alias COMPVARS* PCOMPVARS;
+
+const ICMF_COMPVARS_VALID = 0x00000001;
+
+extern (Windows) {
+	BOOL ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn, LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle);
+}
+
+enum {
+	ICMF_CHOOSE_KEYFRAME		= 0x0001,
+	ICMF_CHOOSE_DATARATE		= 0x0002,
+	ICMF_CHOOSE_PREVIEW			= 0x0004,
+	ICMF_CHOOSE_ALLCOMPRESSORS	= 0x0008,
+}
+
+extern (Windows) {
+	BOOL ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn);
+	void ICSeqCompressFrameEnd(PCOMPVARS pc);
+	LPVOID ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL* pfKey, LONG* plSize);
+	void ICCompressorFree(PCOMPVARS pc);
+}
+
+alias HANDLE HDRAWDIB;
+
+enum {
+	DDF_0001			= 0x0001,
+	DDF_UPDATE			= 0x0002,
+	DDF_SAME_HDC		= 0x0004,
+	DDF_SAME_DRAW		= 0x0008,
+	DDF_DONTDRAW		= 0x0010,
+	DDF_ANIMATE			= 0x0020,
+	DDF_BUFFER			= 0x0040,
+	DDF_JUSTDRAWIT		= 0x0080,
+	DDF_FULLSCREEN		= 0x0100,
+	DDF_BACKGROUNDPAL	= 0x0200,
+	DDF_NOTKEYFRAME		= 0x0400,
+	DDF_HURRYUP			= 0x0800,
+	DDF_HALFTONE		= 0x1000,
+	DDF_2000			= 0x2000,
+	DDF_PREROLL			= DDF_DONTDRAW,
+	DDF_SAME_DIB		= DDF_SAME_DRAW,
+	DDF_SAME_SIZE		= DDF_SAME_DRAW,
+}
+
+extern (Windows) {
+	BOOL DrawDibInit();
+	HDRAWDIB DrawDibOpen();
+	BOOL DrawDibClose(HDRAWDIB hdd);
+	LPVOID DrawDibGetBuffer(HDRAWDIB hdd, LPBITMAPINFOHEADER lpbi, DWORD dwSize, DWORD dwFlags);
+	UINT DrawDibError(HDRAWDIB hdd);
+	HPALETTE DrawDibGetPalette(HDRAWDIB hdd);
+	BOOL DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal);
+	BOOL DrawDibChangePalette(HDRAWDIB hdd, int iStart, int iLen, LPPALETTEENTRY lppe);
+	UINT DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground);
+	BOOL DrawDibStart(HDRAWDIB hdd, DWORD rate);
+	BOOL DrawDibStop(HDRAWDIB hdd);
+	BOOL DrawDibBegin(HDRAWDIB hdd, HDC hdc, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi, int dxSrc, int dySrc, UINT wFlags);
+	BOOL DrawDibDraw(HDRAWDIB hdd, HDC hdc, int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi,
+		LPVOID lpBits, int xSrc, int ySrc, int dxSrc, int dySrc, UINT wFlags);
+}
+
+BOOL DrawDibUpdate(HDRAWDIB hdd, HDC hdc, int x, int y) {
+	return DrawDibDraw(hdd, hdc, x, y, 0, 0, null, null, 0, 0, 0, 0, DDF_UPDATE);
+}
+
+extern (Windows) {
+	BOOL DrawDibEnd(HDRAWDIB hdd);
+}
+
+struct DRAWDIBTIME {
+    LONG    timeCount;
+    LONG    timeDraw;
+    LONG    timeDecompress;
+    LONG    timeDither;
+    LONG    timeStretch;
+    LONG    timeBlt;
+    LONG    timeSetDIBits;
+}
+alias DRAWDIBTIME* LPDRAWDIBTIME;
+
+extern (Windows) {
+	BOOL DrawDibTime(HDRAWDIB hdd, LPDRAWDIBTIME lpddtime);
+}
+
+enum {
+	PD_CAN_DRAW_DIB			= 0x0001,
+	PD_CAN_STRETCHDIB		= 0x0002,
+	PD_STRETCHDIB_1_1_OK	= 0x0004,
+	PD_STRETCHDIB_1_2_OK	= 0x0008,
+	PD_STRETCHDIB_1_N_OK	= 0x0010,
+}
+
+extern (Windows) {
+	LRESULT DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi);
+	void StretchDIB(LPBITMAPINFOHEADER biDst, LPVOID lpDst, int	DstX, int DstY,
+		int DstXE, int DstYE, LPBITMAPINFOHEADER biSrc, LPVOID lpSrc,
+		int SrcX, int SrcY, int SrcXE, int SrcYE);
+} 	
+
+alias DWORD FOURCC;
+
+alias WORD TWOCC;
+
+const formtypeAVI			= mmioFOURCC!('A', 'V', 'I', ' ');
+const listtypeAVIHEADER		= mmioFOURCC!('h', 'd', 'r', 'l');
+const ckidAVIMAINHDR		= mmioFOURCC!('a', 'v', 'i', 'h');
+const listtypeSTREAMHEADER	= mmioFOURCC!('s', 't', 'r', 'l');
+const ckidSTREAMHEADER		= mmioFOURCC!('s', 't', 'r', 'h');
+const ckidSTREAMFORMAT		= mmioFOURCC!('s', 't', 'r', 'f');
+const ckidSTREAMHANDLERDATA	= mmioFOURCC!('s', 't', 'r', 'd');
+const ckidSTREAMNAME		= mmioFOURCC!('s', 't', 'r', 'n');
+const listtypeAVIMOVIE		= mmioFOURCC!('m', 'o', 'v', 'i');
+const listtypeAVIRECORD		= mmioFOURCC!('r', 'e', 'c', ' ');
+const ckidAVINEWINDEX		= mmioFOURCC!('i', 'd', 'x', '1');
+const streamtypeVIDEO		= mmioFOURCC!('v', 'i', 'd', 's');
+const streamtypeAUDIO		= mmioFOURCC!('a', 'u', 'd', 's');
+const streamtypeMIDI		= mmioFOURCC!('m', 'i', 'd', 's');
+const streamtypeTEXT		= mmioFOURCC!('t', 'x', 't', 's');
+
+const cktypeDIBbits			= aviTWOCC!('d', 'b');
+const cktypeDIBcompressed	= aviTWOCC!('d', 'c');
+const cktypePALchange		= aviTWOCC!('p', 'c');
+const cktypeWAVEbytes		= aviTWOCC!('w', 'b');
+
+const ckidAVIPADDING		= mmioFOURCC!('J', 'U', 'N', 'K');
+
+DWORD FromHex(char n) {
+	return (n >= 'A') ? n + 10 - 'A' : n - '0';
+}
+
+WORD StreamFromFOURCC(DWORD fcc) {
+	return cast(WORD)((FromHex(LOBYTE(LOWORD(fcc))) << 4) + (FromHex(HIBYTE(LOWORD(fcc)))));
+}
+
+WORD TWOCCFromFOURCC(DWORD fcc) {
+	return HIWORD(fcc);
+}
+
+BYTE ToHex(DWORD n) {
+	return cast(BYTE)((n > 9) ? n - 10 + 'A' : n + '0');
+}
+
+DWORD MAKEAVICKID(WORD tcc, WORD stream) {
+	return MAKELONG(cast(WORD)((ToHex(stream & 0x0f) << 8) | (ToHex((stream & 0xf0) >> 4))), tcc);
+}
+
+enum {
+	AVIF_HASINDEX		= 0x00000010,
+	AVIF_MUSTUSEINDEX	= 0x00000020,
+	AVIF_ISINTERLEAVED	= 0x00000100,
+	AVIF_WASCAPTUREFILE	= 0x00010000,
+	AVIF_COPYRIGHTED	= 0x00020000,
+}
+
+const AVI_HEADERSIZE = 2048;
+
+struct MainAVIHeader {
+	DWORD dwMicroSecPerFrame;
+	DWORD dwMaxBytesPerSec;
+	DWORD dwPaddingGranularity;
+	DWORD dwFlags;
+	DWORD dwTotalFrames;
+	DWORD dwInitialFrames;
+	DWORD dwStreams;
+	DWORD dwSuggestedBufferSize;
+	DWORD dwWidth;
+	DWORD dwHeight;
+	DWORD dwReserved[4];
+}
+
+const AVISF_DISABLED = 0x00000001;
+
+const AVISF_VIDEO_PALCHANGES = 0x00010000;
+
+struct AVIStreamHeader {
+	FOURCC		fccType;
+	FOURCC		fccHandler;
+	DWORD		dwFlags;
+	WORD		wPriority;
+	WORD		wLanguage;
+	DWORD		dwInitialFrames;
+	DWORD		dwScale;	
+	DWORD		dwRate;
+	DWORD		dwStart;
+	DWORD		dwLength;
+	DWORD		dwSuggestedBufferSize;
+	DWORD		dwQuality;
+	DWORD		dwSampleSize;
+	RECT		rcFrame;
+}
+
+enum {
+	AVIIF_FIRSTPART	= 0x00000020L,
+	AVIIF_LASTPART	= 0x00000040L,
+	AVIIF_MIDPART	= (AVIIF_LASTPART|AVIIF_FIRSTPART),
+	AVIIF_NOTIME	= 0x00000100L,
+	AVIIF_COMPUSE	= 0x0FFF0000L,
+}
+
+struct AVIINDEXENTRY {
+	DWORD		ckid;
+	DWORD		dwFlags;
+	DWORD		dwChunkOffset;
+	DWORD		dwChunkLength;
+}
+
+struct AVIPALCHANGE {
+	BYTE		bFirstEntry;
+	BYTE		bNumEntries;
+	WORD		wFlags;
+	PALETTEENTRY	peNew[];
+}
+
+const AVIGETFRAMEF_BESTDISPLAYFMT = 1;
+
+struct AVISTREAMINFOW {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	WORD	wPriority;
+	WORD	wLanguage;
+	DWORD	dwScale;
+	DWORD	dwRate;
+	DWORD	dwStart;
+	DWORD	dwLength;
+	DWORD	dwInitialFrames;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwQuality;
+	DWORD	dwSampleSize;
+	RECT	rcFrame;
+	DWORD	dwEditCount;
+	DWORD	dwFormatChangeCount;
+	WCHAR	szName[64];
+}
+alias AVISTREAMINFOW* LPAVISTREAMINFOW;
+
+struct AVISTREAMINFOA {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	WORD	wPriority;
+	WORD	wLanguage;
+	DWORD	dwScale;
+	DWORD	dwRate;
+	DWORD	dwStart;
+	DWORD	dwLength;
+	DWORD	dwInitialFrames;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwQuality;
+	DWORD	dwSampleSize;
+	RECT	rcFrame;
+	DWORD	dwEditCount;
+	DWORD	dwFormatChangeCount;
+	char	szName[64];
+}
+alias AVISTREAMINFOA* LPAVISTREAMINFOA;
+
+version(Unicode) {
+	alias AVISTREAMINFOW	AVISTREAMINFO;
+	alias LPAVISTREAMINFOW	LPAVISTREAMINFO;
+} else { // Unicode
+	alias AVISTREAMINFOA	AVISTREAMINFO;
+	alias LPAVISTREAMINFOA	LPAVISTREAMINFO;
+}
+
+const AVISTREAMINFO_DISABLED		= 0x00000001;
+const AVISTREAMINFO_FORMATCHANGES	= 0x00010000;
+
+struct AVIFILEINFOW {
+	DWORD	dwMaxBytesPerSec;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	DWORD	dwStreams;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwWidth;
+	DWORD	dwHeight;
+	DWORD	dwScale;	
+	DWORD	dwRate;
+	DWORD	dwLength;
+	DWORD	dwEditCount;
+	WCHAR	szFileType[64];
+}
+alias AVIFILEINFOW* LPAVIFILEINFOW;
+
+struct AVIFILEINFOA {
+	DWORD	dwMaxBytesPerSec;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	DWORD	dwStreams;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwWidth;
+	DWORD	dwHeight;
+	DWORD	dwScale;	
+	DWORD	dwRate;
+	DWORD	dwLength;
+	DWORD	dwEditCount;
+	char	szFileType[64];
+}
+alias AVIFILEINFOA* LPAVIFILEINFOA;
+
+version(Unicode) {
+	alias AVIFILEINFOW	AVIFILEINFO;
+	alias LPAVIFILEINFOW	LPAVIFILEINFO;
+} else { // Unicode
+	alias AVIFILEINFOA	AVIFILEINFO;
+	alias LPAVIFILEINFOA	LPAVIFILEINFO;
+}
+
+enum {
+	AVIFILEINFO_HASINDEX		= 0x00000010,
+	AVIFILEINFO_MUSTUSEINDEX	= 0x00000020,
+	AVIFILEINFO_ISINTERLEAVED	= 0x00000100,
+	AVIFILEINFO_WASCAPTUREFILE	= 0x00010000,
+	AVIFILEINFO_COPYRIGHTED		= 0x00020000,
+}
+
+enum {
+	AVIFILECAPS_CANREAD			= 0x00000001,
+	AVIFILECAPS_CANWRITE		= 0x00000002,
+	AVIFILECAPS_ALLKEYFRAMES	= 0x00000010,
+	AVIFILECAPS_NOCOMPRESSION	= 0x00000020,
+}
+
+extern (Windows) {
+	alias BOOL function(int) AVISAVECALLBACK;
+}
+
+struct AVICOMPRESSOPTIONS {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwKeyFrameEvery;
+	DWORD	dwQuality;
+	DWORD	dwBytesPerSecond;
+	DWORD	dwFlags;
+	LPVOID	lpFormat;
+	DWORD	cbFormat;
+	LPVOID	lpParms;
+	DWORD	cbParms;
+	DWORD	dwInterleaveEvery;
+}
+alias AVICOMPRESSOPTIONS* LPAVICOMPRESSOPTIONS;
+
+enum {
+	AVICOMPRESSF_INTERLEAVE	= 0x00000001,
+	AVICOMPRESSF_DATARATE	= 0x00000002,
+	AVICOMPRESSF_KEYFRAMES	= 0x00000004,
+	AVICOMPRESSF_VALID		= 0x00000008,
+}
+
+/+ TODO:
+DECLARE_INTERFACE_(IAVIStream, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Create)      (THIS_ LPARAM lParam1, LPARAM lParam2) PURE ;
+    STDMETHOD(Info)        (THIS_ AVISTREAMINFOW FAR * psi, LONG lSize) PURE ;
+    STDMETHOD_(LONG, FindSample)(THIS_ LONG lPos, LONG lFlags) PURE ;
+    STDMETHOD(ReadFormat)  (THIS_ LONG lPos,
+			    LPVOID lpFormat, LONG FAR *lpcbFormat) PURE ;
+    STDMETHOD(SetFormat)   (THIS_ LONG lPos,
+			    LPVOID lpFormat, LONG cbFormat) PURE ;
+    STDMETHOD(Read)        (THIS_ LONG lStart, LONG lSamples,
+			    LPVOID lpBuffer, LONG cbBuffer,
+			    LONG FAR * plBytes, LONG FAR * plSamples) PURE ;
+    STDMETHOD(Write)       (THIS_ LONG lStart, LONG lSamples,
+			    LPVOID lpBuffer, LONG cbBuffer,
+			    DWORD dwFlags,
+			    LONG FAR *plSampWritten,
+			    LONG FAR *plBytesWritten) PURE ;
+    STDMETHOD(Delete)      (THIS_ LONG lStart, LONG lSamples) PURE;
+    STDMETHOD(ReadData)    (THIS_ DWORD fcc, LPVOID lp, LONG FAR *lpcb) PURE ;
+    STDMETHOD(WriteData)   (THIS_ DWORD fcc, LPVOID lp, LONG cb) PURE ;
+#ifdef _WIN32
+    STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
+			    LONG cbInfo) PURE;
+#else
+    STDMETHOD(Reserved1)            (THIS) PURE;
+    STDMETHOD(Reserved2)            (THIS) PURE;
+    STDMETHOD(Reserved3)            (THIS) PURE;
+    STDMETHOD(Reserved4)            (THIS) PURE;
+    STDMETHOD(Reserved5)            (THIS) PURE;
+#endif
+};
+
+typedef       IAVIStream FAR* PAVISTREAM;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIStreaming
+
+DECLARE_INTERFACE_(IAVIStreaming, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Begin) (THIS_
+		      LONG  lStart,
+		      LONG  lEnd,
+		      LONG  lRate) PURE;
+    STDMETHOD(End)   (THIS) PURE;
+};
+
+typedef       IAVIStreaming FAR* PAVISTREAMING;
+
+
+#undef  INTERFACE
+#define INTERFACE   IAVIEditStream
+
+DECLARE_INTERFACE_(IAVIEditStream, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Cut) (THIS_ LONG FAR *plStart,
+			  LONG FAR *plLength,
+			  PAVISTREAM FAR * ppResult) PURE;
+    STDMETHOD(Copy) (THIS_ LONG FAR *plStart,
+			   LONG FAR *plLength,
+			   PAVISTREAM FAR * ppResult) PURE;
+    STDMETHOD(Paste) (THIS_ LONG FAR *plPos,
+			    LONG FAR *plLength,
+			    PAVISTREAM pstream,
+			    LONG lStart,
+			    LONG lEnd) PURE;
+    STDMETHOD(Clone) (THIS_ PAVISTREAM FAR *ppResult) PURE;
+    STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
+			    LONG cbInfo) PURE;
+};
+
+typedef       IAVIEditStream FAR* PAVIEDITSTREAM;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIPersistFile
+
+DECLARE_INTERFACE_(IAVIPersistFile, IPersistFile)
+{
+    STDMETHOD(Reserved1)(THIS) PURE;
+};
+
+typedef IAVIPersistFile FAR* PAVIPERSISTFILE;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIFile
+#define PAVIFILE IAVIFile FAR*
+
+DECLARE_INTERFACE_(IAVIFile, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Info)                 (THIS_
+                                     AVIFILEINFOW FAR * pfi,
+                                     LONG lSize) PURE;
+    STDMETHOD(GetStream)            (THIS_
+                                     PAVISTREAM FAR * ppStream,
+				     DWORD fccType,
+                                     LONG lParam) PURE;
+    STDMETHOD(CreateStream)         (THIS_
+                                     PAVISTREAM FAR * ppStream,
+                                     AVISTREAMINFOW FAR * psi) PURE;
+    STDMETHOD(WriteData)            (THIS_
+                                     DWORD ckid,
+                                     LPVOID lpData,
+                                     LONG cbData) PURE;
+    STDMETHOD(ReadData)             (THIS_
+                                     DWORD ckid,
+                                     LPVOID lpData,
+                                     LONG FAR *lpcbData) PURE;
+    STDMETHOD(EndRecord)            (THIS) PURE;
+    STDMETHOD(DeleteStream)         (THIS_
+				     DWORD fccType,
+                                     LONG lParam) PURE;
+};
+
+#undef PAVIFILE
+typedef       IAVIFile FAR* PAVIFILE;
+
+#undef  INTERFACE
+#define INTERFACE   IGetFrame
+#define PGETFRAME   IGetFrame FAR*
+
+DECLARE_INTERFACE_(IGetFrame, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD_(LPVOID,GetFrame) (THIS_ LONG lPos) PURE;
+
+    STDMETHOD(Begin) (THIS_ LONG lStart, LONG lEnd, LONG lRate) PURE;
+    STDMETHOD(End) (THIS) PURE;
+
+    STDMETHOD(SetFormat) (THIS_ LPBITMAPINFOHEADER lpbi, LPVOID lpBits, int x, int y, int dx, int dy) PURE;
+};
+
+#undef PGETFRAME
+typedef IGetFrame FAR* PGETFRAME;
+
+#define DEFINE_AVIGUID(name, l, w1, w2)    DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
+
+DEFINE_AVIGUID(IID_IAVIFile,            0x00020020, 0, 0);
+DEFINE_AVIGUID(IID_IAVIStream,          0x00020021, 0, 0);
+DEFINE_AVIGUID(IID_IAVIStreaming,       0x00020022, 0, 0);
+DEFINE_AVIGUID(IID_IGetFrame,           0x00020023, 0, 0);
+DEFINE_AVIGUID(IID_IAVIEditStream,      0x00020024, 0, 0);
+DEFINE_AVIGUID(IID_IAVIPersistFile,     0x00020025, 0, 0);
+#ifndef UNICODE
+DEFINE_AVIGUID(CLSID_AVISimpleUnMarshal,        0x00020009, 0, 0);
+#endif
+
+DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
+
+#define	AVIFILEHANDLER_CANREAD		0x0001
+#define	AVIFILEHANDLER_CANWRITE		0x0002
+#define	AVIFILEHANDLER_CANACCEPTNONRGB	0x0004
+
+STDAPI_(void) AVIFileInit(void);
+STDAPI_(void) AVIFileExit(void);
+
+STDAPI_(ULONG) AVIFileAddRef       (PAVIFILE pfile);
+STDAPI_(ULONG) AVIFileRelease      (PAVIFILE pfile);
+
+#ifdef _WIN32
+STDAPI AVIFileOpenA       (PAVIFILE FAR * ppfile, LPCSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+STDAPI AVIFileOpenW       (PAVIFILE FAR * ppfile, LPCWSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+#ifdef UNICODE
+#define AVIFileOpen	  AVIFileOpenW	
+#else
+#define AVIFileOpen	  AVIFileOpenA	
+#endif
+#else
+STDAPI AVIFileOpen       (PAVIFILE FAR * ppfile, LPCSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+#define AVIFileOpenW	AVIFileOpen
+#endif
+
+#ifdef _WIN32
+STDAPI AVIFileInfoW (PAVIFILE pfile, LPAVIFILEINFOW pfi, LONG lSize);
+STDAPI AVIFileInfoA (PAVIFILE pfile, LPAVIFILEINFOA pfi, LONG lSize);
+#ifdef UNICODE
+#define AVIFileInfo	AVIFileInfoW
+#else
+#define AVIFileInfo	AVIFileInfoA
+#endif
+#else
+STDAPI AVIFileInfo (PAVIFILE pfile, LPAVIFILEINFO pfi, LONG lSize);
+#define AVIFileInfoW AVIFileInfo
+#endif
+
+
+STDAPI AVIFileGetStream     (PAVIFILE pfile, PAVISTREAM FAR * ppavi, DWORD fccType, LONG lParam);
+
+
+#ifdef _WIN32
+STDAPI AVIFileCreateStreamW (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOW FAR * psi);
+STDAPI AVIFileCreateStreamA (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOA FAR * psi);
+#ifdef UNICODE
+#define AVIFileCreateStream	AVIFileCreateStreamW
+#else
+#define AVIFileCreateStream	AVIFileCreateStreamA
+#endif
+#else
+STDAPI AVIFileCreateStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFO FAR * psi);
+#define AVIFileCreateStreamW AVIFileCreateStream
+#endif
+
+STDAPI AVIFileWriteData	(PAVIFILE pfile,
+					 DWORD ckid,
+					 LPVOID lpData,
+					 LONG cbData);
+STDAPI AVIFileReadData	(PAVIFILE pfile,
+					 DWORD ckid,
+					 LPVOID lpData,
+					 LONG FAR *lpcbData);
+STDAPI AVIFileEndRecord	(PAVIFILE pfile);
+
+STDAPI_(ULONG) AVIStreamAddRef       (PAVISTREAM pavi);
+STDAPI_(ULONG) AVIStreamRelease      (PAVISTREAM pavi);
+
+STDAPI AVIStreamInfoW (PAVISTREAM pavi, LPAVISTREAMINFOW psi, LONG lSize);
+STDAPI AVIStreamInfoA (PAVISTREAM pavi, LPAVISTREAMINFOA psi, LONG lSize);
+#ifdef UNICODE
+#define AVIStreamInfo	AVIStreamInfoW
+#else
+#define AVIStreamInfo	AVIStreamInfoA
+#endif
+
+STDAPI_(LONG) AVIStreamFindSample(PAVISTREAM pavi, LONG lPos, LONG lFlags);
+STDAPI AVIStreamReadFormat   (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG FAR *lpcbFormat);
+STDAPI AVIStreamSetFormat    (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG cbFormat);
+STDAPI AVIStreamReadData     (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG FAR *lpcb);
+STDAPI AVIStreamWriteData    (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG cb);
+
+STDAPI AVIStreamRead         (PAVISTREAM pavi,
+			      LONG lStart,
+			      LONG lSamples,
+			      LPVOID lpBuffer,
+			      LONG cbBuffer,
+			      LONG FAR * plBytes,
+			      LONG FAR * plSamples);
+#define AVISTREAMREAD_CONVENIENT	(-1L)
+
+STDAPI AVIStreamWrite        (PAVISTREAM pavi,
+			      LONG lStart, LONG lSamples,
+			      LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags,
+			      LONG FAR *plSampWritten,
+			      LONG FAR *plBytesWritten);
+
+STDAPI_(LONG) AVIStreamStart        (PAVISTREAM pavi);
+STDAPI_(LONG) AVIStreamLength       (PAVISTREAM pavi);
+STDAPI_(LONG) AVIStreamTimeToSample (PAVISTREAM pavi, LONG lTime);
+STDAPI_(LONG) AVIStreamSampleToTime (PAVISTREAM pavi, LONG lSample);
+
+
+STDAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LONG lRate);
+STDAPI AVIStreamEndStreaming(PAVISTREAM pavi);
+
+STDAPI_(PGETFRAME) AVIStreamGetFrameOpen(PAVISTREAM pavi,
+					 LPBITMAPINFOHEADER lpbiWanted);
+STDAPI_(LPVOID) AVIStreamGetFrame(PGETFRAME pg, LONG lPos);
+STDAPI AVIStreamGetFrameClose(PGETFRAME pg);
+
+STDAPI AVIStreamOpenFromFileA(PAVISTREAM FAR *ppavi, LPCSTR szFile,
+			     DWORD fccType, LONG lParam,
+			     UINT mode, CLSID FAR *pclsidHandler);
+STDAPI AVIStreamOpenFromFileW(PAVISTREAM FAR *ppavi, LPCWSTR szFile,
+			     DWORD fccType, LONG lParam,
+			     UINT mode, CLSID FAR *pclsidHandler);
+#ifdef UNICODE
+#define AVIStreamOpenFromFile	AVIStreamOpenFromFileW
+#else
+#define AVIStreamOpenFromFile	AVIStreamOpenFromFileA
+#endif
+
+STDAPI AVIStreamCreate(PAVISTREAM FAR *ppavi, LONG lParam1, LONG lParam2,
+		       CLSID FAR *pclsidHandler);
+
+
+
+#define FIND_DIR        0x0000000FL
+#define FIND_NEXT       0x00000001L
+#define FIND_PREV       0x00000004L
+#define FIND_FROM_START 0x00000008L
+
+#define FIND_TYPE       0x000000F0L
+#define FIND_KEY        0x00000010L
+#define FIND_ANY        0x00000020L
+#define FIND_FORMAT     0x00000040L
+
+#define FIND_RET        0x0000F000L
+#define FIND_POS        0x00000000L
+#define FIND_LENGTH     0x00001000L
+#define FIND_OFFSET     0x00002000L
+#define FIND_SIZE       0x00003000L
+#define FIND_INDEX      0x00004000L
+
+#define AVIStreamFindKeyFrame AVIStreamFindSample
+#define FindKeyFrame	FindSample
+
+#define AVIStreamClose AVIStreamRelease
+#define AVIFileClose   AVIFileRelease
+#define AVIStreamInit  AVIFileInit
+#define AVIStreamExit  AVIFileExit
+
+#define SEARCH_NEAREST  FIND_PREV
+#define SEARCH_BACKWARD FIND_PREV
+#define SEARCH_FORWARD  FIND_NEXT
+#define SEARCH_KEY      FIND_KEY
+#define SEARCH_ANY      FIND_ANY
+
+#define     AVIStreamSampleToSample(pavi1, pavi2, l)            AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2, l))
+
+#define     AVIStreamNextSample(pavi, l)            AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_ANY)
+
+#define     AVIStreamPrevSample(pavi, l)            AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_ANY)
+
+#define     AVIStreamNearestSample(pavi, l)            AVIStreamFindSample(pavi,l,FIND_PREV|FIND_ANY)
+
+#define     AVIStreamNextKeyFrame(pavi,l)            AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_KEY)
+
+#define     AVIStreamPrevKeyFrame(pavi, l)            AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_KEY)
+
+#define     AVIStreamNearestKeyFrame(pavi, l)            AVIStreamFindSample(pavi,l,FIND_PREV|FIND_KEY)
+
+#define     AVIStreamIsKeyFrame(pavi, l)            (AVIStreamNearestKeyFrame(pavi,l) == l)
+
+#define     AVIStreamPrevSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamPrevSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNextSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNextSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNearestSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNearestSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNextKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNextKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamPrevKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamPrevKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamNearestKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNearestKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamStartTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamStart(pavi))
+
+#define     AVIStreamLengthTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamLength(pavi))
+
+#define     AVIStreamEnd(pavi)            (AVIStreamStart(pavi) + AVIStreamLength(pavi))
+
+#define     AVIStreamEndTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi))
+
+#define     AVIStreamSampleSize(pavi, lPos, plSize)	    AVIStreamRead(pavi,lPos,1,NULL,0,plSize,NULL)
+
+#define     AVIStreamFormatSize(pavi, lPos, plSize)            AVIStreamReadFormat(pavi,lPos,NULL,plSize)
+
+#define     AVIStreamDataSize(pavi, fcc, plSize)            AVIStreamReadData(pavi,fcc,NULL,plSize)
+
+#ifndef comptypeDIB
+#define comptypeDIB         mmioFOURCC('D', 'I', 'B', ' ')
+#endif
+
+STDAPI AVIMakeCompressedStream(
+		PAVISTREAM FAR *	    ppsCompressed,
+		PAVISTREAM		    ppsSource,
+		AVICOMPRESSOPTIONS FAR *    lpOptions,
+		CLSID FAR *pclsidHandler);
+
+EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM	    pfile,
+		LPAVICOMPRESSOPTIONS lpOptions,
+		...);
+
+STDAPI AVISaveVA(LPCSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM FAR *    ppavi,
+		LPAVICOMPRESSOPTIONS FAR *plpOptions);
+EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM	    pfile,
+		LPAVICOMPRESSOPTIONS lpOptions,
+		...);
+
+STDAPI AVISaveVW(LPCWSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM FAR *    ppavi,
+		LPAVICOMPRESSOPTIONS FAR *plpOptions);
+#ifdef UNICODE
+#define AVISave		AVISaveW
+#define AVISaveV	AVISaveVW
+#else
+#define AVISave		AVISaveA
+#define AVISaveV	AVISaveVA
+#endif
+
+
+
+STDAPI_(INT_PTR) AVISaveOptions(HWND hwnd,
+			     UINT	uiFlags,
+			     int	nStreams,
+			     PAVISTREAM FAR *ppavi,
+			     LPAVICOMPRESSOPTIONS FAR *plpOptions);
+
+STDAPI AVISaveOptionsFree(int nStreams,
+			     LPAVICOMPRESSOPTIONS FAR *plpOptions);
+
+STDAPI AVIBuildFilterW(LPWSTR lpszFilter, LONG cbFilter, BOOL fSaving);
+STDAPI AVIBuildFilterA(LPSTR lpszFilter, LONG cbFilter, BOOL fSaving);
+#ifdef UNICODE
+#define AVIBuildFilter	AVIBuildFilterW
+#else
+#define AVIBuildFilter	AVIBuildFilterA
+#endif
+STDAPI AVIMakeFileFromStreams(PAVIFILE FAR *	ppfile,
+			       int		nStreams,
+			       PAVISTREAM FAR *	papStreams);
+
+STDAPI AVIMakeStreamFromClipboard(UINT cfFormat, HANDLE hGlobal, PAVISTREAM FAR *ppstream);
+
+STDAPI AVIPutFileOnClipboard(PAVIFILE pf);
+
+STDAPI AVIGetFromClipboard(PAVIFILE FAR * lppf);
+
+STDAPI AVIClearClipboard(void);
+
+STDAPI CreateEditableStream(
+		PAVISTREAM FAR *	    ppsEditable,
+		PAVISTREAM		    psSource);
+
+STDAPI EditStreamCut(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
+
+STDAPI EditStreamCopy(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
+
+STDAPI EditStreamPaste(PAVISTREAM pavi, LONG FAR *plPos, LONG FAR *plLength, PAVISTREAM pstream, LONG lStart, LONG lEnd);
+
+STDAPI EditStreamClone(PAVISTREAM pavi, PAVISTREAM FAR *ppResult);
+
+
+STDAPI EditStreamSetNameA(PAVISTREAM pavi, LPCSTR lpszName);
+STDAPI EditStreamSetNameW(PAVISTREAM pavi, LPCWSTR lpszName);
+STDAPI EditStreamSetInfoW(PAVISTREAM pavi, LPAVISTREAMINFOW lpInfo, LONG cbInfo);
+STDAPI EditStreamSetInfoA(PAVISTREAM pavi, LPAVISTREAMINFOA lpInfo, LONG cbInfo);
+#ifdef UNICODE
+#define EditStreamSetInfo	EditStreamSetInfoW
+#define EditStreamSetName	EditStreamSetNameW
+#else
+#define EditStreamSetInfo	EditStreamSetInfoA
+#define EditStreamSetName	EditStreamSetNameA
+#endif
++/
+const AVIERR_OK = 0L;
+
+SCODE MAKE_AVIERR(DWORD error) {
+	return MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error);
+}
+
+const AVIERR_UNSUPPORTED	= MAKE_AVIERR(101);
+const AVIERR_BADFORMAT		= MAKE_AVIERR(102);
+const AVIERR_MEMORY			= MAKE_AVIERR(103);
+const AVIERR_INTERNAL		= MAKE_AVIERR(104);
+const AVIERR_BADFLAGS		= MAKE_AVIERR(105);
+const AVIERR_BADPARAM		= MAKE_AVIERR(106);
+const AVIERR_BADSIZE		= MAKE_AVIERR(107);
+const AVIERR_BADHANDLE		= MAKE_AVIERR(108);
+const AVIERR_FILEREAD		= MAKE_AVIERR(109);
+const AVIERR_FILEWRITE		= MAKE_AVIERR(110);
+const AVIERR_FILEOPEN		= MAKE_AVIERR(111);
+const AVIERR_COMPRESSOR		= MAKE_AVIERR(112);
+const AVIERR_NOCOMPRESSOR	= MAKE_AVIERR(113);
+const AVIERR_READONLY		= MAKE_AVIERR(114);
+const AVIERR_NODATA			= MAKE_AVIERR(115);
+const AVIERR_BUFFERTOOSMALL	= MAKE_AVIERR(116);
+const AVIERR_CANTCOMPRESS	= MAKE_AVIERR(117);
+const AVIERR_USERABORT		= MAKE_AVIERR(198);
+const AVIERR_ERROR			= MAKE_AVIERR(199);
+
+const TCHAR[] MCIWND_WINDOW_CLASS = "MCIWndClass";
+
+extern (Windows) {
+	HWND MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCSTR szFile);
+	HWND MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCWSTR szFile);
+}
+
+version(Unicode) {
+	alias MCIWndCreateW	MCIWndCreate;
+} else { // Unicode
+	alias MCIWndCreateA	MCIWndCreate;
+}
+
+extern(Windows) {
+	BOOL MCIWndRegisterClass();
+}
+
+enum {
+	MCIWNDOPENF_NEW				= 0x0001,
+	MCIWNDF_NOAUTOSIZEWINDOW	= 0x0001,
+	MCIWNDF_NOPLAYBAR			= 0x0002,
+	MCIWNDF_NOAUTOSIZEMOVIE		= 0x0004,
+	MCIWNDF_NOMENU				= 0x0008,
+	MCIWNDF_SHOWNAME			= 0x0010,
+	MCIWNDF_SHOWPOS				= 0x0020,
+	MCIWNDF_SHOWMODE			= 0x0040,
+	MCIWNDF_SHOWALL				= 0x0070,
+	MCIWNDF_NOTIFYMODE			= 0x0100,
+	MCIWNDF_NOTIFYPOS			= 0x0200,
+	MCIWNDF_NOTIFYSIZE			= 0x0400,
+	MCIWNDF_NOTIFYERROR			= 0x1000,
+	MCIWNDF_NOTIFYALL			= 0x1F00,
+	MCIWNDF_NOTIFYANSI			= 0x0080,
+	MCIWNDF_NOTIFYMEDIAA		= 0x0880,
+	MCIWNDF_NOTIFYMEDIAW		= 0x0800,
+}
+
+version(Unicode) {
+	alias MCIWNDF_NOTIFYMEDIAW	MCIWNDF_NOTIFYMEDIA;
+} else { // Unicode
+	alias MCIWNDF_NOTIFYMEDIAA	MCIWNDF_NOTIFYMEDIA;
+}
+
+enum {
+	MCIWNDF_RECORD		= 0x2000,
+	MCIWNDF_NOERRORDLG	= 0x4000,
+	MCIWNDF_NOOPEN		= 0x8000,
+}
+
+// can macros
+
+BOOL MCIWndCanPlay(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_PLAY, 0, 0); }
+BOOL MCIWndCanRecord(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_RECORD, 0, 0); }
+BOOL MCIWndCanSave(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_SAVE, 0, 0); }
+BOOL MCIWndCanWindow(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_WINDOW, 0, 0); }
+BOOL MCIWndCanEject(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_EJECT, 0, 0); }
+BOOL MCIWndCanConfig(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_CONFIG, 0, 0); }
+BOOL MCIWndPaletteKick(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_PALETTEKICK, 0, 0); }
+LONG MCIWndSave(HWND hwnd, LPVOID szFile)
+	{ return cast(LONG)SendMessage(hwnd, MCI_SAVE, 0, cast(LPARAM)szFile); }
+LONG MCIWndSaveDialog(HWND hwnd)
+	{ return MCIWndSave(hwnd, cast(LPVOID)-1); }
+LONG MCIWndNew(HWND hwnd, LPVOID lp)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_NEW, 0, cast(LPARAM)lp); }
+LONG MCIWndRecord(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_RECORD, 0, 0); }
+LONG MCIWndOpen(HWND hwnd, LPVOID sz, UINT f)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_OPEN, cast(WPARAM)f, cast(LPARAM)sz); }
+LONG MCIWndOpenDialog(HWND hwnd)
+	{ return MCIWndOpen(hwnd, cast(LPVOID)-1, 0); }
+LONG MCIWndClose(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_CLOSE, 0, 0); }
+LONG MCIWndPlay(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_PLAY, 0, 0); }
+LONG MCIWndStop(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_STOP, 0, 0); }
+LONG MCIWndPause(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_PAUSE, 0, 0); }
+LONG MCIWndResume(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_RESUME, 0, 0); }
+LONG MCIWndSeek(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCI_SEEK, 0, cast(LPARAM)lPos); }
+LONG MCIWndHome(HWND hwnd)
+	{ return MCIWndSeek(hwnd, MCIWND_START); }
+LONG MCIWndEnd(HWND hwnd)
+	{ return MCIWndSeek(hwnd, MCIWND_END); }
+LONG MCIWndEject(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_EJECT, 0, 0); }
+LONG MCIWndGetSource(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GET_SOURCE, 0, cast(LPARAM)prc); }
+LONG MCIWndPutSource(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PUT_SOURCE, 0, cast(LPARAM)prc); }
+LONG MCIWndGetDest(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GET_DEST, 0, cast(LPARAM)prc); }
+LONG MCIWndPutDest(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PUT_DEST, 0, cast(LPARAM)prc); }
+LONG MCIWndPlayReverse(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYREVERSE, 0, 0); }
+LONG MCIWndPlayFrom(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYFROM, 0, cast(LPARAM)lPos); }
+LONG MCIWndPlayTo(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYTO, 0, cast(LPARAM)lPos); }
+LONG MCIWndPlayFromTo(HWND hwnd, LONG lStart, LONG lEnd)
+	{ MCIWndSeek(hwnd, lStart); return MCIWndPlayTo(hwnd, lEnd); }
+UINT MCIWndGetDeviceID(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETDEVICEID, 0, 0); }
+UINT MCIWndGetAlias(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETALIAS, 0, 0); }
+LONG MCIWndGetMode(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETMODE, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetPosition(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETPOSITION, 0, 0); }
+LONG MCIWndGetPositionString(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETPOSITION, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetStart(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETSTART, 0, 0); }
+LONG MCIWndGetLength(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETLENGTH, 0, 0); }
+LONG MCIWndGetEnd(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETEND, 0, 0); }
+LONG MCIWndStep(HWND hwnd, LONG n)
+	{ return cast(LONG)SendMessage(hwnd, MCI_STEP, 0, cast(LPARAM)n); }
+void MCIWndDestroy(HWND hwnd)
+	{ SendMessage(hwnd, WM_CLOSE, 0, 0); }
+void MCIWndSetZoom(HWND hwnd, UINT iZoom)
+	{ SendMessage(hwnd, MCIWNDM_SETZOOM, 0, cast(LPARAM)iZoom); }
+UINT MCIWndGetZoom(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETZOOM, 0, 0); }
+LONG MCIWndSetVolume(HWND hwnd, UINT iVol)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETVOLUME, 0, cast(LPARAM)iVol); }
+LONG MCIWndGetVolume(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETVOLUME, 0, 0); }
+LONG MCIWndSetSpeed(HWND hwnd, UINT iSpeed)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETSPEED, 0, cast(LPARAM)iSpeed); }
+LONG MCIWndGetSpeed(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETSPEED, 0, 0); }
+LONG MCIWndSetTimeFormat(HWND hwnd, LPTSTR lp)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETTIMEFORMAT, 0, cast(LPARAM)lp); }
+LONG MCIWndUseFrames(HWND hwnd)
+	{ return MCIWndSetTimeFormat(hwnd, (cast(TCHAR[])"frames").ptr); }
+LONG MCIWndUseTime(HWND hwnd)
+	{ return MCIWndSetTimeFormat(hwnd, (cast(TCHAR[])"ms").ptr); }
+LONG MCIWndGetTimeFormat(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETTIMEFORMAT, cast(WPARAM)len, cast(LPARAM)lp); }
+void MCIWndValidateMedia(HWND hwnd)
+	{ SendMessage(hwnd, MCIWNDM_VALIDATEMEDIA, 0, 0); }
+void MCIWndSetRepeat(HWND hwnd, BOOL f)
+	{ SendMessage(hwnd, MCIWNDM_SETREPEAT, 0, cast(LPARAM)f); }
+BOOL MCIWndGetRepeat(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_GETREPEAT, 0, 0); }
+void MCIWndSetActiveTimer(HWND hwnd, UINT active)
+	{ SendMessage(hwnd, MCIWNDM_SETACTIVETIMER, cast(WPARAM)active, 0); }
+void MCIWndSetInactiveTimer(HWND hwnd, UINT inactive)
+	{ SendMessage(hwnd, MCIWNDM_SETINACTIVETIMER, cast(WPARAM)inactive, 0); }
+void MCIWndSetTimers(HWND hwnd, UINT active, UINT inactive)
+	{ SendMessage(hwnd, MCIWNDM_SETTIMERS, cast(WPARAM)active, cast(LPARAM)inactive); }
+UINT MCIWndGetActiveTimer(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETACTIVETIMER, 0, 0); }
+UINT MCIWndGetInactiveTimer(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETINACTIVETIMER, 0, 0); }
+LONG MCIWndRealize(HWND hwnd, BOOL fBkgnd)
+	{ return SendMessage(hwnd, MCIWNDM_REALIZE, cast(WPARAM)fBkgnd, 0); }
+LONG MCIWndSendString(HWND hwnd, LPTSTR sz)
+	{ return SendMessage(hwnd, MCIWNDM_SENDSTRING, 0, cast(LPARAM)sz); }
+LONG MCIWndReturnString(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_RETURNSTRING, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetError(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETERROR, cast(WPARAM)len, cast(LPARAM)lp); }
+HPALETTE MCIWndGetPalette(HWND hwnd)
+	{ return cast(HPALETTE)SendMessage(hwnd, MCIWNDM_GETPALETTE, 0, 0); }
+LONG MCIWndSetPalette(HWND hwnd, HPALETTE hpal)
+	{ return SendMessage(hwnd, MCIWNDM_SETPALETTE, cast(WPARAM)hpal, 0); }
+LONG MCIWndGetFileName(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETFILENAME, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetDevice(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETDEVICE, cast(WPARAM)len, cast(LPARAM)lp); }
+UINT MCIWndGetStyles(HWND hwnd)
+	{ return SendMessage(hwnd, MCIWNDM_GETSTYLES, 0, 0); }
+LONG MCIWndChangeStyles(HWND hwnd, UINT mask, LONG value)
+	{ return SendMessage(hwnd, MCIWNDM_CHANGESTYLES, cast(WPARAM)mask, cast(LPARAM)value); }
+LONG MCIWndOpenInterface(HWND hwnd, LPUNKNOWN pUnk)
+	{ return SendMessage(hwnd, MCIWNDM_OPENINTERFACE, 0, cast(LPARAM)cast(void*)pUnk); }
+LONG MCIWndSetOwner(HWND hwnd, HWND hwndP)
+	{ return SendMessage(hwnd, MCIWNDM_SETOWNER, cast(WPARAM)hwndP, 0); }
+
+enum {
+	MCIWNDM_GETDEVICEID			= WM_USER + 100,
+	MCIWNDM_SENDSTRINGA			= WM_USER + 101,
+	MCIWNDM_GETPOSITIONA		= WM_USER + 102,
+	MCIWNDM_GETSTART			= WM_USER + 103,
+	MCIWNDM_GETLENGTH			= WM_USER + 104,
+	MCIWNDM_GETEND				= WM_USER + 105,
+	MCIWNDM_GETMODEA			= WM_USER + 106,
+	MCIWNDM_EJECT				= WM_USER + 107,
+	MCIWNDM_SETZOOM				= WM_USER + 108,
+	MCIWNDM_GETZOOM				= WM_USER + 109,
+	MCIWNDM_SETVOLUME			= WM_USER + 110,
+	MCIWNDM_GETVOLUME			= WM_USER + 111,
+	MCIWNDM_SETSPEED			= WM_USER + 112,
+	MCIWNDM_GETSPEED			= WM_USER + 113,
+	MCIWNDM_SETREPEAT			= WM_USER + 114,
+	MCIWNDM_GETREPEAT			= WM_USER + 115,
+	MCIWNDM_REALIZE				= WM_USER + 118,
+	MCIWNDM_SETTIMEFORMATA		= WM_USER + 119,
+	MCIWNDM_GETTIMEFORMATA		= WM_USER + 120,
+	MCIWNDM_VALIDATEMEDIA		= WM_USER + 121,
+	MCIWNDM_PLAYFROM			= WM_USER + 122,
+	MCIWNDM_PLAYTO				= WM_USER + 123,
+	MCIWNDM_GETFILENAMEA		= WM_USER + 124,
+	MCIWNDM_GETDEVICEA			= WM_USER + 125,
+	MCIWNDM_GETPALETTE			= WM_USER + 126,
+	MCIWNDM_SETPALETTE			= WM_USER + 127,
+	MCIWNDM_GETERRORA			= WM_USER + 128,
+	MCIWNDM_SETTIMERS			= WM_USER + 129,
+	MCIWNDM_SETACTIVETIMER		= WM_USER + 130,
+	MCIWNDM_SETINACTIVETIMER	= WM_USER + 131,
+	MCIWNDM_GETACTIVETIMER		= WM_USER + 132,
+	MCIWNDM_GETINACTIVETIMER	= WM_USER + 133,
+	MCIWNDM_NEWA				= WM_USER + 134,
+	MCIWNDM_CHANGESTYLES		= WM_USER + 135,
+	MCIWNDM_GETSTYLES			= WM_USER + 136,
+	MCIWNDM_GETALIAS			= WM_USER + 137,
+	MCIWNDM_RETURNSTRINGA		= WM_USER + 138,
+	MCIWNDM_PLAYREVERSE			= WM_USER + 139,
+	MCIWNDM_GET_SOURCE			= WM_USER + 140,
+	MCIWNDM_PUT_SOURCE			= WM_USER + 141,
+	MCIWNDM_GET_DEST			= WM_USER + 142,
+	MCIWNDM_PUT_DEST			= WM_USER + 143,
+	MCIWNDM_CAN_PLAY			= WM_USER + 144,
+	MCIWNDM_CAN_WINDOW			= WM_USER + 145,
+	MCIWNDM_CAN_RECORD			= WM_USER + 146,
+	MCIWNDM_CAN_SAVE			= WM_USER + 147,
+	MCIWNDM_CAN_EJECT			= WM_USER + 148,
+	MCIWNDM_CAN_CONFIG			= WM_USER + 149,
+	MCIWNDM_PALETTEKICK			= WM_USER + 150,
+	MCIWNDM_OPENINTERFACE		= WM_USER + 151,
+	MCIWNDM_SETOWNER			= WM_USER + 152,
+	MCIWNDM_OPENA				= WM_USER + 153,
+	MCIWNDM_SENDSTRINGW			= WM_USER + 201,
+	MCIWNDM_GETPOSITIONW		= WM_USER + 202,
+	MCIWNDM_GETMODEW			= WM_USER + 206,
+	MCIWNDM_SETTIMEFORMATW		= WM_USER + 219,
+	MCIWNDM_GETTIMEFORMATW		= WM_USER + 220,
+	MCIWNDM_GETFILENAMEW		= WM_USER + 224,
+	MCIWNDM_GETDEVICEW			= WM_USER + 225,
+	MCIWNDM_GETERRORW			= WM_USER + 228,
+	MCIWNDM_NEWW				= WM_USER + 234,
+	MCIWNDM_RETURNSTRINGW		= WM_USER + 238,
+	MCIWNDM_OPENW				= WM_USER + 252,
+}
+
+version(Unicode) {
+	alias MCIWNDM_SENDSTRINGW		MCIWNDM_SENDSTRING;
+	alias MCIWNDM_GETPOSITIONW		MCIWNDM_GETPOSITION;
+	alias MCIWNDM_GETMODEW			MCIWNDM_GETMODE;
+	alias MCIWNDM_SETTIMEFORMATW	MCIWNDM_SETTIMEFORMAT;
+	alias MCIWNDM_GETTIMEFORMATW	MCIWNDM_GETTIMEFORMAT;
+	alias MCIWNDM_GETFILENAMEW		MCIWNDM_GETFILENAME;
+	alias MCIWNDM_GETDEVICEW		MCIWNDM_GETDEVICE;
+	alias MCIWNDM_GETERRORW			MCIWNDM_GETERROR;
+	alias MCIWNDM_NEWW				MCIWNDM_NEW;
+	alias MCIWNDM_RETURNSTRINGW		MCIWNDM_RETURNSTRING;
+	alias MCIWNDM_OPENW				MCIWNDM_OPEN;
+} else { // Unicode
+	alias MCIWNDM_SENDSTRINGA		MCIWNDM_SENDSTRING;
+	alias MCIWNDM_GETPOSITIONA		MCIWNDM_GETPOSITION;
+	alias MCIWNDM_GETMODEA			MCIWNDM_GETMODE;
+	alias MCIWNDM_SETTIMEFORMATA	MCIWNDM_SETTIMEFORMAT;
+	alias MCIWNDM_GETTIMEFORMATA	MCIWNDM_GETTIMEFORMAT;
+	alias MCIWNDM_GETFILENAMEA		MCIWNDM_GETFILENAME;
+	alias MCIWNDM_GETDEVICEA		MCIWNDM_GETDEVICE;
+	alias MCIWNDM_GETERRORA			MCIWNDM_GETERROR;
+	alias MCIWNDM_NEWA				MCIWNDM_NEW;
+	alias MCIWNDM_RETURNSTRINGA		MCIWNDM_RETURNSTRING;
+	alias MCIWNDM_OPENA				MCIWNDM_OPEN;
+}
+
+enum {
+	MCIWNDM_NOTIFYMODE	= WM_USER + 200,
+	MCIWNDM_NOTIFYPOS	= WM_USER + 201,
+	MCIWNDM_NOTIFYSIZE	= WM_USER + 202,
+	MCIWNDM_NOTIFYMEDIA	= WM_USER + 203,
+	MCIWNDM_NOTIFYERROR	= WM_USER + 205,
+}
+
+const MCIWND_START	= -1;
+const MCIWND_END	= -2;
+
+enum {
+	MCI_CLOSE	= 0x0804,
+	MCI_PLAY	= 0x0806,
+	MCI_SEEK	= 0x0807,
+	MCI_STOP	= 0x0808,
+	MCI_PAUSE	= 0x0809,
+	MCI_STEP	= 0x080E,
+	MCI_RECORD	= 0x080F,
+	MCI_SAVE	= 0x0813,
+	MCI_CUT		= 0x0851,
+	MCI_COPY	= 0x0852,
+	MCI_PASTE	= 0x0853,
+	MCI_RESUME	= 0x0855,
+	MCI_DELETE	= 0x0856,
+}
+
+enum {
+	MCI_MODE_NOT_READY	= 524,
+	MCI_MODE_STOP,
+	MCI_MODE_PLAY,
+	MCI_MODE_RECORD,
+	MCI_MODE_SEEK,
+	MCI_MODE_PAUSE,
+	MCI_MODE_OPEN,
+}
+
+typedef HANDLE HVIDEO;
+alias HVIDEO* LPHVIDEO;
+
+// Error Return Values
+
+enum {
+	DV_ERR_OK				= 0,
+	DV_ERR_BASE				= 1,
+	DV_ERR_NONSPECIFIC		= DV_ERR_BASE,
+	DV_ERR_BADFORMAT		= DV_ERR_BASE + 1,
+	DV_ERR_STILLPLAYING		= DV_ERR_BASE + 2,
+	DV_ERR_UNPREPARED		= DV_ERR_BASE + 3,
+	DV_ERR_SYNC				= DV_ERR_BASE + 4,
+	DV_ERR_TOOMANYCHANNELS	= DV_ERR_BASE + 5,
+	DV_ERR_NOTDETECTED		= DV_ERR_BASE + 6,
+	DV_ERR_BADINSTALL		= DV_ERR_BASE + 7,
+	DV_ERR_CREATEPALETTE	= DV_ERR_BASE + 8,
+	DV_ERR_SIZEFIELD		= DV_ERR_BASE + 9,
+	DV_ERR_PARAM1			= DV_ERR_BASE + 10,
+	DV_ERR_PARAM2			= DV_ERR_BASE + 11,
+	DV_ERR_CONFIG1			= DV_ERR_BASE + 12,
+	DV_ERR_CONFIG2			= DV_ERR_BASE + 13,
+	DV_ERR_FLAGS			= DV_ERR_BASE + 14,
+	DV_ERR_13				= DV_ERR_BASE + 15,
+	DV_ERR_NOTSUPPORTED		= DV_ERR_BASE + 16,
+	DV_ERR_NOMEM			= DV_ERR_BASE + 17,
+	DV_ERR_ALLOCATED		= DV_ERR_BASE + 18,
+	DV_ERR_BADDEVICEID		= DV_ERR_BASE + 19,
+	DV_ERR_INVALHANDLE		= DV_ERR_BASE + 20,
+	DV_ERR_BADERRNUM		= DV_ERR_BASE + 21,
+	DV_ERR_NO_BUFFERS		= DV_ERR_BASE + 22,
+	DV_ERR_MEM_CONFLICT		= DV_ERR_BASE + 23,
+	DV_ERR_IO_CONFLICT		= DV_ERR_BASE + 24,
+	DV_ERR_DMA_CONFLICT		= DV_ERR_BASE + 25,
+	DV_ERR_INT_CONFLICT		= DV_ERR_BASE + 26,
+	DV_ERR_PROTECT_ONLY		= DV_ERR_BASE + 27,
+	DV_ERR_LASTERROR		= DV_ERR_BASE + 27,
+	DV_ERR_USER_MSG			= DV_ERR_BASE + 1000,
+}
+
+// Callback Messages
+
+enum {
+	MM_DRVM_OPEN	= 0x3D0,
+	MM_DRVM_CLOSE,
+	MM_DRVM_DATA,
+	MM_DRVM_ERROR,
+}
+
+enum {
+	DV_VM_OPEN	= MM_DRVM_OPEN,
+	DV_VM_CLOSE	= MM_DRVM_CLOSE,
+	DV_VM_DATA	= MM_DRVM_DATA,
+	DV_VM_ERROR	= MM_DRVM_ERROR,
+}
+
+/**
+ * Structures
+ */
+
+struct VIDEOHDR {
+	LPBYTE		lpData;
+	DWORD		dwBufferLength;
+	DWORD		dwBytesUsed;
+	DWORD		dwTimeCaptured;
+	DWORD_PTR	dwUser;
+	DWORD		dwFlags;
+    DWORD_PTR   dwReserved[4];
+}
+alias VIDEOHDR* PVIDEOHDR, LPVIDEOHDR;
+
+enum {
+	VHDR_DONE		= 0x00000001,
+	VHDR_PREPARED	= 0x00000002,
+	VHDR_INQUEUE	= 0x00000004,
+	VHDR_KEYFRAME	= 0x00000008,
+	VHDR_VALID		= 0x0000000F,
+}
+
+struct CHANNEL_CAPS {
+	DWORD	dwFlags;
+	DWORD	dwSrcRectXMod;
+	DWORD	dwSrcRectYMod;
+	DWORD	dwSrcRectWidthMod;
+	DWORD	dwSrcRectHeightMod;
+	DWORD	dwDstRectXMod;
+	DWORD	dwDstRectYMod;
+	DWORD	dwDstRectWidthMod;
+	DWORD	dwDstRectHeightMod;
+}
+alias CHANNEL_CAPS* PCHANNEL_CAPS, LPCHANNEL_CAPS;
+
+enum {
+	VCAPS_OVERLAY		= 0x00000001,
+	VCAPS_SRC_CAN_CLIP	= 0x00000002,
+	VCAPS_DST_CAN_CLIP	= 0x00000004,
+	VCAPS_CAN_SCALE		= 0x00000008,
+}
+
+/**
+ * API Flags
+ */
+
+enum {
+	VIDEO_EXTERNALIN			= 0x0001,
+	VIDEO_EXTERNALOUT			= 0x0002,
+	VIDEO_IN					= 0x0004,
+	VIDEO_OUT					= 0x0008,
+	VIDEO_DLG_QUERY				= 0x0010,
+}
+
+enum {
+	VIDEO_CONFIGURE_QUERYSIZE	= 0x0001,
+	VIDEO_CONFIGURE_CURRENT		= 0x0010,
+	VIDEO_CONFIGURE_NOMINAL		= 0x0020,
+	VIDEO_CONFIGURE_MIN			= 0x0040,
+	VIDEO_CONFIGURE_MAX			= 0x0080,
+	VIDEO_CONFIGURE_SET			= 0x1000,
+	VIDEO_CONFIGURE_GET			= 0x2000,
+	VIDEO_CONFIGURE_QUERY		= 0x8000,
+}
+
+/**
+ * CONFIGURE MESSAGES
+ */
+
+enum {
+	DVM_USER			= 0x4000,
+	DVM_CONFIGURE_START	= 0x1000,
+	DVM_CONFIGURE_END	= 0x1FFF,
+	DVM_PALETTE			= DVM_CONFIGURE_START + 1,
+	DVM_FORMAT			= DVM_CONFIGURE_START + 2,
+	DVM_PALETTERGB555	= DVM_CONFIGURE_START + 3,
+	DVM_SRC_RECT		= DVM_CONFIGURE_START + 4,
+	DVM_DST_RECT		= DVM_CONFIGURE_START + 5,
+}
+
+/**
+ * AVICap window class
+ */
+
+LRESULT AVICapSM(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
+	if (IsWindow(hWnd)) {
+		return SendMessage(hWnd, msg, wParam, lParam);
+	}
+	return 0;
+}
+
+enum {
+	WM_CAP_START				= WM_USER,
+	WM_CAP_UNICODE_START		= WM_USER + 100,
+
+	WM_CAP_GET_CAPSTREAMPTR		= WM_CAP_START + 1,
+	WM_CAP_SET_CALLBACK_ERRORA	= WM_CAP_START + 2,
+	WM_CAP_SET_CALLBACK_STATUSA	= WM_CAP_START + 3,
+
+	WM_CAP_SET_CALLBACK_ERRORW	= WM_CAP_UNICODE_START + 2,
+	WM_CAP_SET_CALLBACK_STATUSW	= WM_CAP_UNICODE_START + 3,
+}
+
+version(Unicode) {
+	alias WM_CAP_SET_CALLBACK_ERRORW	WM_CAP_SET_CALLBACK_ERROR;
+	alias WM_CAP_SET_CALLBACK_STATUSW	WM_CAP_SET_CALLBACK_STATUS;
+} else { // Unicode
+	alias WM_CAP_SET_CALLBACK_ERRORA	WM_CAP_SET_CALLBACK_ERROR;
+	alias WM_CAP_SET_CALLBACK_STATUSA	WM_CAP_SET_CALLBACK_STATUS;
+}
+
+enum {
+	WM_CAP_SET_CALLBACK_YIELD		= WM_CAP_START + 4,
+	WM_CAP_SET_CALLBACK_FRAME		= WM_CAP_START + 5,
+	WM_CAP_SET_CALLBACK_VIDEOSTREAM	= WM_CAP_START + 6,
+	WM_CAP_SET_CALLBACK_WAVESTREAM	= WM_CAP_START + 7,
+	WM_CAP_GET_USER_DATA			= WM_CAP_START + 8,
+	WM_CAP_SET_USER_DATA			= WM_CAP_START + 9,
+	WM_CAP_DRIVER_CONNECT			= WM_CAP_START + 10,
+	WM_CAP_DRIVER_DISCONNECT		= WM_CAP_START + 11,
+	WM_CAP_DRIVER_GET_NAMEA			= WM_CAP_START + 12,
+	WM_CAP_DRIVER_GET_VERSIONA		= WM_CAP_START + 13,
+
+	WM_CAP_DRIVER_GET_NAMEW			= WM_CAP_UNICODE_START + 12,
+	WM_CAP_DRIVER_GET_VERSIONW		= WM_CAP_UNICODE_START + 13,
+}
+
+version(Unicode) {
+	alias WM_CAP_DRIVER_GET_NAMEW		WM_CAP_DRIVER_GET_NAME;
+	alias WM_CAP_DRIVER_GET_VERSIONW	WM_CAP_DRIVER_GET_VERSION;
+} else { // Unicode
+	alias WM_CAP_DRIVER_GET_NAMEA		WM_CAP_DRIVER_GET_NAME;
+	alias WM_CAP_DRIVER_GET_VERSIONA	WM_CAP_DRIVER_GET_VERSION;
+}
+
+enum {
+	WM_CAP_DRIVER_GET_CAPS			= WM_CAP_START + 14,
+	WM_CAP_FILE_SET_CAPTURE_FILEA	= WM_CAP_START + 20,
+	WM_CAP_FILE_GET_CAPTURE_FILEA	= WM_CAP_START + 21,
+	WM_CAP_FILE_SAVEASA				= WM_CAP_START + 23,
+	WM_CAP_FILE_SAVEDIBA			= WM_CAP_START + 25,
+
+	WM_CAP_FILE_SET_CAPTURE_FILEW	= WM_CAP_UNICODE_START + 20,
+	WM_CAP_FILE_GET_CAPTURE_FILEW	= WM_CAP_UNICODE_START + 21,
+	WM_CAP_FILE_SAVEASW				= WM_CAP_UNICODE_START + 23,
+	WM_CAP_FILE_SAVEDIBW			= WM_CAP_UNICODE_START + 25,
+}
+
+version(Unicode) {
+	alias WM_CAP_FILE_SET_CAPTURE_FILEW	WM_CAP_FILE_SET_CAPTURE_FILE;
+	alias WM_CAP_FILE_GET_CAPTURE_FILEW	WM_CAP_FILE_GET_CAPTURE_FILE;
+	alias WM_CAP_FILE_SAVEASW			WM_CAP_FILE_SAVEAS;
+	alias WM_CAP_FILE_SAVEDIBW			WM_CAP_FILE_SAVEDIB;
+} else { // Unicode
+	alias WM_CAP_FILE_SET_CAPTURE_FILEA	WM_CAP_FILE_SET_CAPTURE_FILE;
+	alias WM_CAP_FILE_GET_CAPTURE_FILEA	WM_CAP_FILE_GET_CAPTURE_FILE;
+	alias WM_CAP_FILE_SAVEASA			WM_CAP_FILE_SAVEAS;
+	alias WM_CAP_FILE_SAVEDIBA			WM_CAP_FILE_SAVEDIB;
+}
+
+enum {
+	WM_CAP_FILE_ALLOCATE		= WM_CAP_START + 22,
+	WM_CAP_FILE_SET_INFOCHUNK	= WM_CAP_START + 24,
+	WM_CAP_EDIT_COPY			= WM_CAP_START + 30,
+	WM_CAP_SET_AUDIOFORMAT		= WM_CAP_START + 35,
+	WM_CAP_GET_AUDIOFORMAT		= WM_CAP_START + 36,
+	WM_CAP_DLG_VIDEOFORMAT		= WM_CAP_START + 41,
+	WM_CAP_DLG_VIDEOSOURCE		= WM_CAP_START + 42,
+	WM_CAP_DLG_VIDEODISPLAY		= WM_CAP_START + 43,
+	WM_CAP_GET_VIDEOFORMAT		= WM_CAP_START + 44,
+	WM_CAP_SET_VIDEOFORMAT		= WM_CAP_START + 45,
+	WM_CAP_DLG_VIDEOCOMPRESSION	= WM_CAP_START + 46,
+	WM_CAP_SET_PREVIEW			= WM_CAP_START + 50,
+	WM_CAP_SET_OVERLAY			= WM_CAP_START + 51,
+	WM_CAP_SET_PREVIEWRATE		= WM_CAP_START + 52,
+	WM_CAP_SET_SCALE			= WM_CAP_START + 53,
+	WM_CAP_GET_STATUS			= WM_CAP_START + 54,
+	WM_CAP_SET_SCROLL			= WM_CAP_START + 55,
+	WM_CAP_GRAB_FRAME			= WM_CAP_START + 60,
+	WM_CAP_GRAB_FRAME_NOSTOP	= WM_CAP_START + 61,
+	WM_CAP_SEQUENCE				= WM_CAP_START + 62,
+	WM_CAP_SEQUENCE_NOFILE		= WM_CAP_START + 63,
+	WM_CAP_SET_SEQUENCE_SETUP	= WM_CAP_START + 64,
+	WM_CAP_GET_SEQUENCE_SETUP	= WM_CAP_START + 65,
+	WM_CAP_SET_MCI_DEVICEA		= WM_CAP_START + 66,
+	WM_CAP_GET_MCI_DEVICEA		= WM_CAP_START + 67,
+
+	WM_CAP_SET_MCI_DEVICEW		= WM_CAP_UNICODE_START + 66,
+	WM_CAP_GET_MCI_DEVICEW		= WM_CAP_UNICODE_START + 67,
+}
+
+version(Unicode) {
+	alias WM_CAP_SET_MCI_DEVICEW	WM_CAP_SET_MCI_DEVICE;
+	alias WM_CAP_GET_MCI_DEVICEW	WM_CAP_GET_MCI_DEVICE;
+} else { // Unicode
+	alias WM_CAP_SET_MCI_DEVICEA	WM_CAP_SET_MCI_DEVICE;
+	alias WM_CAP_GET_MCI_DEVICEA	WM_CAP_GET_MCI_DEVICE;
+}
+
+enum {
+	WM_CAP_STOP					= WM_CAP_START + 68,
+	WM_CAP_ABORT				= WM_CAP_START + 69,
+	WM_CAP_SINGLE_FRAME_OPEN	= WM_CAP_START + 70,
+	WM_CAP_SINGLE_FRAME_CLOSE	= WM_CAP_START + 71,
+	WM_CAP_SINGLE_FRAME			= WM_CAP_START + 72,
+	WM_CAP_PAL_OPENA			= WM_CAP_START + 80,
+	WM_CAP_PAL_SAVEA			= WM_CAP_START + 81,
+
+	WM_CAP_PAL_OPENW			= WM_CAP_UNICODE_START + 80,
+	WM_CAP_PAL_SAVEW			= WM_CAP_UNICODE_START + 81,
+}
+
+version(Unicode) {
+	alias WM_CAP_PAL_OPENW	WM_CAP_PAL_OPEN;
+	alias WM_CAP_PAL_SAVEW	WM_CAP_PAL_SAVE;
+} else { // Unicode
+	alias WM_CAP_PAL_OPENA	WM_CAP_PAL_OPEN;
+	alias WM_CAP_PAL_SAVEA	WM_CAP_PAL_SAVE;
+}
+
+enum {
+	WM_CAP_PAL_PASTE				= WM_CAP_START + 82,
+	WM_CAP_PAL_AUTOCREATE			= WM_CAP_START + 83,
+	WM_CAP_PAL_MANUALCREATE			= WM_CAP_START + 84,
+	WM_CAP_SET_CALLBACK_CAPCONTROL	= WM_CAP_START + 85,
+	WM_CAP_UNICODE_END				= WM_CAP_PAL_SAVEW,
+	WM_CAP_END						= WM_CAP_UNICODE_END,
+}
+
+/**
+ * message wrapper
+ */
+
+BOOL capSetCallbackOnError(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_ERROR, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnStatus(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_STATUS, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnYield(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_YIELD, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnFrame(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_FRAME, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnVideoStream(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnWaveStream(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnCapControl(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, cast(LPARAM)fpProc); }
+
+BOOL capSetUserData(HWND hWnd, LPARAM lUser)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_USER_DATA, 0, lUser); }
+BOOL capGetUserData(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_USER_DATA, 0, 0); }
+
+BOOL capDriverConnect(HWND hWnd, WPARAM i)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_CONNECT, i, 0); }
+BOOL capDriverDisconnect(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); }
+BOOL capDriverGetName(HWND hWnd, LPTSTR szName, WPARAM wSize)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_NAME, wSize, cast(LPARAM)szName); }
+BOOL capDriverGetVersion(HWND hWnd, LPTSTR szVer, WPARAM wSize)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_VERSION, wSize, cast(LPARAM)szVer); }
+BOOL capDriverGetCaps(HWND hWnd, LPCAPDRIVERCAPS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_CAPS, wSize, cast(LPARAM)s); }
+
+BOOL capFileSetCaptureFile(HWND hWnd, LPTSTR szName)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, cast(LPARAM)szName); }
+BOOL capFileGetCaptureFile(HWND hWnd, LPTSTR szName, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, cast(LPARAM)szName); }
+BOOL capFileAlloc(HWND hWnd, WPARAM wSize)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_ALLOCATE, wSize, 0); }
+BOOL capFileSaveAs(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEAS, 0, cast(LPARAM)szName); }
+BOOL capFileSetInfoChunk(HWND hWnd, LPCAPINFOCHUNK lpInfoChunk)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_INFOCHUNK, 0, cast(LPARAM)lpInfoChunk); }
+BOOL capFileSaveDIB(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEDIB, 0, cast(LPARAM)szName); }
+
+BOOL capEditCopy(HWND hWnd)											{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_EDIT_COPY, 0, 0); }
+
+BOOL capSetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)	{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetAudioFormatSize(HWND hWnd)								{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, 0, 0); }
+
+BOOL capDlgVideoFormat(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0); }
+BOOL capDlgVideoSource(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0); }
+BOOL capDlgVideoDisplay(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0); }
+BOOL capDlgVideoCompression(HWND hWnd)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); }
+
+DWORD capGetVideoFormat(HWND hWnd, void* s, WPARAM wSize)			{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetVideoFormatSize(HWND hWnd)								{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); }
+BOOL capSetVideoFormat(HWND hWnd, void* s, WPARAM wSize)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
+
+BOOL capPreview(HWND hWnd, BOOL f)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEW, cast(WPARAM)f, 0); }
+BOOL capPreviewRate(HWND hWnd, WPARAM wMS)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); }
+BOOL capOverlay(HWND hWnd, BOOL f)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_OVERLAY, cast(WPARAM)f, 0); }
+BOOL capPreviewScale(HWND hWnd, BOOL f)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCALE, cast(WPARAM)f, 0); }
+BOOL capGetStatus(HWND hWnd, LPCAPSTATUS s, WPARAM wSize)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_STATUS, wSize, cast(LPARAM)s); }
+BOOL capSetScrollPos(HWND hWnd, LPPOINT lpP)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCROLL, 0, cast(LPARAM)lpP); }
+
+BOOL capGrabFrame(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME, 0, 0); }
+BOOL capGrabFrameNoStop(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0); }
+
+BOOL capCaptureSequence(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE, 0, 0); }
+BOOL capCaptureSequenceNoFile(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE_NOFILE, 0, 0); }
+BOOL capCaptureStop(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_STOP, 0, 0); }
+BOOL capCaptureAbort(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_ABORT, 0, 0); }
+
+BOOL capCaptureSingleFrameOpen(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0); }
+BOOL capCaptureSingleFrameClose(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0); }
+BOOL capCaptureSingleFrame(HWND hWnd)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME, 0, 0); }
+
+BOOL capCaptureGetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
+BOOL capCaptureSetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
+
+BOOL capSetMCIDeviceName(HWND hWnd, LPTSTR szName)					{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_MCI_DEVICE, 0, cast(LPARAM)szName); }
+BOOL capGetMCIDeviceName(HWND hWnd, LPTSTR szName, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_MCI_DEVICE, wSize, cast(LPARAM)szName); }
+
+BOOL capPaletteOpen(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_OPEN, 0, cast(LPARAM)szName); }
+BOOL capPaletteSave(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_SAVE, 0, cast(LPARAM)szName); }
+BOOL capPalettePaste(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_PASTE, 0, 0); }
+BOOL capPaletteAuto(HWND hWnd, WPARAM iFrames, LPARAM iColors)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors); }
+BOOL capPaletteManual(HWND hWnd, WPARAM fGrab, LPARAM iColors)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors); }
+
+/**
+ * structs
+ */
+
+struct CAPDRIVERCAPS {
+	UINT	wDeviceIndex;
+	BOOL	fHasOverlay;
+	BOOL	fHasDlgVideoSource;
+	BOOL	fHasDlgVideoFormat;
+	BOOL	fHasDlgVideoDisplay;
+	BOOL	fCaptureInitialized;
+	BOOL	fDriverSuppliesPalettes;
+	HANDLE	hVideoIn;
+	HANDLE	hVideoOut;
+	HANDLE	hVideoExtIn;
+	HANDLE	hVideoExtOut;
+}
+alias CAPDRIVERCAPS* PCAPDRIVERCAPS, LPCAPDRIVERCAPS;
+
+struct CAPSTATUS {
+	UINT		uiImageWidth;
+	UINT		uiImageHeight;
+	BOOL		fLiveWindow;
+	BOOL		fOverlayWindow;
+	BOOL		fScale;
+	POINT		ptScroll;
+	BOOL		fUsingDefaultPalette;
+	BOOL		fAudioHardware;
+	BOOL		fCapFileExists;
+	DWORD		dwCurrentVideoFrame;
+	DWORD		dwCurrentVideoFramesDropped;
+	DWORD		dwCurrentWaveSamples;
+	DWORD		dwCurrentTimeElapsedMS;
+	HPALETTE	hPalCurrent;
+	BOOL		fCapturingNow;
+	DWORD		dwReturn;
+	UINT		wNumVideoAllocated;
+	UINT		wNumAudioAllocated;
+}
+alias CAPSTATUS* PCAPSTATUS, LPCAPSTATUS;
+
+struct CAPTUREPARMS {
+	DWORD	dwRequestMicroSecPerFrame;
+	BOOL	fMakeUserHitOKToCapture;
+	UINT	wPercentDropForError;
+	BOOL	fYield;
+	DWORD	dwIndexSize;
+	UINT	wChunkGranularity;
+	BOOL	fUsingDOSMemory;
+	UINT	wNumVideoRequested;
+	BOOL	fCaptureAudio;
+	UINT	wNumAudioRequested;
+	UINT	vKeyAbort;
+	BOOL	fAbortLeftMouse;
+	BOOL	fAbortRightMouse;
+	BOOL	fLimitEnabled;
+	UINT	wTimeLimit;
+	BOOL	fMCIControl;
+	BOOL	fStepMCIDevice;
+	DWORD	dwMCIStartTime;
+	DWORD	dwMCIStopTime;
+	BOOL	fStepCaptureAt2x;
+	UINT	wStepCaptureAverageFrames;
+	DWORD	dwAudioBufferSize;
+	BOOL	fDisableWriteCache;
+	UINT	AVStreamMaster;
+}
+alias CAPTUREPARMS* PCAPTUREPARMS, LPCAPTUREPARMS;
+
+const AVSTREAMMASTER_AUDIO = 0;
+const AVSTREAMMASTER_NONE  = 1;
+
+struct CAPINFOCHUNK {
+	FOURCC	fccInfoID;
+	LPVOID	lpData;
+	LONG	cbData;
+}
+alias CAPINFOCHUNK* PCAPINFOCHUNK, LPCAPINFOCHUNK;
+
+// Callback Definitions
+
+extern (Windows) {
+	alias LRESULT function(HWND hWnd) CAPYIELDCALLBACK;
+	alias LRESULT function(HWND hWnd, int nID, LPCWSTR lpsz) CAPSTATUSCALLBACKW;
+	alias LRESULT function(HWND hWnd, int nID, LPCWSTR lpsz) CAPERRORCALLBACKW;
+	alias LRESULT function(HWND hWnd, int nID, LPCSTR lpsz) CAPSTATUSCALLBACKA;
+	alias LRESULT function(HWND hWnd, int nID, LPCSTR lpsz) CAPERRORCALLBACKA;
+}
+
+version(Unicode) {
+	alias CAPSTATUSCALLBACKW	CAPSTATUSCALLBACK;
+	alias CAPERRORCALLBACKW		CAPERRORCALLBACK;
+} else { // Unicode
+	alias CAPSTATUSCALLBACKA	CAPSTATUSCALLBACK;
+	alias CAPERRORCALLBACKA		CAPERRORCALLBACK;
+}
+
+extern (Windows) {
+	alias LRESULT function(HWND hWnd, LPVIDEOHDR lpVHdr) CAPVIDEOCALLBACK;
+	alias LRESULT function(HWND hWnd, LPWAVEHDR lpWHdr) CAPWAVECALLBACK;
+	alias LRESULT function(HWND hWnd, int nState) CAPCONTROLCALLBACK;
+}
+
+//  CapControlCallback states
+const CONTROLCALLBACK_PREROLL	= 1;
+const CONTROLCALLBACK_CAPTURING	= 2;
+
+extern (Windows) {
+	HWND capCreateCaptureWindowA(LPCSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, int nID);
+	BOOL capGetDriverDescriptionA(UINT wDriverIndex, LPSTR lpszName, int cbName, LPSTR lpszVer, int cbVer);
+	HWND capCreateCaptureWindowW(LPCWSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, int nID);
+	BOOL capGetDriverDescriptionW(UINT wDriverIndex, LPWSTR lpszName, int cbName, LPWSTR lpszVer, int cbVer);
+}
+
+version(Unicode) {
+	alias capCreateCaptureWindowW	capCreateCaptureWindow;
+	alias capGetDriverDescriptionW	capGetDriverDescription;
+} else { // Unicode
+	alias capCreateCaptureWindowA	capCreateCaptureWindow;
+	alias capGetDriverDescriptionA	capGetDriverDescription;
+}
+
+// New Information chunk IDs
+const infotypeDIGITIZATION_TIME	= mmioFOURCC!('I', 'D', 'I', 'T');
+const infotypeSMPTE_TIME		= mmioFOURCC!('I', 'S', 'M', 'P');
+
+// status and error callbacks
+enum {
+	IDS_CAP_BEGIN					= 300,
+	IDS_CAP_END						= 301,
+
+	IDS_CAP_INFO					= 401,
+	IDS_CAP_OUTOFMEM				= 402,
+	IDS_CAP_FILEEXISTS				= 403,
+	IDS_CAP_ERRORPALOPEN			= 404,
+	IDS_CAP_ERRORPALSAVE			= 405,
+	IDS_CAP_ERRORDIBSAVE			= 406,
+	IDS_CAP_DEFAVIEXT				= 407,
+	IDS_CAP_DEFPALEXT				= 408,
+	IDS_CAP_CANTOPEN				= 409,
+	IDS_CAP_SEQ_MSGSTART			= 410,
+	IDS_CAP_SEQ_MSGSTOP				= 411,
+
+	IDS_CAP_VIDEDITERR				= 412,
+	IDS_CAP_READONLYFILE			= 413,
+	IDS_CAP_WRITEERROR				= 414,
+	IDS_CAP_NODISKSPACE				= 415,
+	IDS_CAP_SETFILESIZE				= 416,
+	IDS_CAP_SAVEASPERCENT			= 417,
+
+	IDS_CAP_DRIVER_ERROR			= 418,
+
+	IDS_CAP_WAVE_OPEN_ERROR			= 419,
+	IDS_CAP_WAVE_ALLOC_ERROR		= 420,
+	IDS_CAP_WAVE_PREPARE_ERROR		= 421,
+	IDS_CAP_WAVE_ADD_ERROR			= 422,
+	IDS_CAP_WAVE_SIZE_ERROR			= 423,
+
+	IDS_CAP_VIDEO_OPEN_ERROR		= 424,
+	IDS_CAP_VIDEO_ALLOC_ERROR		= 425,
+	IDS_CAP_VIDEO_PREPARE_ERROR		= 426,
+	IDS_CAP_VIDEO_ADD_ERROR			= 427,
+	IDS_CAP_VIDEO_SIZE_ERROR		= 428,
+
+	IDS_CAP_FILE_OPEN_ERROR			= 429,
+	IDS_CAP_FILE_WRITE_ERROR		= 430,
+	IDS_CAP_RECORDING_ERROR			= 431,
+	IDS_CAP_RECORDING_ERROR2		= 432,
+	IDS_CAP_AVI_INIT_ERROR			= 433,
+	IDS_CAP_NO_FRAME_CAP_ERROR		= 434,
+	IDS_CAP_NO_PALETTE_WARN			= 435,
+	IDS_CAP_MCI_CONTROL_ERROR		= 436,
+	IDS_CAP_MCI_CANT_STEP_ERROR		= 437,
+	IDS_CAP_NO_AUDIO_CAP_ERROR		= 438,
+	IDS_CAP_AVI_DRAWDIB_ERROR		= 439,
+	IDS_CAP_COMPRESSOR_ERROR		= 440,
+	IDS_CAP_AUDIO_DROP_ERROR		= 441,
+	IDS_CAP_AUDIO_DROP_COMPERROR	= 442,
+
+	IDS_CAP_STAT_LIVE_MODE			= 500,
+	IDS_CAP_STAT_OVERLAY_MODE		= 501,
+	IDS_CAP_STAT_CAP_INIT			= 502,
+	IDS_CAP_STAT_CAP_FINI			= 503,
+	IDS_CAP_STAT_PALETTE_BUILD		= 504,
+	IDS_CAP_STAT_OPTPAL_BUILD		= 505,
+	IDS_CAP_STAT_I_FRAMES			= 506,
+	IDS_CAP_STAT_L_FRAMES			= 507,
+	IDS_CAP_STAT_CAP_L_FRAMES		= 508,
+	IDS_CAP_STAT_CAP_AUDIO			= 509,
+	IDS_CAP_STAT_VIDEOCURRENT		= 510,
+	IDS_CAP_STAT_VIDEOAUDIO			= 511,
+	IDS_CAP_STAT_VIDEOONLY			= 512,
+	IDS_CAP_STAT_FRAMESDROPPED		= 513,
+}
+
+/**
+ * FilePreview dialog.
+ */
+
+extern (Windows) {
+	BOOL GetOpenFileNamePreviewA(LPOPENFILENAMEA lpofn);
+	BOOL GetSaveFileNamePreviewA(LPOPENFILENAMEA lpofn);
+	BOOL GetOpenFileNamePreviewW(LPOPENFILENAMEW lpofn);
+	BOOL GetSaveFileNamePreviewW(LPOPENFILENAMEW lpofn);
+}
+
+version(Unicode) {
+	alias GetOpenFileNamePreviewW	GetOpenFileNamePreview;
+	alias GetSaveFileNamePreviewW	GetSaveFileNamePreview;
+} else { // Unicode
+	alias GetOpenFileNamePreviewA	GetOpenFileNamePreview;
+	alias GetSaveFileNamePreviewA	GetSaveFileNamePreview;
+}
\ No newline at end of file