diff options
Diffstat (limited to '')
-rw-r--r-- | public/sdk/inc/vfw.h | 3558 |
1 files changed, 3558 insertions, 0 deletions
diff --git a/public/sdk/inc/vfw.h b/public/sdk/inc/vfw.h new file mode 100644 index 000000000..b46cdcbac --- /dev/null +++ b/public/sdk/inc/vfw.h @@ -0,0 +1,3558 @@ +/*******************0000***************************************************** + * + * VfW.H - Video for windows include file for WIN32 + * + * Copyright (c) 1991-1995, Microsoft Corp. All rights reserved. + * + * This include files defines interfaces to the following + * video components + * + * COMPMAN - Installable Compression Manager. + * DRAWDIB - Routines for drawing to the display. + * VIDEO - Video Capture Driver Interface + * + * AVIFMT - AVI File Format structure definitions. + * MMREG - FOURCC and other things + * + * AVIFile - Interface for reading AVI Files and AVI Streams + * MCIWND - MCI/AVI window class + * AVICAP - AVI Capture Window class + * + * MSACM - Audio compression manager. + * + * The following symbols control inclusion of various parts of this file: + * + * NOCOMPMAN - dont include COMPMAN + * NODRAWDIB - dont include DRAWDIB + * NOVIDEO - dont include video capture interface + * + * NOAVIFMT - dont include AVI file format structs + * NOMMREG - dont include MMREG + * + * NOAVIFILE - dont include AVIFile interface + * NOMCIWND - dont include AVIWnd class. + * NOAVICAP - dont include AVICap class. + * + * NOMSACM - dont include ACM stuff. + * + ****************************************************************************/ + +#ifndef _INC_VFW +#define _INC_VFW + +#ifdef __cplusplus +extern "C" { /* Assume C declarations for C++ */ +#endif /* __cplusplus */ + +/**************************************************************************** + * + * types + * + ***************************************************************************/ + +#define VFWAPI WINAPI +#define VFWAPIV WINAPIV + +/**************************************************************************** + * + * VideoForWindowsVersion() - returns version of VfW + * + ***************************************************************************/ + +DWORD FAR PASCAL VideoForWindowsVersion(void); + +/**************************************************************************** + * + * call these to start stop using VfW from your app. + * + ***************************************************************************/ + +LONG VFWAPI InitVFW(void); +LONG VFWAPI TermVFW(void); + +/**************************************************************************** + * + * do we need MMSYSTEM? + * + ****************************************************************************/ + +#if !defined(_INC_MMSYSTEM) && (!defined(NOVIDEO) || !defined(NOAVICAP)) + #include <mmsystem.h> +#endif + +/****************************************************************************/ +/* */ +/* Macros */ +/* */ +/* should we define this?? */ +/* */ +/****************************************************************************/ + +#ifndef MKFOURCC +#define MKFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) +#endif + +#if !defined(_INC_MMSYSTEM) + #define mmioFOURCC MKFOURCC +#endif + +/**************************************************************************** + * + * COMPMAN - Installable Compression Manager. + * + ****************************************************************************/ + +#ifndef NOCOMPMAN + +#define ICVERSION 0x0104 + +DECLARE_HANDLE(HIC); /* Handle to a Installable Compressor */ + +// +// this code in biCompression means the DIB must be accesed via +// 48 bit pointers! using *ONLY* the selector given. +// +#define BI_1632 0x32333631 // '1632' + +#ifndef mmioFOURCC +#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) +#endif + +#ifndef aviTWOCC +#define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8)) +#endif + +#ifndef ICTYPE_VIDEO +#define ICTYPE_VIDEO mmioFOURCC('v', 'i', 'd', 'c') +#define ICTYPE_AUDIO mmioFOURCC('a', 'u', 'd', 'c') +#endif + +#ifndef ICERR_OK +#define ICERR_OK 0L +#define ICERR_DONTDRAW 1L +#define ICERR_NEWPALETTE 2L +#define ICERR_GOTOKEYFRAME 3L +#define ICERR_STOPDRAWING 4L + +#define ICERR_UNSUPPORTED -1L +#define ICERR_BADFORMAT -2L +#define ICERR_MEMORY -3L +#define ICERR_INTERNAL -4L +#define ICERR_BADFLAGS -5L +#define ICERR_BADPARAM -6L +#define ICERR_BADSIZE -7L +#define ICERR_BADHANDLE -8L +#define ICERR_CANTUPDATE -9L +#define ICERR_ABORT -10L +#define ICERR_ERROR -100L +#define ICERR_BADBITDEPTH -200L +#define ICERR_BADIMAGESIZE -201L + +#define ICERR_CUSTOM -400L // errors less than ICERR_CUSTOM... +#endif + +/* Values for dwFlags of ICOpen() */ +#ifndef ICMODE_COMPRESS +#define ICMODE_COMPRESS 1 +#define ICMODE_DECOMPRESS 2 +#define ICMODE_FASTDECOMPRESS 3 +#define ICMODE_QUERY 4 +#define ICMODE_FASTCOMPRESS 5 +#define ICMODE_DRAW 8 +#endif +#ifndef _WIN32 // ;Internal +#define ICMODE_INTERNALF_FUNCTION32 0x8000 // ;Internal +#define ICMODE_INTERNALF_MASK 0x8000 // ;Internal +#endif // ;Internal + +/* Flags for AVI file index */ +#define AVIIF_LIST 0x00000001L +#define AVIIF_TWOCC 0x00000002L +#define AVIIF_KEYFRAME 0x00000010L + +/* quality flags */ +#define ICQUALITY_LOW 0 +#define ICQUALITY_HIGH 10000 +#define ICQUALITY_DEFAULT -1 + +/************************************************************************ +************************************************************************/ + +#define ICM_USER (DRV_USER+0x0000) + +#define ICM_RESERVED ICM_RESERVED_LOW +#define ICM_RESERVED_LOW (DRV_USER+0x1000) +#define ICM_RESERVED_HIGH (DRV_USER+0x2000) + +/************************************************************************ + + messages. + +************************************************************************/ + +#define ICM_GETSTATE (ICM_RESERVED+0) // Get compressor state +#define ICM_SETSTATE (ICM_RESERVED+1) // Set compressor state +#define ICM_GETINFO (ICM_RESERVED+2) // Query info about the compressor + +#define ICM_CONFIGURE (ICM_RESERVED+10) // show the configure dialog +#define ICM_ABOUT (ICM_RESERVED+11) // show the about box + +#define ICM_GETERRORTEXT (ICM_RESERVED+12) // get error text TBD ;Internal +#define ICM_GETFORMATNAME (ICM_RESERVED+20) // get a name for a format ;Internal +#define ICM_ENUMFORMATS (ICM_RESERVED+21) // cycle through formats ;Internal + +#define ICM_GETDEFAULTQUALITY (ICM_RESERVED+30) // get the default value for quality +#define ICM_GETQUALITY (ICM_RESERVED+31) // get the current value for quality +#define ICM_SETQUALITY (ICM_RESERVED+32) // set the default value for quality + +#define ICM_SET (ICM_RESERVED+40) // Tell the driver something +#define ICM_GET (ICM_RESERVED+41) // Ask the driver something + +// Constants for ICM_SET: +#define ICM_FRAMERATE mmioFOURCC('F','r','m','R') +#define ICM_KEYFRAMERATE mmioFOURCC('K','e','y','R') + +/************************************************************************ + + ICM specific messages. + +************************************************************************/ + +#define ICM_COMPRESS_GET_FORMAT (ICM_USER+4) // get compress format or size +#define ICM_COMPRESS_GET_SIZE (ICM_USER+5) // get output size +#define ICM_COMPRESS_QUERY (ICM_USER+6) // query support for compress +#define ICM_COMPRESS_BEGIN (ICM_USER+7) // begin a series of compress calls. +#define ICM_COMPRESS (ICM_USER+8) // compress a frame +#define ICM_COMPRESS_END (ICM_USER+9) // end of a series of compress calls. + +#define ICM_DECOMPRESS_GET_FORMAT (ICM_USER+10) // get decompress format or size +#define ICM_DECOMPRESS_QUERY (ICM_USER+11) // query support for dempress +#define ICM_DECOMPRESS_BEGIN (ICM_USER+12) // start a series of decompress calls +#define ICM_DECOMPRESS (ICM_USER+13) // decompress a frame +#define ICM_DECOMPRESS_END (ICM_USER+14) // end a series of decompress calls +#define ICM_DECOMPRESS_SET_PALETTE (ICM_USER+29) // fill in the DIB color table +#define ICM_DECOMPRESS_GET_PALETTE (ICM_USER+30) // fill in the DIB color table + +#define ICM_DRAW_QUERY (ICM_USER+31) // query support for dempress +#define ICM_DRAW_BEGIN (ICM_USER+15) // start a series of draw calls +#define ICM_DRAW_GET_PALETTE (ICM_USER+16) // get the palette needed for drawing +#define ICM_DRAW_UPDATE (ICM_USER+17) // update screen with current frame ;Internal +#define ICM_DRAW_START (ICM_USER+18) // start decompress clock +#define ICM_DRAW_STOP (ICM_USER+19) // stop decompress clock +#define ICM_DRAW_BITS (ICM_USER+20) // decompress a frame to screen ;Internal +#define ICM_DRAW_END (ICM_USER+21) // end a series of draw calls +#define ICM_DRAW_GETTIME (ICM_USER+32) // get value of decompress clock +#define ICM_DRAW (ICM_USER+33) // generalized "render" message +#define ICM_DRAW_WINDOW (ICM_USER+34) // drawing window has moved or hidden +#define ICM_DRAW_SETTIME (ICM_USER+35) // set correct value for decompress clock +#define ICM_DRAW_REALIZE (ICM_USER+36) // realize palette for drawing +#define ICM_DRAW_FLUSH (ICM_USER+37) // clear out buffered frames +#define ICM_DRAW_RENDERBUFFER (ICM_USER+38) // draw undrawn things in queue + +#define ICM_DRAW_START_PLAY (ICM_USER+39) // start of a play +#define ICM_DRAW_STOP_PLAY (ICM_USER+40) // end of a play + +#define ICM_DRAW_SUGGESTFORMAT (ICM_USER+50) // Like ICGetDisplayFormat +#define ICM_DRAW_CHANGEPALETTE (ICM_USER+51) // for animating palette + +#define ICM_DRAW_IDLE (ICM_USER+52) // send each frame time ;Internal + +#define ICM_GETBUFFERSWANTED (ICM_USER+41) // ask about prebuffering + +#define ICM_GETDEFAULTKEYFRAMERATE (ICM_USER+42) // get the default value for key frames + + +#define ICM_DECOMPRESSEX_BEGIN (ICM_USER+60) // start a series of decompress calls +#define ICM_DECOMPRESSEX_QUERY (ICM_USER+61) // start a series of decompress calls +#define ICM_DECOMPRESSEX (ICM_USER+62) // decompress a frame +#define ICM_DECOMPRESSEX_END (ICM_USER+63) // end a series of decompress calls + +#define ICM_COMPRESS_FRAMES_INFO (ICM_USER+70) // tell about compress to come +#define ICM_COMPRESS_FRAMES (ICM_USER+71) // compress a bunch of frames ;Internal +#define ICM_SET_STATUS_PROC (ICM_USER+72) // set status callback + +/************************************************************************ +************************************************************************/ + +typedef struct { + DWORD dwSize; // sizeof(ICOPEN) + DWORD fccType; // 'vidc' + DWORD fccHandler; // + DWORD dwVersion; // version of compman opening you + DWORD dwFlags; // LOWORD is type specific + LRESULT dwError; // error return. + LPVOID pV1Reserved; // Reserved + LPVOID pV2Reserved; // Reserved + DWORD dnDevNode; // Devnode for PnP devices +} ICOPEN; + +/************************************************************************ +************************************************************************/ + +typedef struct { + DWORD dwSize; // sizeof(ICINFO) + DWORD fccType; // compressor type 'vidc' 'audc' + DWORD fccHandler; // compressor sub-type 'rle ' 'jpeg' 'pcm ' + DWORD dwFlags; // flags LOWORD is type specific + DWORD dwVersion; // version of the driver + DWORD dwVersionICM; // version of the ICM used + // + // under Win32, the driver always returns UNICODE strings. + // + WCHAR szName[16]; // short name + WCHAR szDescription[128]; // long name + WCHAR szDriver[128]; // driver that contains compressor +} ICINFO; + +/* Flags for the <dwFlags> field of the <ICINFO> structure. */ +#define VIDCF_QUALITY 0x0001 // supports quality +#define VIDCF_CRUNCH 0x0002 // supports crunching to a frame size +#define VIDCF_TEMPORAL 0x0004 // supports inter-frame compress +#define VIDCF_COMPRESSFRAMES 0x0008 // wants the compress all frames message +#define VIDCF_DRAW 0x0010 // supports drawing +#define VIDCF_FASTTEMPORALC 0x0020 // does not need prev frame on compress +#define VIDCF_FASTTEMPORALD 0x0080 // does not need prev frame on decompress +//#define VIDCF_QUALITYTIME 0x0040 // supports temporal quality + +//#define VIDCF_FASTTEMPORAL (VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD) + +/************************************************************************ +************************************************************************/ + +#define ICCOMPRESS_KEYFRAME 0x00000001L + +typedef struct { + DWORD dwFlags; // flags + + LPBITMAPINFOHEADER lpbiOutput; // output format + LPVOID lpOutput; // output data + + LPBITMAPINFOHEADER lpbiInput; // format of frame to compress + LPVOID lpInput; // frame data to compress + + LPDWORD lpckid; // ckid for data in AVI file + LPDWORD lpdwFlags; // flags in the AVI index. + LONG lFrameNum; // frame number of seq. + DWORD dwFrameSize; // reqested size in bytes. (if non zero) + + DWORD dwQuality; // quality + + // these are new fields + LPBITMAPINFOHEADER lpbiPrev; // format of previous frame + LPVOID lpPrev; // previous frame + +} ICCOMPRESS; + +/************************************************************************ +************************************************************************/ + +#define ICCOMPRESSFRAMES_PADDING 0x00000001 + +typedef struct { + DWORD dwFlags; // flags + + LPBITMAPINFOHEADER lpbiOutput; // output format + LPARAM lOutput; // output identifier + + LPBITMAPINFOHEADER lpbiInput; // format of frame to compress + LPARAM lInput; // input identifier + + LONG lStartFrame; // start frame + LONG lFrameCount; // # of frames + + LONG lQuality; // quality + LONG lDataRate; // data rate + LONG lKeyRate; // key frame rate + + DWORD dwRate; // frame rate, as always + DWORD dwScale; + + DWORD dwOverheadPerFrame; + DWORD dwReserved2; + + LONG (CALLBACK *GetData)(LPARAM lInput, LONG lFrame, LPVOID lpBits, LONG len); + LONG (CALLBACK *PutData)(LPARAM lOutput, LONG lFrame, LPVOID lpBits, LONG len); +} ICCOMPRESSFRAMES; + +typedef struct { + DWORD dwFlags; + LPARAM lParam; + + // messages for Status callback + #define ICSTATUS_START 0 + #define ICSTATUS_STATUS 1 // l == % done + #define ICSTATUS_END 2 + #define ICSTATUS_ERROR 3 // l == error string (LPSTR) + #define ICSTATUS_YIELD 4 + // return nonzero means abort operation in progress + + LONG (CALLBACK *Status) (LPARAM lParam, UINT message, LONG l); +} ICSETSTATUSPROC; + +/************************************************************************ +************************************************************************/ + +#define ICDECOMPRESS_HURRYUP 0x80000000L // don't draw just buffer (hurry up!) +#define ICDECOMPRESS_UPDATE 0x40000000L // don't draw just update screen +#define ICDECOMPRESS_PREROLL 0x20000000L // this frame is before real start +#define ICDECOMPRESS_NULLFRAME 0x10000000L // repeat last frame +#define ICDECOMPRESS_NOTKEYFRAME 0x08000000L // this frame is not a key frame + +typedef struct { + DWORD dwFlags; // flags (from AVI index...) + + LPBITMAPINFOHEADER lpbiInput; // BITMAPINFO of compressed data + // biSizeImage has the chunk size + LPVOID lpInput; // compressed data + + LPBITMAPINFOHEADER lpbiOutput; // DIB to decompress to + LPVOID lpOutput; + DWORD ckid; // ckid from AVI file +} ICDECOMPRESS; + +typedef struct { + // + // same as ICM_DECOMPRESS + // + DWORD dwFlags; + + LPBITMAPINFOHEADER lpbiSrc; // BITMAPINFO of compressed data + LPVOID lpSrc; // compressed data + + LPBITMAPINFOHEADER lpbiDst; // DIB to decompress to + LPVOID lpDst; // output data + + // + // new for ICM_DECOMPRESSEX + // + int xDst; // destination rectangle + int yDst; + int dxDst; + int dyDst; + + int xSrc; // source rectangle + int ySrc; + int dxSrc; + int dySrc; + +} ICDECOMPRESSEX; + +/************************************************************************ +************************************************************************/ + +#define ICDRAW_QUERY 0x00000001L // test for support +#define ICDRAW_FULLSCREEN 0x00000002L // draw to full screen +#define ICDRAW_HDC 0x00000004L // draw to a HDC/HWND +#define ICDRAW_ANIMATE 0x00000008L // expect palette animation +#define ICDRAW_CONTINUE 0x00000010L // draw is a continuation of previous draw +#define ICDRAW_MEMORYDC 0x00000020L // DC is offscreen, by the way +#define ICDRAW_UPDATING 0x00000040L // We're updating, as opposed to playing +#define ICDRAW_RENDER 0x00000080L // used to render data not draw it +#define ICDRAW_BUFFER 0x00000100L // please buffer this data offscreen, we will need to update it + +typedef struct { + DWORD dwFlags; // flags + + HPALETTE hpal; // palette to draw with + HWND hwnd; // window to draw to + HDC hdc; // HDC to draw to + + int xDst; // destination rectangle + int yDst; + int dxDst; + int dyDst; + + LPBITMAPINFOHEADER lpbi; // format of frame to draw + + int xSrc; // source rectangle + int ySrc; + int dxSrc; + int dySrc; + + DWORD dwRate; // frames/second = (dwRate/dwScale) + DWORD dwScale; + +} ICDRAWBEGIN; + +/************************************************************************ +************************************************************************/ + +#define ICDRAW_HURRYUP 0x80000000L // don't draw just buffer (hurry up!) +#define ICDRAW_UPDATE 0x40000000L // don't draw just update screen +#define ICDRAW_PREROLL 0x20000000L // this frame is before real start +#define ICDRAW_NULLFRAME 0x10000000L // repeat last frame +#define ICDRAW_NOTKEYFRAME 0x08000000L // this frame is not a key frame + +typedef struct { + DWORD dwFlags; // flags + LPVOID lpFormat; // format of frame to decompress + LPVOID lpData; // frame data to decompress + DWORD cbData; + LONG lTime; // time in drawbegin units (see dwRate and dwScale) +} ICDRAW; + +typedef struct { + LPBITMAPINFOHEADER lpbiIn; // format to be drawn + LPBITMAPINFOHEADER lpbiSuggest; // location for suggested format (or NULL to get size) + int dxSrc; // source extent or 0 + int dySrc; + int dxDst; // dest extent or 0 + int dyDst; + HIC hicDecompressor;// decompressor you can talk to +} ICDRAWSUGGEST; + +/************************************************************************ +************************************************************************/ + +typedef struct { + DWORD dwFlags; // flags (from AVI index...) + int iStart; // first palette to change + int iLen; // count of entries to change. + LPPALETTEENTRY lppe; // palette +} ICPALETTE; + + +/************************************************************************ + + ICM function declarations + +************************************************************************/ + +BOOL VFWAPI ICInfo(DWORD fccType, DWORD fccHandler, ICINFO FAR * lpicinfo); +BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags); +BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags); +LRESULT VFWAPI ICGetInfo(HIC hic, ICINFO FAR *picinfo, DWORD cb); + +HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode); +HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler); +LRESULT VFWAPI ICClose(HIC hic); + +LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD dw1, DWORD dw2); +#ifndef _WIN32 +//this function is unsupported on Win32 as it is non-portable. +LRESULT VFWAPIV ICMessage(HIC hic, UINT msg, UINT cb, ...); +#endif + + +/* Values for wFlags of ICInstall() */ +#define ICINSTALL_UNICODE 0x8000 + +#define ICINSTALL_FUNCTION 0x0001 // lParam is a DriverProc (function ptr) +#define ICINSTALL_DRIVER 0x0002 // lParam is a driver name (string) +#define ICINSTALL_HDRV 0x0004 // lParam is a HDRVR (driver handle) + +#define ICINSTALL_DRIVERW 0x8002 // lParam is a unicode driver name + +/************************************************************************ + + query macros + +************************************************************************/ +#define ICMF_CONFIGURE_QUERY 0x00000001 +#define ICMF_ABOUT_QUERY 0x00000001 + +#define ICQueryAbout(hic) \ + (ICSendMessage(hic, ICM_ABOUT, (DWORD) -1, ICMF_ABOUT_QUERY) == ICERR_OK) + +#define ICAbout(hic, hwnd) \ + ICSendMessage(hic, ICM_ABOUT, (DWORD)(UINT)(hwnd), 0) + +#define ICQueryConfigure(hic) \ + (ICSendMessage(hic, ICM_CONFIGURE, (DWORD) -1, ICMF_CONFIGURE_QUERY) == ICERR_OK) + +#define ICConfigure(hic, hwnd) \ + ICSendMessage(hic, ICM_CONFIGURE, (DWORD)(UINT)(hwnd), 0) + +/************************************************************************ + + get/set state macros + +************************************************************************/ + +#define ICGetState(hic, pv, cb) \ + ICSendMessage(hic, ICM_GETSTATE, (DWORD)(LPVOID)(pv), (DWORD)(cb)) + +#define ICSetState(hic, pv, cb) \ + ICSendMessage(hic, ICM_SETSTATE, (DWORD)(LPVOID)(pv), (DWORD)(cb)) + +#define ICGetStateSize(hic) \ + ICGetState(hic, NULL, 0) + +/************************************************************************ + + get value macros + +************************************************************************/ +static DWORD dwICValue; + +#define ICGetDefaultQuality(hic) \ + (ICSendMessage(hic, ICM_GETDEFAULTQUALITY, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD)), dwICValue) + +#define ICGetDefaultKeyFrameRate(hic) \ + (ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, (DWORD)(LPVOID)&dwICValue, sizeof(DWORD)), dwICValue) + +/************************************************************************ + + draw window macro + +************************************************************************/ +#define ICDrawWindow(hic, prc) \ + ICSendMessage(hic, ICM_DRAW_WINDOW, (DWORD)(LPVOID)(prc), sizeof(RECT)) + +/************************************************************************ + + compression functions + +************************************************************************/ +/* + * ICCompress() + * + * compress a single frame + * + */ +DWORD VFWAPIV ICCompress( + HIC hic, + DWORD dwFlags, // flags + LPBITMAPINFOHEADER lpbiOutput, // output format + LPVOID lpData, // output data + LPBITMAPINFOHEADER lpbiInput, // format of frame to compress + LPVOID lpBits, // frame data to compress + LPDWORD lpckid, // ckid for data in AVI file + LPDWORD lpdwFlags, // flags in the AVI index. + LONG lFrameNum, // frame number of seq. + DWORD dwFrameSize, // reqested size in bytes. (if non zero) + DWORD dwQuality, // quality within one frame + LPBITMAPINFOHEADER lpbiPrev, // format of previous frame + LPVOID lpPrev); // previous frame + +/* + * ICCompressBegin() + * + * start compression from a source format (lpbiInput) to a dest + * format (lpbiOuput) is supported. + * + */ +#define ICCompressBegin(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_COMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +/* + * ICCompressQuery() + * + * determines if compression from a source format (lpbiInput) to a dest + * format (lpbiOuput) is supported. + * + */ +#define ICCompressQuery(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_COMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +/* + * ICCompressGetFormat() + * + * get the output format, (format of compressed data) + * if lpbiOutput is NULL return the size in bytes needed for format. + * + */ +#define ICCompressGetFormat(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +#define ICCompressGetFormatSize(hic, lpbi) \ + ICCompressGetFormat(hic, lpbi, NULL) + +/* + * ICCompressSize() + * + * return the maximal size of a compressed frame + * + */ +#define ICCompressGetSize(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +#define ICCompressEnd(hic) \ + ICSendMessage(hic, ICM_COMPRESS_END, 0, 0) + +/************************************************************************ + + decompression functions + +************************************************************************/ + +/* + * ICDecompress() + * + * decompress a single frame + * + */ +#define ICDECOMPRESS_HURRYUP 0x80000000L // don't draw just buffer (hurry up!) + +DWORD VFWAPIV ICDecompress( + HIC hic, + DWORD dwFlags, // flags (from AVI index...) + LPBITMAPINFOHEADER lpbiFormat, // BITMAPINFO of compressed data + // biSizeImage has the chunk size + LPVOID lpData, // data + LPBITMAPINFOHEADER lpbi, // DIB to decompress to + LPVOID lpBits); + +/* + * ICDecompressBegin() + * + * start compression from a source format (lpbiInput) to a dest + * format (lpbiOutput) is supported. + * + */ +#define ICDecompressBegin(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +/* + * ICDecompressQuery() + * + * determines if compression from a source format (lpbiInput) to a dest + * format (lpbiOutput) is supported. + * + */ +#define ICDecompressQuery(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_DECOMPRESS_QUERY, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +/* + * ICDecompressGetFormat() + * + * get the output format, (format of un-compressed data) + * if lpbiOutput is NULL return the size in bytes needed for format. + * + */ +#define ICDecompressGetFormat(hic, lpbiInput, lpbiOutput) \ + ((LONG) ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput))) + +#define ICDecompressGetFormatSize(hic, lpbi) \ + ICDecompressGetFormat(hic, lpbi, NULL) + +/* + * ICDecompressGetPalette() + * + * get the output palette + * + */ +#define ICDecompressGetPalette(hic, lpbiInput, lpbiOutput) \ + ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, (DWORD)(LPVOID)(lpbiInput), (DWORD)(LPVOID)(lpbiOutput)) + +#define ICDecompressSetPalette(hic, lpbiPalette) \ + ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, (DWORD)(LPVOID)(lpbiPalette), 0) + +#define ICDecompressEnd(hic) \ + ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0) + +/************************************************************************ + + decompression (ex) functions + +************************************************************************/ + + +// +// on Win16 these functions are macros that call ICMessage. ICMessage will +// not work on NT. rather than add new entrypoints we have given +// them as static inline functions +// + +/* + * ICDecompressEx() + * + * decompress a single frame + * + */ +static __inline LRESULT VFWAPI +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; + + // note that ICM swaps round the length and pointer + // length in lparam2, pointer in lparam1 + return ICSendMessage(hic, ICM_DECOMPRESSEX, (DWORD)&ic, sizeof(ic)); +} + + +/* + * ICDecompressExBegin() + * + * start compression from a source format (lpbiInput) to a dest + * format (lpbiOutput) is supported. + * + */ +static __inline LRESULT VFWAPI +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; + + // note that ICM swaps round the length and pointer + // length in lparam2, pointer in lparam1 + return ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, (DWORD)&ic, sizeof(ic)); +} + +/* + * ICDecompressExQuery() + * + */ +static __inline LRESULT VFWAPI +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; + + // note that ICM swaps round the length and pointer + // length in lparam2, pointer in lparam1 + return ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, (DWORD)&ic, sizeof(ic)); +} + + +#define ICDecompressExEnd(hic) \ + ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0) + +/************************************************************************ + + drawing functions + +************************************************************************/ + +/* + * ICDrawBegin() + * + * start decompressing data with format (lpbiInput) directly to the screen + * + * return zero if the decompressor supports drawing. + * + */ + +#define ICDRAW_QUERY 0x00000001L // test for support +#define ICDRAW_FULLSCREEN 0x00000002L // draw to full screen +#define ICDRAW_HDC 0x00000004L // draw to a HDC/HWND + +DWORD VFWAPIV ICDrawBegin( + HIC hic, + DWORD dwFlags, // flags + HPALETTE hpal, // palette to draw with + HWND hwnd, // window to draw to + HDC hdc, // HDC to draw to + int xDst, // destination rectangle + int yDst, + int dxDst, + int dyDst, + LPBITMAPINFOHEADER lpbi, // format of frame to draw + int xSrc, // source rectangle + int ySrc, + int dxSrc, + int dySrc, + DWORD dwRate, // frames/second = (dwRate/dwScale) + DWORD dwScale); + +/* + * ICDraw() + * + * decompress data directly to the screen + * + */ + +#define ICDRAW_HURRYUP 0x80000000L // don't draw just buffer (hurry up!) +#define ICDRAW_UPDATE 0x40000000L // don't draw just update screen + +DWORD VFWAPIV ICDraw( + HIC hic, + DWORD dwFlags, // flags + LPVOID lpFormat, // format of frame to decompress + LPVOID lpData, // frame data to decompress + DWORD cbData, // size of data + LONG lTime); // time to draw this frame + + +// ICMessage is not supported on Win32, so provide a static inline function +// to do the same job +static __inline LRESULT VFWAPI +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; + + // note that ICM swaps round the length and pointer + // length in lparam2, pointer in lparam1 + return ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, (DWORD)&ic, sizeof(ic)); +} + + +/* + * ICDrawQuery() + * + * determines if the compressor is willing to render the specified format. + * + */ +#define ICDrawQuery(hic, lpbiInput) \ + ICSendMessage(hic, ICM_DRAW_QUERY, (DWORD)(LPVOID)(lpbiInput), 0L) + +#define ICDrawChangePalette(hic, lpbiInput) \ + ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, (DWORD)(LPVOID)(lpbiInput), 0L) + +#define ICGetBuffersWanted(hic, lpdwBuffers) \ + ICSendMessage(hic, ICM_GETBUFFERSWANTED, (DWORD)(LPVOID)(lpdwBuffers), 0) + +#define ICDrawEnd(hic) \ + ICSendMessage(hic, ICM_DRAW_END, 0, 0) + +#define ICDrawStart(hic) \ + ICSendMessage(hic, ICM_DRAW_START, 0, 0) + +#define ICDrawStartPlay(hic, lFrom, lTo) \ + ICSendMessage(hic, ICM_DRAW_START_PLAY, (DWORD)(lFrom), (DWORD)(lTo)) + +#define ICDrawStop(hic) \ + ICSendMessage(hic, ICM_DRAW_STOP, 0, 0) + +#define ICDrawStopPlay(hic) \ + ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0) + +#define ICDrawGetTime(hic, lplTime) \ + ICSendMessage(hic, ICM_DRAW_GETTIME, (DWORD)(LPVOID)(lplTime), 0) + +#define ICDrawSetTime(hic, lTime) \ + ICSendMessage(hic, ICM_DRAW_SETTIME, (DWORD)lTime, 0) + +#define ICDrawRealize(hic, hdc, fBackground) \ + ICSendMessage(hic, ICM_DRAW_REALIZE, (DWORD)(UINT)(HDC)(hdc), (DWORD)(BOOL)(fBackground)) + +#define ICDrawFlush(hic) \ + ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0) + +#define ICDrawRenderBuffer(hic) \ + ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0) + +/************************************************************************ + + Status callback functions + +************************************************************************/ + +/* + * ICSetStatusProc() + * + * Set the status callback function + * + */ + + +// ICMessage is not supported on NT +static __inline LRESULT VFWAPI +ICSetStatusProc( + HIC hic, + DWORD dwFlags, + LRESULT lParam, + LONG (CALLBACK *fpfnStatus)(LPARAM, UINT, LONG) ) +{ + ICSETSTATUSPROC ic; + + ic.dwFlags = dwFlags; + ic.lParam = lParam; + ic.Status = fpfnStatus; + + // note that ICM swaps round the length and pointer + // length in lparam2, pointer in lparam1 + return ICSendMessage(hic, ICM_SET_STATUS_PROC, (DWORD)&ic, sizeof(ic)); +} + + +/************************************************************************ + +helper routines for DrawDib and MCIAVI... + +************************************************************************/ + +#define ICDecompressOpen(fccType, fccHandler, lpbiIn, lpbiOut) \ + ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS) + +#define ICDrawOpen(fccType, fccHandler, lpbiIn) \ + ICLocate(fccType, fccHandler, lpbiIn, NULL, ICMODE_DRAW) + +HIC VFWAPI ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags); +HIC VFWAPI ICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, int BitDepth, int dx, int dy); + +/************************************************************************ +Higher level functions +************************************************************************/ + +HANDLE VFWAPI ICImageCompress( + HIC hic, // compressor to use + UINT uiFlags, // flags (none yet) + LPBITMAPINFO lpbiIn, // format to compress from + LPVOID lpBits, // data to compress + LPBITMAPINFO lpbiOut, // compress to this (NULL ==> default) + LONG lQuality, // quality to use + LONG FAR * plSize); // compress to this size (0=whatever) + +HANDLE VFWAPI ICImageDecompress( + HIC hic, // compressor to use + UINT uiFlags, // flags (none yet) + LPBITMAPINFO lpbiIn, // format to decompress from + LPVOID lpBits, // data to decompress + LPBITMAPINFO lpbiOut); // decompress to this (NULL ==> default) + +// +// Structure used by ICSeqCompressFrame and ICCompressorChoose routines +// Make sure this matches the autodoc in icm.c! +// +typedef struct { + LONG cbSize; // set to sizeof(COMPVARS) before + // calling ICCompressorChoose + DWORD dwFlags; // see below... + HIC hic; // HIC of chosen compressor + DWORD fccType; // basically ICTYPE_VIDEO + DWORD fccHandler; // handler of chosen compressor or + // "" or "DIB " + LPBITMAPINFO lpbiIn; // input format + LPBITMAPINFO lpbiOut; // output format - will compress to this + LPVOID lpBitsOut; + LPVOID lpBitsPrev; + LONG lFrame; + LONG lKey; // key frames how often? + LONG lDataRate; // desired data rate KB/Sec + LONG lQ; // desired quality + LONG lKeyCount; + LPVOID lpState; // state of compressor + LONG cbState; // size of the state +} COMPVARS, FAR *PCOMPVARS; + +// FLAGS for dwFlags element of COMPVARS structure: +// set this flag if you initialize COMPVARS before calling ICCompressorChoose +#define ICMF_COMPVARS_VALID 0x00000001 // COMPVARS contains valid data + +// +// allows user to choose compressor, quality etc... +// +BOOL VFWAPI ICCompressorChoose( + HWND hwnd, // parent window for dialog + UINT uiFlags, // flags + LPVOID pvIn, // input format (optional) + LPVOID lpData, // input data (optional) + PCOMPVARS pc, // data about the compressor/dlg + LPSTR lpszTitle); // dialog title (optional) + +// defines for uiFlags +#define ICMF_CHOOSE_KEYFRAME 0x0001 // show KeyFrame Every box +#define ICMF_CHOOSE_DATARATE 0x0002 // show DataRate box +#define ICMF_CHOOSE_PREVIEW 0x0004 // allow expanded preview dialog +#define ICMF_CHOOSE_ALLCOMPRESSORS 0x0008 // don't only show those that + // can handle the input format + // or input data + +BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn); +void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc); + +LPVOID VFWAPI ICSeqCompressFrame( + PCOMPVARS pc, // set by ICCompressorChoose + UINT uiFlags, // flags + LPVOID lpBits, // input DIB bits + BOOL FAR *pfKey, // did it end up being a key frame? + LONG FAR *plSize); // size to compress to/of returned image + +void VFWAPI ICCompressorFree(PCOMPVARS pc); + +#endif /* NOCOMPMAN */ + +/************************************************************************** + * + * DRAWDIB - Routines for drawing to the display. + * + *************************************************************************/ + +#ifndef NODRAWDIB + +typedef HANDLE HDRAWDIB; /* hdd */ + +/********************************************************************* + + DrawDib Flags + +**********************************************************************/ +#define DDF_0001 0x0001 /* ;Internal */ +#define DDF_UPDATE 0x0002 /* re-draw the last DIB */ +#define DDF_SAME_HDC 0x0004 /* HDC same as last call (all setup) */ +#define DDF_SAME_DRAW 0x0008 /* draw params are the same */ +#define DDF_DONTDRAW 0x0010 /* dont draw frame, just decompress */ +#define DDF_ANIMATE 0x0020 /* allow palette animation */ +#define DDF_BUFFER 0x0040 /* always buffer image */ +#define DDF_JUSTDRAWIT 0x0080 /* just draw it with GDI */ +#define DDF_FULLSCREEN 0x0100 /* use DisplayDib */ +#define DDF_BACKGROUNDPAL 0x0200 /* Realize palette in background */ +#define DDF_NOTKEYFRAME 0x0400 /* this is a partial frame update, hint */ +#define DDF_HURRYUP 0x0800 /* hurry up please! */ +#define DDF_HALFTONE 0x1000 /* always halftone */ +#define DDF_2000 0x2000 /* ;Internal */ + +#define DDF_PREROLL DDF_DONTDRAW /* Builing up a non-keyframe */ +#define DDF_SAME_DIB DDF_SAME_DRAW +#define DDF_SAME_SIZE DDF_SAME_DRAW + +/********************************************************************* + + DrawDib functions + +*********************************************************************/ +/* // ;Internal +** DrawDibInit() // ;Internal +** // ;Internal +*/ // ;Internal +extern BOOL VFWAPI DrawDibInit(void); // ;Internal + // ;Internal +/* +** DrawDibOpen() +** +*/ +extern HDRAWDIB VFWAPI DrawDibOpen(void); + +/* +** DrawDibClose() +** +*/ +extern BOOL VFWAPI DrawDibClose(HDRAWDIB hdd); + +/* +** DrawDibGetBuffer() +** +*/ +extern LPVOID VFWAPI DrawDibGetBuffer(HDRAWDIB hdd, LPBITMAPINFOHEADER lpbi, DWORD dwSize, DWORD dwFlags); + +/* // ;Internal +** DrawDibError() // ;Internal +*/ // ;Internal +extern UINT VFWAPI DrawDibError(HDRAWDIB hdd); // ;Internal + // ;Internal +/* +** DrawDibGetPalette() +** +** get the palette used for drawing DIBs +** +*/ +extern HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd); + + +/* +** DrawDibSetPalette() +** +** get the palette used for drawing DIBs +** +*/ +extern BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal); + +/* +** DrawDibChangePalette() +*/ +extern BOOL VFWAPI DrawDibChangePalette(HDRAWDIB hdd, int iStart, int iLen, LPPALETTEENTRY lppe); + +/* +** DrawDibRealize() +** +** realize the palette in a HDD +** +*/ +extern UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground); + +/* +** DrawDibStart() +** +** start of streaming playback +** +*/ +extern BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate); + +/* +** DrawDibStop() +** +** start of streaming playback +** +*/ +extern BOOL VFWAPI DrawDibStop(HDRAWDIB hdd); + +/* +** DrawDibBegin() +** +** prepare to draw +** +*/ +extern BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd, + HDC hdc, + int dxDst, + int dyDst, + LPBITMAPINFOHEADER lpbi, + int dxSrc, + int dySrc, + UINT wFlags); +/* +** DrawDibDraw() +** +** actualy draw a DIB to the screen. +** +*/ +extern BOOL VFWAPI 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); + +/* +** DrawDibUpdate() +** +** redraw the last image (may only be valid with DDF_BUFFER) +*/ +#define DrawDibUpdate(hdd, hdc, x, y) \ + DrawDibDraw(hdd, hdc, x, y, 0, 0, NULL, NULL, 0, 0, 0, 0, DDF_UPDATE) + +/* +** DrawDibEnd() +*/ +extern BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd); + +/* +** DrawDibTime() [for debugging purposes only] +*/ +typedef struct { + LONG timeCount; + LONG timeDraw; + LONG timeDecompress; + LONG timeDither; + LONG timeStretch; + LONG timeBlt; + LONG timeSetDIBits; +} DRAWDIBTIME, FAR *LPDRAWDIBTIME; + +BOOL VFWAPI DrawDibTime(HDRAWDIB hdd, LPDRAWDIBTIME lpddtime); + +/* display profiling */ +#define PD_CAN_DRAW_DIB 0x0001 /* if you can draw at all */ +#define PD_CAN_STRETCHDIB 0x0002 /* basicly RC_STRETCHDIB */ +#define PD_STRETCHDIB_1_1_OK 0x0004 /* is it fast? */ +#define PD_STRETCHDIB_1_2_OK 0x0008 /* ... */ +#define PD_STRETCHDIB_1_N_OK 0x0010 /* ... */ + +DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi); + +#endif /* NODRAWDIB */ + +/**************************************************************************** + * + * AVIFMT - AVI file format definitions + * + ****************************************************************************/ + +#ifndef NOAVIFMT + #ifndef _INC_MMSYSTEM + typedef DWORD FOURCC; + #endif +#ifdef _MSC_VER +#pragma warning(disable:4200) +#endif + +/* The following is a short description of the AVI file format. Please + * see the accompanying documentation for a full explanation. + * + * An AVI file is the following RIFF form: + * + * RIFF('AVI' + * LIST('hdrl' + * avih(<MainAVIHeader>) + * LIST ('strl' + * strh(<Stream header>) + * strf(<Stream format>) + * ... additional header data + * LIST('movi' + * { LIST('rec' + * SubChunk... + * ) + * | SubChunk } .... + * ) + * [ <AVIIndex> ] + * ) + * + * The main file header specifies how many streams are present. For + * each one, there must be a stream header chunk and a stream format + * chunk, enlosed in a 'strl' LIST chunk. The 'strf' chunk contains + * type-specific format information; for a video stream, this should + * be a BITMAPINFO structure, including palette. For an audio stream, + * this should be a WAVEFORMAT (or PCMWAVEFORMAT) structure. + * + * The actual data is contained in subchunks within the 'movi' LIST + * chunk. The first two characters of each data chunk are the + * stream number with which that data is associated. + * + * Some defined chunk types: + * Video Streams: + * ##db: RGB DIB bits + * ##dc: RLE8 compressed DIB bits + * ##pc: Palette Change + * + * Audio Streams: + * ##wb: waveform audio bytes + * + * The grouping into LIST 'rec' chunks implies only that the contents of + * the chunk should be read into memory at the same time. This + * grouping is used for files specifically intended to be played from + * CD-ROM. + * + * The index chunk at the end of the file should contain one entry for + * each data chunk in the file. + * + * Limitations for the current software: + * Only one video stream and one audio stream are allowed. + * The streams must start at the beginning of the file. + * + * + * To register codec types please obtain a copy of the Multimedia + * Developer Registration Kit from: + * + * Microsoft Corporation + * Multimedia Systems Group + * Product Marketing + * One Microsoft Way + * Redmond, WA 98052-6399 + * + */ + + +#ifndef mmioFOURCC +#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) +#endif + +/* Macro to make a TWOCC out of two characters */ +#ifndef aviTWOCC +#define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8)) +#endif + +typedef WORD TWOCC; + +/* form types, list types, and chunk types */ +#define formtypeAVI mmioFOURCC('A', 'V', 'I', ' ') +#define listtypeAVIHEADER mmioFOURCC('h', 'd', 'r', 'l') +#define ckidAVIMAINHDR mmioFOURCC('a', 'v', 'i', 'h') +#define listtypeSTREAMHEADER mmioFOURCC('s', 't', 'r', 'l') +#define ckidSTREAMHEADER mmioFOURCC('s', 't', 'r', 'h') +#define ckidSTREAMFORMAT mmioFOURCC('s', 't', 'r', 'f') +#define ckidSTREAMHANDLERDATA mmioFOURCC('s', 't', 'r', 'd') +#define ckidSTREAMNAME mmioFOURCC('s', 't', 'r', 'n') + +#define listtypeAVIMOVIE mmioFOURCC('m', 'o', 'v', 'i') +#define listtypeAVIRECORD mmioFOURCC('r', 'e', 'c', ' ') + +#define ckidAVINEWINDEX mmioFOURCC('i', 'd', 'x', '1') + +/* +** Stream types for the <fccType> field of the stream header. +*/ +#define streamtypeVIDEO mmioFOURCC('v', 'i', 'd', 's') +#define streamtypeAUDIO mmioFOURCC('a', 'u', 'd', 's') +#define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's') +#define streamtypeTEXT mmioFOURCC('t', 'x', 't', 's') + +/* Basic chunk types */ +#define cktypeDIBbits aviTWOCC('d', 'b') +#define cktypeDIBcompressed aviTWOCC('d', 'c') +#define cktypePALchange aviTWOCC('p', 'c') +#define cktypeWAVEbytes aviTWOCC('w', 'b') + +/* Chunk id to use for extra chunks for padding. */ +#define ckidAVIPADDING mmioFOURCC('J', 'U', 'N', 'K') + + +/* +** Useful macros +** +** Warning: These are nasty macro, and MS C 6.0 compiles some of them +** incorrectly if optimizations are on. Ack. +*/ + +/* Macro to get stream number out of a FOURCC ckid */ +#define FromHex(n) (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0')) +#define StreamFromFOURCC(fcc) ((WORD) ((FromHex(LOBYTE(LOWORD(fcc))) << 4) + \ + (FromHex(HIBYTE(LOWORD(fcc)))))) + +/* Macro to get TWOCC chunk type out of a FOURCC ckid */ +#define TWOCCFromFOURCC(fcc) HIWORD(fcc) + +/* Macro to make a ckid for a chunk out of a TWOCC and a stream number +** from 0-255. +*/ +#define ToHex(n) ((BYTE) (((n) > 9) ? ((n) - 10 + 'A') : ((n) + '0'))) +#define MAKEAVICKID(tcc, stream) \ + MAKELONG((ToHex((stream) & 0x0f) << 8) | \ + (ToHex(((stream) & 0xf0) >> 4)), tcc) + + +/* +** Main AVI File Header +*/ + +/* flags for use in <dwFlags> in AVIFileHdr */ +#define AVIF_HASINDEX 0x00000010 // Index at end of file? +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 + +/* The AVI File Header LIST chunk should be padded to this size */ +#define AVI_HEADERSIZE 2048 // size of AVI header list + +typedef struct +{ + DWORD dwMicroSecPerFrame; // frame display rate (or 0L) + DWORD dwMaxBytesPerSec; // max. transfer rate + DWORD dwPaddingGranularity; // pad to multiples of this + // size; normally 2K. + DWORD dwFlags; // the ever-present flags + DWORD dwTotalFrames; // # frames in file + DWORD dwInitialFrames; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + + DWORD dwWidth; + DWORD dwHeight; + + DWORD dwReserved[4]; +} MainAVIHeader; + + +/* +** Stream header +*/ + +#define AVISF_DISABLED 0x00000001 + +#define AVISF_VIDEO_PALCHANGES 0x00010000 + +typedef struct { + FOURCC fccType; + FOURCC fccHandler; + DWORD dwFlags; /* Contains AVITF_* flags */ + WORD wPriority; + WORD wLanguage; + DWORD dwInitialFrames; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; +} AVIStreamHeader; + +/* Flags for index */ +#define AVIIF_LIST 0x00000001L // chunk is a 'LIST' +#define AVIIF_KEYFRAME 0x00000010L // this frame is a key frame. +#define AVIIF_FIRSTPART 0x00000020L // this frame is the start of a partial frame. +#define AVIIF_LASTPART 0x00000040L // this frame is the end of a partial frame. +#define AVIIF_MIDPART (AVIIF_LASTPART|AVIIF_FIRSTPART) + +#define AVIIF_NOTIME 0x00000100L // this frame doesn't take any time +#define AVIIF_COMPUSE 0x0FFF0000L // these bits are for compressor use + +typedef struct +{ + DWORD ckid; + DWORD dwFlags; + DWORD dwChunkOffset; // Position of chunk + DWORD dwChunkLength; // Length of chunk +} AVIINDEXENTRY; + + +/* +** Palette change chunk +** +** Used in video streams. +*/ +typedef struct +{ + BYTE bFirstEntry; /* first entry to change */ + BYTE bNumEntries; /* # entries to change (0 if 256) */ + WORD wFlags; /* Mostly to preserve alignment... */ + PALETTEENTRY peNew[]; /* New color specifications */ +} AVIPALCHANGE; + +#endif /* NOAVIFMT */ + +/**************************************************************************** + * + * MMREG.H (standard include file for MM defines, like FOURCC and things) + * + ***************************************************************************/ + +#ifndef RC_INVOKED +#include "pshpack8.h" +#endif +#ifndef NOMMREG + #include <mmreg.h> +#endif + +/**************************************************************************** + * + * AVIFile - routines for reading/writing standard AVI files + * + ***************************************************************************/ + +#ifndef NOAVIFILE + +/* + * Ansi - Unicode thunking. + * + * Unicode or Ansi-only apps can call the avifile APIs. + * any Win32 app who wants to use + * any of the AVI COM interfaces must be UNICODE - the AVISTREAMINFO and + * AVIFILEINFO structures used in the Info methods of these interfaces are + * the unicode variants, and no thunking to or from ansi takes place + * except in the AVIFILE api entrypoints. + * + * For Ansi/Unicode thunking: for each entrypoint or structure that + * uses chars or strings, two versions are declared in the Win32 version, + * ApiNameW and ApiNameA. The default name ApiName is #defined to one or + * other of these depending on whether UNICODE is defined (during + * compilation of the app that is including this header). The source will + * contain ApiName and ApiNameA (with ApiName being the Win16 implementation, + * and also #defined to ApiNameW, and ApiNameA being the thunk entrypoint). + * + */ + +#ifndef mmioFOURCC + #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) +#endif + +#ifndef streamtypeVIDEO +#define streamtypeVIDEO mmioFOURCC('v', 'i', 'd', 's') +#define streamtypeAUDIO mmioFOURCC('a', 'u', 'd', 's') +#define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's') +#define streamtypeTEXT mmioFOURCC('t', 'x', 't', 's') +#endif + +#ifndef AVIIF_KEYFRAME +#define AVIIF_KEYFRAME 0x00000010L // this frame is a key frame. +#endif + +// For GetFrame::SetFormat - use the best format for the display +#define AVIGETFRAMEF_BESTDISPLAYFMT 1 + +// +// Structures used by AVIStreamInfo & AVIFileInfo. +// +// These are related to, but not identical to, the header chunks +// in an AVI file. +// + +/* + * + * --- AVISTREAMINFO ------------------------------------------------ + * + * for Unicode/Ansi thunking we need to declare three versions of this! + */ +typedef struct _AVISTREAMINFOW { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; /* Contains AVITF_* flags */ + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + WCHAR szName[64]; +} AVISTREAMINFOW, FAR * LPAVISTREAMINFOW; + +typedef struct _AVISTREAMINFOA { + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; /* Contains AVITF_* flags */ + DWORD dwCaps; + WORD wPriority; + WORD wLanguage; + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwStart; + DWORD dwLength; /* In units above... */ + DWORD dwInitialFrames; + DWORD dwSuggestedBufferSize; + DWORD dwQuality; + DWORD dwSampleSize; + RECT rcFrame; + DWORD dwEditCount; + DWORD dwFormatChangeCount; + char szName[64]; +} AVISTREAMINFOA, FAR * LPAVISTREAMINFOA; + +#ifdef UNICODE +#define AVISTREAMINFO AVISTREAMINFOW +#define LPAVISTREAMINFO LPAVISTREAMINFOW +#else +#define AVISTREAMINFO AVISTREAMINFOA +#define LPAVISTREAMINFO LPAVISTREAMINFOA +#endif + + +#define AVISTREAMINFO_DISABLED 0x00000001 +#define AVISTREAMINFO_FORMATCHANGES 0x00010000 + +/* + * --- AVIFILEINFO ---------------------------------------------------- + * + */ + + +typedef struct _AVIFILEINFOW { + DWORD dwMaxBytesPerSec; // max. transfer rate + DWORD dwFlags; // the ever-present flags + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + + DWORD dwWidth; + DWORD dwHeight; + + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwLength; + + DWORD dwEditCount; + + WCHAR szFileType[64]; // descriptive string for file type? +} AVIFILEINFOW, FAR * LPAVIFILEINFOW; + +typedef struct _AVIFILEINFOA { + DWORD dwMaxBytesPerSec; // max. transfer rate + DWORD dwFlags; // the ever-present flags + DWORD dwCaps; + DWORD dwStreams; + DWORD dwSuggestedBufferSize; + + DWORD dwWidth; + DWORD dwHeight; + + DWORD dwScale; + DWORD dwRate; /* dwRate / dwScale == samples/second */ + DWORD dwLength; + + DWORD dwEditCount; + + char szFileType[64]; // descriptive string for file type? +} AVIFILEINFOA, FAR * LPAVIFILEINFOA; + +#ifdef UNICODE +#define AVIFILEINFO AVIFILEINFOW +#define LPAVIFILEINFO LPAVIFILEINFOW +#else +#define AVIFILEINFO AVIFILEINFOA +#define LPAVIFILEINFO LPAVIFILEINFOA +#endif + + +// Flags for dwFlags +#define AVIFILEINFO_HASINDEX 0x00000010 +#define AVIFILEINFO_MUSTUSEINDEX 0x00000020 +#define AVIFILEINFO_ISINTERLEAVED 0x00000100 +#define AVIFILEINFO_WASCAPTUREFILE 0x00010000 +#define AVIFILEINFO_COPYRIGHTED 0x00020000 + +// Flags for dwCaps +#define AVIFILECAPS_CANREAD 0x00000001 +#define AVIFILECAPS_CANWRITE 0x00000002 +#define AVIFILECAPS_ALLKEYFRAMES 0x00000010 +#define AVIFILECAPS_NOCOMPRESSION 0x00000020 + +typedef BOOL (FAR PASCAL * AVISAVECALLBACK)(int); + +/************************************************************************/ +/* Declaration for the AVICOMPRESSOPTIONS structure. Make sure it */ +/* matches the AutoDoc in avisave.c !!! */ +/************************************************************************/ + +typedef struct { + DWORD fccType; /* stream type, for consistency */ + DWORD fccHandler; /* compressor */ + DWORD dwKeyFrameEvery; /* keyframe rate */ + DWORD dwQuality; /* compress quality 0-10,000 */ + DWORD dwBytesPerSecond; /* bytes per second */ + DWORD dwFlags; /* flags... see below */ + LPVOID lpFormat; /* save format */ + DWORD cbFormat; + LPVOID lpParms; /* compressor options */ + DWORD cbParms; + DWORD dwInterleaveEvery; /* for non-video streams only */ +} AVICOMPRESSOPTIONS, FAR *LPAVICOMPRESSOPTIONS; + +// +// Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct +// Each of these flags determines if the appropriate field in the structure +// (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed +// attention to. See the autodoc in avisave.c for details. +// +#define AVICOMPRESSF_INTERLEAVE 0x00000001 // interleave +#define AVICOMPRESSF_DATARATE 0x00000002 // use a data rate +#define AVICOMPRESSF_KEYFRAMES 0x00000004 // use keyframes +#define AVICOMPRESSF_VALID 0x00000008 // has valid data? + + + + + + + + + + + + + + + + + + + + + + + + +#include <ole2.h> + +/* - - - - - - - - */ + + +/****** AVI Stream Interface *******************************************/ + +#undef INTERFACE +#define INTERFACE IAVIStream + +DECLARE_INTERFACE_(IAVIStream, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IAVIStream methods *** + 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) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IAVIStreaming methods *** + STDMETHOD(Begin) (THIS_ + LONG lStart, // start of what we expect + // to play + LONG lEnd, // expected end, or -1 + LONG lRate) PURE; // Should this be a float? + STDMETHOD(End) (THIS) PURE; +}; + +typedef IAVIStreaming FAR* PAVISTREAMING; + + +#undef INTERFACE +#define INTERFACE IAVIEditStream + +DECLARE_INTERFACE_(IAVIEditStream, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IAVIEditStream methods *** + 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; + + +/****** AVI File Interface *******************************************/ + + +#undef INTERFACE +#define INTERFACE IAVIFile +#define PAVIFILE IAVIFile FAR* + +DECLARE_INTERFACE_(IAVIFile, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IAVIFile methods *** + 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; + +/****** GetFrame Interface *******************************************/ + +#undef INTERFACE +#define INTERFACE IGetFrame +#define PGETFRAME IGetFrame FAR* + +DECLARE_INTERFACE_(IGetFrame, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IGetFrame methods *** + + STDMETHOD_(LPVOID,GetFrame) (THIS_ LONG lPos) PURE; +// STDMETHOD_(LPVOID,GetFrameData) (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; + +// STDMETHOD(DrawFrameStart) (THIS) PURE; +// STDMETHOD(DrawFrame) (THIS_ LONG lPos, HDC hdc, int x, int y, int dx, int dy) PURE; +// STDMETHOD(DrawFrameEnd) (THIS) PURE; +}; + +#undef PGETFRAME +typedef IGetFrame FAR* PGETFRAME; + +/****** GUIDs *******************************************/ + +#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); +#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 + +// +// functions +// + +STDAPI_(void) AVIFileInit(void); // Call this first! +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 // win16 +STDAPI AVIFileOpen (PAVIFILE FAR * ppfile, LPCSTR szFile, + UINT uMode, LPCLSID lpHandler); +#define AVIFileOpenW AVIFileOpen /* ;Internal */ +#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 //win16 version +STDAPI AVIFileInfo (PAVIFILE pfile, LPAVIFILEINFO pfi, LONG lSize); +#define AVIFileInfoW AVIFileInfo /* ;Internal */ +#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 //win16 version +STDAPI AVIFileCreateStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFO FAR * psi); +#define AVIFileCreateStreamW AVIFileCreateStream /* ;Internal */ +#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); + +// Right now, these just use AVIStreamInfo() to get information, then +// return some of it. Can they be more efficient? +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); + +// +// helper functions for using IGetFrame +// +STDAPI_(PGETFRAME) AVIStreamGetFrameOpen(PAVISTREAM pavi, + LPBITMAPINFOHEADER lpbiWanted); +STDAPI_(LPVOID) AVIStreamGetFrame(PGETFRAME pg, LONG lPos); +STDAPI AVIStreamGetFrameClose(PGETFRAME pg); + + +// !!! We need some way to place an advise on a stream.... +// STDAPI AVIStreamHasChanged (PAVISTREAM pavi); + + + +// Shortcut function +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 + +// Use to create disembodied streams +STDAPI AVIStreamCreate(PAVISTREAM FAR *ppavi, LONG lParam1, LONG lParam2, + CLSID FAR *pclsidHandler); + + + +// PHANDLER AVIAPI AVIGetHandler (PAVISTREAM pavi, PAVISTREAMHANDLER psh); +// PAVISTREAM AVIAPI AVIGetStream (PHANDLER p); + +// +// flags for AVIStreamFindSample +// +#define FIND_DIR 0x0000000FL // direction +#define FIND_NEXT 0x00000001L // go forward +#define FIND_PREV 0x00000004L // go backward +#define FIND_FROM_START 0x00000008L // start at the logical beginning + +#define FIND_TYPE 0x000000F0L // type mask +#define FIND_KEY 0x00000010L // find key frame. +#define FIND_ANY 0x00000020L // find any (non-empty) sample +#define FIND_FORMAT 0x00000040L // find format change + +#define FIND_RET 0x0000F000L // return mask +#define FIND_POS 0x00000000L // return logical position +#define FIND_LENGTH 0x00001000L // return logical size +#define FIND_OFFSET 0x00002000L // return physical position +#define FIND_SIZE 0x00003000L // return physical size +#define FIND_INDEX 0x00004000L // return physical index position + + +// +// stuff to support backward compat. +// +#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 + +// +// helper macros. +// +#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) + +/**************************************************************************** + * + * AVISave routines and structures + * + ***************************************************************************/ + +#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_(BOOL) AVISaveOptions(HWND hwnd, + UINT uiFlags, + int nStreams, + PAVISTREAM FAR *ppavi, + LPAVICOMPRESSOPTIONS FAR *plpOptions); + +STDAPI AVISaveOptionsFree(int nStreams, + LPAVICOMPRESSOPTIONS FAR *plpOptions); + +// FLAGS FOR uiFlags: +// +// Same as the flags for ICCompressorChoose (see compman.h) +// These determine what the compression options dialog for video streams +// will look like. + +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); + +/**************************************************************************** + * + * Clipboard routines + * + ***************************************************************************/ + +STDAPI AVIPutFileOnClipboard(PAVIFILE pf); + +STDAPI AVIGetFromClipboard(PAVIFILE FAR * lppf); + +STDAPI AVIClearClipboard(void); + +/**************************************************************************** + * + * Editing routines + * + ***************************************************************************/ +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 + +/* - - - - - - - - */ + +#ifndef AVIERR_OK +#define AVIERR_OK 0L + +#define MAKE_AVIERR(error) MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error) + +// !!! Questions to be answered: +// How can you get a string form of these errors? +// Which of these errors should be replaced by errors in SCODE.H? +#define AVIERR_UNSUPPORTED MAKE_AVIERR(101) +#define AVIERR_BADFORMAT MAKE_AVIERR(102) +#define AVIERR_MEMORY MAKE_AVIERR(103) +#define AVIERR_INTERNAL MAKE_AVIERR(104) +#define AVIERR_BADFLAGS MAKE_AVIERR(105) +#define AVIERR_BADPARAM MAKE_AVIERR(106) +#define AVIERR_BADSIZE MAKE_AVIERR(107) +#define AVIERR_BADHANDLE MAKE_AVIERR(108) +#define AVIERR_FILEREAD MAKE_AVIERR(109) +#define AVIERR_FILEWRITE MAKE_AVIERR(110) +#define AVIERR_FILEOPEN MAKE_AVIERR(111) +#define AVIERR_COMPRESSOR MAKE_AVIERR(112) +#define AVIERR_NOCOMPRESSOR MAKE_AVIERR(113) +#define AVIERR_READONLY MAKE_AVIERR(114) +#define AVIERR_NODATA MAKE_AVIERR(115) +#define AVIERR_BUFFERTOOSMALL MAKE_AVIERR(116) +#define AVIERR_CANTCOMPRESS MAKE_AVIERR(117) +#define AVIERR_USERABORT MAKE_AVIERR(198) +#define AVIERR_ERROR MAKE_AVIERR(199) +#endif +#endif /* NOAVIFILE */ + +/**************************************************************************** + * + * MCIWnd - Window class for MCI objects + * + ***************************************************************************/ + +#ifndef NOMCIWND +/*----------------------------------------------------------------------------*\ + * + * MCIWnd + * + * MCIWnd window class header file. + * + * the MCIWnd window class is a window class for controling MCI devices + * MCI devices include, wave files, midi files, AVI Video, cd audio, + * vcr, video disc, and others.. + * + * to learn more about MCI and mci command sets see the + * "Microsoft Multimedia Programmers's guide" in the Win31 SDK + * + * the easiest use of the MCIWnd class is like so: + * + * hwnd = MCIWndCreate(hwndParent, hInstance, 0, "chimes.wav"); + * ... + * MCIWndPlay(hwnd); + * MCIWndStop(hwnd); + * MCIWndPause(hwnd); + * .... + * MCIWndDestroy(hwnd); + * + * this will create a window with a play/pause, stop and a playbar + * and start the wave file playing. + * + * mciwnd.h defines macros for all the most common MCI commands, but + * any string command can be used if needed. + * + * Note: unlike the mciSendString() API, no alias or file name needs + * to be specifed, since the device to use is implied by the window handle. + * + * MCIWndSendString(hwnd, "setaudio stream to 2"); + * + * (C) Copyright Microsoft Corp. 1991-1995. All rights reserved. + * + * You have a royalty-free right to use, modify, reproduce and + * distribute the Sample Files (and/or any modified version) in + * any way you find useful, provided that you agree that + * Microsoft has no warranty obligations or liability for any + * Sample Application Files. + * + * If you did not get this from Microsoft Sources, then it may not be the + * most current version. This sample code in particular will be updated + * and include more documentation. + * + * Sources are: + * CompuServe: WINSDK forum, MDK section. + * Anonymous FTP from ftp.uu.net vendor\microsoft\multimedia + * + * WIN32: + * + * MCIWnd supports both ansi and unicode interfaces. For any message that + * takes or returns a text string, two versions of the message are defined, + * appended with A or W for Ansi or Wide Char. The message or api itself + * is defined to be one or other of these depending on whether you have + * UNICODE defined in your application. + * Thus for the api MCIWndCreate, there are in fact two apis, + * MCIWndCreateA and MCIWndCreateW. If you call MCIWndCreate, this will be + * re-routed to MCIWndCreateA unless UNICODE is defined when building your + * application. In any one application, you can mix calls to the + * Ansi and Unicode entrypoints. + * + * If you use SendMessage instead of the macros below such as MCIWndOpen(), + * you will see that the messages have changed for WIN32, to support Ansi + * and Unicode entrypoints. In particular, MCI_OPEN has been replaced by + * MCWNDM_OPENA, or MCIWNDM_OPENW (MCIWNDM_OPEN is defined to be one or + * other of these). + * + * Also, note that the WIN32 implementation of MCIWnd uses UNICODE + * so all apis and messages supporting ANSI strings do so by mapping them + * UNICODE strings and then calling the corresponding UNICODE entrypoint. + * + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// MFC Redefines SendMessage, so make sure we get the global one.... +#define MCIWndSM ::SendMessage /* SendMessage in C++*/ +#else +#define MCIWndSM SendMessage /* SendMessage in C */ +#endif /* __cplusplus */ +#define MCIWND_WINDOW_CLASS TEXT("MCIWndClass") +HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, + DWORD dwStyle,LPCSTR szFile); +HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, + DWORD dwStyle,LPCWSTR szFile); +#ifdef UNICODE +#define MCIWndCreate MCIWndCreateW +#else +#define MCIWndCreate MCIWndCreateA +#endif +BOOL VFWAPIV MCIWndRegisterClass(void); + +// Flags for the MCIWndOpen command +#define MCIWNDOPENF_NEW 0x0001 // open a new file + +// window styles +#define MCIWNDF_NOAUTOSIZEWINDOW 0x0001 // when movie size changes +#define MCIWNDF_NOPLAYBAR 0x0002 // no toolbar +#define MCIWNDF_NOAUTOSIZEMOVIE 0x0004 // when window size changes +#define MCIWNDF_NOMENU 0x0008 // no popup menu from RBUTTONDOWN +#define MCIWNDF_SHOWNAME 0x0010 // show name in caption +#define MCIWNDF_SHOWPOS 0x0020 // show position in caption +#define MCIWNDF_SHOWMODE 0x0040 // show mode in caption +#define MCIWNDF_SHOWALL 0x0070 // show all + +#define MCIWNDF_NOTIFYMODE 0x0100 // tell parent of mode change +#define MCIWNDF_NOTIFYPOS 0x0200 // tell parent of pos change +#define MCIWNDF_NOTIFYSIZE 0x0400 // tell parent of size change +#define MCIWNDF_NOTIFYERROR 0x1000 // tell parent of an error +#define MCIWNDF_NOTIFYALL 0x1F00 // tell all + +#define MCIWNDF_NOTIFYANSI 0x0080 + + +// The MEDIA notification includes a text string. +// To receive notifications in ANSI instead of unicode set the +// MCIWNDF_NOTIFYANSI style bit. The macro below includes this bit +// by default unless you define UNICODE in your application. + +#define MCIWNDF_NOTIFYMEDIAA 0x0880 // tell parent of media change +#define MCIWNDF_NOTIFYMEDIAW 0x0800 // tell parent of media change + +#ifdef UNICODE +#define MCIWNDF_NOTIFYMEDIA MCIWNDF_NOTIFYMEDIAW +#else +#define MCIWNDF_NOTIFYMEDIA MCIWNDF_NOTIFYMEDIAA +#endif + + + +#define MCIWNDF_RECORD 0x2000 // Give a record button +#define MCIWNDF_NOERRORDLG 0x4000 // Show Error Dlgs for MCI cmds? +#define MCIWNDF_NOOPEN 0x8000 // Don't allow user to open things + + + + +// can macros + +#define MCIWndCanPlay(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_PLAY,0,0) +#define MCIWndCanRecord(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_RECORD,0,0) +#define MCIWndCanSave(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_SAVE,0,0) +#define MCIWndCanWindow(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_WINDOW,0,0) +#define MCIWndCanEject(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_EJECT,0,0) +#define MCIWndCanConfig(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_CONFIG,0,0) +#define MCIWndPaletteKick(hwnd) (BOOL)MCIWndSM(hwnd,MCIWNDM_PALETTEKICK,0,0) + +#define MCIWndSave(hwnd, szFile) (LONG)MCIWndSM(hwnd, MCI_SAVE, 0, (LPARAM)(LPVOID)(szFile)) +#define MCIWndSaveDialog(hwnd) MCIWndSave(hwnd, -1) + +// if you dont give a device it will use the current device.... +#define MCIWndNew(hwnd, lp) (LONG)MCIWndSM(hwnd, MCIWNDM_NEW, 0, (LPARAM)(LPVOID)(lp)) + +#define MCIWndRecord(hwnd) (LONG)MCIWndSM(hwnd, MCI_RECORD, 0, 0) +#define MCIWndOpen(hwnd, sz, f) (LONG)MCIWndSM(hwnd, MCIWNDM_OPEN, (WPARAM)(UINT)(f),(LPARAM)(LPVOID)(sz)) +#define MCIWndOpenDialog(hwnd) MCIWndOpen(hwnd, -1, 0) +#define MCIWndClose(hwnd) (LONG)MCIWndSM(hwnd, MCI_CLOSE, 0, 0) +#define MCIWndPlay(hwnd) (LONG)MCIWndSM(hwnd, MCI_PLAY, 0, 0) +#define MCIWndStop(hwnd) (LONG)MCIWndSM(hwnd, MCI_STOP, 0, 0) +#define MCIWndPause(hwnd) (LONG)MCIWndSM(hwnd, MCI_PAUSE, 0, 0) +#define MCIWndResume(hwnd) (LONG)MCIWndSM(hwnd, MCI_RESUME, 0, 0) +#define MCIWndSeek(hwnd, lPos) (LONG)MCIWndSM(hwnd, MCI_SEEK, 0, (LPARAM)(LONG)(lPos)) +#define MCIWndEject(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_EJECT, 0, 0) + +#define MCIWndHome(hwnd) MCIWndSeek(hwnd, MCIWND_START) +#define MCIWndEnd(hwnd) MCIWndSeek(hwnd, MCIWND_END) + +#define MCIWndGetSource(hwnd, prc) (LONG)MCIWndSM(hwnd, MCIWNDM_GET_SOURCE, 0, (LPARAM)(LPRECT)(prc)) +#define MCIWndPutSource(hwnd, prc) (LONG)MCIWndSM(hwnd, MCIWNDM_PUT_SOURCE, 0, (LPARAM)(LPRECT)(prc)) + +#define MCIWndGetDest(hwnd, prc) (LONG)MCIWndSM(hwnd, MCIWNDM_GET_DEST, 0, (LPARAM)(LPRECT)(prc)) +#define MCIWndPutDest(hwnd, prc) (LONG)MCIWndSM(hwnd, MCIWNDM_PUT_DEST, 0, (LPARAM)(LPRECT)(prc)) + +#define MCIWndPlayReverse(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYREVERSE, 0, 0) +#define MCIWndPlayFrom(hwnd, lPos) (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYFROM, 0, (LPARAM)(LONG)(lPos)) +#define MCIWndPlayTo(hwnd, lPos) (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYTO, 0, (LPARAM)(LONG)(lPos)) +#define MCIWndPlayFromTo(hwnd, lStart, lEnd) (MCIWndSeek(hwnd, lStart), MCIWndPlayTo(hwnd, lEnd)) + +#define MCIWndGetDeviceID(hwnd) (UINT)MCIWndSM(hwnd, MCIWNDM_GETDEVICEID, 0, 0) +#define MCIWndGetAlias(hwnd) (UINT)MCIWndSM(hwnd, MCIWNDM_GETALIAS, 0, 0) +#define MCIWndGetMode(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETMODE, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp)) +#define MCIWndGetPosition(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETPOSITION, 0, 0) +#define MCIWndGetPositionString(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETPOSITION, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp)) +#define MCIWndGetStart(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETSTART, 0, 0) +#define MCIWndGetLength(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETLENGTH, 0, 0) +#define MCIWndGetEnd(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETEND, 0, 0) + +#define MCIWndStep(hwnd, n) (LONG)MCIWndSM(hwnd, MCI_STEP, 0,(LPARAM)(long)(n)) + +#define MCIWndDestroy(hwnd) (VOID)MCIWndSM(hwnd, WM_CLOSE, 0, 0) +#define MCIWndSetZoom(hwnd,iZoom) (VOID)MCIWndSM(hwnd, MCIWNDM_SETZOOM, 0, (LPARAM)(UINT)(iZoom)) +#define MCIWndGetZoom(hwnd) (UINT)MCIWndSM(hwnd, MCIWNDM_GETZOOM, 0, 0) +#define MCIWndSetVolume(hwnd,iVol) (LONG)MCIWndSM(hwnd, MCIWNDM_SETVOLUME, 0, (LPARAM)(UINT)(iVol)) +#define MCIWndGetVolume(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETVOLUME, 0, 0) +#define MCIWndSetSpeed(hwnd,iSpeed) (LONG)MCIWndSM(hwnd, MCIWNDM_SETSPEED, 0, (LPARAM)(UINT)(iSpeed)) +#define MCIWndGetSpeed(hwnd) (LONG)MCIWndSM(hwnd, MCIWNDM_GETSPEED, 0, 0) +#define MCIWndSetTimeFormat(hwnd, lp) (LONG)MCIWndSM(hwnd, MCIWNDM_SETTIMEFORMAT, 0, (LPARAM)(LPTSTR)(lp)) +#define MCIWndGetTimeFormat(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETTIMEFORMAT, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp)) +#define MCIWndValidateMedia(hwnd) (VOID)MCIWndSM(hwnd, MCIWNDM_VALIDATEMEDIA, 0, 0) + +#define MCIWndSetRepeat(hwnd,f) (void)MCIWndSM(hwnd, MCIWNDM_SETREPEAT, 0, (LPARAM)(BOOL)(f)) +#define MCIWndGetRepeat(hwnd) (BOOL)MCIWndSM(hwnd, MCIWNDM_GETREPEAT, 0, 0) + +#define MCIWndUseFrames(hwnd) MCIWndSetTimeFormat(hwnd, TEXT("frames")) +#define MCIWndUseTime(hwnd) MCIWndSetTimeFormat(hwnd, TEXT("ms")) + +#define MCIWndSetActiveTimer(hwnd, active) \ + (VOID)MCIWndSM(hwnd, MCIWNDM_SETACTIVETIMER, \ + (WPARAM)(UINT)(active), 0L) +#define MCIWndSetInactiveTimer(hwnd, inactive) \ + (VOID)MCIWndSM(hwnd, MCIWNDM_SETINACTIVETIMER, \ + (WPARAM)(UINT)(inactive), 0L) +#define MCIWndSetTimers(hwnd, active, inactive) \ + (VOID)MCIWndSM(hwnd, MCIWNDM_SETTIMERS,(WPARAM)(UINT)(active), \ + (LPARAM)(UINT)(inactive)) +#define MCIWndGetActiveTimer(hwnd) \ + (UINT)MCIWndSM(hwnd, MCIWNDM_GETACTIVETIMER, 0, 0L); +#define MCIWndGetInactiveTimer(hwnd) \ + (UINT)MCIWndSM(hwnd, MCIWNDM_GETINACTIVETIMER, 0, 0L); + +#define MCIWndRealize(hwnd, fBkgnd) (LONG)MCIWndSM(hwnd, MCIWNDM_REALIZE,(WPARAM)(BOOL)(fBkgnd),0) + +#define MCIWndSendString(hwnd, sz) (LONG)MCIWndSM(hwnd, MCIWNDM_SENDSTRING, 0, (LPARAM)(LPTSTR)(sz)) +#define MCIWndReturnString(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_RETURNSTRING, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp)) +#define MCIWndGetError(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETERROR, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp)) + +//#define MCIWndActivate(hwnd, f) (void)MCIWndSM(hwnd, WM_ACTIVATE, (WPARAM)(BOOL)(f), 0) + +#define MCIWndGetPalette(hwnd) (HPALETTE)MCIWndSM(hwnd, MCIWNDM_GETPALETTE, 0, 0) +#define MCIWndSetPalette(hwnd, hpal) (LONG)MCIWndSM(hwnd, MCIWNDM_SETPALETTE, (WPARAM)(HPALETTE)(hpal), 0) + +#define MCIWndGetFileName(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETFILENAME, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp)) +#define MCIWndGetDevice(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETDEVICE, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp)) + +#define MCIWndGetStyles(hwnd) (UINT)MCIWndSM(hwnd, MCIWNDM_GETSTYLES, 0, 0L) +#define MCIWndChangeStyles(hwnd, mask, value) (LONG)MCIWndSM(hwnd, MCIWNDM_CHANGESTYLES, (WPARAM)(UINT)(mask), (LPARAM)(LONG)(value)) + +#define MCIWndOpenInterface(hwnd, pUnk) (LONG)MCIWndSM(hwnd, MCIWNDM_OPENINTERFACE, 0, (LPARAM)(LPUNKNOWN)(pUnk)) + +#define MCIWndSetOwner(hwnd, hwndP) (LONG)MCIWndSM(hwnd, MCIWNDM_SETOWNER, (WPARAM)(hwndP), 0) + + +// Messages an app will send to MCIWND + +// all the text-related messages are defined out of order above (they need +// to be defined before the MCIWndOpen() macros + +#define MCIWNDM_GETDEVICEID (WM_USER + 100) +#define MCIWNDM_GETSTART (WM_USER + 103) +#define MCIWNDM_GETLENGTH (WM_USER + 104) +#define MCIWNDM_GETEND (WM_USER + 105) +#define MCIWNDM_EJECT (WM_USER + 107) +#define MCIWNDM_SETZOOM (WM_USER + 108) +#define MCIWNDM_GETZOOM (WM_USER + 109) +#define MCIWNDM_SETVOLUME (WM_USER + 110) +#define MCIWNDM_GETVOLUME (WM_USER + 111) +#define MCIWNDM_SETSPEED (WM_USER + 112) +#define MCIWNDM_GETSPEED (WM_USER + 113) +#define MCIWNDM_SETREPEAT (WM_USER + 114) +#define MCIWNDM_GETREPEAT (WM_USER + 115) +#define MCIWNDM_REALIZE (WM_USER + 118) +#define MCIWNDM_VALIDATEMEDIA (WM_USER + 121) +#define MCIWNDM_PLAYFROM (WM_USER + 122) +#define MCIWNDM_PLAYTO (WM_USER + 123) +#define MCIWNDM_GETPALETTE (WM_USER + 126) +#define MCIWNDM_SETPALETTE (WM_USER + 127) +#define MCIWNDM_SETTIMERS (WM_USER + 129) +#define MCIWNDM_SETACTIVETIMER (WM_USER + 130) +#define MCIWNDM_SETINACTIVETIMER (WM_USER + 131) +#define MCIWNDM_GETACTIVETIMER (WM_USER + 132) +#define MCIWNDM_GETINACTIVETIMER (WM_USER + 133) +#define MCIWNDM_CHANGESTYLES (WM_USER + 135) +#define MCIWNDM_GETSTYLES (WM_USER + 136) +#define MCIWNDM_GETALIAS (WM_USER + 137) +#define MCIWNDM_PLAYREVERSE (WM_USER + 139) +#define MCIWNDM_GET_SOURCE (WM_USER + 140) +#define MCIWNDM_PUT_SOURCE (WM_USER + 141) +#define MCIWNDM_GET_DEST (WM_USER + 142) +#define MCIWNDM_PUT_DEST (WM_USER + 143) +#define MCIWNDM_CAN_PLAY (WM_USER + 144) +#define MCIWNDM_CAN_WINDOW (WM_USER + 145) +#define MCIWNDM_CAN_RECORD (WM_USER + 146) +#define MCIWNDM_CAN_SAVE (WM_USER + 147) +#define MCIWNDM_CAN_EJECT (WM_USER + 148) +#define MCIWNDM_CAN_CONFIG (WM_USER + 149) +#define MCIWNDM_PALETTEKICK (WM_USER + 150) +#define MCIWNDM_OPENINTERFACE (WM_USER + 151) +#define MCIWNDM_SETOWNER (WM_USER + 152) + + + +//define both A and W messages +#define MCIWNDM_SENDSTRINGA (WM_USER + 101) +#define MCIWNDM_GETPOSITIONA (WM_USER + 102) +#define MCIWNDM_GETMODEA (WM_USER + 106) +#define MCIWNDM_SETTIMEFORMATA (WM_USER + 119) +#define MCIWNDM_GETTIMEFORMATA (WM_USER + 120) +#define MCIWNDM_GETFILENAMEA (WM_USER + 124) +#define MCIWNDM_GETDEVICEA (WM_USER + 125) +#define MCIWNDM_GETERRORA (WM_USER + 128) +#define MCIWNDM_NEWA (WM_USER + 134) +#define MCIWNDM_RETURNSTRINGA (WM_USER + 138) +#define MCIWNDM_OPENA (WM_USER + 153) + +#define MCIWNDM_SENDSTRINGW (WM_USER + 201) +#define MCIWNDM_GETPOSITIONW (WM_USER + 202) +#define MCIWNDM_GETMODEW (WM_USER + 206) +#define MCIWNDM_SETTIMEFORMATW (WM_USER + 219) +#define MCIWNDM_GETTIMEFORMATW (WM_USER + 220) +#define MCIWNDM_GETFILENAMEW (WM_USER + 224) +#define MCIWNDM_GETDEVICEW (WM_USER + 225) +#define MCIWNDM_GETERRORW (WM_USER + 228) +#define MCIWNDM_NEWW (WM_USER + 234) +#define MCIWNDM_RETURNSTRINGW (WM_USER + 238) +#define MCIWNDM_OPENW (WM_USER + 252) + +// map defaults to A or W depending on app's UNICODE setting +#ifdef UNICODE +#define MCIWNDM_SENDSTRING MCIWNDM_SENDSTRINGW +#define MCIWNDM_GETPOSITION MCIWNDM_GETPOSITIONW +#define MCIWNDM_GETMODE MCIWNDM_GETMODEW +#define MCIWNDM_SETTIMEFORMAT MCIWNDM_SETTIMEFORMATW +#define MCIWNDM_GETTIMEFORMAT MCIWNDM_GETTIMEFORMATW +#define MCIWNDM_GETFILENAME MCIWNDM_GETFILENAMEW +#define MCIWNDM_GETDEVICE MCIWNDM_GETDEVICEW +#define MCIWNDM_GETERROR MCIWNDM_GETERRORW +#define MCIWNDM_NEW MCIWNDM_NEWW +#define MCIWNDM_RETURNSTRING MCIWNDM_RETURNSTRINGW +#define MCIWNDM_OPEN MCIWNDM_OPENW +#else +#define MCIWNDM_SENDSTRING MCIWNDM_SENDSTRINGA +#define MCIWNDM_GETPOSITION MCIWNDM_GETPOSITIONA +#define MCIWNDM_GETMODE MCIWNDM_GETMODEA +#define MCIWNDM_SETTIMEFORMAT MCIWNDM_SETTIMEFORMATA +#define MCIWNDM_GETTIMEFORMAT MCIWNDM_GETTIMEFORMATA +#define MCIWNDM_GETFILENAME MCIWNDM_GETFILENAMEA +#define MCIWNDM_GETDEVICE MCIWNDM_GETDEVICEA +#define MCIWNDM_GETERROR MCIWNDM_GETERRORA +#define MCIWNDM_NEW MCIWNDM_NEWA +#define MCIWNDM_RETURNSTRING MCIWNDM_RETURNSTRINGA +#define MCIWNDM_OPEN MCIWNDM_OPENA +#endif + +// note that the source text for MCIWND will thus contain +// support for eg MCIWNDM_SENDSTRING (both the 16-bit entrypoint and +// in win32 mapped to MCIWNDM_SENDSTRINGW), and MCIWNDM_SENDSTRINGA (the +// win32 ansi thunk). + + + + + + + +// Messages MCIWND will send to an app +// !!! Use less messages and use a code instead to indicate the type of notify? /* ;Internal */ +#define MCIWNDM_NOTIFYMODE (WM_USER + 200) // wp = hwnd, lp = mode +#define MCIWNDM_NOTIFYPOS (WM_USER + 201) // wp = hwnd, lp = pos +#define MCIWNDM_NOTIFYSIZE (WM_USER + 202) // wp = hwnd +#define MCIWNDM_NOTIFYMEDIA (WM_USER + 203) // wp = hwnd, lp = fn +#define MCIWNDM_NOTIFYERROR (WM_USER + 205) // wp = hwnd, lp = error + +// special seek values for START and END +#define MCIWND_START -1 +#define MCIWND_END -2 + +#ifndef MCI_PLAY + /* MCI command message identifiers */ +#ifndef _WIN32 + // win32 apps send MCIWNDM_OPEN + #define MCI_OPEN 0x0803 +#endif + #define MCI_CLOSE 0x0804 + #define MCI_PLAY 0x0806 + #define MCI_SEEK 0x0807 + #define MCI_STOP 0x0808 + #define MCI_PAUSE 0x0809 + #define MCI_STEP 0x080E + #define MCI_RECORD 0x080F + #define MCI_SAVE 0x0813 + #define MCI_CUT 0x0851 + #define MCI_COPY 0x0852 + #define MCI_PASTE 0x0853 + #define MCI_RESUME 0x0855 + #define MCI_DELETE 0x0856 +#endif + +#ifndef MCI_MODE_NOT_READY + /* return values for 'status mode' command */ + #define MCI_MODE_NOT_READY (524) + #define MCI_MODE_STOP (525) + #define MCI_MODE_PLAY (526) + #define MCI_MODE_RECORD (527) + #define MCI_MODE_SEEK (528) + #define MCI_MODE_PAUSE (529) + #define MCI_MODE_OPEN (530) +#endif + +#endif /* NOAVIFILE */ + +/**************************************************************************** + * + * VIDEO - Video Capture Driver Interface + * + ****************************************************************************/ + +#if !defined(NOAVICAP) || !defined(NOVIDEO) + +#ifndef _RCINVOKED + + +/* video data types */ +DECLARE_HANDLE(HVIDEO); // generic handle +typedef HVIDEO FAR * LPHVIDEO; +#endif // ifndef RCINVOKED + +/**************************************************************************** + + version api + +****************************************************************************/ + +DWORD FAR PASCAL VideoForWindowsVersion(void); + +/**************************************************************************** + + Error Return Values + +****************************************************************************/ +#define DV_ERR_OK (0) /* No error */ +#define DV_ERR_BASE (1) /* Error Base */ +#define DV_ERR_NONSPECIFIC (DV_ERR_BASE) +#define DV_ERR_BADFORMAT (DV_ERR_BASE + 1) + /* unsupported video format */ +#define DV_ERR_STILLPLAYING (DV_ERR_BASE + 2) + /* still something playing */ +#define DV_ERR_UNPREPARED (DV_ERR_BASE + 3) + /* header not prepared */ +#define DV_ERR_SYNC (DV_ERR_BASE + 4) + /* device is synchronous */ +#define DV_ERR_TOOMANYCHANNELS (DV_ERR_BASE + 5) + /* number of channels exceeded */ +#define DV_ERR_NOTDETECTED (DV_ERR_BASE + 6) /* HW not detected */ +#define DV_ERR_BADINSTALL (DV_ERR_BASE + 7) /* Can not get Profile */ +#define DV_ERR_CREATEPALETTE (DV_ERR_BASE + 8) +#define DV_ERR_SIZEFIELD (DV_ERR_BASE + 9) +#define DV_ERR_PARAM1 (DV_ERR_BASE + 10) +#define DV_ERR_PARAM2 (DV_ERR_BASE + 11) +#define DV_ERR_CONFIG1 (DV_ERR_BASE + 12) +#define DV_ERR_CONFIG2 (DV_ERR_BASE + 13) +#define DV_ERR_FLAGS (DV_ERR_BASE + 14) +#define DV_ERR_13 (DV_ERR_BASE + 15) + +#define DV_ERR_NOTSUPPORTED (DV_ERR_BASE + 16) /* function not suported */ +#define DV_ERR_NOMEM (DV_ERR_BASE + 17) /* out of memory */ +#define DV_ERR_ALLOCATED (DV_ERR_BASE + 18) /* device is allocated */ +#define DV_ERR_BADDEVICEID (DV_ERR_BASE + 19) +#define DV_ERR_INVALHANDLE (DV_ERR_BASE + 20) +#define DV_ERR_BADERRNUM (DV_ERR_BASE + 21) +#define DV_ERR_NO_BUFFERS (DV_ERR_BASE + 22) /* out of buffers */ + +#define DV_ERR_MEM_CONFLICT (DV_ERR_BASE + 23) /* Mem conflict detected */ +#define DV_ERR_IO_CONFLICT (DV_ERR_BASE + 24) /* I/O conflict detected */ +#define DV_ERR_DMA_CONFLICT (DV_ERR_BASE + 25) /* DMA conflict detected */ +#define DV_ERR_INT_CONFLICT (DV_ERR_BASE + 26) /* Interrupt conflict detected */ +#define DV_ERR_PROTECT_ONLY (DV_ERR_BASE + 27) /* Can not run in standard mode */ +#define DV_ERR_LASTERROR (DV_ERR_BASE + 27) + +//#define DV_IDS_PROFILING (DV_ERR_BASE + 900) +//#define DV_IDS_LISTBOX (DV_ERR_BASE + 901) + +#define DV_ERR_USER_MSG (DV_ERR_BASE + 1000) /* Hardware specific errors */ + +/**************************************************************************** + + Callback Messages + +Note that the values for all installable driver callback messages are +identical, (ie. MM_DRVM_DATA has the same value for capture drivers, +installable video codecs, and the audio compression manager). +****************************************************************************/ +#ifndef _RCINVOKED + +#ifndef MM_DRVM_OPEN +#define MM_DRVM_OPEN 0x3D0 +#define MM_DRVM_CLOSE 0x3D1 +#define MM_DRVM_DATA 0x3D2 +#define MM_DRVM_ERROR 0x3D3 +#endif + +#define DV_VM_OPEN MM_DRVM_OPEN // Obsolete messages +#define DV_VM_CLOSE MM_DRVM_CLOSE +#define DV_VM_DATA MM_DRVM_DATA +#define DV_VM_ERROR MM_DRVM_ERROR + +/**************************************************************************** + + Structures + +****************************************************************************/ +/* video data block header */ +typedef struct videohdr_tag { + LPBYTE lpData; /* pointer to locked data buffer */ + DWORD dwBufferLength; /* Length of data buffer */ + DWORD dwBytesUsed; /* Bytes actually used */ + DWORD dwTimeCaptured; /* Milliseconds from start of stream */ + DWORD dwUser; /* for client's use */ + DWORD dwFlags; /* assorted flags (see defines) */ + DWORD dwReserved[4]; /* reserved for driver */ +} VIDEOHDR, NEAR *PVIDEOHDR, FAR * LPVIDEOHDR; + +/* dwFlags field of VIDEOHDR */ +#define VHDR_DONE 0x00000001 /* Done bit */ +#define VHDR_PREPARED 0x00000002 /* Set if this header has been prepared */ +#define VHDR_INQUEUE 0x00000004 /* Reserved for driver */ +#define VHDR_KEYFRAME 0x00000008 /* Key Frame */ +#define VHDR_VALID 0x0000000F /* valid flags */ /* ;Internal */ + +/* Channel capabilities structure */ +typedef struct channel_caps_tag { + DWORD dwFlags; /* Capability flags*/ + DWORD dwSrcRectXMod; /* Granularity of src rect in x */ + DWORD dwSrcRectYMod; /* Granularity of src rect in y */ + DWORD dwSrcRectWidthMod; /* Granularity of src rect width */ + DWORD dwSrcRectHeightMod; /* Granularity of src rect height */ + DWORD dwDstRectXMod; /* Granularity of dst rect in x */ + DWORD dwDstRectYMod; /* Granularity of dst rect in y */ + DWORD dwDstRectWidthMod; /* Granularity of dst rect width */ + DWORD dwDstRectHeightMod; /* Granularity of dst rect height */ +} CHANNEL_CAPS, NEAR *PCHANNEL_CAPS, FAR * LPCHANNEL_CAPS; + +/* dwFlags of CHANNEL_CAPS */ +#define VCAPS_OVERLAY 0x00000001 /* overlay channel */ +#define VCAPS_SRC_CAN_CLIP 0x00000002 /* src rect can clip */ +#define VCAPS_DST_CAN_CLIP 0x00000004 /* dst rect can clip */ +#define VCAPS_CAN_SCALE 0x00000008 /* allows src != dst */ + + +/**************************************************************************** + + API Flags + +****************************************************************************/ + +// Types of channels to open with the videoOpen function +#define VIDEO_EXTERNALIN 0x0001 +#define VIDEO_EXTERNALOUT 0x0002 +#define VIDEO_IN 0x0004 +#define VIDEO_OUT 0x0008 + +// Is a driver dialog available for this channel? +#define VIDEO_DLG_QUERY 0x0010 + +// videoConfigure (both GET and SET) +#define VIDEO_CONFIGURE_QUERY 0x8000 + +// videoConfigure (SET only) +#define VIDEO_CONFIGURE_SET 0x1000 + +// videoConfigure (GET only) +#define VIDEO_CONFIGURE_GET 0x2000 +#define VIDEO_CONFIGURE_QUERYSIZE 0x0001 + +#define VIDEO_CONFIGURE_CURRENT 0x0010 +#define VIDEO_CONFIGURE_NOMINAL 0x0020 +#define VIDEO_CONFIGURE_MIN 0x0040 +#define VIDEO_CONFIGURE_MAX 0x0080 + +/**************************************************************************** + + CONFIGURE MESSAGES + +****************************************************************************/ +#define DVM_USER 0X4000 + +#define DVM_CONFIGURE_START 0x1000 +#define DVM_CONFIGURE_END 0x1FFF + +#define DVM_PALETTE (DVM_CONFIGURE_START + 1) +#define DVM_FORMAT (DVM_CONFIGURE_START + 2) +#define DVM_PALETTERGB555 (DVM_CONFIGURE_START + 3) +#define DVM_SRC_RECT (DVM_CONFIGURE_START + 4) +#define DVM_DST_RECT (DVM_CONFIGURE_START + 5) + +#endif /* ifndef _RCINVOKED */ + +#endif /* NOVIDEO */ + +/**************************************************************************** + * + * AVICAP - Window class for AVI capture + * + ***************************************************************************/ + +#ifndef NOAVICAP +#ifdef __cplusplus +/* SendMessage in C++*/ +#define AVICapSM(hwnd,m,w,l) ( (IsWindow(hwnd)) ? ::SendMessage(hwnd,m,w,l) : 0) +#else +/* SendMessage in C */ +#define AVICapSM(hwnd,m,w,l) ( (IsWindow(hwnd)) ? SendMessage(hwnd,m,w,l) : 0) +#endif /* __cplusplus */ + +#ifndef RC_INVOKED + +// ------------------------------------------------------------------ +// Window Messages WM_CAP... which can be sent to an AVICAP window +// ------------------------------------------------------------------ + + + +// UNICODE +// +// The Win32 version of AVICAP on NT supports UNICODE applications: +// for each API or message that takes a char or string parameter, there are +// two versions, ApiNameA and ApiNameW. The default name ApiName is #defined +// to one or other depending on whether UNICODE is defined. Apps can call +// the A and W apis directly, and mix them. +// +// The 32-bit AVICAP on NT uses unicode exclusively internally. +// ApiNameA() will be implemented as a call to ApiNameW() together with +// translation of strings. + + + + +// Defines start of the message range +#define WM_CAP_START WM_USER + +// start of unicode messages +#define WM_CAP_UNICODE_START WM_USER+100 + +#define WM_CAP_GET_CAPSTREAMPTR (WM_CAP_START+ 1) + +#define WM_CAP_SET_CALLBACK_ERRORW (WM_CAP_UNICODE_START+ 2) +#define WM_CAP_SET_CALLBACK_STATUSW (WM_CAP_UNICODE_START+ 3) +#define WM_CAP_SET_CALLBACK_ERRORA (WM_CAP_START+ 2) +#define WM_CAP_SET_CALLBACK_STATUSA (WM_CAP_START+ 3) +#ifdef UNICODE +#define WM_CAP_SET_CALLBACK_ERROR WM_CAP_SET_CALLBACK_ERRORW +#define WM_CAP_SET_CALLBACK_STATUS WM_CAP_SET_CALLBACK_STATUSW +#else +#define WM_CAP_SET_CALLBACK_ERROR WM_CAP_SET_CALLBACK_ERRORA +#define WM_CAP_SET_CALLBACK_STATUS WM_CAP_SET_CALLBACK_STATUSA +#endif + + +#define WM_CAP_SET_CALLBACK_YIELD (WM_CAP_START+ 4) +#define WM_CAP_SET_CALLBACK_FRAME (WM_CAP_START+ 5) +#define WM_CAP_SET_CALLBACK_VIDEOSTREAM (WM_CAP_START+ 6) +#define WM_CAP_SET_CALLBACK_WAVESTREAM (WM_CAP_START+ 7) +#define WM_CAP_GET_USER_DATA (WM_CAP_START+ 8) +#define WM_CAP_SET_USER_DATA (WM_CAP_START+ 9) + +#define WM_CAP_DRIVER_CONNECT (WM_CAP_START+ 10) +#define WM_CAP_DRIVER_DISCONNECT (WM_CAP_START+ 11) + +#define WM_CAP_DRIVER_GET_NAMEA (WM_CAP_START+ 12) +#define WM_CAP_DRIVER_GET_VERSIONA (WM_CAP_START+ 13) +#define WM_CAP_DRIVER_GET_NAMEW (WM_CAP_UNICODE_START+ 12) +#define WM_CAP_DRIVER_GET_VERSIONW (WM_CAP_UNICODE_START+ 13) +#ifdef UNICODE +#define WM_CAP_DRIVER_GET_NAME WM_CAP_DRIVER_GET_NAMEW +#define WM_CAP_DRIVER_GET_VERSION WM_CAP_DRIVER_GET_VERSIONW +#else +#define WM_CAP_DRIVER_GET_NAME WM_CAP_DRIVER_GET_NAMEA +#define WM_CAP_DRIVER_GET_VERSION WM_CAP_DRIVER_GET_VERSIONA +#endif + +#define WM_CAP_DRIVER_GET_CAPS (WM_CAP_START+ 14) + +#define WM_CAP_FILE_SET_CAPTURE_FILEA (WM_CAP_START+ 20) +#define WM_CAP_FILE_GET_CAPTURE_FILEA (WM_CAP_START+ 21) +#define WM_CAP_FILE_SAVEASA (WM_CAP_START+ 23) +#define WM_CAP_FILE_SAVEDIBA (WM_CAP_START+ 25) +#define WM_CAP_FILE_SET_CAPTURE_FILEW (WM_CAP_UNICODE_START+ 20) +#define WM_CAP_FILE_GET_CAPTURE_FILEW (WM_CAP_UNICODE_START+ 21) +#define WM_CAP_FILE_SAVEASW (WM_CAP_UNICODE_START+ 23) +#define WM_CAP_FILE_SAVEDIBW (WM_CAP_UNICODE_START+ 25) +#ifdef UNICODE +#define WM_CAP_FILE_SET_CAPTURE_FILE WM_CAP_FILE_SET_CAPTURE_FILEW +#define WM_CAP_FILE_GET_CAPTURE_FILE WM_CAP_FILE_GET_CAPTURE_FILEW +#define WM_CAP_FILE_SAVEAS WM_CAP_FILE_SAVEASW +#define WM_CAP_FILE_SAVEDIB WM_CAP_FILE_SAVEDIBW +#else +#define WM_CAP_FILE_SET_CAPTURE_FILE WM_CAP_FILE_SET_CAPTURE_FILEA +#define WM_CAP_FILE_GET_CAPTURE_FILE WM_CAP_FILE_GET_CAPTURE_FILEA +#define WM_CAP_FILE_SAVEAS WM_CAP_FILE_SAVEASA +#define WM_CAP_FILE_SAVEDIB WM_CAP_FILE_SAVEDIBA +#endif + +// out of order to save on ifdefs +#define WM_CAP_FILE_ALLOCATE (WM_CAP_START+ 22) +#define WM_CAP_FILE_SET_INFOCHUNK (WM_CAP_START+ 24) + +#define WM_CAP_EDIT_COPY (WM_CAP_START+ 30) + +#define WM_CAP_SET_AUDIOFORMAT (WM_CAP_START+ 35) +#define WM_CAP_GET_AUDIOFORMAT (WM_CAP_START+ 36) + +#define WM_CAP_DLG_VIDEOFORMAT (WM_CAP_START+ 41) +#define WM_CAP_DLG_VIDEOSOURCE (WM_CAP_START+ 42) +#define WM_CAP_DLG_VIDEODISPLAY (WM_CAP_START+ 43) +#define WM_CAP_GET_VIDEOFORMAT (WM_CAP_START+ 44) +#define WM_CAP_SET_VIDEOFORMAT (WM_CAP_START+ 45) +#define WM_CAP_DLG_VIDEOCOMPRESSION (WM_CAP_START+ 46) + +#define WM_CAP_SET_PREVIEW (WM_CAP_START+ 50) +#define WM_CAP_SET_OVERLAY (WM_CAP_START+ 51) +#define WM_CAP_SET_PREVIEWRATE (WM_CAP_START+ 52) +#define WM_CAP_SET_SCALE (WM_CAP_START+ 53) +#define WM_CAP_GET_STATUS (WM_CAP_START+ 54) +#define WM_CAP_SET_SCROLL (WM_CAP_START+ 55) + +#define WM_CAP_GRAB_FRAME (WM_CAP_START+ 60) +#define WM_CAP_GRAB_FRAME_NOSTOP (WM_CAP_START+ 61) + +#define WM_CAP_SEQUENCE (WM_CAP_START+ 62) +#define WM_CAP_SEQUENCE_NOFILE (WM_CAP_START+ 63) +#define WM_CAP_SET_SEQUENCE_SETUP (WM_CAP_START+ 64) +#define WM_CAP_GET_SEQUENCE_SETUP (WM_CAP_START+ 65) + +#define WM_CAP_SET_MCI_DEVICEA (WM_CAP_START+ 66) +#define WM_CAP_GET_MCI_DEVICEA (WM_CAP_START+ 67) +#define WM_CAP_SET_MCI_DEVICEW (WM_CAP_UNICODE_START+ 66) +#define WM_CAP_GET_MCI_DEVICEW (WM_CAP_UNICODE_START+ 67) +#ifdef UNICODE +#define WM_CAP_SET_MCI_DEVICE WM_CAP_SET_MCI_DEVICEW +#define WM_CAP_GET_MCI_DEVICE WM_CAP_GET_MCI_DEVICEW +#else +#define WM_CAP_SET_MCI_DEVICE WM_CAP_SET_MCI_DEVICEA +#define WM_CAP_GET_MCI_DEVICE WM_CAP_GET_MCI_DEVICEA +#endif + + + +#define WM_CAP_STOP (WM_CAP_START+ 68) +#define WM_CAP_ABORT (WM_CAP_START+ 69) + +#define WM_CAP_SINGLE_FRAME_OPEN (WM_CAP_START+ 70) +#define WM_CAP_SINGLE_FRAME_CLOSE (WM_CAP_START+ 71) +#define WM_CAP_SINGLE_FRAME (WM_CAP_START+ 72) + +#define WM_CAP_PAL_OPENA (WM_CAP_START+ 80) +#define WM_CAP_PAL_SAVEA (WM_CAP_START+ 81) +#define WM_CAP_PAL_OPENW (WM_CAP_UNICODE_START+ 80) +#define WM_CAP_PAL_SAVEW (WM_CAP_UNICODE_START+ 81) +#ifdef UNICODE +#define WM_CAP_PAL_OPEN WM_CAP_PAL_OPENW +#define WM_CAP_PAL_SAVE WM_CAP_PAL_SAVEW +#else +#define WM_CAP_PAL_OPEN WM_CAP_PAL_OPENA +#define WM_CAP_PAL_SAVE WM_CAP_PAL_SAVEA +#endif + +#define WM_CAP_PAL_PASTE (WM_CAP_START+ 82) +#define WM_CAP_PAL_AUTOCREATE (WM_CAP_START+ 83) +#define WM_CAP_PAL_MANUALCREATE (WM_CAP_START+ 84) + +// Following added post VFW 1.1 +#define WM_CAP_SET_CALLBACK_CAPCONTROL (WM_CAP_START+ 85) + + +// Defines end of the message range +#define WM_CAP_UNICODE_END WM_CAP_PAL_SAVEW +#define WM_CAP_END WM_CAP_UNICODE_END + +// ------------------------------------------------------------------ +// Message crackers for above +// ------------------------------------------------------------------ + +// message wrapper macros are defined for the default messages only. Apps +// that wish to mix Ansi and UNICODE message sending will have to +// reference the _A and _W messages directly + +#define capSetCallbackOnError(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnStatus(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnYield(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnFrame(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnVideoStream(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnWaveStream(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, (LPARAM)(LPVOID)(fpProc))) +#define capSetCallbackOnCapControl(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, (LPARAM)(LPVOID)(fpProc))) + +#define capSetUserData(hwnd, lUser) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_USER_DATA, 0, (LPARAM)lUser)) +#define capGetUserData(hwnd) (AVICapSM(hwnd, WM_CAP_GET_USER_DATA, 0, 0)) + +#define capDriverConnect(hwnd, i) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L)) +#define capDriverDisconnect(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_DISCONNECT, (WPARAM)0, 0L)) +#define capDriverGetName(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_NAME, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capDriverGetVersion(hwnd, szVer, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_VERSION, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szVer))) +#define capDriverGetCaps(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_CAPS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPDRIVERCAPS)(s))) + +#define capFileSetCaptureFile(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capFileGetCaptureFile(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capFileAlloc(hwnd, dwSize) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_ALLOCATE, 0, (LPARAM)(DWORD)(dwSize))) +#define capFileSaveAs(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEAS, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capFileSetInfoChunk(hwnd, lpInfoChunk) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_INFOCHUNK, (WPARAM)0, (LPARAM)(LPCAPINFOCHUNK)(lpInfoChunk))) +#define capFileSaveDIB(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEDIB, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) + +#define capEditCopy(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_EDIT_COPY, 0, 0L)) + +#define capSetAudioFormat(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s))) +#define capGetAudioFormat(hwnd, s, wSize) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s))) +#define capGetAudioFormatSize(hwnd) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)0, (LPARAM)0L)) + +#define capDlgVideoFormat(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0L)) +#define capDlgVideoSource(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0L)) +#define capDlgVideoDisplay(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0L)) +#define capDlgVideoCompression(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0L)) + +#define capGetVideoFormat(hwnd, s, wSize) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s))) +#define capGetVideoFormatSize(hwnd) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0L)) +#define capSetVideoFormat(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s))) + +#define capPreview(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEW, (WPARAM)(BOOL)(f), 0L)) +#define capPreviewRate(hwnd, wMS) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEWRATE, (WPARAM)(wMS), 0)) +#define capOverlay(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_OVERLAY, (WPARAM)(BOOL)(f), 0L)) +#define capPreviewScale(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCALE, (WPARAM)(BOOL)f, 0L)) +#define capGetStatus(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_STATUS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPSTATUS)(s))) +#define capSetScrollPos(hwnd, lpP) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCROLL, (WPARAM)0, (LPARAM)(LPPOINT)(lpP))) + +#define capGrabFrame(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME, (WPARAM)0, (LPARAM)0L)) +#define capGrabFrameNoStop(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, (WPARAM)0, (LPARAM)0L)) + +#define capCaptureSequence(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE, (WPARAM)0, (LPARAM)0L)) +#define capCaptureSequenceNoFile(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE_NOFILE, (WPARAM)0, (LPARAM)0L)) +#define capCaptureStop(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_STOP, (WPARAM)0, (LPARAM)0L)) +#define capCaptureAbort(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_ABORT, (WPARAM)0, (LPARAM)0L)) + +#define capCaptureSingleFrameOpen(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_OPEN, (WPARAM)0, (LPARAM)0L)) +#define capCaptureSingleFrameClose(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, (WPARAM)0, (LPARAM)0L)) +#define capCaptureSingleFrame(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME, (WPARAM)0, (LPARAM)0L)) + +#define capCaptureGetSetup(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s))) +#define capCaptureSetSetup(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s))) + +#define capSetMCIDeviceName(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_MCI_DEVICE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capGetMCIDeviceName(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_MCI_DEVICE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName))) + +#define capPaletteOpen(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_OPEN, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capPaletteSave(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_SAVE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) +#define capPalettePaste(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_PASTE, (WPARAM) 0, (LPARAM)0L)) +#define capPaletteAuto(hwnd, iFrames, iColors) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_AUTOCREATE, (WPARAM)(iFrames), (LPARAM)(DWORD)(iColors))) +#define capPaletteManual(hwnd, fGrab, iColors) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_MANUALCREATE, (WPARAM)(fGrab), (LPARAM)(DWORD)(iColors))) + +// ------------------------------------------------------------------ +// Structures +// ------------------------------------------------------------------ + +typedef struct tagCapDriverCaps { + UINT wDeviceIndex; // Driver index in system.ini + BOOL fHasOverlay; // Can device overlay? + BOOL fHasDlgVideoSource; // Has Video source dlg? + BOOL fHasDlgVideoFormat; // Has Format dlg? + BOOL fHasDlgVideoDisplay; // Has External out dlg? + BOOL fCaptureInitialized; // Driver ready to capture? + BOOL fDriverSuppliesPalettes; // Can driver make palettes? + +// following always NULL on Win32. + HANDLE hVideoIn; // Driver In channel + HANDLE hVideoOut; // Driver Out channel + HANDLE hVideoExtIn; // Driver Ext In channel + HANDLE hVideoExtOut; // Driver Ext Out channel +} CAPDRIVERCAPS, *PCAPDRIVERCAPS, FAR *LPCAPDRIVERCAPS; + +typedef struct tagCapStatus { + UINT uiImageWidth; // Width of the image + UINT uiImageHeight; // Height of the image + BOOL fLiveWindow; // Now Previewing video? + BOOL fOverlayWindow; // Now Overlaying video? + BOOL fScale; // Scale image to client? + POINT ptScroll; // Scroll position + BOOL fUsingDefaultPalette; // Using default driver palette? + BOOL fAudioHardware; // Audio hardware present? + BOOL fCapFileExists; // Does capture file exist? + DWORD dwCurrentVideoFrame; // # of video frames cap'td + DWORD dwCurrentVideoFramesDropped;// # of video frames dropped + DWORD dwCurrentWaveSamples; // # of wave samples cap'td + DWORD dwCurrentTimeElapsedMS; // Elapsed capture duration + HPALETTE hPalCurrent; // Current palette in use + BOOL fCapturingNow; // Capture in progress? + DWORD dwReturn; // Error value after any operation + UINT wNumVideoAllocated; // Actual number of video buffers + UINT wNumAudioAllocated; // Actual number of audio buffers +} CAPSTATUS, *PCAPSTATUS, FAR *LPCAPSTATUS; + + // Default values in parenthesis +typedef struct tagCaptureParms { + DWORD dwRequestMicroSecPerFrame; // Requested capture rate + BOOL fMakeUserHitOKToCapture; // Show "Hit OK to cap" dlg? + UINT wPercentDropForError; // Give error msg if > (10%) + BOOL fYield; // Capture via background task? + DWORD dwIndexSize; // Max index size in frames (32K) + UINT wChunkGranularity; // Junk chunk granularity (2K) + BOOL fUsingDOSMemory; // Use DOS buffers? + UINT wNumVideoRequested; // # video buffers, If 0, autocalc + BOOL fCaptureAudio; // Capture audio? + UINT wNumAudioRequested; // # audio buffers, If 0, autocalc + UINT vKeyAbort; // Virtual key causing abort + BOOL fAbortLeftMouse; // Abort on left mouse? + BOOL fAbortRightMouse; // Abort on right mouse? + BOOL fLimitEnabled; // Use wTimeLimit? + UINT wTimeLimit; // Seconds to capture + BOOL fMCIControl; // Use MCI video source? + BOOL fStepMCIDevice; // Step MCI device? + DWORD dwMCIStartTime; // Time to start in MS + DWORD dwMCIStopTime; // Time to stop in MS + BOOL fStepCaptureAt2x; // Perform spatial averaging 2x + UINT wStepCaptureAverageFrames; // Temporal average n Frames + DWORD dwAudioBufferSize; // Size of audio bufs (0 = default) + BOOL fDisableWriteCache; // Attempt to disable write cache + UINT AVStreamMaster; // Which stream controls length? +} CAPTUREPARMS, *PCAPTUREPARMS, FAR *LPCAPTUREPARMS; + +// ------------------------------------------------------------------ +// AVStreamMaster +// Since Audio and Video streams generally use non-synchronized capture +// clocks, this flag determines whether the audio stream is to be considered +// the master or controlling clock when writing the AVI file: +// +// AVSTREAMMASTER_AUDIO - Audio is master, video frame duration is forced +// to match audio duration (VFW 1.0, 1.1 default) +// AVSTREAMMASTER_NONE - No master, audio and video streams may be of +// different lengths +// ------------------------------------------------------------------ +#define AVSTREAMMASTER_AUDIO 0 /* Audio master (VFW 1.0, 1.1) */ +#define AVSTREAMMASTER_NONE 1 /* No master */ + +typedef struct tagCapInfoChunk { + FOURCC fccInfoID; // Chunk ID, "ICOP" for copyright + LPVOID lpData; // pointer to data + LONG cbData; // size of lpData +} CAPINFOCHUNK, *PCAPINFOCHUNK, FAR *LPCAPINFOCHUNK; + + +// ------------------------------------------------------------------ +// Callback Definitions +// ------------------------------------------------------------------ + +typedef LRESULT (CALLBACK* CAPYIELDCALLBACK) (HWND hWnd); +typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKW) (HWND hWnd, int nID, LPCWSTR lpsz); +typedef LRESULT (CALLBACK* CAPERRORCALLBACKW) (HWND hWnd, int nID, LPCWSTR lpsz); +typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKA) (HWND hWnd, int nID, LPCSTR lpsz); +typedef LRESULT (CALLBACK* CAPERRORCALLBACKA) (HWND hWnd, int nID, LPCSTR lpsz); +#ifdef UNICODE +#define CAPSTATUSCALLBACK CAPSTATUSCALLBACKW +#define CAPERRORCALLBACK CAPERRORCALLBACKW +#else +#define CAPSTATUSCALLBACK CAPSTATUSCALLBACKA +#define CAPERRORCALLBACK CAPERRORCALLBACKA +#endif +typedef LRESULT (CALLBACK* CAPVIDEOCALLBACK) (HWND hWnd, LPVIDEOHDR lpVHdr); +typedef LRESULT (CALLBACK* CAPWAVECALLBACK) (HWND hWnd, LPWAVEHDR lpWHdr); +typedef LRESULT (CALLBACK* CAPCONTROLCALLBACK)(HWND hWnd, int nState); + +// ------------------------------------------------------------------ +// CapControlCallback states +// ------------------------------------------------------------------ +#define CONTROLCALLBACK_PREROLL 1 /* Waiting to start capture */ +#define CONTROLCALLBACK_CAPTURING 2 /* Now capturing */ + +// ------------------------------------------------------------------ +// The only exported functions from AVICAP.DLL +// ------------------------------------------------------------------ + +HWND VFWAPI capCreateCaptureWindowA ( + LPCSTR lpszWindowName, + DWORD dwStyle, + int x, int y, int nWidth, int nHeight, + HWND hwndParent, int nID); + +BOOL VFWAPI capGetDriverDescriptionA (UINT wDriverIndex, + LPSTR lpszName, int cbName, + LPSTR lpszVer, int cbVer); + +HWND VFWAPI capCreateCaptureWindowW ( + LPCWSTR lpszWindowName, + DWORD dwStyle, + int x, int y, int nWidth, int nHeight, + HWND hwndParent, int nID); + +BOOL VFWAPI capGetDriverDescriptionW (UINT wDriverIndex, + LPWSTR lpszName, int cbName, + LPWSTR lpszVer, int cbVer); +#ifdef UNICODE +#define capCreateCaptureWindow capCreateCaptureWindowW +#define capGetDriverDescription capGetDriverDescriptionW +#else +#define capCreateCaptureWindow capCreateCaptureWindowA +#define capGetDriverDescription capGetDriverDescriptionA +#endif + +#endif /* RC_INVOKED */ + +// ------------------------------------------------------------------ +// New Information chunk IDs +// ------------------------------------------------------------------ +#define infotypeDIGITIZATION_TIME mmioFOURCC ('I','D','I','T') +#define infotypeSMPTE_TIME mmioFOURCC ('I','S','M','P') + +// ------------------------------------------------------------------ +// String IDs from status and error callbacks +// ------------------------------------------------------------------ + +#define IDS_CAP_BEGIN 300 /* "Capture Start" */ +#define IDS_CAP_END 301 /* "Capture End" */ + +#define IDS_CAP_INFO 401 /* "%s" */ +#define IDS_CAP_OUTOFMEM 402 /* "Out of memory" */ +#define IDS_CAP_FILEEXISTS 403 /* "File '%s' exists -- overwrite it?" */ +#define IDS_CAP_ERRORPALOPEN 404 /* "Error opening palette '%s'" */ +#define IDS_CAP_ERRORPALSAVE 405 /* "Error saving palette '%s'" */ +#define IDS_CAP_ERRORDIBSAVE 406 /* "Error saving frame '%s'" */ +#define IDS_CAP_DEFAVIEXT 407 /* "avi" */ +#define IDS_CAP_DEFPALEXT 408 /* "pal" */ +#define IDS_CAP_CANTOPEN 409 /* "Cannot open '%s'" */ +#define IDS_CAP_SEQ_MSGSTART 410 /* "Select OK to start capture\nof video sequence\nto %s." */ +#define IDS_CAP_SEQ_MSGSTOP 411 /* "Hit ESCAPE or click to end capture" */ + +#define IDS_CAP_VIDEDITERR 412 /* "An error occurred while trying to run VidEdit." */ +#define IDS_CAP_READONLYFILE 413 /* "The file '%s' is a read-only file." */ +#define IDS_CAP_WRITEERROR 414 /* "Unable to write to file '%s'.\nDisk may be full." */ +#define IDS_CAP_NODISKSPACE 415 /* "There is no space to create a capture file on the specified device." */ +#define IDS_CAP_SETFILESIZE 416 /* "Set File Size" */ +#define IDS_CAP_SAVEASPERCENT 417 /* "SaveAs: %2ld%% Hit Escape to abort." */ + +#define IDS_CAP_DRIVER_ERROR 418 /* Driver specific error message */ + +#define IDS_CAP_WAVE_OPEN_ERROR 419 /* "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." */ +#define IDS_CAP_WAVE_ALLOC_ERROR 420 /* "Error: Out of memory for wave buffers." */ +#define IDS_CAP_WAVE_PREPARE_ERROR 421 /* "Error: Cannot prepare wave buffers." */ +#define IDS_CAP_WAVE_ADD_ERROR 422 /* "Error: Cannot add wave buffers." */ +#define IDS_CAP_WAVE_SIZE_ERROR 423 /* "Error: Bad wave size." */ + +#define IDS_CAP_VIDEO_OPEN_ERROR 424 /* "Error: Cannot open the video input device." */ +#define IDS_CAP_VIDEO_ALLOC_ERROR 425 /* "Error: Out of memory for video buffers." */ +#define IDS_CAP_VIDEO_PREPARE_ERROR 426 /* "Error: Cannot prepare video buffers." */ +#define IDS_CAP_VIDEO_ADD_ERROR 427 /* "Error: Cannot add video buffers." */ +#define IDS_CAP_VIDEO_SIZE_ERROR 428 /* "Error: Bad video size." */ + +#define IDS_CAP_FILE_OPEN_ERROR 429 /* "Error: Cannot open capture file." */ +#define IDS_CAP_FILE_WRITE_ERROR 430 /* "Error: Cannot write to capture file. Disk may be full." */ +#define IDS_CAP_RECORDING_ERROR 431 /* "Error: Cannot write to capture file. Data rate too high or disk full." */ +#define IDS_CAP_RECORDING_ERROR2 432 /* "Error while recording" */ +#define IDS_CAP_AVI_INIT_ERROR 433 /* "Error: Unable to initialize for capture." */ +#define IDS_CAP_NO_FRAME_CAP_ERROR 434 /* "Warning: No frames captured.\nConfirm that vertical sync interrupts\nare configured and enabled." */ +#define IDS_CAP_NO_PALETTE_WARN 435 /* "Warning: Using default palette." */ +#define IDS_CAP_MCI_CONTROL_ERROR 436 /* "Error: Unable to access MCI device." */ +#define IDS_CAP_MCI_CANT_STEP_ERROR 437 /* "Error: Unable to step MCI device." */ +#define IDS_CAP_NO_AUDIO_CAP_ERROR 438 /* "Error: No audio data captured.\nCheck audio card settings." */ +#define IDS_CAP_AVI_DRAWDIB_ERROR 439 /* "Error: Unable to draw this data format." */ +#define IDS_CAP_COMPRESSOR_ERROR 440 /* "Error: Unable to initialize compressor." */ +#define IDS_CAP_AUDIO_DROP_ERROR 441 /* "Error: Audio data was lost during capture, reduce capture rate." */ +#define IDS_CAP_AUDIO_DROP_COMPERROR 442 /* "Error: Audio data was lost during capture. Try capturing without compressing." */ + +/* status string IDs */ +#define IDS_CAP_STAT_LIVE_MODE 500 /* "Live window" */ +#define IDS_CAP_STAT_OVERLAY_MODE 501 /* "Overlay window" */ +#define IDS_CAP_STAT_CAP_INIT 502 /* "Setting up for capture - Please wait" */ +#define IDS_CAP_STAT_CAP_FINI 503 /* "Finished capture, now writing frame %ld" */ +#define IDS_CAP_STAT_PALETTE_BUILD 504 /* "Building palette map" */ +#define IDS_CAP_STAT_OPTPAL_BUILD 505 /* "Computing optimal palette" */ +#define IDS_CAP_STAT_I_FRAMES 506 /* "%d frames" */ +#define IDS_CAP_STAT_L_FRAMES 507 /* "%ld frames" */ +#define IDS_CAP_STAT_CAP_L_FRAMES 508 /* "Captured %ld frames" */ +#define IDS_CAP_STAT_CAP_AUDIO 509 /* "Capturing audio" */ +#define IDS_CAP_STAT_VIDEOCURRENT 510 /* "Captured %ld frames (%ld dropped) %d.%03d sec." */ +#define IDS_CAP_STAT_VIDEOAUDIO 511 /* "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps). %ld audio bytes (%d,%03d sps)" */ +#define IDS_CAP_STAT_VIDEOONLY 512 /* "Captured %d.%03d sec. %ld frames (%ld dropped) (%d.%03d fps)" */ +#define IDS_CAP_STAT_FRAMESDROPPED 513 /* "Dropped %ld of %ld frames (%d.%02d%%) during capture." */ +#endif /* NOAVIFILE */ + +/**************************************************************************** + * + * ACM (Audio compression manager) + * + ***************************************************************************/ + +#ifndef NOMSACM + #include <msacm.h> +#endif + +/**************************************************************************** + * + * FilePreview dialog. + * + ***************************************************************************/ +#ifdef OFN_READONLY + + BOOL VFWAPI GetOpenFileNamePreviewA(LPOPENFILENAMEA lpofn); + BOOL VFWAPI GetSaveFileNamePreviewA(LPOPENFILENAMEA lpofn); + + BOOL VFWAPI GetOpenFileNamePreviewW(LPOPENFILENAMEW lpofn); + BOOL VFWAPI GetSaveFileNamePreviewW(LPOPENFILENAMEW lpofn); + + #ifdef UNICODE + #define GetOpenFileNamePreview GetOpenFileNamePreviewW + #define GetSaveFileNamePreview GetSaveFileNamePreviewW + #else + #define GetOpenFileNamePreview GetOpenFileNamePreviewA + #define GetSaveFileNamePreview GetSaveFileNamePreviewA + #endif + +#endif // OFN_READONLY + +#ifndef RC_INVOKED +#include "poppack.h" +#endif + +#ifdef __cplusplus +} /* End of extern "C" { */ +#endif /* __cplusplus */ + +#endif /* _INC_VFW */ |