home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / vfw.h < prev    next >
C/C++ Source or Header  |  2000-02-01  |  143KB  |  3,789 lines

  1. /****************************************************************************
  2.  *
  3.  *      VfW.H - Video for windows include file for WIN32
  4.  *
  5.  *      Copyright (c) 1991-1995, Microsoft Corp.  All rights reserved.
  6.  *
  7.  *      This include files defines interfaces to the following
  8.  *      video components
  9.  *
  10.  *          COMPMAN         - Installable Compression Manager.
  11.  *          DRAWDIB         - Routines for drawing to the display.
  12.  *          VIDEO           - Video Capture Driver Interface
  13.  *
  14.  *          AVIFMT          - AVI File Format structure definitions.
  15.  *          MMREG           - FOURCC and other things
  16.  *
  17.  *          AVIFile         - Interface for reading AVI Files and AVI Streams
  18.  *          MCIWND          - MCI/AVI window class
  19.  *          AVICAP          - AVI Capture Window class
  20.  *
  21.  *          MSACM           - Audio compression manager.
  22.  *
  23.  *      The following symbols control inclusion of various parts of this file:
  24.  *
  25.  *          NOCOMPMAN       - dont include COMPMAN
  26.  *          NODRAWDIB       - dont include DRAWDIB
  27.  *          NOVIDEO         - dont include video capture interface
  28.  *
  29.  *          NOAVIFMT        - dont include AVI file format structs
  30.  *          NOMMREG         - dont include MMREG
  31.  *
  32.  *          NOAVIFILE       - dont include AVIFile interface
  33.  *          NOMCIWND        - dont include AVIWnd class.
  34.  *          NOAVICAP        - dont include AVICap class.
  35.  *
  36.  *          NOMSACM         - dont include ACM stuff.
  37.  *
  38.  ****************************************************************************/
  39.  
  40. #ifndef _INC_VFW
  41. #pragma option push -b -a8 -pc -A- /*P_O_Push*/
  42. #define _INC_VFW
  43.  
  44. #ifdef __cplusplus
  45. extern "C" {            /* Assume C declarations for C++ */
  46. #endif  /* __cplusplus */
  47.  
  48. /****************************************************************************
  49.  *
  50.  *  types
  51.  *
  52.  ***************************************************************************/
  53.  
  54. #define VFWAPI  WINAPI
  55. #define VFWAPIV WINAPIV
  56.  
  57. /****************************************************************************
  58.  *
  59.  *  VideoForWindowsVersion() - returns version of VfW
  60.  *
  61.  ***************************************************************************/
  62.  
  63. DWORD FAR PASCAL VideoForWindowsVersion(void);
  64.  
  65. /****************************************************************************
  66.  *
  67.  *  call these to start stop using VfW from your app.
  68.  *
  69.  ***************************************************************************/
  70.  
  71. LONG VFWAPI InitVFW(void);
  72. LONG VFWAPI TermVFW(void);
  73.  
  74. #ifdef __cplusplus
  75. } // extern "C"
  76. #endif  /* __cplusplus */
  77.  
  78.  
  79. /****************************************************************************
  80.  *
  81.  *  do we need MMSYSTEM?
  82.  *
  83.  ****************************************************************************/
  84.  
  85. #if !defined(_INC_MMSYSTEM) && (!defined(NOVIDEO) || !defined(NOAVICAP))
  86.     #include <mmsystem.h>
  87. #endif
  88.  
  89. #ifdef __cplusplus
  90. extern "C" {            /* Assume C declarations for C++ */
  91. #endif  /* __cplusplus */
  92.  
  93. /****************************************************************************/
  94. /*                                                                          */
  95. /*        Macros                                                            */
  96. /*                                                                          */
  97. /*  should we define this??                                                 */
  98. /*                                                                          */
  99. /****************************************************************************/
  100.  
  101. #ifndef MKFOURCC
  102. #define MKFOURCC( ch0, ch1, ch2, ch3 )                                    \
  103.         ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
  104.         ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  105. #endif
  106.  
  107. #if !defined(_INC_MMSYSTEM)
  108.     #define mmioFOURCC MKFOURCC
  109. #endif
  110.  
  111. /****************************************************************************
  112.  *
  113.  *  COMPMAN - Installable Compression Manager.
  114.  *
  115.  ****************************************************************************/
  116.  
  117. #ifndef NOCOMPMAN
  118.  
  119. #define ICVERSION       0x0104
  120.  
  121. DECLARE_HANDLE(HIC);     /* Handle to a Installable Compressor */
  122.  
  123. //
  124. // this code in biCompression means the DIB must be accesed via
  125. // 48 bit pointers! using *ONLY* the selector given.
  126. //
  127. #define BI_1632  0x32333631     // '1632'
  128.  
  129. #ifndef mmioFOURCC
  130. #define mmioFOURCC( ch0, ch1, ch2, ch3 )                \
  131.         ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
  132.         ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  133. #endif
  134.  
  135. #ifndef aviTWOCC
  136. #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
  137. #endif
  138.  
  139. #ifndef ICTYPE_VIDEO
  140. #define ICTYPE_VIDEO    mmioFOURCC('v', 'i', 'd', 'c')
  141. #define ICTYPE_AUDIO    mmioFOURCC('a', 'u', 'd', 'c')
  142. #endif
  143.  
  144. #ifndef ICERR_OK
  145. #define ICERR_OK                0L
  146. #define ICERR_DONTDRAW          1L
  147. #define ICERR_NEWPALETTE        2L
  148. #define ICERR_GOTOKEYFRAME    3L
  149. #define ICERR_STOPDRAWING     4L
  150.  
  151. #define ICERR_UNSUPPORTED      -1L
  152. #define ICERR_BADFORMAT        -2L
  153. #define ICERR_MEMORY           -3L
  154. #define ICERR_INTERNAL         -4L
  155. #define ICERR_BADFLAGS         -5L
  156. #define ICERR_BADPARAM         -6L
  157. #define ICERR_BADSIZE          -7L
  158. #define ICERR_BADHANDLE        -8L
  159. #define ICERR_CANTUPDATE       -9L
  160. #define ICERR_ABORT           -10L
  161. #define ICERR_ERROR            -100L
  162. #define ICERR_BADBITDEPTH      -200L
  163. #define ICERR_BADIMAGESIZE     -201L
  164.  
  165. #define ICERR_CUSTOM           -400L    // errors less than ICERR_CUSTOM...
  166. #endif
  167.  
  168. /* Values for dwFlags of ICOpen() */
  169. #ifndef ICMODE_COMPRESS
  170. #define ICMODE_COMPRESS        1
  171. #define ICMODE_DECOMPRESS    2
  172. #define ICMODE_FASTDECOMPRESS   3
  173. #define ICMODE_QUERY            4
  174. #define ICMODE_FASTCOMPRESS     5
  175. #define ICMODE_DRAW             8
  176. #endif
  177. #ifndef _WIN32                    // ;Internal
  178. #define ICMODE_INTERNALF_FUNCTION32    0x8000    // ;Internal
  179. #define ICMODE_INTERNALF_MASK        0x8000    // ;Internal
  180. #endif                        // ;Internal
  181.  
  182. /* Flags for AVI file index */
  183. #define AVIIF_LIST    0x00000001L
  184. #define AVIIF_TWOCC    0x00000002L
  185. #define AVIIF_KEYFRAME    0x00000010L
  186.  
  187. /* quality flags */
  188. #define ICQUALITY_LOW       0
  189. #define ICQUALITY_HIGH      10000
  190. #define ICQUALITY_DEFAULT   -1
  191.  
  192. /************************************************************************
  193. ************************************************************************/
  194.  
  195. #define ICM_USER          (DRV_USER+0x0000)
  196.  
  197. #define ICM_RESERVED      ICM_RESERVED_LOW
  198. #define ICM_RESERVED_LOW  (DRV_USER+0x1000)
  199. #define ICM_RESERVED_HIGH (DRV_USER+0x2000)
  200.  
  201. /************************************************************************
  202.  
  203.     messages.
  204.  
  205. ************************************************************************/
  206.  
  207. #define ICM_GETSTATE                (ICM_RESERVED+0)    // Get compressor state
  208. #define ICM_SETSTATE                (ICM_RESERVED+1)    // Set compressor state
  209. #define ICM_GETINFO                 (ICM_RESERVED+2)    // Query info about the compressor
  210.  
  211. #define ICM_CONFIGURE               (ICM_RESERVED+10)   // show the configure dialog
  212. #define ICM_ABOUT                   (ICM_RESERVED+11)   // show the about box
  213.  
  214. #define ICM_GETERRORTEXT            (ICM_RESERVED+12)   // get error text TBD ;Internal
  215. #define ICM_GETFORMATNAME        (ICM_RESERVED+20)    // get a name for a format ;Internal
  216. #define ICM_ENUMFORMATS            (ICM_RESERVED+21)    // cycle through formats ;Internal
  217.  
  218. #define ICM_GETDEFAULTQUALITY       (ICM_RESERVED+30)   // get the default value for quality
  219. #define ICM_GETQUALITY              (ICM_RESERVED+31)   // get the current value for quality
  220. #define ICM_SETQUALITY              (ICM_RESERVED+32)   // set the default value for quality
  221.  
  222. #define ICM_SET                (ICM_RESERVED+40)    // Tell the driver something
  223. #define ICM_GET                (ICM_RESERVED+41)    // Ask the driver something
  224.  
  225. // Constants for ICM_SET:
  226. #define ICM_FRAMERATE       mmioFOURCC('F','r','m','R')
  227. #define ICM_KEYFRAMERATE    mmioFOURCC('K','e','y','R')
  228.  
  229. /************************************************************************
  230.  
  231.     ICM specific messages.
  232.  
  233. ************************************************************************/
  234.  
  235. #define ICM_COMPRESS_GET_FORMAT     (ICM_USER+4)    // get compress format or size
  236. #define ICM_COMPRESS_GET_SIZE       (ICM_USER+5)    // get output size
  237. #define ICM_COMPRESS_QUERY          (ICM_USER+6)    // query support for compress
  238. #define ICM_COMPRESS_BEGIN          (ICM_USER+7)    // begin a series of compress calls.
  239. #define ICM_COMPRESS                (ICM_USER+8)    // compress a frame
  240. #define ICM_COMPRESS_END            (ICM_USER+9)    // end of a series of compress calls.
  241.  
  242. #define ICM_DECOMPRESS_GET_FORMAT   (ICM_USER+10)   // get decompress format or size
  243. #define ICM_DECOMPRESS_QUERY        (ICM_USER+11)   // query support for dempress
  244. #define ICM_DECOMPRESS_BEGIN        (ICM_USER+12)   // start a series of decompress calls
  245. #define ICM_DECOMPRESS              (ICM_USER+13)   // decompress a frame
  246. #define ICM_DECOMPRESS_END          (ICM_USER+14)   // end a series of decompress calls
  247. #define ICM_DECOMPRESS_SET_PALETTE  (ICM_USER+29)   // fill in the DIB color table
  248. #define ICM_DECOMPRESS_GET_PALETTE  (ICM_USER+30)   // fill in the DIB color table
  249.  
  250. #define ICM_DRAW_QUERY              (ICM_USER+31)   // query support for dempress
  251. #define ICM_DRAW_BEGIN              (ICM_USER+15)   // start a series of draw calls
  252. #define ICM_DRAW_GET_PALETTE        (ICM_USER+16)   // get the palette needed for drawing
  253. #define ICM_DRAW_UPDATE             (ICM_USER+17)   // update screen with current frame ;Internal
  254. #define ICM_DRAW_START              (ICM_USER+18)   // start decompress clock
  255. #define ICM_DRAW_STOP               (ICM_USER+19)   // stop decompress clock
  256. #define ICM_DRAW_BITS               (ICM_USER+20)   // decompress a frame to screen ;Internal
  257. #define ICM_DRAW_END                (ICM_USER+21)   // end a series of draw calls
  258. #define ICM_DRAW_GETTIME            (ICM_USER+32)   // get value of decompress clock
  259. #define ICM_DRAW                    (ICM_USER+33)   // generalized "render" message
  260. #define ICM_DRAW_WINDOW             (ICM_USER+34)   // drawing window has moved or hidden
  261. #define ICM_DRAW_SETTIME            (ICM_USER+35)   // set correct value for decompress clock
  262. #define ICM_DRAW_REALIZE            (ICM_USER+36)   // realize palette for drawing
  263. #define ICM_DRAW_FLUSH                (ICM_USER+37)   // clear out buffered frames
  264. #define ICM_DRAW_RENDERBUFFER       (ICM_USER+38)   // draw undrawn things in queue
  265.  
  266. #define ICM_DRAW_START_PLAY         (ICM_USER+39)   // start of a play
  267. #define ICM_DRAW_STOP_PLAY          (ICM_USER+40)   // end of a play
  268.  
  269. #define ICM_DRAW_SUGGESTFORMAT      (ICM_USER+50)   // Like ICGetDisplayFormat
  270. #define ICM_DRAW_CHANGEPALETTE      (ICM_USER+51)   // for animating palette
  271.  
  272. #define ICM_DRAW_IDLE               (ICM_USER+52)   // send each frame time ;Internal
  273.  
  274. #define ICM_GETBUFFERSWANTED        (ICM_USER+41)   // ask about prebuffering
  275.  
  276. #define ICM_GETDEFAULTKEYFRAMERATE  (ICM_USER+42)   // get the default value for key frames
  277.  
  278.  
  279. #define ICM_DECOMPRESSEX_BEGIN      (ICM_USER+60)   // start a series of decompress calls
  280. #define ICM_DECOMPRESSEX_QUERY      (ICM_USER+61)   // start a series of decompress calls
  281. #define ICM_DECOMPRESSEX            (ICM_USER+62)   // decompress a frame
  282. #define ICM_DECOMPRESSEX_END        (ICM_USER+63)   // end a series of decompress calls
  283.  
  284. #define ICM_COMPRESS_FRAMES_INFO    (ICM_USER+70)   // tell about compress to come
  285. #define ICM_COMPRESS_FRAMES         (ICM_USER+71)   // compress a bunch of frames ;Internal
  286. #define ICM_SET_STATUS_PROC            (ICM_USER+72)   // set status callback
  287.  
  288. /************************************************************************
  289. ************************************************************************/
  290.  
  291. typedef struct {
  292.     DWORD               dwSize;         // sizeof(ICOPEN)
  293.     DWORD               fccType;        // 'vidc'
  294.     DWORD               fccHandler;     //
  295.     DWORD               dwVersion;      // version of compman opening you
  296.     DWORD               dwFlags;        // LOWORD is type specific
  297.     LRESULT             dwError;        // error return.
  298.     LPVOID              pV1Reserved;    // Reserved
  299.     LPVOID              pV2Reserved;    // Reserved
  300.     DWORD               dnDevNode;      // Devnode for PnP devices
  301. } ICOPEN;
  302.  
  303. /************************************************************************
  304. ************************************************************************/
  305.  
  306. typedef struct {
  307.     DWORD   dwSize;                 // sizeof(ICINFO)
  308.     DWORD   fccType;                // compressor type     'vidc' 'audc'
  309.     DWORD   fccHandler;             // compressor sub-type 'rle ' 'jpeg' 'pcm '
  310.     DWORD   dwFlags;                // flags LOWORD is type specific
  311.     DWORD   dwVersion;              // version of the driver
  312.     DWORD   dwVersionICM;           // version of the ICM used
  313.     //
  314.     // under Win32, the driver always returns UNICODE strings.
  315.     //
  316.     WCHAR   szName[16];             // short name
  317.     WCHAR   szDescription[128];     // long name
  318.     WCHAR   szDriver[128];          // driver that contains compressor
  319. }   ICINFO;
  320.  
  321. /* Flags for the <dwFlags> field of the <ICINFO> structure. */
  322. #define VIDCF_QUALITY        0x0001  // supports quality
  323. #define VIDCF_CRUNCH         0x0002  // supports crunching to a frame size
  324. #define VIDCF_TEMPORAL       0x0004  // supports inter-frame compress
  325. #define VIDCF_COMPRESSFRAMES 0x0008  // wants the compress all frames message
  326. #define VIDCF_DRAW           0x0010  // supports drawing
  327. #define VIDCF_FASTTEMPORALC  0x0020  // does not need prev frame on compress
  328. #define VIDCF_FASTTEMPORALD  0x0080  // does not need prev frame on decompress
  329. //#define VIDCF_QUALITYTIME    0x0040  // supports temporal quality
  330.  
  331. //#define VIDCF_FASTTEMPORAL   (VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD)
  332.  
  333. /************************************************************************
  334. ************************************************************************/
  335.  
  336. #define ICCOMPRESS_KEYFRAME    0x00000001L
  337.  
  338. typedef struct {
  339.     DWORD               dwFlags;        // flags
  340.  
  341.     LPBITMAPINFOHEADER  lpbiOutput;     // output format
  342.     LPVOID              lpOutput;       // output data
  343.  
  344.     LPBITMAPINFOHEADER  lpbiInput;      // format of frame to compress
  345.     LPVOID              lpInput;        // frame data to compress
  346.  
  347.     LPDWORD             lpckid;         // ckid for data in AVI file
  348.     LPDWORD             lpdwFlags;      // flags in the AVI index.
  349.     LONG                lFrameNum;      // frame number of seq.
  350.     DWORD               dwFrameSize;    // reqested size in bytes. (if non zero)
  351.  
  352.     DWORD               dwQuality;      // quality
  353.  
  354.     // these are new fields
  355.     LPBITMAPINFOHEADER  lpbiPrev;       // format of previous frame
  356.     LPVOID              lpPrev;         // previous frame
  357.  
  358. } ICCOMPRESS;
  359.  
  360. /************************************************************************
  361. ************************************************************************/
  362.  
  363. #define ICCOMPRESSFRAMES_PADDING    0x00000001
  364.  
  365. typedef struct {
  366.     DWORD               dwFlags;        // flags
  367.  
  368.     LPBITMAPINFOHEADER  lpbiOutput;     // output format
  369.     LPARAM              lOutput;        // output identifier
  370.  
  371.     LPBITMAPINFOHEADER  lpbiInput;      // format of frame to compress
  372.     LPARAM              lInput;         // input identifier
  373.  
  374.     LONG                lStartFrame;    // start frame
  375.     LONG                lFrameCount;    // # of frames
  376.  
  377.     LONG                lQuality;       // quality
  378.     LONG                lDataRate;      // data rate
  379.     LONG                lKeyRate;       // key frame rate
  380.  
  381.     DWORD        dwRate;        // frame rate, as always
  382.     DWORD        dwScale;
  383.  
  384.     DWORD        dwOverheadPerFrame;
  385.     DWORD        dwReserved2;
  386.  
  387.     LONG (CALLBACK *GetData)(LPARAM lInput, LONG lFrame, LPVOID lpBits, LONG len);
  388.     LONG (CALLBACK *PutData)(LPARAM lOutput, LONG lFrame, LPVOID lpBits, LONG len);
  389. } ICCOMPRESSFRAMES;
  390.  
  391. typedef struct {
  392.     DWORD        dwFlags;
  393.     LPARAM        lParam;
  394.  
  395.     // messages for Status callback
  396.     #define ICSTATUS_START        0
  397.     #define ICSTATUS_STATUS        1        // l == % done
  398.     #define ICSTATUS_END        2
  399.     #define ICSTATUS_ERROR        3        // l == error string (LPSTR)
  400.     #define ICSTATUS_YIELD        4
  401.     // return nonzero means abort operation in progress
  402.  
  403.     LONG (CALLBACK *Status) (LPARAM lParam, UINT message, LONG l);
  404. } ICSETSTATUSPROC;
  405.  
  406. /************************************************************************
  407. ************************************************************************/
  408.  
  409. #define ICDECOMPRESS_HURRYUP      0x80000000L   // don't draw just buffer (hurry up!)
  410. #define ICDECOMPRESS_UPDATE       0x40000000L   // don't draw just update screen
  411. #define ICDECOMPRESS_PREROLL      0x20000000L   // this frame is before real start
  412. #define ICDECOMPRESS_NULLFRAME    0x10000000L   // repeat last frame
  413. #define ICDECOMPRESS_NOTKEYFRAME  0x08000000L   // this frame is not a key frame
  414.  
  415. typedef struct {
  416.     DWORD               dwFlags;    // flags (from AVI index...)
  417.  
  418.     LPBITMAPINFOHEADER  lpbiInput;  // BITMAPINFO of compressed data
  419.                                     // biSizeImage has the chunk size
  420.     LPVOID              lpInput;    // compressed data
  421.  
  422.     LPBITMAPINFOHEADER  lpbiOutput; // DIB to decompress to
  423.     LPVOID              lpOutput;
  424.     DWORD        ckid;        // ckid from AVI file
  425. } ICDECOMPRESS;
  426.  
  427. typedef struct {
  428.     //
  429.     // same as ICM_DECOMPRESS
  430.     //
  431.     DWORD               dwFlags;
  432.  
  433.     LPBITMAPINFOHEADER  lpbiSrc;    // BITMAPINFO of compressed data
  434.     LPVOID              lpSrc;      // compressed data
  435.  
  436.     LPBITMAPINFOHEADER  lpbiDst;    // DIB to decompress to
  437.     LPVOID              lpDst;      // output data
  438.  
  439.     //
  440.     // new for ICM_DECOMPRESSEX
  441.     //
  442.     int                 xDst;       // destination rectangle
  443.     int                 yDst;
  444.     int                 dxDst;
  445.     int                 dyDst;
  446.  
  447.     int                 xSrc;       // source rectangle
  448.     int                 ySrc;
  449.     int                 dxSrc;
  450.     int                 dySrc;
  451.  
  452. } ICDECOMPRESSEX;
  453.  
  454. /************************************************************************
  455. ************************************************************************/
  456.  
  457. #define ICDRAW_QUERY        0x00000001L   // test for support
  458. #define ICDRAW_FULLSCREEN   0x00000002L   // draw to full screen
  459. #define ICDRAW_HDC          0x00000004L   // draw to a HDC/HWND
  460. #define ICDRAW_ANIMATE        0x00000008L      // expect palette animation
  461. #define ICDRAW_CONTINUE        0x00000010L      // draw is a continuation of previous draw
  462. #define ICDRAW_MEMORYDC        0x00000020L      // DC is offscreen, by the way
  463. #define ICDRAW_UPDATING        0x00000040L      // We're updating, as opposed to playing
  464. #define ICDRAW_RENDER       0x00000080L   // used to render data not draw it
  465. #define ICDRAW_BUFFER       0x00000100L   // please buffer this data offscreen, we will need to update it
  466.  
  467. typedef struct {
  468.     DWORD               dwFlags;        // flags
  469.  
  470.     HPALETTE            hpal;           // palette to draw with
  471.     HWND                hwnd;           // window to draw to
  472.     HDC                 hdc;            // HDC to draw to
  473.  
  474.     int                 xDst;           // destination rectangle
  475.     int                 yDst;
  476.     int                 dxDst;
  477.     int                 dyDst;
  478.  
  479.     LPBITMAPINFOHEADER  lpbi;           // format of frame to draw
  480.  
  481.     int                 xSrc;           // source rectangle
  482.     int                 ySrc;
  483.     int                 dxSrc;
  484.     int                 dySrc;
  485.  
  486.     DWORD               dwRate;         // frames/second = (dwRate/dwScale)
  487.     DWORD               dwScale;
  488.  
  489. } ICDRAWBEGIN;
  490.  
  491. /************************************************************************
  492. ************************************************************************/
  493.  
  494. #define ICDRAW_HURRYUP      0x80000000L   // don't draw just buffer (hurry up!)
  495. #define ICDRAW_UPDATE       0x40000000L   // don't draw just update screen
  496. #define ICDRAW_PREROLL        0x20000000L      // this frame is before real start
  497. #define ICDRAW_NULLFRAME    0x10000000L      // repeat last frame
  498. #define ICDRAW_NOTKEYFRAME  0x08000000L   // this frame is not a key frame
  499.  
  500. typedef struct {
  501.     DWORD               dwFlags;        // flags
  502.     LPVOID        lpFormat;       // format of frame to decompress
  503.     LPVOID              lpData;         // frame data to decompress
  504.     DWORD               cbData;
  505.     LONG                lTime;          // time in drawbegin units (see dwRate and dwScale)
  506. } ICDRAW;
  507.  
  508. typedef struct {
  509.     LPBITMAPINFOHEADER    lpbiIn;        // format to be drawn
  510.     LPBITMAPINFOHEADER    lpbiSuggest;    // location for suggested format (or NULL to get size)
  511.     int            dxSrc;        // source extent or 0
  512.     int            dySrc;
  513.     int            dxDst;        // dest extent or 0
  514.     int            dyDst;
  515.     HIC            hicDecompressor;// decompressor you can talk to
  516. } ICDRAWSUGGEST;
  517.  
  518. /************************************************************************
  519. ************************************************************************/
  520.  
  521. typedef struct {
  522.     DWORD               dwFlags;    // flags (from AVI index...)
  523.     int                 iStart;     // first palette to change
  524.     int                 iLen;       // count of entries to change.
  525.     LPPALETTEENTRY      lppe;       // palette
  526. } ICPALETTE;
  527.  
  528.  
  529. /************************************************************************
  530.  
  531.     ICM function declarations
  532.     
  533. ************************************************************************/
  534.  
  535. BOOL
  536. VFWAPI
  537. ICInfo(
  538.     IN DWORD fccType,
  539.     IN DWORD fccHandler,
  540.     OUT ICINFO FAR * lpicinfo
  541.     );
  542.  
  543. BOOL
  544. VFWAPI
  545. ICInstall(
  546.     IN DWORD fccType,
  547.     IN DWORD fccHandler,
  548.     IN LPARAM lParam,
  549.     IN LPSTR szDesc,
  550.     IN UINT wFlags
  551.     );
  552.  
  553. BOOL
  554. VFWAPI
  555. ICRemove(
  556.     IN DWORD fccType,
  557.     IN DWORD fccHandler,
  558.     IN UINT wFlags
  559.     );
  560.  
  561. LRESULT
  562. VFWAPI
  563. ICGetInfo(
  564.     IN HIC hic,
  565.     OUT ICINFO FAR *picinfo,
  566.     IN DWORD cb
  567.     );
  568.  
  569. HIC
  570. VFWAPI
  571. ICOpen(
  572.     IN DWORD fccType,
  573.     IN DWORD fccHandler,
  574.     IN UINT wMode
  575.     );
  576.  
  577. HIC
  578. VFWAPI
  579. ICOpenFunction(
  580.     IN DWORD fccType,
  581.     IN DWORD fccHandler,
  582.     IN UINT wMode,
  583.     IN FARPROC lpfnHandler
  584.     );
  585.  
  586. LRESULT
  587. VFWAPI
  588. ICClose(
  589.     IN HIC hic
  590.     );
  591.  
  592. LRESULT
  593. VFWAPI
  594. ICSendMessage(
  595.     IN HIC hic,
  596.     IN UINT msg,
  597.     IN DWORD_PTR dw1,
  598.     IN DWORD_PTR dw2
  599.     );
  600. #ifndef _WIN32
  601. //this function is unsupported on Win32 as it is non-portable.
  602. LRESULT VFWAPIV ICMessage(HIC hic, UINT msg, UINT cb, ...);
  603. #endif
  604.  
  605.  
  606. /* Values for wFlags of ICInstall() */
  607. #define ICINSTALL_UNICODE       0x8000
  608.  
  609. #define ICINSTALL_FUNCTION      0x0001  // lParam is a DriverProc (function ptr)
  610. #define ICINSTALL_DRIVER        0x0002  // lParam is a driver name (string)
  611. #define ICINSTALL_HDRV          0x0004  // lParam is a HDRVR (driver handle)
  612.  
  613. #define ICINSTALL_DRIVERW       0x8002  // lParam is a unicode driver name
  614.  
  615. /************************************************************************
  616.  
  617.     query macros
  618.  
  619. ************************************************************************/
  620. #define ICMF_CONFIGURE_QUERY     0x00000001
  621. #define ICMF_ABOUT_QUERY         0x00000001
  622.  
  623. #define ICQueryAbout(hic) \
  624.     (ICSendMessage(hic, ICM_ABOUT, (DWORD_PTR) -1, ICMF_ABOUT_QUERY) == ICERR_OK)
  625.  
  626. #define ICAbout(hic, hwnd) \
  627.     ICSendMessage(hic, ICM_ABOUT, (DWORD_PTR)(UINT_PTR)(hwnd), 0)
  628.  
  629. #define ICQueryConfigure(hic) \
  630.     (ICSendMessage(hic, ICM_CONFIGURE, (DWORD_PTR) -1, ICMF_CONFIGURE_QUERY) == ICERR_OK)
  631.  
  632. #define ICConfigure(hic, hwnd) \
  633.     ICSendMessage(hic, ICM_CONFIGURE, (DWORD_PTR)(UINT_PTR)(hwnd), 0)
  634.  
  635. /************************************************************************
  636.  
  637.     get/set state macros
  638.     
  639. ************************************************************************/
  640.  
  641. #define ICGetState(hic, pv, cb) \
  642.     ICSendMessage(hic, ICM_GETSTATE, (DWORD_PTR)(LPVOID)(pv), (DWORD_PTR)(cb))
  643.  
  644. #define ICSetState(hic, pv, cb) \
  645.     ICSendMessage(hic, ICM_SETSTATE, (DWORD_PTR)(LPVOID)(pv), (DWORD_PTR)(cb))
  646.  
  647. #define ICGetStateSize(hic) \
  648.     (DWORD) ICGetState(hic, NULL, 0)
  649.  
  650. /************************************************************************
  651.  
  652.     get value macros
  653.  
  654. ************************************************************************/
  655. static DWORD dwICValue;
  656.  
  657. #define ICGetDefaultQuality(hic) \
  658.     (ICSendMessage(hic, ICM_GETDEFAULTQUALITY, (DWORD_PTR)(LPVOID)&dwICValue, sizeof(DWORD)), dwICValue)
  659.  
  660. #define ICGetDefaultKeyFrameRate(hic) \
  661.     (ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, (DWORD_PTR)(LPVOID)&dwICValue, sizeof(DWORD)), dwICValue)
  662.  
  663. /************************************************************************
  664.  
  665.     draw window macro
  666.     
  667. ************************************************************************/
  668. #define ICDrawWindow(hic, prc) \
  669.     ICSendMessage(hic, ICM_DRAW_WINDOW, (DWORD_PTR)(LPVOID)(prc), sizeof(RECT))
  670.  
  671. /************************************************************************
  672.  
  673.     compression functions
  674.  
  675. ************************************************************************/
  676. /*
  677.  *  ICCompress()
  678.  *
  679.  *  compress a single frame
  680.  *
  681.  */
  682. DWORD
  683. VFWAPIV
  684. ICCompress(
  685.     IN     HIC                 hic,
  686.     IN     DWORD               dwFlags,        // flags
  687.     IN     LPBITMAPINFOHEADER  lpbiOutput,     // output format
  688.     OUT    LPVOID              lpData,         // output data
  689.     IN     LPBITMAPINFOHEADER  lpbiInput,      // format of frame to compress
  690.     IN     LPVOID              lpBits,         // frame data to compress
  691.     OUT    LPDWORD             lpckid,         // ckid for data in AVI file
  692.     OUT    LPDWORD             lpdwFlags,      // flags in the AVI index.
  693.     IN     LONG                lFrameNum,      // frame number of seq.
  694.     IN     DWORD               dwFrameSize,    // reqested size in bytes. (if non zero)
  695.     IN     DWORD               dwQuality,      // quality within one frame
  696.     IN     LPBITMAPINFOHEADER  lpbiPrev,       // format of previous frame
  697.     IN     LPVOID              lpPrev          // previous frame
  698.     );
  699.  
  700. /*
  701.  *  ICCompressBegin()
  702.  *
  703.  *  start compression from a source format (lpbiInput) to a dest
  704.  *  format (lpbiOuput) is supported.
  705.  *
  706.  */
  707. #define ICCompressBegin(hic, lpbiInput, lpbiOutput) \
  708.     ICSendMessage(hic, ICM_COMPRESS_BEGIN, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  709.  
  710. /*
  711.  *  ICCompressQuery()
  712.  *
  713.  *  determines if compression from a source format (lpbiInput) to a dest
  714.  *  format (lpbiOuput) is supported.
  715.  *
  716.  */
  717. #define ICCompressQuery(hic, lpbiInput, lpbiOutput) \
  718.     ICSendMessage(hic, ICM_COMPRESS_QUERY, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  719.  
  720. /*
  721.  *  ICCompressGetFormat()
  722.  *
  723.  *  get the output format, (format of compressed data)
  724.  *  if lpbiOutput is NULL return the size in bytes needed for format.
  725.  *
  726.  */
  727. #define ICCompressGetFormat(hic, lpbiInput, lpbiOutput) \
  728.     ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  729.  
  730. #define ICCompressGetFormatSize(hic, lpbi) \
  731.     (DWORD) ICCompressGetFormat(hic, lpbi, NULL)
  732.  
  733. /*
  734.  *  ICCompressSize()
  735.  *
  736.  *  return the maximal size of a compressed frame
  737.  *
  738.  */
  739. #define ICCompressGetSize(hic, lpbiInput, lpbiOutput) \
  740.     (DWORD) ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  741.  
  742. #define ICCompressEnd(hic) \
  743.     ICSendMessage(hic, ICM_COMPRESS_END, 0, 0)
  744.  
  745. /************************************************************************
  746.  
  747.     decompression functions
  748.  
  749. ************************************************************************/
  750.  
  751. /*
  752.  *  ICDecompress()
  753.  *
  754.  *  decompress a single frame
  755.  *
  756.  */
  757. #define ICDECOMPRESS_HURRYUP    0x80000000L     // don't draw just buffer (hurry up!)
  758.  
  759. DWORD
  760. VFWAPIV
  761. ICDecompress(
  762.     IN  HIC                 hic,
  763.     IN  DWORD               dwFlags,    // flags (from AVI index...)
  764.     IN  LPBITMAPINFOHEADER  lpbiFormat, // BITMAPINFO of compressed data
  765.                                         // biSizeImage has the chunk size
  766.     IN  LPVOID              lpData,     // data
  767.     IN  LPBITMAPINFOHEADER  lpbi,       // DIB to decompress to
  768.     OUT LPVOID              lpBits
  769.     );
  770.  
  771. /*
  772.  *  ICDecompressBegin()
  773.  *
  774.  *  start compression from a source format (lpbiInput) to a dest
  775.  *  format (lpbiOutput) is supported.
  776.  *
  777.  */
  778. #define ICDecompressBegin(hic, lpbiInput, lpbiOutput) \
  779.     ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  780.  
  781. /*
  782.  *  ICDecompressQuery()
  783.  *
  784.  *  determines if compression from a source format (lpbiInput) to a dest
  785.  *  format (lpbiOutput) is supported.
  786.  *
  787.  */
  788. #define ICDecompressQuery(hic, lpbiInput, lpbiOutput) \
  789.     ICSendMessage(hic, ICM_DECOMPRESS_QUERY, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  790.  
  791. /*
  792.  *  ICDecompressGetFormat()
  793.  *
  794.  *  get the output format, (format of un-compressed data)
  795.  *  if lpbiOutput is NULL return the size in bytes needed for format.
  796.  *
  797.  */
  798. #define ICDecompressGetFormat(hic, lpbiInput, lpbiOutput) \
  799.     ((LONG) ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput)))
  800.  
  801. #define ICDecompressGetFormatSize(hic, lpbi) \
  802.     ICDecompressGetFormat(hic, lpbi, NULL)
  803.  
  804. /*
  805.  *  ICDecompressGetPalette()
  806.  *
  807.  *  get the output palette
  808.  *
  809.  */
  810. #define ICDecompressGetPalette(hic, lpbiInput, lpbiOutput) \
  811.     ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, (DWORD_PTR)(LPVOID)(lpbiInput), (DWORD_PTR)(LPVOID)(lpbiOutput))
  812.  
  813. #define ICDecompressSetPalette(hic, lpbiPalette) \
  814.     ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, (DWORD_PTR)(LPVOID)(lpbiPalette), 0)
  815.  
  816. #define ICDecompressEnd(hic) \
  817.     ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0)
  818.  
  819. /************************************************************************
  820.  
  821.     decompression (ex) functions
  822.  
  823. ************************************************************************/
  824.  
  825.  
  826. //
  827. // on Win16 these functions are macros that call ICMessage. ICMessage will
  828. // not work on NT. rather than add new entrypoints we have given
  829. // them as static inline functions
  830. //
  831.  
  832. /*
  833.  *  ICDecompressEx()
  834.  *
  835.  *  decompress a single frame
  836.  *
  837.  */
  838. static __inline LRESULT VFWAPI
  839. ICDecompressEx(
  840.             HIC hic,
  841.             DWORD dwFlags,
  842.             LPBITMAPINFOHEADER lpbiSrc,
  843.             LPVOID lpSrc,
  844.             int xSrc,
  845.             int ySrc,
  846.             int dxSrc,
  847.             int dySrc,
  848.             LPBITMAPINFOHEADER lpbiDst,
  849.             LPVOID lpDst,
  850.             int xDst,
  851.             int yDst,
  852.             int dxDst,
  853.             int dyDst)
  854. {
  855.     ICDECOMPRESSEX ic;
  856.  
  857.     ic.dwFlags = dwFlags;
  858.     ic.lpbiSrc = lpbiSrc;
  859.     ic.lpSrc = lpSrc;
  860.     ic.xSrc = xSrc;
  861.     ic.ySrc = ySrc;
  862.     ic.dxSrc = dxSrc;
  863.     ic.dySrc = dySrc;
  864.     ic.lpbiDst = lpbiDst;
  865.     ic.lpDst = lpDst;
  866.     ic.xDst = xDst;
  867.     ic.yDst = yDst;
  868.     ic.dxDst = dxDst;
  869.     ic.dyDst = dyDst;
  870.  
  871.     // note that ICM swaps round the length and pointer
  872.     // length in lparam2, pointer in lparam1
  873.     return ICSendMessage(hic, ICM_DECOMPRESSEX, (DWORD_PTR)&ic, sizeof(ic));
  874. }
  875.  
  876.  
  877. /*
  878.  *  ICDecompressExBegin()
  879.  *
  880.  *  start compression from a source format (lpbiInput) to a dest
  881.  *  format (lpbiOutput) is supported.
  882.  *
  883.  */
  884. static __inline LRESULT VFWAPI
  885. ICDecompressExBegin(
  886.             HIC hic,
  887.             DWORD dwFlags,
  888.             LPBITMAPINFOHEADER lpbiSrc,
  889.             LPVOID lpSrc,
  890.             int xSrc,
  891.             int ySrc,
  892.             int dxSrc,
  893.             int dySrc,
  894.             LPBITMAPINFOHEADER lpbiDst,
  895.             LPVOID lpDst,
  896.             int xDst,
  897.             int yDst,
  898.             int dxDst,
  899.             int dyDst)
  900. {
  901.     ICDECOMPRESSEX ic;
  902.  
  903.     ic.dwFlags = dwFlags;
  904.     ic.lpbiSrc = lpbiSrc;
  905.     ic.lpSrc = lpSrc;
  906.     ic.xSrc = xSrc;
  907.     ic.ySrc = ySrc;
  908.     ic.dxSrc = dxSrc;
  909.     ic.dySrc = dySrc;
  910.     ic.lpbiDst = lpbiDst;
  911.     ic.lpDst = lpDst;
  912.     ic.xDst = xDst;
  913.     ic.yDst = yDst;
  914.     ic.dxDst = dxDst;
  915.     ic.dyDst = dyDst;
  916.  
  917.     // note that ICM swaps round the length and pointer
  918.     // length in lparam2, pointer in lparam1
  919.     return ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, (DWORD_PTR)&ic, sizeof(ic));
  920. }
  921.  
  922. /*
  923.  *  ICDecompressExQuery()
  924.  *
  925.  */
  926. static __inline LRESULT VFWAPI
  927. ICDecompressExQuery(
  928.             HIC hic,
  929.             DWORD dwFlags,
  930.             LPBITMAPINFOHEADER lpbiSrc,
  931.             LPVOID lpSrc,
  932.             int xSrc,
  933.             int ySrc,
  934.             int dxSrc,
  935.             int dySrc,
  936.             LPBITMAPINFOHEADER lpbiDst,
  937.             LPVOID lpDst,
  938.             int xDst,
  939.             int yDst,
  940.             int dxDst,
  941.             int dyDst)
  942. {
  943.     ICDECOMPRESSEX ic;
  944.  
  945.     ic.dwFlags = dwFlags;
  946.     ic.lpbiSrc = lpbiSrc;
  947.     ic.lpSrc = lpSrc;
  948.     ic.xSrc = xSrc;
  949.     ic.ySrc = ySrc;
  950.     ic.dxSrc = dxSrc;
  951.     ic.dySrc = dySrc;
  952.     ic.lpbiDst = lpbiDst;
  953.     ic.lpDst = lpDst;
  954.     ic.xDst = xDst;
  955.     ic.yDst = yDst;
  956.     ic.dxDst = dxDst;
  957.     ic.dyDst = dyDst;
  958.  
  959.     // note that ICM swaps round the length and pointer
  960.     // length in lparam2, pointer in lparam1
  961.     return ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, (DWORD_PTR)&ic, sizeof(ic));
  962. }
  963.  
  964.  
  965. #define ICDecompressExEnd(hic) \
  966.     ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0)
  967.  
  968. /************************************************************************
  969.  
  970.     drawing functions
  971.  
  972. ************************************************************************/
  973.  
  974. /*
  975.  *  ICDrawBegin()
  976.  *
  977.  *  start decompressing data with format (lpbiInput) directly to the screen
  978.  *
  979.  *  return zero if the decompressor supports drawing.
  980.  *
  981.  */
  982.  
  983. #define ICDRAW_QUERY        0x00000001L   // test for support
  984. #define ICDRAW_FULLSCREEN   0x00000002L   // draw to full screen
  985. #define ICDRAW_HDC          0x00000004L   // draw to a HDC/HWND
  986.  
  987. DWORD
  988. VFWAPIV
  989. ICDrawBegin(
  990.     IN HIC                 hic,
  991.     IN DWORD               dwFlags,        // flags
  992.     IN HPALETTE            hpal,           // palette to draw with
  993.     IN HWND                hwnd,           // window to draw to
  994.     IN HDC                 hdc,            // HDC to draw to
  995.     IN int                 xDst,           // destination rectangle
  996.     IN int                 yDst,
  997.     IN int                 dxDst,
  998.     IN int                 dyDst,
  999.     IN LPBITMAPINFOHEADER  lpbi,           // format of frame to draw
  1000.     IN int                 xSrc,           // source rectangle
  1001.     IN int                 ySrc,
  1002.     IN int                 dxSrc,
  1003.     IN int                 dySrc,
  1004.     IN DWORD               dwRate,         // frames/second = (dwRate/dwScale)
  1005.     IN DWORD               dwScale
  1006.     );
  1007.  
  1008. /*
  1009.  *  ICDraw()
  1010.  *
  1011.  *  decompress data directly to the screen
  1012.  *
  1013.  */
  1014.  
  1015. #define ICDRAW_HURRYUP      0x80000000L   // don't draw just buffer (hurry up!)
  1016. #define ICDRAW_UPDATE       0x40000000L   // don't draw just update screen
  1017.  
  1018. DWORD
  1019. VFWAPIV
  1020. ICDraw(
  1021.     IN HIC                 hic,
  1022.     IN DWORD               dwFlags,        // flags
  1023.     IN LPVOID              lpFormat,       // format of frame to decompress
  1024.     IN LPVOID              lpData,         // frame data to decompress
  1025.     IN DWORD               cbData,         // size of data
  1026.     IN LONG                lTime           // time to draw this frame
  1027.     );
  1028.  
  1029.  
  1030. // ICMessage is not supported on Win32, so provide a static inline function
  1031. // to do the same job
  1032. static __inline LRESULT VFWAPI
  1033. ICDrawSuggestFormat(
  1034.             HIC hic,
  1035.             LPBITMAPINFOHEADER lpbiIn,
  1036.             LPBITMAPINFOHEADER lpbiOut,
  1037.             int dxSrc,
  1038.             int dySrc,
  1039.             int dxDst,
  1040.             int dyDst,
  1041.             HIC hicDecomp)
  1042. {
  1043.     ICDRAWSUGGEST ic;
  1044.  
  1045.     ic.lpbiIn = lpbiIn;
  1046.     ic.lpbiSuggest = lpbiOut;
  1047.     ic.dxSrc = dxSrc;
  1048.     ic.dySrc = dySrc;
  1049.     ic.dxDst = dxDst;
  1050.     ic.dyDst = dyDst;
  1051.     ic.hicDecompressor = hicDecomp;
  1052.  
  1053.     // note that ICM swaps round the length and pointer
  1054.     // length in lparam2, pointer in lparam1
  1055.     return ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, (DWORD_PTR)&ic, sizeof(ic));
  1056. }
  1057.  
  1058.  
  1059. /*
  1060.  *  ICDrawQuery()
  1061.  *
  1062.  *  determines if the compressor is willing to render the specified format.
  1063.  *
  1064.  */
  1065. #define ICDrawQuery(hic, lpbiInput) \
  1066.     ICSendMessage(hic, ICM_DRAW_QUERY, (DWORD_PTR)(LPVOID)(lpbiInput), 0L)
  1067.  
  1068. #define ICDrawChangePalette(hic, lpbiInput) \
  1069.     ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, (DWORD_PTR)(LPVOID)(lpbiInput), 0L)
  1070.  
  1071. #define ICGetBuffersWanted(hic, lpdwBuffers) \
  1072.     ICSendMessage(hic, ICM_GETBUFFERSWANTED, (DWORD_PTR)(LPVOID)(lpdwBuffers), 0)
  1073.  
  1074. #define ICDrawEnd(hic) \
  1075.     ICSendMessage(hic, ICM_DRAW_END, 0, 0)
  1076.  
  1077. #define ICDrawStart(hic) \
  1078.     ICSendMessage(hic, ICM_DRAW_START, 0, 0)
  1079.  
  1080. #define ICDrawStartPlay(hic, lFrom, lTo) \
  1081.     ICSendMessage(hic, ICM_DRAW_START_PLAY, (DWORD_PTR)(lFrom), (DWORD_PTR)(lTo))
  1082.  
  1083. #define ICDrawStop(hic) \
  1084.     ICSendMessage(hic, ICM_DRAW_STOP, 0, 0)
  1085.  
  1086. #define ICDrawStopPlay(hic) \
  1087.     ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0)
  1088.  
  1089. #define ICDrawGetTime(hic, lplTime) \
  1090.     ICSendMessage(hic, ICM_DRAW_GETTIME, (DWORD_PTR)(LPVOID)(lplTime), 0)
  1091.  
  1092. #define ICDrawSetTime(hic, lTime) \
  1093.     ICSendMessage(hic, ICM_DRAW_SETTIME, (DWORD_PTR)lTime, 0)
  1094.  
  1095. #define ICDrawRealize(hic, hdc, fBackground) \
  1096.     ICSendMessage(hic, ICM_DRAW_REALIZE, (DWORD_PTR)(UINT_PTR)(HDC)(hdc), (DWORD_PTR)(BOOL)(fBackground))
  1097.  
  1098. #define ICDrawFlush(hic) \
  1099.     ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0)
  1100.  
  1101. #define ICDrawRenderBuffer(hic) \
  1102.     ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0)
  1103.  
  1104. /************************************************************************
  1105.  
  1106.     Status callback functions
  1107.  
  1108. ************************************************************************/
  1109.  
  1110. /*
  1111.  *  ICSetStatusProc()
  1112.  *
  1113.  *  Set the status callback function
  1114.  *
  1115.  */
  1116.  
  1117.  
  1118. // ICMessage is not supported on NT
  1119. static __inline LRESULT VFWAPI
  1120. ICSetStatusProc(
  1121.             HIC hic,
  1122.             DWORD dwFlags,
  1123.             LRESULT lParam,
  1124.             LONG (CALLBACK *fpfnStatus)(LPARAM, UINT, LONG) )
  1125. {
  1126.     ICSETSTATUSPROC ic;
  1127.  
  1128.     ic.dwFlags = dwFlags;
  1129.     ic.lParam = lParam;
  1130.     ic.Status = fpfnStatus;
  1131.  
  1132.     // note that ICM swaps round the length and pointer
  1133.     // length in lparam2, pointer in lparam1
  1134.     return ICSendMessage(hic, ICM_SET_STATUS_PROC, (DWORD_PTR)&ic, sizeof(ic));
  1135. }
  1136.  
  1137.  
  1138. /************************************************************************
  1139.  
  1140. helper routines for DrawDib and MCIAVI...
  1141.  
  1142. ************************************************************************/
  1143.  
  1144. #define ICDecompressOpen(fccType, fccHandler, lpbiIn, lpbiOut) \
  1145.     ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS)
  1146.  
  1147. #define ICDrawOpen(fccType, fccHandler, lpbiIn) \
  1148.     ICLocate(fccType, fccHandler, lpbiIn, NULL, ICMODE_DRAW)
  1149.  
  1150. HIC
  1151. VFWAPI
  1152. ICLocate(
  1153.     IN DWORD fccType,
  1154.     IN DWORD fccHandler,
  1155.     IN LPBITMAPINFOHEADER lpbiIn,
  1156.     IN LPBITMAPINFOHEADER lpbiOut,
  1157.     IN WORD wFlags
  1158.     );
  1159.  
  1160. HIC
  1161. VFWAPI
  1162. ICGetDisplayFormat(
  1163.     IN HIC hic,
  1164.     IN LPBITMAPINFOHEADER lpbiIn,
  1165.     OUT LPBITMAPINFOHEADER lpbiOut,
  1166.     IN int BitDepth,
  1167.     IN int dx,
  1168.     IN int dy
  1169.     );
  1170.  
  1171. /************************************************************************
  1172. Higher level functions
  1173. ************************************************************************/
  1174.  
  1175. HANDLE
  1176. VFWAPI
  1177. ICImageCompress(
  1178.     IN HIC                 hic,        // compressor to use
  1179.     IN UINT                uiFlags,    // flags (none yet)
  1180.     IN LPBITMAPINFO        lpbiIn,     // format to compress from
  1181.     IN LPVOID              lpBits,     // data to compress
  1182.     IN LPBITMAPINFO        lpbiOut,    // compress to this (NULL ==> default)
  1183.     IN LONG                lQuality,   // quality to use
  1184.     IN OUT LONG FAR *      plSize      // compress to this size (0=whatever)
  1185.     );
  1186.  
  1187. HANDLE
  1188. VFWAPI
  1189. ICImageDecompress(
  1190.     IN HIC                 hic,        // compressor to use
  1191.     IN UINT                uiFlags,    // flags (none yet)
  1192.     IN LPBITMAPINFO        lpbiIn,     // format to decompress from
  1193.     IN LPVOID              lpBits,     // data to decompress
  1194.     IN LPBITMAPINFO        lpbiOut     // decompress to this (NULL ==> default)
  1195.     );
  1196.  
  1197. //
  1198. // Structure used by ICSeqCompressFrame and ICCompressorChoose routines
  1199. // Make sure this matches the autodoc in icm.c!
  1200. //
  1201. typedef struct {
  1202.     LONG        cbSize;        // set to sizeof(COMPVARS) before
  1203.                     // calling ICCompressorChoose
  1204.     DWORD        dwFlags;    // see below...
  1205.     HIC            hic;        // HIC of chosen compressor
  1206.     DWORD               fccType;    // basically ICTYPE_VIDEO
  1207.     DWORD               fccHandler;    // handler of chosen compressor or
  1208.                     // "" or "DIB "
  1209.     LPBITMAPINFO    lpbiIn;        // input format
  1210.     LPBITMAPINFO    lpbiOut;    // output format - will compress to this
  1211.     LPVOID        lpBitsOut;
  1212.     LPVOID        lpBitsPrev;
  1213.     LONG        lFrame;
  1214.     LONG        lKey;        // key frames how often?
  1215.     LONG        lDataRate;    // desired data rate KB/Sec
  1216.     LONG        lQ;        // desired quality
  1217.     LONG        lKeyCount;
  1218.     LPVOID        lpState;    // state of compressor
  1219.     LONG        cbState;    // size of the state
  1220. } COMPVARS, FAR *PCOMPVARS;
  1221.  
  1222. // FLAGS for dwFlags element of COMPVARS structure:
  1223. // set this flag if you initialize COMPVARS before calling ICCompressorChoose
  1224. #define ICMF_COMPVARS_VALID    0x00000001    // COMPVARS contains valid data
  1225.  
  1226. //
  1227. //  allows user to choose compressor, quality etc...
  1228. //
  1229. BOOL
  1230. VFWAPI
  1231. ICCompressorChoose(
  1232.     IN     HWND        hwnd,               // parent window for dialog
  1233.     IN     UINT        uiFlags,            // flags
  1234.     IN     LPVOID      pvIn,               // input format (optional)
  1235.     IN     LPVOID      lpData,             // input data (optional)
  1236.     IN OUT PCOMPVARS   pc,                 // data about the compressor/dlg
  1237.     IN     LPSTR       lpszTitle           // dialog title (optional)
  1238.     );
  1239.  
  1240. // defines for uiFlags
  1241. #define ICMF_CHOOSE_KEYFRAME    0x0001    // show KeyFrame Every box
  1242. #define ICMF_CHOOSE_DATARATE    0x0002    // show DataRate box
  1243. #define ICMF_CHOOSE_PREVIEW    0x0004    // allow expanded preview dialog
  1244. #define ICMF_CHOOSE_ALLCOMPRESSORS    0x0008    // don't only show those that
  1245.                         // can handle the input format
  1246.                         // or input data
  1247.  
  1248. BOOL
  1249. VFWAPI
  1250. ICSeqCompressFrameStart(
  1251.     IN PCOMPVARS pc,
  1252.     IN LPBITMAPINFO lpbiIn
  1253.     );
  1254.  
  1255. void
  1256. VFWAPI
  1257. ICSeqCompressFrameEnd(
  1258.     IN PCOMPVARS pc
  1259.     );
  1260.  
  1261. LPVOID
  1262. VFWAPI
  1263. ICSeqCompressFrame(
  1264.     IN  PCOMPVARS               pc,         // set by ICCompressorChoose
  1265.     IN  UINT                    uiFlags,    // flags
  1266.     IN  LPVOID                  lpBits,     // input DIB bits
  1267.     OUT BOOL FAR                *pfKey,     // did it end up being a key frame?
  1268.     IN OUT LONG FAR             *plSize     // size to compress to/of returned image
  1269.     );
  1270.  
  1271. void
  1272. VFWAPI
  1273. ICCompressorFree(
  1274.     IN PCOMPVARS pc
  1275.     );
  1276.  
  1277. #endif  /* NOCOMPMAN */
  1278.  
  1279. /**************************************************************************
  1280.  *
  1281.  *  DRAWDIB - Routines for drawing to the display.
  1282.  *
  1283.  *************************************************************************/
  1284.  
  1285. #ifndef NODRAWDIB
  1286.  
  1287. typedef HANDLE HDRAWDIB; /* hdd */
  1288.  
  1289. /*********************************************************************
  1290.  
  1291.   DrawDib Flags
  1292.  
  1293. **********************************************************************/
  1294. #define DDF_0001            0x0001          /* ;Internal */
  1295. #define DDF_UPDATE          0x0002          /* re-draw the last DIB */
  1296. #define DDF_SAME_HDC        0x0004          /* HDC same as last call (all setup) */
  1297. #define DDF_SAME_DRAW       0x0008          /* draw params are the same */
  1298. #define DDF_DONTDRAW        0x0010          /* dont draw frame, just decompress */
  1299. #define DDF_ANIMATE         0x0020          /* allow palette animation */
  1300. #define DDF_BUFFER          0x0040          /* always buffer image */
  1301. #define DDF_JUSTDRAWIT      0x0080          /* just draw it with GDI */
  1302. #define DDF_FULLSCREEN      0x0100          /* use DisplayDib */
  1303. #define DDF_BACKGROUNDPAL   0x0200        /* Realize palette in background */
  1304. #define DDF_NOTKEYFRAME     0x0400          /* this is a partial frame update, hint */
  1305. #define DDF_HURRYUP         0x0800          /* hurry up please! */
  1306. #define DDF_HALFTONE        0x1000          /* always halftone */
  1307. #define DDF_2000            0x2000          /* ;Internal */
  1308.  
  1309. #define DDF_PREROLL         DDF_DONTDRAW    /* Builing up a non-keyframe */
  1310. #define DDF_SAME_DIB        DDF_SAME_DRAW
  1311. #define DDF_SAME_SIZE       DDF_SAME_DRAW
  1312.  
  1313. /*********************************************************************
  1314.  
  1315.     DrawDib functions
  1316.     
  1317. *********************************************************************/
  1318. /*                            // ;Internal
  1319. **  DrawDibInit()                    // ;Internal
  1320. **                            // ;Internal
  1321. */                            // ;Internal
  1322. extern BOOL VFWAPI DrawDibInit(void);            // ;Internal
  1323.                             // ;Internal
  1324. /*
  1325. **  DrawDibOpen()
  1326. **
  1327. */
  1328. extern HDRAWDIB VFWAPI DrawDibOpen(void);
  1329.  
  1330. /*
  1331. **  DrawDibClose()
  1332. **
  1333. */
  1334. extern
  1335. BOOL
  1336. VFWAPI
  1337. DrawDibClose(
  1338.     IN HDRAWDIB hdd
  1339.     );
  1340.  
  1341. /*
  1342. ** DrawDibGetBuffer()
  1343. **
  1344. */
  1345. extern
  1346. LPVOID
  1347. VFWAPI
  1348. DrawDibGetBuffer(
  1349.     IN HDRAWDIB hdd,
  1350.     OUT LPBITMAPINFOHEADER lpbi,
  1351.     IN DWORD dwSize,
  1352.     IN DWORD dwFlags
  1353.     );
  1354.  
  1355. /*                            // ;Internal
  1356. **  DrawDibError()                    // ;Internal
  1357. */                            // ;Internal
  1358. extern UINT VFWAPI DrawDibError(HDRAWDIB hdd);        // ;Internal
  1359.                             // ;Internal
  1360. /*
  1361. **  DrawDibGetPalette()
  1362. **
  1363. **  get the palette used for drawing DIBs
  1364. **
  1365. */
  1366. extern
  1367. HPALETTE
  1368. VFWAPI
  1369. DrawDibGetPalette(
  1370.     IN HDRAWDIB hdd
  1371.     );
  1372.  
  1373.  
  1374. /*
  1375. **  DrawDibSetPalette()
  1376. **
  1377. **  get the palette used for drawing DIBs
  1378. **
  1379. */
  1380. extern
  1381. BOOL
  1382. VFWAPI
  1383. DrawDibSetPalette(
  1384.     IN HDRAWDIB hdd,
  1385.     IN HPALETTE hpal
  1386.     );
  1387.  
  1388. /*
  1389. **  DrawDibChangePalette()
  1390. */
  1391. extern
  1392. BOOL
  1393. VFWAPI
  1394. DrawDibChangePalette(
  1395.     IN HDRAWDIB hdd,
  1396.     IN int iStart,
  1397.     IN int iLen,
  1398.     IN LPPALETTEENTRY lppe
  1399.     );
  1400.  
  1401. /*
  1402. **  DrawDibRealize()
  1403. **
  1404. **  realize the palette in a HDD
  1405. **
  1406. */
  1407. extern
  1408. UINT
  1409. VFWAPI
  1410. DrawDibRealize(
  1411.     IN HDRAWDIB hdd,
  1412.     IN HDC hdc,
  1413.     IN BOOL fBackground
  1414.     );
  1415.  
  1416. /*
  1417. **  DrawDibStart()
  1418. **
  1419. **  start of streaming playback
  1420. **
  1421. */
  1422. extern
  1423. BOOL
  1424. VFWAPI
  1425. DrawDibStart(
  1426.     IN HDRAWDIB hdd,
  1427.     IN DWORD rate
  1428.     );
  1429.  
  1430. /*
  1431. **  DrawDibStop()
  1432. **
  1433. **  start of streaming playback
  1434. **
  1435. */
  1436. extern
  1437. BOOL
  1438. VFWAPI
  1439. DrawDibStop(
  1440.     IN HDRAWDIB hdd
  1441.     );
  1442.  
  1443. /*
  1444. **  DrawDibBegin()
  1445. **
  1446. **  prepare to draw
  1447. **
  1448. */
  1449. extern
  1450. BOOL
  1451. VFWAPI
  1452. DrawDibBegin(
  1453.     IN HDRAWDIB hdd,
  1454.     IN HDC      hdc,
  1455.     IN int      dxDst,
  1456.     IN int      dyDst,
  1457.     IN LPBITMAPINFOHEADER lpbi,
  1458.     IN int      dxSrc,
  1459.     IN int      dySrc,
  1460.     IN UINT     wFlags
  1461.     );
  1462.  
  1463. /*
  1464. **  DrawDibDraw()
  1465. **
  1466. **  actualy draw a DIB to the screen.
  1467. **
  1468. */
  1469. extern
  1470. BOOL
  1471. VFWAPI
  1472. DrawDibDraw(
  1473.     IN HDRAWDIB hdd,
  1474.     IN HDC      hdc,
  1475.     IN int      xDst,
  1476.     IN int      yDst,
  1477.     IN int      dxDst,
  1478.     IN int      dyDst,
  1479.     IN LPBITMAPINFOHEADER lpbi,
  1480.     IN LPVOID   lpBits,
  1481.     IN int      xSrc,
  1482.     IN int      ySrc,
  1483.     IN int      dxSrc,
  1484.     IN int      dySrc,
  1485.     IN UINT     wFlags
  1486.     );
  1487.  
  1488. /*
  1489. **  DrawDibUpdate()
  1490. **
  1491. **  redraw the last image (may only be valid with DDF_BUFFER)
  1492. */
  1493. #define DrawDibUpdate(hdd, hdc, x, y) \
  1494.         DrawDibDraw(hdd, hdc, x, y, 0, 0, NULL, NULL, 0, 0, 0, 0, DDF_UPDATE)
  1495.  
  1496. /*
  1497. **  DrawDibEnd()
  1498. */
  1499. extern
  1500. BOOL
  1501. VFWAPI
  1502. DrawDibEnd(
  1503.     IN HDRAWDIB hdd
  1504.     );
  1505.  
  1506. /*
  1507. **  DrawDibTime()  [for debugging purposes only]
  1508. */
  1509. typedef struct {
  1510.     LONG    timeCount;
  1511.     LONG    timeDraw;
  1512.     LONG    timeDecompress;
  1513.     LONG    timeDither;
  1514.     LONG    timeStretch;
  1515.     LONG    timeBlt;
  1516.     LONG    timeSetDIBits;
  1517. }   DRAWDIBTIME, FAR *LPDRAWDIBTIME;
  1518.  
  1519. BOOL
  1520. VFWAPI
  1521. DrawDibTime(
  1522.     IN HDRAWDIB hdd,
  1523.     OUT LPDRAWDIBTIME lpddtime
  1524.     );
  1525.  
  1526. /* display profiling */
  1527. #define PD_CAN_DRAW_DIB         0x0001      /* if you can draw at all */
  1528. #define PD_CAN_STRETCHDIB       0x0002      /* basicly RC_STRETCHDIB */
  1529. #define PD_STRETCHDIB_1_1_OK    0x0004      /* is it fast? */
  1530. #define PD_STRETCHDIB_1_2_OK    0x0008      /* ... */
  1531. #define PD_STRETCHDIB_1_N_OK    0x0010      /* ... */
  1532.  
  1533. LRESULT
  1534. VFWAPI
  1535. DrawDibProfileDisplay(
  1536.     IN LPBITMAPINFOHEADER lpbi
  1537.     );
  1538.  
  1539. #endif  /* NODRAWDIB */
  1540.  
  1541. /****************************************************************************
  1542.  *
  1543.  *  AVIFMT - AVI file format definitions
  1544.  *
  1545.  ****************************************************************************/
  1546.  
  1547. #ifndef NOAVIFMT
  1548.     #ifndef _INC_MMSYSTEM
  1549.         typedef DWORD FOURCC;
  1550.     #endif
  1551. #ifdef _MSC_VER
  1552. #pragma warning(disable:4200)
  1553. #endif
  1554.  
  1555. /* The following is a short description of the AVI file format.  Please
  1556.  * see the accompanying documentation for a full explanation.
  1557.  *
  1558.  * An AVI file is the following RIFF form:
  1559.  *
  1560.  *    RIFF('AVI'
  1561.  *          LIST('hdrl'
  1562.  *            avih(<MainAVIHeader>)
  1563.  *                  LIST ('strl'
  1564.  *                      strh(<Stream header>)
  1565.  *                      strf(<Stream format>)
  1566.  *                      ... additional header data
  1567.  *            LIST('movi'    
  1568.  *            { LIST('rec'
  1569.  *                    SubChunk...
  1570.  *                 )
  1571.  *                | SubChunk } ....    
  1572.  *            )
  1573.  *            [ <AVIIndex> ]
  1574.  *      )
  1575.  *
  1576.  *    The main file header specifies how many streams are present.  For
  1577.  *    each one, there must be a stream header chunk and a stream format
  1578.  *    chunk, enlosed in a 'strl' LIST chunk.  The 'strf' chunk contains
  1579.  *    type-specific format information; for a video stream, this should
  1580.  *    be a BITMAPINFO structure, including palette.  For an audio stream,
  1581.  *    this should be a WAVEFORMAT (or PCMWAVEFORMAT) structure.
  1582.  *
  1583.  *    The actual data is contained in subchunks within the 'movi' LIST
  1584.  *    chunk.  The first two characters of each data chunk are the
  1585.  *    stream number with which that data is associated.
  1586.  *
  1587.  *    Some defined chunk types:
  1588.  *           Video Streams:
  1589.  *                  ##db:    RGB DIB bits
  1590.  *                  ##dc:    RLE8 compressed DIB bits
  1591.  *                  ##pc:    Palette Change
  1592.  *
  1593.  *           Audio Streams:
  1594.  *                  ##wb:    waveform audio bytes
  1595.  *
  1596.  * The grouping into LIST 'rec' chunks implies only that the contents of
  1597.  *   the chunk should be read into memory at the same time.  This
  1598.  *   grouping is used for files specifically intended to be played from
  1599.  *   CD-ROM.
  1600.  *
  1601.  * The index chunk at the end of the file should contain one entry for
  1602.  *   each data chunk in the file.
  1603.  *
  1604.  * Limitations for the current software:
  1605.  *    Only one video stream and one audio stream are allowed.
  1606.  *    The streams must start at the beginning of the file.
  1607.  *
  1608.  *
  1609.  * To register codec types please obtain a copy of the Multimedia
  1610.  * Developer Registration Kit from:
  1611.  *
  1612.  *  Microsoft Corporation
  1613.  *  Multimedia Systems Group
  1614.  *  Product Marketing
  1615.  *  One Microsoft Way
  1616.  *  Redmond, WA 98052-6399
  1617.  *
  1618.  */
  1619.  
  1620.  
  1621. #ifndef mmioFOURCC
  1622. #define mmioFOURCC( ch0, ch1, ch2, ch3 )                \
  1623.         ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
  1624.         ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  1625. #endif
  1626.  
  1627. /* Macro to make a TWOCC out of two characters */
  1628. #ifndef aviTWOCC
  1629. #define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
  1630. #endif
  1631.  
  1632. typedef WORD TWOCC;
  1633.  
  1634. /* form types, list types, and chunk types */
  1635. #define formtypeAVI             mmioFOURCC('A', 'V', 'I', ' ')
  1636. #define listtypeAVIHEADER       mmioFOURCC('h', 'd', 'r', 'l')
  1637. #define ckidAVIMAINHDR          mmioFOURCC('a', 'v', 'i', 'h')
  1638. #define listtypeSTREAMHEADER    mmioFOURCC('s', 't', 'r', 'l')
  1639. #define ckidSTREAMHEADER        mmioFOURCC('s', 't', 'r', 'h')
  1640. #define ckidSTREAMFORMAT        mmioFOURCC('s', 't', 'r', 'f')
  1641. #define ckidSTREAMHANDLERDATA   mmioFOURCC('s', 't', 'r', 'd')
  1642. #define ckidSTREAMNAME        mmioFOURCC('s', 't', 'r', 'n')
  1643.  
  1644. #define listtypeAVIMOVIE        mmioFOURCC('m', 'o', 'v', 'i')
  1645. #define listtypeAVIRECORD       mmioFOURCC('r', 'e', 'c', ' ')
  1646.  
  1647. #define ckidAVINEWINDEX         mmioFOURCC('i', 'd', 'x', '1')
  1648.  
  1649. /*
  1650. ** Stream types for the <fccType> field of the stream header.
  1651. */
  1652. #define streamtypeVIDEO         mmioFOURCC('v', 'i', 'd', 's')
  1653. #define streamtypeAUDIO         mmioFOURCC('a', 'u', 'd', 's')
  1654. #define streamtypeMIDI        mmioFOURCC('m', 'i', 'd', 's')
  1655. #define streamtypeTEXT          mmioFOURCC('t', 'x', 't', 's')
  1656.  
  1657. /* Basic chunk types */
  1658. #define cktypeDIBbits           aviTWOCC('d', 'b')
  1659. #define cktypeDIBcompressed     aviTWOCC('d', 'c')
  1660. #define cktypePALchange         aviTWOCC('p', 'c')
  1661. #define cktypeWAVEbytes         aviTWOCC('w', 'b')
  1662.  
  1663. /* Chunk id to use for extra chunks for padding. */
  1664. #define ckidAVIPADDING          mmioFOURCC('J', 'U', 'N', 'K')
  1665.  
  1666.  
  1667. /*
  1668. ** Useful macros
  1669. **
  1670. ** Warning: These are nasty macro, and MS C 6.0 compiles some of them
  1671. ** incorrectly if optimizations are on.  Ack.
  1672. */
  1673.  
  1674. /* Macro to get stream number out of a FOURCC ckid */
  1675. #define FromHex(n)    (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0'))
  1676. #define StreamFromFOURCC(fcc) ((WORD) ((FromHex(LOBYTE(LOWORD(fcc))) << 4) + \
  1677.                                              (FromHex(HIBYTE(LOWORD(fcc))))))
  1678.  
  1679. /* Macro to get TWOCC chunk type out of a FOURCC ckid */
  1680. #define TWOCCFromFOURCC(fcc)    HIWORD(fcc)
  1681.  
  1682. /* Macro to make a ckid for a chunk out of a TWOCC and a stream number
  1683. ** from 0-255.
  1684. */
  1685. #define ToHex(n)    ((BYTE) (((n) > 9) ? ((n) - 10 + 'A') : ((n) + '0')))
  1686. #define MAKEAVICKID(tcc, stream) \
  1687.         MAKELONG((ToHex((stream) & 0x0f) << 8) | \
  1688.                 (ToHex(((stream) & 0xf0) >> 4)), tcc)
  1689.  
  1690.  
  1691. /*
  1692. ** Main AVI File Header
  1693. */    
  1694.         
  1695. /* flags for use in <dwFlags> in AVIFileHdr */
  1696. #define AVIF_HASINDEX        0x00000010    // Index at end of file?
  1697. #define AVIF_MUSTUSEINDEX    0x00000020
  1698. #define AVIF_ISINTERLEAVED    0x00000100
  1699. #define AVIF_WASCAPTUREFILE    0x00010000
  1700. #define AVIF_COPYRIGHTED    0x00020000
  1701.  
  1702. /* The AVI File Header LIST chunk should be padded to this size */
  1703. #define AVI_HEADERSIZE  2048                    // size of AVI header list
  1704.  
  1705. typedef struct
  1706. {
  1707.     DWORD        dwMicroSecPerFrame;    // frame display rate (or 0L)
  1708.     DWORD        dwMaxBytesPerSec;    // max. transfer rate
  1709.     DWORD        dwPaddingGranularity;    // pad to multiples of this
  1710.                                                 // size; normally 2K.
  1711.     DWORD        dwFlags;        // the ever-present flags
  1712.     DWORD        dwTotalFrames;        // # frames in file
  1713.     DWORD        dwInitialFrames;
  1714.     DWORD        dwStreams;
  1715.     DWORD        dwSuggestedBufferSize;
  1716.  
  1717.     DWORD        dwWidth;
  1718.     DWORD        dwHeight;
  1719.  
  1720.     DWORD        dwReserved[4];
  1721. } MainAVIHeader;
  1722.  
  1723.  
  1724. /*
  1725. ** Stream header
  1726. */
  1727.  
  1728. #define AVISF_DISABLED            0x00000001
  1729.  
  1730. #define AVISF_VIDEO_PALCHANGES        0x00010000
  1731.  
  1732. typedef struct {
  1733.     FOURCC        fccType;
  1734.     FOURCC        fccHandler;
  1735.     DWORD        dwFlags;    /* Contains AVITF_* flags */
  1736.     WORD        wPriority;
  1737.     WORD        wLanguage;
  1738.     DWORD        dwInitialFrames;
  1739.     DWORD        dwScale;    
  1740.     DWORD        dwRate;    /* dwRate / dwScale == samples/second */
  1741.     DWORD        dwStart;
  1742.     DWORD        dwLength; /* In units above... */
  1743.     DWORD        dwSuggestedBufferSize;
  1744.     DWORD        dwQuality;
  1745.     DWORD        dwSampleSize;
  1746.     RECT        rcFrame;
  1747. } AVIStreamHeader;
  1748.  
  1749. /* Flags for index */
  1750. #define AVIIF_LIST          0x00000001L // chunk is a 'LIST'
  1751. #define AVIIF_KEYFRAME      0x00000010L // this frame is a key frame.
  1752. #define AVIIF_FIRSTPART     0x00000020L // this frame is the start of a partial frame.
  1753. #define AVIIF_LASTPART      0x00000040L // this frame is the end of a partial frame.
  1754. #define AVIIF_MIDPART       (AVIIF_LASTPART|AVIIF_FIRSTPART)
  1755.  
  1756. #define AVIIF_NOTIME        0x00000100L // this frame doesn't take any time
  1757. #define AVIIF_COMPUSE       0x0FFF0000L // these bits are for compressor use
  1758.  
  1759. typedef struct
  1760. {
  1761.     DWORD        ckid;
  1762.     DWORD        dwFlags;
  1763.     DWORD        dwChunkOffset;        // Position of chunk
  1764.     DWORD        dwChunkLength;        // Length of chunk
  1765. } AVIINDEXENTRY;
  1766.  
  1767.  
  1768. /*
  1769. ** Palette change chunk
  1770. **
  1771. ** Used in video streams.
  1772. */
  1773. typedef struct
  1774. {
  1775.     BYTE        bFirstEntry;    /* first entry to change */
  1776.     BYTE        bNumEntries;    /* # entries to change (0 if 256) */
  1777.     WORD        wFlags;        /* Mostly to preserve alignment... */
  1778.     PALETTEENTRY    peNew[];    /* New color specifications */
  1779. } AVIPALCHANGE;
  1780.  
  1781. #endif /* NOAVIFMT */
  1782.  
  1783. #ifdef __cplusplus
  1784. } // extern "C"
  1785. #endif  /* __cplusplus */
  1786.  
  1787. /****************************************************************************
  1788.  *
  1789.  *  MMREG.H (standard include file for MM defines, like FOURCC and things)
  1790.  *
  1791.  ***************************************************************************/
  1792.  
  1793. #ifndef RC_INVOKED
  1794. #include "pshpack8.h"
  1795. #endif
  1796. #ifndef NOMMREG
  1797.     #include <mmreg.h>
  1798. #endif
  1799.  
  1800. #ifdef __cplusplus
  1801. extern "C" {            /* Assume C declarations for C++ */
  1802. #endif  /* __cplusplus */
  1803.  
  1804. /****************************************************************************
  1805.  *
  1806.  *  AVIFile - routines for reading/writing standard AVI files
  1807.  *
  1808.  ***************************************************************************/
  1809.  
  1810. #ifndef NOAVIFILE
  1811.  
  1812. /*
  1813.  * Ansi - Unicode thunking.
  1814.  *
  1815.  * Unicode or Ansi-only apps can call the avifile APIs.
  1816.  * any Win32 app who wants to use
  1817.  * any of the AVI COM interfaces must be UNICODE - the AVISTREAMINFO and
  1818.  * AVIFILEINFO structures used in the Info methods of these interfaces are
  1819.  * the unicode variants, and no thunking to or from ansi takes place
  1820.  * except in the AVIFILE api entrypoints.
  1821.  *
  1822.  * For Ansi/Unicode thunking: for each entrypoint or structure that
  1823.  * uses chars or strings, two versions are declared in the Win32 version,
  1824.  * ApiNameW and ApiNameA. The default name ApiName is #defined to one or
  1825.  * other of these depending on whether UNICODE is defined (during
  1826.  * compilation of the app that is including this header). The source will
  1827.  * contain ApiName and ApiNameA (with ApiName being the Win16 implementation,
  1828.  * and also #defined to ApiNameW, and ApiNameA being the thunk entrypoint).
  1829.  *
  1830.  */
  1831.  
  1832. #ifndef mmioFOURCC
  1833.     #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
  1834.     ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
  1835.     ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  1836. #endif
  1837.  
  1838. #ifndef streamtypeVIDEO
  1839. #define streamtypeVIDEO        mmioFOURCC('v', 'i', 'd', 's')
  1840. #define streamtypeAUDIO        mmioFOURCC('a', 'u', 'd', 's')
  1841. #define streamtypeMIDI        mmioFOURCC('m', 'i', 'd', 's')
  1842. #define streamtypeTEXT        mmioFOURCC('t', 'x', 't', 's')
  1843. #endif
  1844.  
  1845. #ifndef AVIIF_KEYFRAME
  1846. #define AVIIF_KEYFRAME      0x00000010L // this frame is a key frame.
  1847. #endif
  1848.  
  1849. // For GetFrame::SetFormat - use the best format for the display
  1850. #define AVIGETFRAMEF_BESTDISPLAYFMT    1
  1851.  
  1852. //
  1853. // Structures used by AVIStreamInfo & AVIFileInfo.
  1854. //
  1855. // These are related to, but not identical to, the header chunks
  1856. // in an AVI file.
  1857. //
  1858.  
  1859. /*
  1860.  *
  1861.  * --- AVISTREAMINFO ------------------------------------------------
  1862.  *
  1863.  * for Unicode/Ansi thunking we need to declare three versions of this!
  1864.  */
  1865. typedef struct _AVISTREAMINFOW {
  1866.     DWORD        fccType;
  1867.     DWORD               fccHandler;
  1868.     DWORD               dwFlags;        /* Contains AVITF_* flags */
  1869.     DWORD        dwCaps;
  1870.     WORD        wPriority;
  1871.     WORD        wLanguage;
  1872.     DWORD               dwScale;
  1873.     DWORD               dwRate; /* dwRate / dwScale == samples/second */
  1874.     DWORD               dwStart;
  1875.     DWORD               dwLength; /* In units above... */
  1876.     DWORD        dwInitialFrames;
  1877.     DWORD               dwSuggestedBufferSize;
  1878.     DWORD               dwQuality;
  1879.     DWORD               dwSampleSize;
  1880.     RECT                rcFrame;
  1881.     DWORD        dwEditCount;
  1882.     DWORD        dwFormatChangeCount;
  1883.     WCHAR        szName[64];
  1884. } AVISTREAMINFOW, FAR * LPAVISTREAMINFOW;
  1885.  
  1886. typedef struct _AVISTREAMINFOA {
  1887.     DWORD        fccType;
  1888.     DWORD               fccHandler;
  1889.     DWORD               dwFlags;        /* Contains AVITF_* flags */
  1890.     DWORD        dwCaps;
  1891.     WORD        wPriority;
  1892.     WORD        wLanguage;
  1893.     DWORD               dwScale;
  1894.     DWORD               dwRate; /* dwRate / dwScale == samples/second */
  1895.     DWORD               dwStart;
  1896.     DWORD               dwLength; /* In units above... */
  1897.     DWORD        dwInitialFrames;
  1898.     DWORD               dwSuggestedBufferSize;
  1899.     DWORD               dwQuality;
  1900.     DWORD               dwSampleSize;
  1901.     RECT                rcFrame;
  1902.     DWORD        dwEditCount;
  1903.     DWORD        dwFormatChangeCount;
  1904.     char        szName[64];
  1905. } AVISTREAMINFOA, FAR * LPAVISTREAMINFOA;
  1906.  
  1907. #ifdef UNICODE
  1908. #define AVISTREAMINFO    AVISTREAMINFOW
  1909. #define LPAVISTREAMINFO    LPAVISTREAMINFOW
  1910. #else
  1911. #define AVISTREAMINFO    AVISTREAMINFOA
  1912. #define LPAVISTREAMINFO    LPAVISTREAMINFOA
  1913. #endif
  1914.  
  1915.  
  1916. #define AVISTREAMINFO_DISABLED            0x00000001
  1917. #define AVISTREAMINFO_FORMATCHANGES        0x00010000
  1918.  
  1919. /*
  1920.  * --- AVIFILEINFO ----------------------------------------------------
  1921.  *
  1922.  */
  1923.  
  1924.  
  1925. typedef struct _AVIFILEINFOW {
  1926.     DWORD        dwMaxBytesPerSec;    // max. transfer rate
  1927.     DWORD        dwFlags;        // the ever-present flags
  1928.     DWORD        dwCaps;
  1929.     DWORD        dwStreams;
  1930.     DWORD        dwSuggestedBufferSize;
  1931.  
  1932.     DWORD        dwWidth;
  1933.     DWORD        dwHeight;
  1934.  
  1935.     DWORD        dwScale;    
  1936.     DWORD        dwRate;    /* dwRate / dwScale == samples/second */
  1937.     DWORD        dwLength;
  1938.  
  1939.     DWORD        dwEditCount;
  1940.  
  1941.     WCHAR        szFileType[64];        // descriptive string for file type?
  1942. } AVIFILEINFOW, FAR * LPAVIFILEINFOW;
  1943.  
  1944. typedef struct _AVIFILEINFOA {
  1945.     DWORD        dwMaxBytesPerSec;    // max. transfer rate
  1946.     DWORD        dwFlags;        // the ever-present flags
  1947.     DWORD        dwCaps;
  1948.     DWORD        dwStreams;
  1949.     DWORD        dwSuggestedBufferSize;
  1950.  
  1951.     DWORD        dwWidth;
  1952.     DWORD        dwHeight;
  1953.  
  1954.     DWORD        dwScale;    
  1955.     DWORD        dwRate;    /* dwRate / dwScale == samples/second */
  1956.     DWORD        dwLength;
  1957.  
  1958.     DWORD        dwEditCount;
  1959.  
  1960.     char        szFileType[64];        // descriptive string for file type?
  1961. } AVIFILEINFOA, FAR * LPAVIFILEINFOA;
  1962.  
  1963. #ifdef UNICODE
  1964. #define AVIFILEINFO    AVIFILEINFOW
  1965. #define LPAVIFILEINFO    LPAVIFILEINFOW
  1966. #else
  1967. #define AVIFILEINFO    AVIFILEINFOA
  1968. #define LPAVIFILEINFO    LPAVIFILEINFOA
  1969. #endif
  1970.  
  1971.  
  1972. // Flags for dwFlags
  1973. #define AVIFILEINFO_HASINDEX        0x00000010
  1974. #define AVIFILEINFO_MUSTUSEINDEX    0x00000020
  1975. #define AVIFILEINFO_ISINTERLEAVED    0x00000100
  1976. #define AVIFILEINFO_WASCAPTUREFILE    0x00010000
  1977. #define AVIFILEINFO_COPYRIGHTED        0x00020000
  1978.  
  1979. // Flags for dwCaps
  1980. #define AVIFILECAPS_CANREAD        0x00000001
  1981. #define AVIFILECAPS_CANWRITE        0x00000002
  1982. #define AVIFILECAPS_ALLKEYFRAMES    0x00000010
  1983. #define AVIFILECAPS_NOCOMPRESSION    0x00000020
  1984.  
  1985. typedef BOOL (FAR PASCAL * AVISAVECALLBACK)(int);
  1986.  
  1987. /************************************************************************/
  1988. /* Declaration for the AVICOMPRESSOPTIONS structure.  Make sure it     */
  1989. /* matches the AutoDoc in avisave.c !!!                                */
  1990. /************************************************************************/
  1991.  
  1992. typedef struct {
  1993.     DWORD    fccType;            /* stream type, for consistency */
  1994.     DWORD       fccHandler;                 /* compressor */
  1995.     DWORD       dwKeyFrameEvery;            /* keyframe rate */
  1996.     DWORD       dwQuality;                  /* compress quality 0-10,000 */
  1997.     DWORD       dwBytesPerSecond;           /* bytes per second */
  1998.     DWORD       dwFlags;                    /* flags... see below */
  1999.     LPVOID      lpFormat;                   /* save format */
  2000.     DWORD       cbFormat;
  2001.     LPVOID      lpParms;                    /* compressor options */
  2002.     DWORD       cbParms;
  2003.     DWORD       dwInterleaveEvery;          /* for non-video streams only */
  2004. } AVICOMPRESSOPTIONS, FAR *LPAVICOMPRESSOPTIONS;
  2005.  
  2006. //
  2007. // Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct
  2008. // Each of these flags determines if the appropriate field in the structure
  2009. // (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed
  2010. // attention to.  See the autodoc in avisave.c for details.
  2011. //
  2012. #define AVICOMPRESSF_INTERLEAVE        0x00000001    // interleave
  2013. #define AVICOMPRESSF_DATARATE        0x00000002    // use a data rate
  2014. #define AVICOMPRESSF_KEYFRAMES        0x00000004    // use keyframes
  2015. #define AVICOMPRESSF_VALID        0x00000008    // has valid data?
  2016.  
  2017. #ifdef __cplusplus
  2018. } // extern "C"
  2019. #endif  /* __cplusplus */
  2020.  
  2021. #include <ole2.h>
  2022.  
  2023. #ifdef __cplusplus
  2024. extern "C" {            /* Assume C declarations for C++ */
  2025. #endif  /* __cplusplus */
  2026.  
  2027. /*    -    -    -    -    -    -    -    -    */
  2028.  
  2029.  
  2030. /****** AVI Stream Interface *******************************************/
  2031.  
  2032. #undef  INTERFACE
  2033. #define INTERFACE   IAVIStream
  2034.  
  2035. DECLARE_INTERFACE_(IAVIStream, IUnknown)
  2036. {
  2037.     // *** IUnknown methods ***
  2038.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  2039.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  2040.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  2041.  
  2042.     // *** IAVIStream methods ***
  2043.     STDMETHOD(Create)      (THIS_ LPARAM lParam1, LPARAM lParam2) PURE ;
  2044.     STDMETHOD(Info)        (THIS_ AVISTREAMINFOW FAR * psi, LONG lSize) PURE ;
  2045.     STDMETHOD_(LONG, FindSample)(THIS_ LONG lPos, LONG lFlags) PURE ;
  2046.     STDMETHOD(ReadFormat)  (THIS_ LONG lPos,
  2047.                 LPVOID lpFormat, LONG FAR *lpcbFormat) PURE ;
  2048.     STDMETHOD(SetFormat)   (THIS_ LONG lPos,
  2049.                 LPVOID lpFormat, LONG cbFormat) PURE ;
  2050.     STDMETHOD(Read)        (THIS_ LONG lStart, LONG lSamples,
  2051.                 LPVOID lpBuffer, LONG cbBuffer,
  2052.                 LONG FAR * plBytes, LONG FAR * plSamples) PURE ;
  2053.     STDMETHOD(Write)       (THIS_ LONG lStart, LONG lSamples,
  2054.                 LPVOID lpBuffer, LONG cbBuffer,
  2055.                 DWORD dwFlags,
  2056.                 LONG FAR *plSampWritten,
  2057.                 LONG FAR *plBytesWritten) PURE ;
  2058.     STDMETHOD(Delete)      (THIS_ LONG lStart, LONG lSamples) PURE;
  2059.     STDMETHOD(ReadData)    (THIS_ DWORD fcc, LPVOID lp, LONG FAR *lpcb) PURE ;
  2060.     STDMETHOD(WriteData)   (THIS_ DWORD fcc, LPVOID lp, LONG cb) PURE ;
  2061. #ifdef _WIN32
  2062.     STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
  2063.                 LONG cbInfo) PURE;
  2064. #else
  2065.     STDMETHOD(Reserved1)            (THIS) PURE;
  2066.     STDMETHOD(Reserved2)            (THIS) PURE;
  2067.     STDMETHOD(Reserved3)            (THIS) PURE;
  2068.     STDMETHOD(Reserved4)            (THIS) PURE;
  2069.     STDMETHOD(Reserved5)            (THIS) PURE;
  2070. #endif
  2071. };
  2072.  
  2073. typedef       IAVIStream FAR* PAVISTREAM;
  2074.  
  2075.  
  2076. #undef  INTERFACE
  2077. #define INTERFACE   IAVIStreaming
  2078.  
  2079. DECLARE_INTERFACE_(IAVIStreaming, IUnknown)
  2080. {
  2081.     // *** IUnknown methods ***
  2082.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  2083.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  2084.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  2085.  
  2086.     // *** IAVIStreaming methods ***
  2087.     STDMETHOD(Begin) (THIS_
  2088.               LONG  lStart,            // start of what we expect
  2089.                             // to play
  2090.               LONG  lEnd,            // expected end, or -1
  2091.               LONG  lRate) PURE;        // Should this be a float?
  2092.     STDMETHOD(End)   (THIS) PURE;
  2093. };
  2094.  
  2095. typedef       IAVIStreaming FAR* PAVISTREAMING;
  2096.  
  2097.  
  2098. #undef  INTERFACE
  2099. #define INTERFACE   IAVIEditStream
  2100.  
  2101. DECLARE_INTERFACE_(IAVIEditStream, IUnknown)
  2102. {
  2103.     // *** IUnknown methods ***
  2104.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  2105.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  2106.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  2107.  
  2108.     // *** IAVIEditStream methods ***
  2109.     STDMETHOD(Cut) (THIS_ LONG FAR *plStart,
  2110.               LONG FAR *plLength,
  2111.               PAVISTREAM FAR * ppResult) PURE;
  2112.     STDMETHOD(Copy) (THIS_ LONG FAR *plStart,
  2113.                LONG FAR *plLength,
  2114.                PAVISTREAM FAR * ppResult) PURE;
  2115.     STDMETHOD(Paste) (THIS_ LONG FAR *plPos,
  2116.                 LONG FAR *plLength,
  2117.                 PAVISTREAM pstream,
  2118.                 LONG lStart,
  2119.                 LONG lEnd) PURE;
  2120.     STDMETHOD(Clone) (THIS_ PAVISTREAM FAR *ppResult) PURE;
  2121.     STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
  2122.                 LONG cbInfo) PURE;
  2123. };
  2124.  
  2125. typedef       IAVIEditStream FAR* PAVIEDITSTREAM;
  2126.  
  2127.  
  2128. /****** AVI File Interface *******************************************/
  2129.  
  2130.  
  2131. #undef  INTERFACE
  2132. #define INTERFACE   IAVIFile
  2133. #define PAVIFILE IAVIFile FAR*
  2134.  
  2135. DECLARE_INTERFACE_(IAVIFile, IUnknown)
  2136. {
  2137.     // *** IUnknown methods ***
  2138.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  2139.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  2140.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  2141.  
  2142.     // *** IAVIFile methods ***
  2143.     STDMETHOD(Info)                 (THIS_
  2144.                                      AVIFILEINFOW FAR * pfi,
  2145.                                      LONG lSize) PURE;
  2146.     STDMETHOD(GetStream)            (THIS_
  2147.                                      PAVISTREAM FAR * ppStream,
  2148.                      DWORD fccType,
  2149.                                      LONG lParam) PURE;
  2150.     STDMETHOD(CreateStream)         (THIS_
  2151.                                      PAVISTREAM FAR * ppStream,
  2152.                                      AVISTREAMINFOW FAR * psi) PURE;
  2153.     STDMETHOD(WriteData)            (THIS_
  2154.                                      DWORD ckid,
  2155.                                      LPVOID lpData,
  2156.                                      LONG cbData) PURE;
  2157.     STDMETHOD(ReadData)             (THIS_
  2158.                                      DWORD ckid,
  2159.                                      LPVOID lpData,
  2160.                                      LONG FAR *lpcbData) PURE;
  2161.     STDMETHOD(EndRecord)            (THIS) PURE;
  2162.     STDMETHOD(DeleteStream)         (THIS_
  2163.                      DWORD fccType,
  2164.                                      LONG lParam) PURE;
  2165. };
  2166.  
  2167. #undef PAVIFILE
  2168. typedef       IAVIFile FAR* PAVIFILE;
  2169.  
  2170. /****** GetFrame Interface *******************************************/
  2171.  
  2172. #undef  INTERFACE
  2173. #define INTERFACE   IGetFrame
  2174. #define PGETFRAME   IGetFrame FAR*
  2175.  
  2176. DECLARE_INTERFACE_(IGetFrame, IUnknown)
  2177. {
  2178.     // *** IUnknown methods ***
  2179.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  2180.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  2181.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  2182.  
  2183.     // *** IGetFrame methods ***
  2184.  
  2185.     STDMETHOD_(LPVOID,GetFrame) (THIS_ LONG lPos) PURE;
  2186. //  STDMETHOD_(LPVOID,GetFrameData) (THIS_ LONG lPos) PURE;
  2187.  
  2188.     STDMETHOD(Begin) (THIS_ LONG lStart, LONG lEnd, LONG lRate) PURE;
  2189.     STDMETHOD(End) (THIS) PURE;
  2190.  
  2191.     STDMETHOD(SetFormat) (THIS_ LPBITMAPINFOHEADER lpbi, LPVOID lpBits, int x, int y, int dx, int dy) PURE;
  2192.  
  2193. //  STDMETHOD(DrawFrameStart) (THIS) PURE;
  2194. //  STDMETHOD(DrawFrame) (THIS_ LONG lPos, HDC hdc, int x, int y, int dx, int dy) PURE;
  2195. //  STDMETHOD(DrawFrameEnd) (THIS) PURE;
  2196. };
  2197.  
  2198. #undef PGETFRAME
  2199. typedef IGetFrame FAR* PGETFRAME;
  2200.  
  2201. /****** GUIDs *******************************************/
  2202.  
  2203. #define DEFINE_AVIGUID(name, l, w1, w2) \
  2204.     DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
  2205.  
  2206. DEFINE_AVIGUID(IID_IAVIFile,            0x00020020, 0, 0);
  2207. DEFINE_AVIGUID(IID_IAVIStream,          0x00020021, 0, 0);
  2208. DEFINE_AVIGUID(IID_IAVIStreaming,       0x00020022, 0, 0);
  2209. DEFINE_AVIGUID(IID_IGetFrame,           0x00020023, 0, 0);
  2210. DEFINE_AVIGUID(IID_IAVIEditStream,      0x00020024, 0, 0);
  2211. #ifndef UNICODE
  2212. DEFINE_AVIGUID(CLSID_AVISimpleUnMarshal,        0x00020009, 0, 0);
  2213. #endif
  2214.  
  2215. DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
  2216.  
  2217. #define    AVIFILEHANDLER_CANREAD        0x0001
  2218. #define    AVIFILEHANDLER_CANWRITE        0x0002
  2219. #define    AVIFILEHANDLER_CANACCEPTNONRGB    0x0004
  2220.  
  2221. //
  2222. // functions
  2223. //
  2224.  
  2225. STDAPI_(void) AVIFileInit(void);   // Call this first!
  2226. STDAPI_(void) AVIFileExit(void);
  2227.  
  2228. STDAPI_(ULONG) AVIFileAddRef       (PAVIFILE pfile);
  2229. STDAPI_(ULONG) AVIFileRelease      (PAVIFILE pfile);
  2230.  
  2231. #ifdef _WIN32
  2232. STDAPI AVIFileOpenA       (PAVIFILE FAR * ppfile, LPCSTR szFile,
  2233.               UINT uMode, LPCLSID lpHandler);
  2234. STDAPI AVIFileOpenW       (PAVIFILE FAR * ppfile, LPCWSTR szFile,
  2235.               UINT uMode, LPCLSID lpHandler);
  2236. #ifdef UNICODE
  2237. #define AVIFileOpen      AVIFileOpenW    
  2238. #else
  2239. #define AVIFileOpen      AVIFileOpenA    
  2240. #endif
  2241. #else // win16
  2242. STDAPI AVIFileOpen       (PAVIFILE FAR * ppfile, LPCSTR szFile,
  2243.               UINT uMode, LPCLSID lpHandler);
  2244. #define AVIFileOpenW    AVIFileOpen        /* ;Internal */
  2245. #endif
  2246.  
  2247. #ifdef _WIN32
  2248. STDAPI AVIFileInfoW (PAVIFILE pfile, LPAVIFILEINFOW pfi, LONG lSize);
  2249. STDAPI AVIFileInfoA (PAVIFILE pfile, LPAVIFILEINFOA pfi, LONG lSize);
  2250. #ifdef UNICODE
  2251. #define AVIFileInfo    AVIFileInfoW
  2252. #else
  2253. #define AVIFileInfo    AVIFileInfoA
  2254. #endif
  2255. #else //win16 version
  2256. STDAPI AVIFileInfo (PAVIFILE pfile, LPAVIFILEINFO pfi, LONG lSize);
  2257. #define AVIFileInfoW AVIFileInfo        /* ;Internal */
  2258. #endif
  2259.  
  2260.  
  2261. STDAPI AVIFileGetStream     (PAVIFILE pfile, PAVISTREAM FAR * ppavi, DWORD fccType, LONG lParam);
  2262.  
  2263.  
  2264. #ifdef _WIN32
  2265. STDAPI AVIFileCreateStreamW (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOW FAR * psi);
  2266. STDAPI AVIFileCreateStreamA (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOA FAR * psi);
  2267. #ifdef UNICODE
  2268. #define AVIFileCreateStream    AVIFileCreateStreamW
  2269. #else
  2270. #define AVIFileCreateStream    AVIFileCreateStreamA
  2271. #endif
  2272. #else //win16 version
  2273. STDAPI AVIFileCreateStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFO FAR * psi);
  2274. #define AVIFileCreateStreamW AVIFileCreateStream        /* ;Internal */
  2275. #endif
  2276.  
  2277. STDAPI AVIFileWriteData    (PAVIFILE pfile,
  2278.                      DWORD ckid,
  2279.                      LPVOID lpData,
  2280.                      LONG cbData);
  2281. STDAPI AVIFileReadData    (PAVIFILE pfile,
  2282.                      DWORD ckid,
  2283.                      LPVOID lpData,
  2284.                      LONG FAR *lpcbData);
  2285. STDAPI AVIFileEndRecord    (PAVIFILE pfile);
  2286.  
  2287. STDAPI_(ULONG) AVIStreamAddRef       (PAVISTREAM pavi);
  2288. STDAPI_(ULONG) AVIStreamRelease      (PAVISTREAM pavi);
  2289.  
  2290. STDAPI AVIStreamInfoW (PAVISTREAM pavi, LPAVISTREAMINFOW psi, LONG lSize);
  2291. STDAPI AVIStreamInfoA (PAVISTREAM pavi, LPAVISTREAMINFOA psi, LONG lSize);
  2292. #ifdef UNICODE
  2293. #define AVIStreamInfo    AVIStreamInfoW
  2294. #else
  2295. #define AVIStreamInfo    AVIStreamInfoA
  2296. #endif
  2297.  
  2298. STDAPI_(LONG) AVIStreamFindSample(PAVISTREAM pavi, LONG lPos, LONG lFlags);
  2299. STDAPI AVIStreamReadFormat   (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG FAR *lpcbFormat);
  2300. STDAPI AVIStreamSetFormat    (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG cbFormat);
  2301. STDAPI AVIStreamReadData     (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG FAR *lpcb);
  2302. STDAPI AVIStreamWriteData    (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG cb);
  2303.  
  2304. STDAPI AVIStreamRead         (PAVISTREAM pavi,
  2305.                   LONG lStart,
  2306.                   LONG lSamples,
  2307.                   LPVOID lpBuffer,
  2308.                   LONG cbBuffer,
  2309.                   LONG FAR * plBytes,
  2310.                   LONG FAR * plSamples);
  2311. #define AVISTREAMREAD_CONVENIENT    (-1L)
  2312.  
  2313. STDAPI AVIStreamWrite        (PAVISTREAM pavi,
  2314.                   LONG lStart, LONG lSamples,
  2315.                   LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags,
  2316.                   LONG FAR *plSampWritten,
  2317.                   LONG FAR *plBytesWritten);
  2318.  
  2319. // Right now, these just use AVIStreamInfo() to get information, then
  2320. // return some of it.  Can they be more efficient?
  2321. STDAPI_(LONG) AVIStreamStart        (PAVISTREAM pavi);
  2322. STDAPI_(LONG) AVIStreamLength       (PAVISTREAM pavi);
  2323. STDAPI_(LONG) AVIStreamTimeToSample (PAVISTREAM pavi, LONG lTime);
  2324. STDAPI_(LONG) AVIStreamSampleToTime (PAVISTREAM pavi, LONG lSample);
  2325.  
  2326.  
  2327. STDAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LONG lRate);
  2328. STDAPI AVIStreamEndStreaming(PAVISTREAM pavi);
  2329.  
  2330. //
  2331. // helper functions for using IGetFrame
  2332. //
  2333. STDAPI_(PGETFRAME) AVIStreamGetFrameOpen(PAVISTREAM pavi,
  2334.                      LPBITMAPINFOHEADER lpbiWanted);
  2335. STDAPI_(LPVOID) AVIStreamGetFrame(PGETFRAME pg, LONG lPos);
  2336. STDAPI AVIStreamGetFrameClose(PGETFRAME pg);
  2337.  
  2338.  
  2339. // !!! We need some way to place an advise on a stream....
  2340. // STDAPI AVIStreamHasChanged   (PAVISTREAM pavi);
  2341.  
  2342.  
  2343.  
  2344. // Shortcut function
  2345. STDAPI AVIStreamOpenFromFileA(PAVISTREAM FAR *ppavi, LPCSTR szFile,
  2346.                  DWORD fccType, LONG lParam,
  2347.                  UINT mode, CLSID FAR *pclsidHandler);
  2348. STDAPI AVIStreamOpenFromFileW(PAVISTREAM FAR *ppavi, LPCWSTR szFile,
  2349.                  DWORD fccType, LONG lParam,
  2350.                  UINT mode, CLSID FAR *pclsidHandler);
  2351. #ifdef UNICODE
  2352. #define AVIStreamOpenFromFile    AVIStreamOpenFromFileW
  2353. #else
  2354. #define AVIStreamOpenFromFile    AVIStreamOpenFromFileA
  2355. #endif
  2356.  
  2357. // Use to create disembodied streams
  2358. STDAPI AVIStreamCreate(PAVISTREAM FAR *ppavi, LONG lParam1, LONG lParam2,
  2359.                CLSID FAR *pclsidHandler);
  2360.  
  2361.  
  2362.  
  2363. // PHANDLER    AVIAPI AVIGetHandler         (PAVISTREAM pavi, PAVISTREAMHANDLER psh);
  2364. // PAVISTREAM  AVIAPI AVIGetStream          (PHANDLER p);
  2365.  
  2366. //
  2367. // flags for AVIStreamFindSample
  2368. //
  2369. #define FIND_DIR        0x0000000FL     // direction
  2370. #define FIND_NEXT       0x00000001L     // go forward
  2371. #define FIND_PREV       0x00000004L     // go backward
  2372. #define FIND_FROM_START 0x00000008L     // start at the logical beginning
  2373.  
  2374. #define FIND_TYPE       0x000000F0L     // type mask
  2375. #define FIND_KEY        0x00000010L     // find key frame.
  2376. #define FIND_ANY        0x00000020L     // find any (non-empty) sample
  2377. #define FIND_FORMAT     0x00000040L     // find format change
  2378.  
  2379. #define FIND_RET        0x0000F000L     // return mask
  2380. #define FIND_POS        0x00000000L     // return logical position
  2381. #define FIND_LENGTH     0x00001000L     // return logical size
  2382. #define FIND_OFFSET     0x00002000L     // return physical position
  2383. #define FIND_SIZE       0x00003000L     // return physical size
  2384. #define FIND_INDEX      0x00004000L     // return physical index position
  2385.  
  2386.  
  2387. //
  2388. //  stuff to support backward compat.
  2389. //
  2390. #define AVIStreamFindKeyFrame AVIStreamFindSample
  2391. #define FindKeyFrame    FindSample
  2392.  
  2393. #define AVIStreamClose AVIStreamRelease
  2394. #define AVIFileClose   AVIFileRelease
  2395. #define AVIStreamInit  AVIFileInit
  2396. #define AVIStreamExit  AVIFileExit
  2397.  
  2398. #define SEARCH_NEAREST  FIND_PREV
  2399. #define SEARCH_BACKWARD FIND_PREV
  2400. #define SEARCH_FORWARD  FIND_NEXT
  2401. #define SEARCH_KEY      FIND_KEY
  2402. #define SEARCH_ANY      FIND_ANY
  2403.  
  2404. //
  2405. //  helper macros.
  2406. //
  2407. #define     AVIStreamSampleToSample(pavi1, pavi2, l) \
  2408.             AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2, l))
  2409.  
  2410. #define     AVIStreamNextSample(pavi, l) \
  2411.             AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_ANY)
  2412.  
  2413. #define     AVIStreamPrevSample(pavi, l) \
  2414.             AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_ANY)
  2415.  
  2416. #define     AVIStreamNearestSample(pavi, l) \
  2417.             AVIStreamFindSample(pavi,l,FIND_PREV|FIND_ANY)
  2418.  
  2419. #define     AVIStreamNextKeyFrame(pavi,l) \
  2420.             AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_KEY)
  2421.  
  2422. #define     AVIStreamPrevKeyFrame(pavi, l) \
  2423.             AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_KEY)
  2424.  
  2425. #define     AVIStreamNearestKeyFrame(pavi, l) \
  2426.             AVIStreamFindSample(pavi,l,FIND_PREV|FIND_KEY)
  2427.  
  2428. #define     AVIStreamIsKeyFrame(pavi, l) \
  2429.             (AVIStreamNearestKeyFrame(pavi,l) == l)
  2430.  
  2431. #define     AVIStreamPrevSampleTime(pavi, t) \
  2432.             AVIStreamSampleToTime(pavi, AVIStreamPrevSample(pavi,AVIStreamTimeToSample(pavi,t)))
  2433.  
  2434. #define     AVIStreamNextSampleTime(pavi, t) \
  2435.             AVIStreamSampleToTime(pavi, AVIStreamNextSample(pavi,AVIStreamTimeToSample(pavi,t)))
  2436.  
  2437. #define     AVIStreamNearestSampleTime(pavi, t) \
  2438.             AVIStreamSampleToTime(pavi, AVIStreamNearestSample(pavi,AVIStreamTimeToSample(pavi,t)))
  2439.  
  2440. #define     AVIStreamNextKeyFrameTime(pavi, t) \
  2441.             AVIStreamSampleToTime(pavi, AVIStreamNextKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  2442.  
  2443. #define     AVIStreamPrevKeyFrameTime(pavi, t) \
  2444.             AVIStreamSampleToTime(pavi, AVIStreamPrevKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  2445.  
  2446. #define     AVIStreamNearestKeyFrameTime(pavi, t) \
  2447.             AVIStreamSampleToTime(pavi, AVIStreamNearestKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
  2448.  
  2449. #define     AVIStreamStartTime(pavi) \
  2450.             AVIStreamSampleToTime(pavi, AVIStreamStart(pavi))
  2451.  
  2452. #define     AVIStreamLengthTime(pavi) \
  2453.             AVIStreamSampleToTime(pavi, AVIStreamLength(pavi))
  2454.  
  2455. #define     AVIStreamEnd(pavi) \
  2456.             (AVIStreamStart(pavi) + AVIStreamLength(pavi))
  2457.  
  2458. #define     AVIStreamEndTime(pavi) \
  2459.             AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi))
  2460.  
  2461. #define     AVIStreamSampleSize(pavi, lPos, plSize) \
  2462.         AVIStreamRead(pavi,lPos,1,NULL,0,plSize,NULL)
  2463.  
  2464. #define     AVIStreamFormatSize(pavi, lPos, plSize) \
  2465.             AVIStreamReadFormat(pavi,lPos,NULL,plSize)
  2466.  
  2467. #define     AVIStreamDataSize(pavi, fcc, plSize) \
  2468.             AVIStreamReadData(pavi,fcc,NULL,plSize)
  2469.  
  2470. /****************************************************************************
  2471.  *
  2472.  *  AVISave routines and structures
  2473.  *
  2474.  ***************************************************************************/
  2475.  
  2476. #ifndef comptypeDIB
  2477. #define comptypeDIB         mmioFOURCC('D', 'I', 'B', ' ')
  2478. #endif
  2479.  
  2480. STDAPI AVIMakeCompressedStream(
  2481.         PAVISTREAM FAR *        ppsCompressed,
  2482.         PAVISTREAM            ppsSource,
  2483.         AVICOMPRESSOPTIONS FAR *    lpOptions,
  2484.         CLSID FAR *pclsidHandler);
  2485.  
  2486. EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
  2487.         CLSID FAR *pclsidHandler,
  2488.         AVISAVECALLBACK     lpfnCallback,
  2489.         int                 nStreams,
  2490.         PAVISTREAM        pfile,
  2491.         LPAVICOMPRESSOPTIONS lpOptions,
  2492.         ...);
  2493.  
  2494. STDAPI AVISaveVA(LPCSTR               szFile,
  2495.         CLSID FAR *pclsidHandler,
  2496.         AVISAVECALLBACK     lpfnCallback,
  2497.         int                 nStreams,
  2498.         PAVISTREAM FAR *    ppavi,
  2499.         LPAVICOMPRESSOPTIONS FAR *plpOptions);
  2500. EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
  2501.         CLSID FAR *pclsidHandler,
  2502.         AVISAVECALLBACK     lpfnCallback,
  2503.         int                 nStreams,
  2504.         PAVISTREAM        pfile,
  2505.         LPAVICOMPRESSOPTIONS lpOptions,
  2506.         ...);
  2507.  
  2508. STDAPI AVISaveVW(LPCWSTR               szFile,
  2509.         CLSID FAR *pclsidHandler,
  2510.         AVISAVECALLBACK     lpfnCallback,
  2511.         int                 nStreams,
  2512.         PAVISTREAM FAR *    ppavi,
  2513.         LPAVICOMPRESSOPTIONS FAR *plpOptions);
  2514. #ifdef UNICODE
  2515. #define AVISave        AVISaveW
  2516. #define AVISaveV    AVISaveVW
  2517. #else
  2518. #define AVISave        AVISaveA
  2519. #define AVISaveV    AVISaveVA
  2520. #endif
  2521.  
  2522.  
  2523.  
  2524. STDAPI_(INT_PTR) AVISaveOptions(HWND hwnd,
  2525.                  UINT    uiFlags,
  2526.                  int    nStreams,
  2527.                  PAVISTREAM FAR *ppavi,
  2528.                  LPAVICOMPRESSOPTIONS FAR *plpOptions);
  2529.  
  2530. STDAPI AVISaveOptionsFree(int nStreams,
  2531.                  LPAVICOMPRESSOPTIONS FAR *plpOptions);
  2532.  
  2533. // FLAGS FOR uiFlags:
  2534. //
  2535. // Same as the flags for ICCompressorChoose (see compman.h)
  2536. // These determine what the compression options dialog for video streams
  2537. // will look like.
  2538.  
  2539. STDAPI AVIBuildFilterW(LPWSTR lpszFilter, LONG cbFilter, BOOL fSaving);
  2540. STDAPI AVIBuildFilterA(LPSTR lpszFilter, LONG cbFilter, BOOL fSaving);
  2541. #ifdef UNICODE
  2542. #define AVIBuildFilter    AVIBuildFilterW
  2543. #else
  2544. #define AVIBuildFilter    AVIBuildFilterA
  2545. #endif
  2546. STDAPI AVIMakeFileFromStreams(PAVIFILE FAR *    ppfile,
  2547.                    int        nStreams,
  2548.                    PAVISTREAM FAR *    papStreams);
  2549.  
  2550. STDAPI AVIMakeStreamFromClipboard(UINT cfFormat, HANDLE hGlobal, PAVISTREAM FAR *ppstream);
  2551.  
  2552. /****************************************************************************
  2553.  *
  2554.  *  Clipboard routines
  2555.  *
  2556.  ***************************************************************************/
  2557.  
  2558. STDAPI AVIPutFileOnClipboard(PAVIFILE pf);
  2559.  
  2560. STDAPI AVIGetFromClipboard(PAVIFILE FAR * lppf);
  2561.  
  2562. STDAPI AVIClearClipboard(void);
  2563.  
  2564. /****************************************************************************
  2565.  *
  2566.  *  Editing routines
  2567.  *
  2568.  ***************************************************************************/
  2569. STDAPI CreateEditableStream(
  2570.         PAVISTREAM FAR *        ppsEditable,
  2571.         PAVISTREAM            psSource);
  2572.  
  2573. STDAPI EditStreamCut(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
  2574.  
  2575. STDAPI EditStreamCopy(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
  2576.  
  2577. STDAPI EditStreamPaste(PAVISTREAM pavi, LONG FAR *plPos, LONG FAR *plLength, PAVISTREAM pstream, LONG lStart, LONG lEnd);
  2578.  
  2579. STDAPI EditStreamClone(PAVISTREAM pavi, PAVISTREAM FAR *ppResult);
  2580.  
  2581.  
  2582. STDAPI EditStreamSetNameA(PAVISTREAM pavi, LPCSTR lpszName);
  2583. STDAPI EditStreamSetNameW(PAVISTREAM pavi, LPCWSTR lpszName);
  2584. STDAPI EditStreamSetInfoW(PAVISTREAM pavi, LPAVISTREAMINFOW lpInfo, LONG cbInfo);
  2585. STDAPI EditStreamSetInfoA(PAVISTREAM pavi, LPAVISTREAMINFOA lpInfo, LONG cbInfo);
  2586. #ifdef UNICODE
  2587. #define EditStreamSetInfo    EditStreamSetInfoW
  2588. #define EditStreamSetName    EditStreamSetNameW
  2589. #else
  2590. #define EditStreamSetInfo    EditStreamSetInfoA
  2591. #define EditStreamSetName    EditStreamSetNameA
  2592. #endif
  2593.  
  2594. /*    -    -    -    -    -    -    -    -    */
  2595.  
  2596. #ifndef AVIERR_OK
  2597. #define AVIERR_OK               0L
  2598.  
  2599. #define MAKE_AVIERR(error)    MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error)
  2600.  
  2601. // !!! Questions to be answered:
  2602. // How can you get a string form of these errors?
  2603. // Which of these errors should be replaced by errors in SCODE.H?
  2604. #define AVIERR_UNSUPPORTED      MAKE_AVIERR(101)
  2605. #define AVIERR_BADFORMAT        MAKE_AVIERR(102)
  2606. #define AVIERR_MEMORY           MAKE_AVIERR(103)
  2607. #define AVIERR_INTERNAL         MAKE_AVIERR(104)
  2608. #define AVIERR_BADFLAGS         MAKE_AVIERR(105)
  2609. #define AVIERR_BADPARAM         MAKE_AVIERR(106)
  2610. #define AVIERR_BADSIZE          MAKE_AVIERR(107)
  2611. #define AVIERR_BADHANDLE        MAKE_AVIERR(108)
  2612. #define AVIERR_FILEREAD         MAKE_AVIERR(109)
  2613. #define AVIERR_FILEWRITE        MAKE_AVIERR(110)
  2614. #define AVIERR_FILEOPEN         MAKE_AVIERR(111)
  2615. #define AVIERR_COMPRESSOR       MAKE_AVIERR(112)
  2616. #define AVIERR_NOCOMPRESSOR     MAKE_AVIERR(113)
  2617. #define AVIERR_READONLY        MAKE_AVIERR(114)
  2618. #define AVIERR_NODATA        MAKE_AVIERR(115)
  2619. #define AVIERR_BUFFERTOOSMALL    MAKE_AVIERR(116)
  2620. #define AVIERR_CANTCOMPRESS    MAKE_AVIERR(117)
  2621. #define AVIERR_USERABORT        MAKE_AVIERR(198)
  2622. #define AVIERR_ERROR            MAKE_AVIERR(199)
  2623. #endif
  2624. #endif  /* NOAVIFILE */
  2625.  
  2626. /****************************************************************************
  2627.  *
  2628.  *  MCIWnd - Window class for MCI objects
  2629.  *
  2630.  ***************************************************************************/
  2631.  
  2632. #ifndef NOMCIWND
  2633. /*----------------------------------------------------------------------------*\
  2634.  *
  2635.  *  MCIWnd
  2636.  *
  2637.  *    MCIWnd window class header file.
  2638.  *
  2639.  *    the MCIWnd window class is a window class for controling MCI devices
  2640.  *    MCI devices include, wave files, midi files, AVI Video, cd audio,
  2641.  *    vcr, video disc, and others..
  2642.  *
  2643.  *    to learn more about MCI and mci command sets see the
  2644.  *    "Microsoft Multimedia Programmers's guide" in the Win31 SDK
  2645.  *
  2646.  *    the easiest use of the MCIWnd class is like so:
  2647.  *
  2648.  *          hwnd = MCIWndCreate(hwndParent, hInstance, 0, "chimes.wav");
  2649.  *          ...
  2650.  *          MCIWndPlay(hwnd);
  2651.  *          MCIWndStop(hwnd);
  2652.  *          MCIWndPause(hwnd);
  2653.  *          ....
  2654.  *          MCIWndDestroy(hwnd);
  2655.  *
  2656.  *    this will create a window with a play/pause, stop and a playbar
  2657.  *    and start the wave file playing.
  2658.  *
  2659.  *    mciwnd.h defines macros for all the most common MCI commands, but
  2660.  *    any string command can be used if needed.
  2661.  *
  2662.  *    Note: unlike the mciSendString() API, no alias or file name needs
  2663.  *    to be specifed, since the device to use is implied by the window handle.
  2664.  *
  2665.  *          MCIWndSendString(hwnd, "setaudio stream to 2");
  2666.  *
  2667.  *    (C) Copyright Microsoft Corp. 1991-1995.  All rights reserved.
  2668.  *
  2669.  *    You have a royalty-free right to use, modify, reproduce and
  2670.  *    distribute the Sample Files (and/or any modified version) in
  2671.  *    any way you find useful, provided that you agree that
  2672.  *    Microsoft has no warranty obligations or liability for any
  2673.  *    Sample Application Files.
  2674.  *
  2675.  *    If you did not get this from Microsoft Sources, then it may not be the
  2676.  *    most current version.  This sample code in particular will be updated
  2677.  *    and include more documentation.
  2678.  *
  2679.  *    Sources are:
  2680.  *       CompuServe: WINSDK forum, MDK section.
  2681.  *       Anonymous FTP from ftp.uu.net vendor\microsoft\multimedia
  2682.  *
  2683.  * WIN32:
  2684.  *
  2685.  *    MCIWnd supports both ansi and unicode interfaces. For any message that
  2686.  *    takes or returns a text string, two versions of the message are defined,
  2687.  *    appended with A or W for Ansi or Wide Char. The message or api itself
  2688.  *    is defined to be one or other of these depending on whether you have
  2689.  *    UNICODE defined in your application.
  2690.  *    Thus for the api MCIWndCreate, there are in fact two apis,
  2691.  *    MCIWndCreateA and MCIWndCreateW. If you call MCIWndCreate, this will be
  2692.  *    re-routed to MCIWndCreateA unless UNICODE is defined when building your
  2693.  *    application. In any one application, you can mix calls to the
  2694.  *    Ansi and Unicode entrypoints.
  2695.  *
  2696.  *    If you use SendMessage instead of the macros below such as MCIWndOpen(),
  2697.  *    you will see that the messages have changed for WIN32, to support Ansi
  2698.  *    and Unicode entrypoints. In particular, MCI_OPEN has been replaced by
  2699.  *    MCWNDM_OPENA, or MCIWNDM_OPENW (MCIWNDM_OPEN is defined to be one or
  2700.  *    other of these).
  2701.  *
  2702.  *    Also, note that the WIN32 implementation of MCIWnd uses UNICODE
  2703.  *    so all apis and messages supporting ANSI strings do so by mapping them
  2704.  *    UNICODE strings and then calling the corresponding UNICODE entrypoint.
  2705.  *
  2706.  *----------------------------------------------------------------------------*/
  2707.  
  2708. #ifdef __cplusplus
  2709. // MFC Redefines SendMessage, so make sure we get the global one....
  2710. #define MCIWndSM ::SendMessage  /* SendMessage in C++*/
  2711. #else
  2712. #define MCIWndSM SendMessage    /* SendMessage in C */
  2713. #endif  /* __cplusplus */
  2714. #define MCIWND_WINDOW_CLASS TEXT("MCIWndClass")
  2715. HWND
  2716. VFWAPIV
  2717. MCIWndCreateA(
  2718.     IN HWND hwndParent,
  2719.     IN HINSTANCE hInstance,
  2720.     IN DWORD dwStyle,
  2721.     IN LPCSTR szFile
  2722.     );
  2723.  
  2724. HWND
  2725. VFWAPIV
  2726. MCIWndCreateW(
  2727.     IN HWND hwndParent,
  2728.     IN HINSTANCE hInstance,
  2729.     IN DWORD dwStyle,
  2730.     IN LPCWSTR szFile
  2731.     );
  2732.  
  2733. #ifdef UNICODE
  2734. #define MCIWndCreate    MCIWndCreateW
  2735. #else
  2736. #define MCIWndCreate    MCIWndCreateA
  2737. #endif
  2738. BOOL VFWAPIV MCIWndRegisterClass(void);
  2739.  
  2740. // Flags for the MCIWndOpen command
  2741. #define MCIWNDOPENF_NEW                0x0001  // open a new file
  2742.  
  2743. // window styles
  2744. #define MCIWNDF_NOAUTOSIZEWINDOW    0x0001  // when movie size changes
  2745. #define MCIWNDF_NOPLAYBAR           0x0002  // no toolbar
  2746. #define MCIWNDF_NOAUTOSIZEMOVIE     0x0004  // when window size changes
  2747. #define MCIWNDF_NOMENU              0x0008  // no popup menu from RBUTTONDOWN
  2748. #define MCIWNDF_SHOWNAME            0x0010  // show name in caption
  2749. #define MCIWNDF_SHOWPOS             0x0020  // show position in caption
  2750. #define MCIWNDF_SHOWMODE            0x0040  // show mode in caption
  2751. #define MCIWNDF_SHOWALL             0x0070  // show all
  2752.  
  2753. #define MCIWNDF_NOTIFYMODE         0x0100  // tell parent of mode change
  2754. #define MCIWNDF_NOTIFYPOS          0x0200  // tell parent of pos change
  2755. #define MCIWNDF_NOTIFYSIZE         0x0400  // tell parent of size change
  2756. #define MCIWNDF_NOTIFYERROR        0x1000  // tell parent of an error
  2757. #define MCIWNDF_NOTIFYALL          0x1F00  // tell all
  2758.  
  2759. #define MCIWNDF_NOTIFYANSI       0x0080
  2760.  
  2761.  
  2762. // The MEDIA notification includes a text string.
  2763. // To receive notifications in ANSI instead of unicode set the
  2764. // MCIWNDF_NOTIFYANSI style bit. The macro below includes this bit
  2765. // by default unless you define UNICODE in your application.
  2766.  
  2767. #define MCIWNDF_NOTIFYMEDIAA       0x0880  // tell parent of media change
  2768. #define MCIWNDF_NOTIFYMEDIAW       0x0800  // tell parent of media change
  2769.  
  2770. #ifdef UNICODE
  2771. #define MCIWNDF_NOTIFYMEDIA         MCIWNDF_NOTIFYMEDIAW
  2772. #else
  2773. #define MCIWNDF_NOTIFYMEDIA         MCIWNDF_NOTIFYMEDIAA
  2774. #endif
  2775.  
  2776.  
  2777.  
  2778. #define MCIWNDF_RECORD              0x2000  // Give a record button
  2779. #define MCIWNDF_NOERRORDLG          0x4000  // Show Error Dlgs for MCI cmds?
  2780. #define MCIWNDF_NOOPEN            0x8000  // Don't allow user to open things
  2781.  
  2782.  
  2783.  
  2784.  
  2785. // can macros
  2786.  
  2787. #define MCIWndCanPlay(hwnd)         (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_PLAY,0,0)
  2788. #define MCIWndCanRecord(hwnd)       (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_RECORD,0,0)
  2789. #define MCIWndCanSave(hwnd)         (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_SAVE,0,0)
  2790. #define MCIWndCanWindow(hwnd)       (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_WINDOW,0,0)
  2791. #define MCIWndCanEject(hwnd)        (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_EJECT,0,0)
  2792. #define MCIWndCanConfig(hwnd)       (BOOL)MCIWndSM(hwnd,MCIWNDM_CAN_CONFIG,0,0)
  2793. #define MCIWndPaletteKick(hwnd)     (BOOL)MCIWndSM(hwnd,MCIWNDM_PALETTEKICK,0,0)
  2794.  
  2795. #define MCIWndSave(hwnd, szFile)    (LONG)MCIWndSM(hwnd, MCI_SAVE, 0, (LPARAM)(LPVOID)(szFile))
  2796. #define MCIWndSaveDialog(hwnd)      MCIWndSave(hwnd, -1)
  2797.  
  2798. // if you dont give a device it will use the current device....
  2799. #define MCIWndNew(hwnd, lp)         (LONG)MCIWndSM(hwnd, MCIWNDM_NEW, 0, (LPARAM)(LPVOID)(lp))
  2800.  
  2801. #define MCIWndRecord(hwnd)          (LONG)MCIWndSM(hwnd, MCI_RECORD, 0, 0)
  2802. #define MCIWndOpen(hwnd, sz, f)     (LONG)MCIWndSM(hwnd, MCIWNDM_OPEN, (WPARAM)(UINT)(f),(LPARAM)(LPVOID)(sz))
  2803. #define MCIWndOpenDialog(hwnd)      MCIWndOpen(hwnd, -1, 0)
  2804. #define MCIWndClose(hwnd)           (LONG)MCIWndSM(hwnd, MCI_CLOSE, 0, 0)
  2805. #define MCIWndPlay(hwnd)            (LONG)MCIWndSM(hwnd, MCI_PLAY, 0, 0)
  2806. #define MCIWndStop(hwnd)            (LONG)MCIWndSM(hwnd, MCI_STOP, 0, 0)
  2807. #define MCIWndPause(hwnd)           (LONG)MCIWndSM(hwnd, MCI_PAUSE, 0, 0)
  2808. #define MCIWndResume(hwnd)          (LONG)MCIWndSM(hwnd, MCI_RESUME, 0, 0)
  2809. #define MCIWndSeek(hwnd, lPos)      (LONG)MCIWndSM(hwnd, MCI_SEEK, 0, (LPARAM)(LONG)(lPos))
  2810. #define MCIWndEject(hwnd)           (LONG)MCIWndSM(hwnd, MCIWNDM_EJECT, 0, 0)
  2811.  
  2812. #define MCIWndHome(hwnd)            MCIWndSeek(hwnd, MCIWND_START)
  2813. #define MCIWndEnd(hwnd)             MCIWndSeek(hwnd, MCIWND_END)
  2814.  
  2815. #define MCIWndGetSource(hwnd, prc)  (LONG)MCIWndSM(hwnd, MCIWNDM_GET_SOURCE, 0, (LPARAM)(LPRECT)(prc))
  2816. #define MCIWndPutSource(hwnd, prc)  (LONG)MCIWndSM(hwnd, MCIWNDM_PUT_SOURCE, 0, (LPARAM)(LPRECT)(prc))
  2817.  
  2818. #define MCIWndGetDest(hwnd, prc)    (LONG)MCIWndSM(hwnd, MCIWNDM_GET_DEST, 0, (LPARAM)(LPRECT)(prc))
  2819. #define MCIWndPutDest(hwnd, prc)    (LONG)MCIWndSM(hwnd, MCIWNDM_PUT_DEST, 0, (LPARAM)(LPRECT)(prc))
  2820.  
  2821. #define MCIWndPlayReverse(hwnd)     (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYREVERSE, 0, 0)
  2822. #define MCIWndPlayFrom(hwnd, lPos)  (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYFROM, 0, (LPARAM)(LONG)(lPos))
  2823. #define MCIWndPlayTo(hwnd, lPos)    (LONG)MCIWndSM(hwnd, MCIWNDM_PLAYTO,   0, (LPARAM)(LONG)(lPos))
  2824. #define MCIWndPlayFromTo(hwnd, lStart, lEnd) (MCIWndSeek(hwnd, lStart), MCIWndPlayTo(hwnd, lEnd))
  2825.  
  2826. #define MCIWndGetDeviceID(hwnd)     (UINT)MCIWndSM(hwnd, MCIWNDM_GETDEVICEID, 0, 0)
  2827. #define MCIWndGetAlias(hwnd)        (UINT)MCIWndSM(hwnd, MCIWNDM_GETALIAS, 0, 0)
  2828. #define MCIWndGetMode(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETMODE, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp))
  2829. #define MCIWndGetPosition(hwnd)     (LONG)MCIWndSM(hwnd, MCIWNDM_GETPOSITION, 0, 0)
  2830. #define MCIWndGetPositionString(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETPOSITION, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp))
  2831. #define MCIWndGetStart(hwnd)        (LONG)MCIWndSM(hwnd, MCIWNDM_GETSTART, 0, 0)
  2832. #define MCIWndGetLength(hwnd)       (LONG)MCIWndSM(hwnd, MCIWNDM_GETLENGTH, 0, 0)
  2833. #define MCIWndGetEnd(hwnd)          (LONG)MCIWndSM(hwnd, MCIWNDM_GETEND, 0, 0)
  2834.  
  2835. #define MCIWndStep(hwnd, n)         (LONG)MCIWndSM(hwnd, MCI_STEP, 0,(LPARAM)(long)(n))
  2836.  
  2837. #define MCIWndDestroy(hwnd)         (VOID)MCIWndSM(hwnd, WM_CLOSE, 0, 0)
  2838. #define MCIWndSetZoom(hwnd,iZoom)   (VOID)MCIWndSM(hwnd, MCIWNDM_SETZOOM, 0, (LPARAM)(UINT)(iZoom))
  2839. #define MCIWndGetZoom(hwnd)         (UINT)MCIWndSM(hwnd, MCIWNDM_GETZOOM, 0, 0)
  2840. #define MCIWndSetVolume(hwnd,iVol)  (LONG)MCIWndSM(hwnd, MCIWNDM_SETVOLUME, 0, (LPARAM)(UINT)(iVol))
  2841. #define MCIWndGetVolume(hwnd)       (LONG)MCIWndSM(hwnd, MCIWNDM_GETVOLUME, 0, 0)
  2842. #define MCIWndSetSpeed(hwnd,iSpeed) (LONG)MCIWndSM(hwnd, MCIWNDM_SETSPEED, 0, (LPARAM)(UINT)(iSpeed))
  2843. #define MCIWndGetSpeed(hwnd)        (LONG)MCIWndSM(hwnd, MCIWNDM_GETSPEED, 0, 0)
  2844. #define MCIWndSetTimeFormat(hwnd, lp) (LONG)MCIWndSM(hwnd, MCIWNDM_SETTIMEFORMAT, 0, (LPARAM)(LPTSTR)(lp))
  2845. #define MCIWndGetTimeFormat(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETTIMEFORMAT, (WPARAM)(UINT)(len), (LPARAM)(LPTSTR)(lp))
  2846. #define MCIWndValidateMedia(hwnd)   (VOID)MCIWndSM(hwnd, MCIWNDM_VALIDATEMEDIA, 0, 0)
  2847.  
  2848. #define MCIWndSetRepeat(hwnd,f)     (void)MCIWndSM(hwnd, MCIWNDM_SETREPEAT, 0, (LPARAM)(BOOL)(f))
  2849. #define MCIWndGetRepeat(hwnd)       (BOOL)MCIWndSM(hwnd, MCIWNDM_GETREPEAT, 0, 0)
  2850.  
  2851. #define MCIWndUseFrames(hwnd)       MCIWndSetTimeFormat(hwnd, TEXT("frames"))
  2852. #define MCIWndUseTime(hwnd)         MCIWndSetTimeFormat(hwnd, TEXT("ms"))
  2853.  
  2854. #define MCIWndSetActiveTimer(hwnd, active)                \
  2855.     (VOID)MCIWndSM(hwnd, MCIWNDM_SETACTIVETIMER,            \
  2856.     (WPARAM)(UINT)(active), 0L)
  2857. #define MCIWndSetInactiveTimer(hwnd, inactive)                \
  2858.     (VOID)MCIWndSM(hwnd, MCIWNDM_SETINACTIVETIMER,        \
  2859.     (WPARAM)(UINT)(inactive), 0L)
  2860. #define MCIWndSetTimers(hwnd, active, inactive)                      \
  2861.         (VOID)MCIWndSM(hwnd, MCIWNDM_SETTIMERS,(WPARAM)(UINT)(active), \
  2862.         (LPARAM)(UINT)(inactive))
  2863. #define MCIWndGetActiveTimer(hwnd)                    \
  2864.     (UINT)MCIWndSM(hwnd, MCIWNDM_GETACTIVETIMER,    0, 0L);
  2865. #define MCIWndGetInactiveTimer(hwnd)                    \
  2866.     (UINT)MCIWndSM(hwnd, MCIWNDM_GETINACTIVETIMER, 0, 0L);
  2867.  
  2868. #define MCIWndRealize(hwnd, fBkgnd) (LONG)MCIWndSM(hwnd, MCIWNDM_REALIZE,(WPARAM)(BOOL)(fBkgnd),0)
  2869.  
  2870. #define MCIWndSendString(hwnd, sz)  (LONG)MCIWndSM(hwnd, MCIWNDM_SENDSTRING, 0, (LPARAM)(LPTSTR)(sz))
  2871. #define MCIWndReturnString(hwnd, lp, len)  (LONG)MCIWndSM(hwnd, MCIWNDM_RETURNSTRING, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp))
  2872. #define MCIWndGetError(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETERROR, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp))
  2873.  
  2874. //#define MCIWndActivate(hwnd, f)     (void)MCIWndSM(hwnd, WM_ACTIVATE, (WPARAM)(BOOL)(f), 0)
  2875.  
  2876. #define MCIWndGetPalette(hwnd)      (HPALETTE)MCIWndSM(hwnd, MCIWNDM_GETPALETTE, 0, 0)
  2877. #define MCIWndSetPalette(hwnd, hpal) (LONG)MCIWndSM(hwnd, MCIWNDM_SETPALETTE, (WPARAM)(HPALETTE)(hpal), 0)
  2878.  
  2879. #define MCIWndGetFileName(hwnd, lp, len) (LONG)MCIWndSM(hwnd, MCIWNDM_GETFILENAME, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp))
  2880. #define MCIWndGetDevice(hwnd, lp, len)   (LONG)MCIWndSM(hwnd, MCIWNDM_GETDEVICE, (WPARAM)(UINT)(len), (LPARAM)(LPVOID)(lp))
  2881.  
  2882. #define MCIWndGetStyles(hwnd) (UINT)MCIWndSM(hwnd, MCIWNDM_GETSTYLES, 0, 0L)
  2883. #define MCIWndChangeStyles(hwnd, mask, value) (LONG)MCIWndSM(hwnd, MCIWNDM_CHANGESTYLES, (WPARAM)(UINT)(mask), (LPARAM)(LONG)(value))
  2884.  
  2885. #define MCIWndOpenInterface(hwnd, pUnk)  (LONG)MCIWndSM(hwnd, MCIWNDM_OPENINTERFACE, 0, (LPARAM)(LPUNKNOWN)(pUnk))
  2886.  
  2887. #define MCIWndSetOwner(hwnd, hwndP)  (LONG)MCIWndSM(hwnd, MCIWNDM_SETOWNER, (WPARAM)(hwndP), 0)
  2888.  
  2889.  
  2890. // Messages an app will send to MCIWND
  2891.  
  2892. // all the text-related messages are defined out of order above (they need
  2893. // to be defined before the MCIWndOpen() macros
  2894.  
  2895. #define MCIWNDM_GETDEVICEID    (WM_USER + 100)
  2896. #define MCIWNDM_GETSTART    (WM_USER + 103)
  2897. #define MCIWNDM_GETLENGTH    (WM_USER + 104)
  2898. #define MCIWNDM_GETEND        (WM_USER + 105)
  2899. #define MCIWNDM_EJECT        (WM_USER + 107)
  2900. #define MCIWNDM_SETZOOM        (WM_USER + 108)
  2901. #define MCIWNDM_GETZOOM         (WM_USER + 109)
  2902. #define MCIWNDM_SETVOLUME    (WM_USER + 110)
  2903. #define MCIWNDM_GETVOLUME    (WM_USER + 111)
  2904. #define MCIWNDM_SETSPEED    (WM_USER + 112)
  2905. #define MCIWNDM_GETSPEED    (WM_USER + 113)
  2906. #define MCIWNDM_SETREPEAT    (WM_USER + 114)
  2907. #define MCIWNDM_GETREPEAT    (WM_USER + 115)
  2908. #define MCIWNDM_REALIZE         (WM_USER + 118)
  2909. #define MCIWNDM_VALIDATEMEDIA   (WM_USER + 121)
  2910. #define MCIWNDM_PLAYFROM    (WM_USER + 122)
  2911. #define MCIWNDM_PLAYTO          (WM_USER + 123)
  2912. #define MCIWNDM_GETPALETTE      (WM_USER + 126)
  2913. #define MCIWNDM_SETPALETTE      (WM_USER + 127)
  2914. #define MCIWNDM_SETTIMERS    (WM_USER + 129)
  2915. #define MCIWNDM_SETACTIVETIMER    (WM_USER + 130)
  2916. #define MCIWNDM_SETINACTIVETIMER (WM_USER + 131)
  2917. #define MCIWNDM_GETACTIVETIMER    (WM_USER + 132)
  2918. #define MCIWNDM_GETINACTIVETIMER (WM_USER + 133)
  2919. #define MCIWNDM_CHANGESTYLES    (WM_USER + 135)
  2920. #define MCIWNDM_GETSTYLES    (WM_USER + 136)
  2921. #define MCIWNDM_GETALIAS    (WM_USER + 137)
  2922. #define MCIWNDM_PLAYREVERSE    (WM_USER + 139)
  2923. #define MCIWNDM_GET_SOURCE      (WM_USER + 140)
  2924. #define MCIWNDM_PUT_SOURCE      (WM_USER + 141)
  2925. #define MCIWNDM_GET_DEST        (WM_USER + 142)
  2926. #define MCIWNDM_PUT_DEST        (WM_USER + 143)
  2927. #define MCIWNDM_CAN_PLAY        (WM_USER + 144)
  2928. #define MCIWNDM_CAN_WINDOW      (WM_USER + 145)
  2929. #define MCIWNDM_CAN_RECORD      (WM_USER + 146)
  2930. #define MCIWNDM_CAN_SAVE        (WM_USER + 147)
  2931. #define MCIWNDM_CAN_EJECT       (WM_USER + 148)
  2932. #define MCIWNDM_CAN_CONFIG      (WM_USER + 149)
  2933. #define MCIWNDM_PALETTEKICK     (WM_USER + 150)
  2934. #define MCIWNDM_OPENINTERFACE    (WM_USER + 151)
  2935. #define MCIWNDM_SETOWNER    (WM_USER + 152)
  2936.  
  2937.  
  2938.  
  2939. //define both A and W messages
  2940. #define MCIWNDM_SENDSTRINGA    (WM_USER + 101)
  2941. #define MCIWNDM_GETPOSITIONA    (WM_USER + 102)
  2942. #define MCIWNDM_GETMODEA    (WM_USER + 106)
  2943. #define MCIWNDM_SETTIMEFORMATA  (WM_USER + 119)
  2944. #define MCIWNDM_GETTIMEFORMATA  (WM_USER + 120)
  2945. #define MCIWNDM_GETFILENAMEA    (WM_USER + 124)
  2946. #define MCIWNDM_GETDEVICEA      (WM_USER + 125)
  2947. #define MCIWNDM_GETERRORA       (WM_USER + 128)
  2948. #define MCIWNDM_NEWA        (WM_USER + 134)
  2949. #define MCIWNDM_RETURNSTRINGA    (WM_USER + 138)
  2950. #define MCIWNDM_OPENA        (WM_USER + 153)
  2951.  
  2952. #define MCIWNDM_SENDSTRINGW    (WM_USER + 201)
  2953. #define MCIWNDM_GETPOSITIONW    (WM_USER + 202)
  2954. #define MCIWNDM_GETMODEW    (WM_USER + 206)
  2955. #define MCIWNDM_SETTIMEFORMATW  (WM_USER + 219)
  2956. #define MCIWNDM_GETTIMEFORMATW  (WM_USER + 220)
  2957. #define MCIWNDM_GETFILENAMEW    (WM_USER + 224)
  2958. #define MCIWNDM_GETDEVICEW      (WM_USER + 225)
  2959. #define MCIWNDM_GETERRORW       (WM_USER + 228)
  2960. #define MCIWNDM_NEWW        (WM_USER + 234)
  2961. #define MCIWNDM_RETURNSTRINGW    (WM_USER + 238)
  2962. #define MCIWNDM_OPENW        (WM_USER + 252)
  2963.  
  2964. // map defaults to A or W depending on app's UNICODE setting
  2965. #ifdef UNICODE
  2966. #define MCIWNDM_SENDSTRING      MCIWNDM_SENDSTRINGW
  2967. #define MCIWNDM_GETPOSITION     MCIWNDM_GETPOSITIONW
  2968. #define MCIWNDM_GETMODE         MCIWNDM_GETMODEW
  2969. #define MCIWNDM_SETTIMEFORMAT   MCIWNDM_SETTIMEFORMATW
  2970. #define MCIWNDM_GETTIMEFORMAT   MCIWNDM_GETTIMEFORMATW
  2971. #define MCIWNDM_GETFILENAME     MCIWNDM_GETFILENAMEW
  2972. #define MCIWNDM_GETDEVICE       MCIWNDM_GETDEVICEW
  2973. #define MCIWNDM_GETERROR        MCIWNDM_GETERRORW
  2974. #define MCIWNDM_NEW             MCIWNDM_NEWW
  2975. #define MCIWNDM_RETURNSTRING    MCIWNDM_RETURNSTRINGW
  2976. #define MCIWNDM_OPEN        MCIWNDM_OPENW
  2977. #else
  2978. #define MCIWNDM_SENDSTRING      MCIWNDM_SENDSTRINGA
  2979. #define MCIWNDM_GETPOSITION     MCIWNDM_GETPOSITIONA
  2980. #define MCIWNDM_GETMODE         MCIWNDM_GETMODEA
  2981. #define MCIWNDM_SETTIMEFORMAT   MCIWNDM_SETTIMEFORMATA
  2982. #define MCIWNDM_GETTIMEFORMAT   MCIWNDM_GETTIMEFORMATA
  2983. #define MCIWNDM_GETFILENAME     MCIWNDM_GETFILENAMEA
  2984. #define MCIWNDM_GETDEVICE       MCIWNDM_GETDEVICEA
  2985. #define MCIWNDM_GETERROR        MCIWNDM_GETERRORA
  2986. #define MCIWNDM_NEW             MCIWNDM_NEWA
  2987. #define MCIWNDM_RETURNSTRING    MCIWNDM_RETURNSTRINGA
  2988. #define MCIWNDM_OPEN        MCIWNDM_OPENA
  2989. #endif
  2990.  
  2991. // note that the source text for MCIWND will thus contain
  2992. // support for eg MCIWNDM_SENDSTRING (both the 16-bit entrypoint and
  2993. // in win32 mapped to MCIWNDM_SENDSTRINGW), and MCIWNDM_SENDSTRINGA (the
  2994. // win32 ansi thunk).
  2995.  
  2996.  
  2997.  
  2998.  
  2999.  
  3000.  
  3001.  
  3002. // Messages MCIWND will send to an app
  3003. // !!! Use less messages and use a code instead to indicate the type of notify? /* ;Internal */
  3004. #define MCIWNDM_NOTIFYMODE      (WM_USER + 200)  // wp = hwnd, lp = mode
  3005. #define MCIWNDM_NOTIFYPOS    (WM_USER + 201)  // wp = hwnd, lp = pos
  3006. #define MCIWNDM_NOTIFYSIZE    (WM_USER + 202)  // wp = hwnd
  3007. #define MCIWNDM_NOTIFYMEDIA     (WM_USER + 203)  // wp = hwnd, lp = fn
  3008. #define MCIWNDM_NOTIFYERROR     (WM_USER + 205)  // wp = hwnd, lp = error
  3009.  
  3010. // special seek values for START and END
  3011. #define MCIWND_START                -1
  3012. #define MCIWND_END                  -2
  3013.  
  3014. #ifndef MCI_PLAY
  3015.     /* MCI command message identifiers */
  3016. #ifndef _WIN32
  3017.     // win32 apps send MCIWNDM_OPEN
  3018.     #define MCI_OPEN                        0x0803
  3019. #endif
  3020.     #define MCI_CLOSE                       0x0804
  3021.     #define MCI_PLAY                        0x0806
  3022.     #define MCI_SEEK                        0x0807
  3023.     #define MCI_STOP                        0x0808
  3024.     #define MCI_PAUSE                       0x0809
  3025.     #define MCI_STEP                        0x080E
  3026.     #define MCI_RECORD                      0x080F
  3027.     #define MCI_SAVE                        0x0813
  3028.     #define MCI_CUT                         0x0851
  3029.     #define MCI_COPY                        0x0852
  3030.     #define MCI_PASTE                       0x0853
  3031.     #define MCI_RESUME                      0x0855
  3032.     #define MCI_DELETE                      0x0856
  3033. #endif
  3034.  
  3035. #ifndef MCI_MODE_NOT_READY
  3036.     /* return values for 'status mode' command */
  3037.     #define MCI_MODE_NOT_READY      (524)
  3038.     #define MCI_MODE_STOP           (525)
  3039.     #define MCI_MODE_PLAY           (526)
  3040.     #define MCI_MODE_RECORD         (527)
  3041.     #define MCI_MODE_SEEK           (528)
  3042.     #define MCI_MODE_PAUSE          (529)
  3043.     #define MCI_MODE_OPEN           (530)
  3044. #endif
  3045.  
  3046. #endif  /* NOAVIFILE */
  3047.  
  3048. /****************************************************************************
  3049.  *
  3050.  *  VIDEO - Video Capture Driver Interface
  3051.  *
  3052.  ****************************************************************************/
  3053.  
  3054. #if !defined(NOAVICAP) || !defined(NOVIDEO)
  3055.  
  3056. #ifndef _RCINVOKED
  3057.  
  3058.  
  3059. /* video data types */
  3060. DECLARE_HANDLE(HVIDEO);                 // generic handle
  3061. typedef HVIDEO FAR * LPHVIDEO;
  3062. #endif                                  // ifndef RCINVOKED
  3063.  
  3064. /****************************************************************************
  3065.  
  3066.                         version api
  3067.  
  3068. ****************************************************************************/
  3069.  
  3070. DWORD FAR PASCAL VideoForWindowsVersion(void);
  3071.  
  3072. /****************************************************************************
  3073.  
  3074.                             Error Return Values
  3075.  
  3076. ****************************************************************************/
  3077. #define DV_ERR_OK               (0)                  /* No error */
  3078. #define DV_ERR_BASE             (1)                  /* Error Base */
  3079. #define DV_ERR_NONSPECIFIC      (DV_ERR_BASE)
  3080. #define DV_ERR_BADFORMAT        (DV_ERR_BASE + 1)
  3081.                 /* unsupported video format */
  3082. #define DV_ERR_STILLPLAYING     (DV_ERR_BASE + 2)
  3083.                 /* still something playing */
  3084. #define DV_ERR_UNPREPARED       (DV_ERR_BASE + 3)
  3085.                 /* header not prepared */
  3086. #define DV_ERR_SYNC             (DV_ERR_BASE + 4)
  3087.                 /* device is synchronous */
  3088. #define DV_ERR_TOOMANYCHANNELS  (DV_ERR_BASE + 5)
  3089.                 /* number of channels exceeded */
  3090. #define DV_ERR_NOTDETECTED    (DV_ERR_BASE + 6)    /* HW not detected */
  3091. #define DV_ERR_BADINSTALL    (DV_ERR_BASE + 7)    /* Can not get Profile */
  3092. #define DV_ERR_CREATEPALETTE    (DV_ERR_BASE + 8)
  3093. #define DV_ERR_SIZEFIELD    (DV_ERR_BASE + 9)
  3094. #define DV_ERR_PARAM1        (DV_ERR_BASE + 10)
  3095. #define DV_ERR_PARAM2        (DV_ERR_BASE + 11)
  3096. #define DV_ERR_CONFIG1        (DV_ERR_BASE + 12)
  3097. #define DV_ERR_CONFIG2        (DV_ERR_BASE + 13)
  3098. #define DV_ERR_FLAGS        (DV_ERR_BASE + 14)
  3099. #define DV_ERR_13        (DV_ERR_BASE + 15)
  3100.  
  3101. #define DV_ERR_NOTSUPPORTED     (DV_ERR_BASE + 16)   /* function not suported */
  3102. #define DV_ERR_NOMEM            (DV_ERR_BASE + 17)   /* out of memory */
  3103. #define DV_ERR_ALLOCATED        (DV_ERR_BASE + 18)   /* device is allocated */
  3104. #define DV_ERR_BADDEVICEID      (DV_ERR_BASE + 19)
  3105. #define DV_ERR_INVALHANDLE      (DV_ERR_BASE + 20)
  3106. #define DV_ERR_BADERRNUM        (DV_ERR_BASE + 21)
  3107. #define DV_ERR_NO_BUFFERS       (DV_ERR_BASE + 22)   /* out of buffers */
  3108.  
  3109. #define DV_ERR_MEM_CONFLICT     (DV_ERR_BASE + 23)   /* Mem conflict detected */
  3110. #define DV_ERR_IO_CONFLICT      (DV_ERR_BASE + 24)   /* I/O conflict detected */
  3111. #define DV_ERR_DMA_CONFLICT     (DV_ERR_BASE + 25)   /* DMA conflict detected */
  3112. #define DV_ERR_INT_CONFLICT     (DV_ERR_BASE + 26)   /* Interrupt conflict detected */
  3113. #define DV_ERR_PROTECT_ONLY     (DV_ERR_BASE + 27)   /* Can not run in standard mode */
  3114. #define DV_ERR_LASTERROR        (DV_ERR_BASE + 27)
  3115.  
  3116. //#define DV_IDS_PROFILING        (DV_ERR_BASE + 900)
  3117. //#define DV_IDS_LISTBOX          (DV_ERR_BASE + 901)
  3118.  
  3119. #define DV_ERR_USER_MSG         (DV_ERR_BASE + 1000) /* Hardware specific errors */
  3120.  
  3121. /****************************************************************************
  3122.  
  3123.                          Callback Messages
  3124.  
  3125. Note that the values for all installable driver callback messages are
  3126. identical, (ie. MM_DRVM_DATA has the same value for capture drivers,
  3127. installable video codecs, and the audio compression manager).
  3128. ****************************************************************************/
  3129. #ifndef _RCINVOKED
  3130.  
  3131. #ifndef MM_DRVM_OPEN
  3132. #define MM_DRVM_OPEN       0x3D0
  3133. #define MM_DRVM_CLOSE      0x3D1
  3134. #define MM_DRVM_DATA       0x3D2
  3135. #define MM_DRVM_ERROR      0x3D3
  3136. #endif
  3137.  
  3138. #define DV_VM_OPEN         MM_DRVM_OPEN         // Obsolete messages
  3139. #define DV_VM_CLOSE        MM_DRVM_CLOSE
  3140. #define DV_VM_DATA         MM_DRVM_DATA
  3141. #define DV_VM_ERROR        MM_DRVM_ERROR
  3142.  
  3143. /****************************************************************************
  3144.  
  3145.                          Structures
  3146.  
  3147. ****************************************************************************/
  3148. /* video data block header */
  3149. typedef struct videohdr_tag {
  3150.     LPBYTE      lpData;                 /* pointer to locked data buffer */
  3151.     DWORD       dwBufferLength;         /* Length of data buffer */
  3152.     DWORD       dwBytesUsed;            /* Bytes actually used */
  3153.     DWORD       dwTimeCaptured;         /* Milliseconds from start of stream */
  3154.     DWORD       dwUser;                 /* for client's use */
  3155.     DWORD       dwFlags;                /* assorted flags (see defines) */
  3156.     DWORD_PTR   dwReserved[4];          /* reserved for driver */
  3157. } VIDEOHDR, NEAR *PVIDEOHDR, FAR * LPVIDEOHDR;
  3158.  
  3159. /* dwFlags field of VIDEOHDR */
  3160. #define VHDR_DONE       0x00000001  /* Done bit */
  3161. #define VHDR_PREPARED   0x00000002  /* Set if this header has been prepared */
  3162. #define VHDR_INQUEUE    0x00000004  /* Reserved for driver */
  3163. #define VHDR_KEYFRAME   0x00000008  /* Key Frame */
  3164. #define VHDR_VALID      0x0000000F  /* valid flags */     /* ;Internal */
  3165.  
  3166. /* Channel capabilities structure */
  3167. typedef struct channel_caps_tag {
  3168.     DWORD       dwFlags;                /* Capability flags*/
  3169.     DWORD       dwSrcRectXMod;          /* Granularity of src rect in x */
  3170.     DWORD       dwSrcRectYMod;          /* Granularity of src rect in y */
  3171.     DWORD       dwSrcRectWidthMod;      /* Granularity of src rect width */
  3172.     DWORD       dwSrcRectHeightMod;     /* Granularity of src rect height */
  3173.     DWORD       dwDstRectXMod;          /* Granularity of dst rect in x */
  3174.     DWORD       dwDstRectYMod;          /* Granularity of dst rect in y */
  3175.     DWORD       dwDstRectWidthMod;      /* Granularity of dst rect width */
  3176.     DWORD       dwDstRectHeightMod;     /* Granularity of dst rect height */
  3177. } CHANNEL_CAPS, NEAR *PCHANNEL_CAPS, FAR * LPCHANNEL_CAPS;
  3178.  
  3179. /* dwFlags of CHANNEL_CAPS */
  3180. #define VCAPS_OVERLAY       0x00000001      /* overlay channel */
  3181. #define VCAPS_SRC_CAN_CLIP  0x00000002      /* src rect can clip */
  3182. #define VCAPS_DST_CAN_CLIP  0x00000004      /* dst rect can clip */
  3183. #define VCAPS_CAN_SCALE     0x00000008      /* allows src != dst */
  3184.  
  3185.  
  3186. /****************************************************************************
  3187.  
  3188.             API Flags
  3189.  
  3190. ****************************************************************************/
  3191.  
  3192. // Types of channels to open with the videoOpen function
  3193. #define VIDEO_EXTERNALIN        0x0001
  3194. #define VIDEO_EXTERNALOUT        0x0002
  3195. #define VIDEO_IN            0x0004
  3196. #define VIDEO_OUT            0x0008
  3197.  
  3198. // Is a driver dialog available for this channel?
  3199. #define VIDEO_DLG_QUERY            0x0010
  3200.  
  3201. // videoConfigure (both GET and SET)
  3202. #define VIDEO_CONFIGURE_QUERY       0x8000
  3203.  
  3204. // videoConfigure (SET only)
  3205. #define VIDEO_CONFIGURE_SET        0x1000
  3206.  
  3207. // videoConfigure (GET only)
  3208. #define VIDEO_CONFIGURE_GET        0x2000
  3209. #define VIDEO_CONFIGURE_QUERYSIZE    0x0001
  3210.  
  3211. #define VIDEO_CONFIGURE_CURRENT        0x0010
  3212. #define VIDEO_CONFIGURE_NOMINAL        0x0020
  3213. #define VIDEO_CONFIGURE_MIN        0x0040
  3214. #define VIDEO_CONFIGURE_MAX        0x0080
  3215.  
  3216. /****************************************************************************
  3217.  
  3218.             CONFIGURE MESSAGES
  3219.  
  3220. ****************************************************************************/
  3221. #define DVM_USER                        0X4000
  3222.  
  3223. #define DVM_CONFIGURE_START        0x1000
  3224. #define DVM_CONFIGURE_END        0x1FFF
  3225.  
  3226. #define DVM_PALETTE            (DVM_CONFIGURE_START + 1)
  3227. #define DVM_FORMAT            (DVM_CONFIGURE_START + 2)
  3228. #define DVM_PALETTERGB555        (DVM_CONFIGURE_START + 3)
  3229. #define DVM_SRC_RECT            (DVM_CONFIGURE_START + 4)
  3230. #define DVM_DST_RECT            (DVM_CONFIGURE_START + 5)
  3231.  
  3232. #endif  /* ifndef _RCINVOKED */
  3233.  
  3234. #endif  /* NOVIDEO */
  3235.  
  3236. /****************************************************************************
  3237.  *
  3238.  *  AVICAP - Window class for AVI capture
  3239.  *
  3240.  ***************************************************************************/
  3241.  
  3242. #ifndef NOAVICAP
  3243. #ifdef __cplusplus
  3244. /* SendMessage in C++*/
  3245. #define AVICapSM(hwnd,m,w,l) ( (::IsWindow(hwnd)) ? ::SendMessage(hwnd,m,w,l) : 0)
  3246. #else
  3247. /* SendMessage in C */
  3248. #define AVICapSM(hwnd,m,w,l) ( (IsWindow(hwnd)) ?   SendMessage(hwnd,m,w,l) : 0)
  3249. #endif  /* __cplusplus */
  3250.  
  3251. #ifndef RC_INVOKED
  3252.  
  3253. // ------------------------------------------------------------------
  3254. //  Window Messages  WM_CAP... which can be sent to an AVICAP window
  3255. // ------------------------------------------------------------------
  3256.  
  3257.  
  3258.  
  3259. // UNICODE
  3260. //
  3261. // The Win32 version of AVICAP on NT supports UNICODE applications:
  3262. // for each API or message that takes a char or string parameter, there are
  3263. // two versions, ApiNameA and ApiNameW. The default name ApiName is #defined
  3264. // to one or other depending on whether UNICODE is defined. Apps can call
  3265. // the A and W apis directly, and mix them.
  3266. //
  3267. // The 32-bit AVICAP on NT uses unicode exclusively internally.
  3268. // ApiNameA() will be implemented as a call to ApiNameW() together with
  3269. // translation of strings.
  3270.  
  3271.  
  3272.  
  3273.  
  3274. // Defines start of the message range
  3275. #define WM_CAP_START                    WM_USER
  3276.  
  3277. // start of unicode messages
  3278. #define WM_CAP_UNICODE_START            WM_USER+100
  3279.  
  3280. #define WM_CAP_GET_CAPSTREAMPTR         (WM_CAP_START+  1)
  3281.  
  3282. #define WM_CAP_SET_CALLBACK_ERRORW     (WM_CAP_UNICODE_START+  2)
  3283. #define WM_CAP_SET_CALLBACK_STATUSW    (WM_CAP_UNICODE_START+  3)
  3284. #define WM_CAP_SET_CALLBACK_ERRORA     (WM_CAP_START+  2)
  3285. #define WM_CAP_SET_CALLBACK_STATUSA    (WM_CAP_START+  3)
  3286. #ifdef UNICODE
  3287. #define WM_CAP_SET_CALLBACK_ERROR       WM_CAP_SET_CALLBACK_ERRORW
  3288. #define WM_CAP_SET_CALLBACK_STATUS      WM_CAP_SET_CALLBACK_STATUSW
  3289. #else
  3290. #define WM_CAP_SET_CALLBACK_ERROR       WM_CAP_SET_CALLBACK_ERRORA
  3291. #define WM_CAP_SET_CALLBACK_STATUS      WM_CAP_SET_CALLBACK_STATUSA
  3292. #endif
  3293.  
  3294.  
  3295. #define WM_CAP_SET_CALLBACK_YIELD       (WM_CAP_START+  4)
  3296. #define WM_CAP_SET_CALLBACK_FRAME       (WM_CAP_START+  5)
  3297. #define WM_CAP_SET_CALLBACK_VIDEOSTREAM (WM_CAP_START+  6)
  3298. #define WM_CAP_SET_CALLBACK_WAVESTREAM  (WM_CAP_START+  7)
  3299. #define WM_CAP_GET_USER_DATA        (WM_CAP_START+  8)
  3300. #define WM_CAP_SET_USER_DATA        (WM_CAP_START+  9)
  3301.  
  3302. #define WM_CAP_DRIVER_CONNECT           (WM_CAP_START+  10)
  3303. #define WM_CAP_DRIVER_DISCONNECT        (WM_CAP_START+  11)
  3304.  
  3305. #define WM_CAP_DRIVER_GET_NAMEA        (WM_CAP_START+  12)
  3306. #define WM_CAP_DRIVER_GET_VERSIONA     (WM_CAP_START+  13)
  3307. #define WM_CAP_DRIVER_GET_NAMEW        (WM_CAP_UNICODE_START+  12)
  3308. #define WM_CAP_DRIVER_GET_VERSIONW     (WM_CAP_UNICODE_START+  13)
  3309. #ifdef UNICODE
  3310. #define WM_CAP_DRIVER_GET_NAME          WM_CAP_DRIVER_GET_NAMEW
  3311. #define WM_CAP_DRIVER_GET_VERSION       WM_CAP_DRIVER_GET_VERSIONW
  3312. #else
  3313. #define WM_CAP_DRIVER_GET_NAME          WM_CAP_DRIVER_GET_NAMEA
  3314. #define WM_CAP_DRIVER_GET_VERSION       WM_CAP_DRIVER_GET_VERSIONA
  3315. #endif
  3316.  
  3317. #define WM_CAP_DRIVER_GET_CAPS          (WM_CAP_START+  14)
  3318.  
  3319. #define WM_CAP_FILE_SET_CAPTURE_FILEA  (WM_CAP_START+  20)
  3320. #define WM_CAP_FILE_GET_CAPTURE_FILEA  (WM_CAP_START+  21)
  3321. #define WM_CAP_FILE_SAVEASA            (WM_CAP_START+  23)
  3322. #define WM_CAP_FILE_SAVEDIBA           (WM_CAP_START+  25)
  3323. #define WM_CAP_FILE_SET_CAPTURE_FILEW  (WM_CAP_UNICODE_START+  20)
  3324. #define WM_CAP_FILE_GET_CAPTURE_FILEW  (WM_CAP_UNICODE_START+  21)
  3325. #define WM_CAP_FILE_SAVEASW            (WM_CAP_UNICODE_START+  23)
  3326. #define WM_CAP_FILE_SAVEDIBW           (WM_CAP_UNICODE_START+  25)
  3327. #ifdef UNICODE
  3328. #define WM_CAP_FILE_SET_CAPTURE_FILE    WM_CAP_FILE_SET_CAPTURE_FILEW
  3329. #define WM_CAP_FILE_GET_CAPTURE_FILE    WM_CAP_FILE_GET_CAPTURE_FILEW
  3330. #define WM_CAP_FILE_SAVEAS              WM_CAP_FILE_SAVEASW
  3331. #define WM_CAP_FILE_SAVEDIB             WM_CAP_FILE_SAVEDIBW
  3332. #else
  3333. #define WM_CAP_FILE_SET_CAPTURE_FILE    WM_CAP_FILE_SET_CAPTURE_FILEA
  3334. #define WM_CAP_FILE_GET_CAPTURE_FILE    WM_CAP_FILE_GET_CAPTURE_FILEA
  3335. #define WM_CAP_FILE_SAVEAS              WM_CAP_FILE_SAVEASA
  3336. #define WM_CAP_FILE_SAVEDIB             WM_CAP_FILE_SAVEDIBA
  3337. #endif
  3338.  
  3339. // out of order to save on ifdefs
  3340. #define WM_CAP_FILE_ALLOCATE            (WM_CAP_START+  22)
  3341. #define WM_CAP_FILE_SET_INFOCHUNK       (WM_CAP_START+  24)
  3342.  
  3343. #define WM_CAP_EDIT_COPY                (WM_CAP_START+  30)
  3344.  
  3345. #define WM_CAP_SET_AUDIOFORMAT          (WM_CAP_START+  35)
  3346. #define WM_CAP_GET_AUDIOFORMAT          (WM_CAP_START+  36)
  3347.  
  3348. #define WM_CAP_DLG_VIDEOFORMAT          (WM_CAP_START+  41)
  3349. #define WM_CAP_DLG_VIDEOSOURCE          (WM_CAP_START+  42)
  3350. #define WM_CAP_DLG_VIDEODISPLAY         (WM_CAP_START+  43)
  3351. #define WM_CAP_GET_VIDEOFORMAT          (WM_CAP_START+  44)
  3352. #define WM_CAP_SET_VIDEOFORMAT          (WM_CAP_START+  45)
  3353. #define WM_CAP_DLG_VIDEOCOMPRESSION     (WM_CAP_START+  46)
  3354.  
  3355. #define WM_CAP_SET_PREVIEW              (WM_CAP_START+  50)
  3356. #define WM_CAP_SET_OVERLAY              (WM_CAP_START+  51)
  3357. #define WM_CAP_SET_PREVIEWRATE          (WM_CAP_START+  52)
  3358. #define WM_CAP_SET_SCALE                (WM_CAP_START+  53)
  3359. #define WM_CAP_GET_STATUS               (WM_CAP_START+  54)
  3360. #define WM_CAP_SET_SCROLL               (WM_CAP_START+  55)
  3361.  
  3362. #define WM_CAP_GRAB_FRAME               (WM_CAP_START+  60)
  3363. #define WM_CAP_GRAB_FRAME_NOSTOP        (WM_CAP_START+  61)
  3364.  
  3365. #define WM_CAP_SEQUENCE                 (WM_CAP_START+  62)
  3366. #define WM_CAP_SEQUENCE_NOFILE          (WM_CAP_START+  63)
  3367. #define WM_CAP_SET_SEQUENCE_SETUP       (WM_CAP_START+  64)
  3368. #define WM_CAP_GET_SEQUENCE_SETUP       (WM_CAP_START+  65)
  3369.  
  3370. #define WM_CAP_SET_MCI_DEVICEA         (WM_CAP_START+  66)
  3371. #define WM_CAP_GET_MCI_DEVICEA         (WM_CAP_START+  67)
  3372. #define WM_CAP_SET_MCI_DEVICEW         (WM_CAP_UNICODE_START+  66)
  3373. #define WM_CAP_GET_MCI_DEVICEW         (WM_CAP_UNICODE_START+  67)
  3374. #ifdef UNICODE
  3375. #define WM_CAP_SET_MCI_DEVICE           WM_CAP_SET_MCI_DEVICEW
  3376. #define WM_CAP_GET_MCI_DEVICE           WM_CAP_GET_MCI_DEVICEW
  3377. #else
  3378. #define WM_CAP_SET_MCI_DEVICE           WM_CAP_SET_MCI_DEVICEA
  3379. #define WM_CAP_GET_MCI_DEVICE           WM_CAP_GET_MCI_DEVICEA
  3380. #endif
  3381.  
  3382.  
  3383.  
  3384. #define WM_CAP_STOP                     (WM_CAP_START+  68)
  3385. #define WM_CAP_ABORT                    (WM_CAP_START+  69)
  3386.  
  3387. #define WM_CAP_SINGLE_FRAME_OPEN        (WM_CAP_START+  70)
  3388. #define WM_CAP_SINGLE_FRAME_CLOSE       (WM_CAP_START+  71)
  3389. #define WM_CAP_SINGLE_FRAME             (WM_CAP_START+  72)
  3390.  
  3391. #define WM_CAP_PAL_OPENA               (WM_CAP_START+  80)
  3392. #define WM_CAP_PAL_SAVEA               (WM_CAP_START+  81)
  3393. #define WM_CAP_PAL_OPENW               (WM_CAP_UNICODE_START+  80)
  3394. #define WM_CAP_PAL_SAVEW               (WM_CAP_UNICODE_START+  81)
  3395. #ifdef UNICODE
  3396. #define WM_CAP_PAL_OPEN                 WM_CAP_PAL_OPENW
  3397. #define WM_CAP_PAL_SAVE                 WM_CAP_PAL_SAVEW
  3398. #else
  3399. #define WM_CAP_PAL_OPEN                 WM_CAP_PAL_OPENA
  3400. #define WM_CAP_PAL_SAVE                 WM_CAP_PAL_SAVEA
  3401. #endif
  3402.  
  3403. #define WM_CAP_PAL_PASTE                (WM_CAP_START+  82)
  3404. #define WM_CAP_PAL_AUTOCREATE           (WM_CAP_START+  83)
  3405. #define WM_CAP_PAL_MANUALCREATE         (WM_CAP_START+  84)
  3406.  
  3407. // Following added post VFW 1.1
  3408. #define WM_CAP_SET_CALLBACK_CAPCONTROL  (WM_CAP_START+  85)
  3409.  
  3410.  
  3411. // Defines end of the message range
  3412. #define WM_CAP_UNICODE_END              WM_CAP_PAL_SAVEW
  3413. #define WM_CAP_END                      WM_CAP_UNICODE_END
  3414.  
  3415. // ------------------------------------------------------------------
  3416. //  Message crackers for above
  3417. // ------------------------------------------------------------------
  3418.  
  3419. // message wrapper macros are defined for the default messages only. Apps
  3420. // that wish to mix Ansi and UNICODE message sending will have to
  3421. // reference the _A and _W messages directly
  3422.  
  3423. #define capSetCallbackOnError(hwnd, fpProc)        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0, (LPARAM)(LPVOID)(fpProc)))
  3424. #define capSetCallbackOnStatus(hwnd, fpProc)       ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, (LPARAM)(LPVOID)(fpProc)))
  3425. #define capSetCallbackOnYield(hwnd, fpProc)        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, (LPARAM)(LPVOID)(fpProc)))
  3426. #define capSetCallbackOnFrame(hwnd, fpProc)        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0, (LPARAM)(LPVOID)(fpProc)))
  3427. #define capSetCallbackOnVideoStream(hwnd, fpProc)  ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, (LPARAM)(LPVOID)(fpProc)))
  3428. #define capSetCallbackOnWaveStream(hwnd, fpProc)   ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, (LPARAM)(LPVOID)(fpProc)))
  3429. #define capSetCallbackOnCapControl(hwnd, fpProc)   ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, (LPARAM)(LPVOID)(fpProc)))
  3430.  
  3431. #define capSetUserData(hwnd, lUser)        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_USER_DATA, 0, (LPARAM)lUser))
  3432. #define capGetUserData(hwnd)               (AVICapSM(hwnd, WM_CAP_GET_USER_DATA, 0, 0))
  3433.  
  3434. #define capDriverConnect(hwnd, i)                  ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L))
  3435. #define capDriverDisconnect(hwnd)                  ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_DISCONNECT, (WPARAM)0, 0L))
  3436. #define capDriverGetName(hwnd, szName, wSize)      ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_NAME, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3437. #define capDriverGetVersion(hwnd, szVer, wSize)    ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_VERSION, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szVer)))
  3438. #define capDriverGetCaps(hwnd, s, wSize)           ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_CAPS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPDRIVERCAPS)(s)))
  3439.  
  3440. #define capFileSetCaptureFile(hwnd, szName)        ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3441. #define capFileGetCaptureFile(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3442. #define capFileAlloc(hwnd, dwSize)                 ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_ALLOCATE, 0, (LPARAM)(DWORD)(dwSize)))
  3443. #define capFileSaveAs(hwnd, szName)                ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEAS, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3444. #define capFileSetInfoChunk(hwnd, lpInfoChunk)     ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_INFOCHUNK, (WPARAM)0, (LPARAM)(LPCAPINFOCHUNK)(lpInfoChunk)))
  3445. #define capFileSaveDIB(hwnd, szName)               ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEDIB, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3446.  
  3447. #define capEditCopy(hwnd)                          ((BOOL)AVICapSM(hwnd, WM_CAP_EDIT_COPY, 0, 0L))
  3448.  
  3449. #define capSetAudioFormat(hwnd, s, wSize)          ((BOOL)AVICapSM(hwnd, WM_CAP_SET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s)))
  3450. #define capGetAudioFormat(hwnd, s, wSize)          ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s)))
  3451. #define capGetAudioFormatSize(hwnd)                ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)0, (LPARAM)0L))
  3452.  
  3453. #define capDlgVideoFormat(hwnd)                    ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0L))
  3454. #define capDlgVideoSource(hwnd)                    ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0L))
  3455. #define capDlgVideoDisplay(hwnd)                   ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0L))
  3456. #define capDlgVideoCompression(hwnd)               ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0L))
  3457.  
  3458. #define capGetVideoFormat(hwnd, s, wSize)          ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s)))
  3459. #define capGetVideoFormatSize(hwnd)            ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0L))
  3460. #define capSetVideoFormat(hwnd, s, wSize)          ((BOOL)AVICapSM(hwnd, WM_CAP_SET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s)))
  3461.  
  3462. #define capPreview(hwnd, f)                        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEW, (WPARAM)(BOOL)(f), 0L))
  3463. #define capPreviewRate(hwnd, wMS)                  ((BOOL)AVICapSM(hwnd, WM_CAP_SET_PREVIEWRATE, (WPARAM)(wMS), 0))
  3464. #define capOverlay(hwnd, f)                        ((BOOL)AVICapSM(hwnd, WM_CAP_SET_OVERLAY, (WPARAM)(BOOL)(f), 0L))
  3465. #define capPreviewScale(hwnd, f)                   ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCALE, (WPARAM)(BOOL)f, 0L))
  3466. #define capGetStatus(hwnd, s, wSize)               ((BOOL)AVICapSM(hwnd, WM_CAP_GET_STATUS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPSTATUS)(s)))
  3467. #define capSetScrollPos(hwnd, lpP)                 ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCROLL, (WPARAM)0, (LPARAM)(LPPOINT)(lpP)))
  3468.  
  3469. #define capGrabFrame(hwnd)                         ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME, (WPARAM)0, (LPARAM)0L))
  3470. #define capGrabFrameNoStop(hwnd)                   ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, (WPARAM)0, (LPARAM)0L))
  3471.  
  3472. #define capCaptureSequence(hwnd)                   ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE, (WPARAM)0, (LPARAM)0L))
  3473. #define capCaptureSequenceNoFile(hwnd)             ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE_NOFILE, (WPARAM)0, (LPARAM)0L))
  3474. #define capCaptureStop(hwnd)                       ((BOOL)AVICapSM(hwnd, WM_CAP_STOP, (WPARAM)0, (LPARAM)0L))
  3475. #define capCaptureAbort(hwnd)                      ((BOOL)AVICapSM(hwnd, WM_CAP_ABORT, (WPARAM)0, (LPARAM)0L))
  3476.  
  3477. #define capCaptureSingleFrameOpen(hwnd)            ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_OPEN, (WPARAM)0, (LPARAM)0L))
  3478. #define capCaptureSingleFrameClose(hwnd)           ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, (WPARAM)0, (LPARAM)0L))
  3479. #define capCaptureSingleFrame(hwnd)                ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME, (WPARAM)0, (LPARAM)0L))
  3480.  
  3481. #define capCaptureGetSetup(hwnd, s, wSize)         ((BOOL)AVICapSM(hwnd, WM_CAP_GET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s)))
  3482. #define capCaptureSetSetup(hwnd, s, wSize)         ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s)))
  3483.  
  3484. #define capSetMCIDeviceName(hwnd, szName)          ((BOOL)AVICapSM(hwnd, WM_CAP_SET_MCI_DEVICE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3485. #define capGetMCIDeviceName(hwnd, szName, wSize)   ((BOOL)AVICapSM(hwnd, WM_CAP_GET_MCI_DEVICE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3486.  
  3487. #define capPaletteOpen(hwnd, szName)               ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_OPEN, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3488. #define capPaletteSave(hwnd, szName)               ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_SAVE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
  3489. #define capPalettePaste(hwnd)                      ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_PASTE, (WPARAM) 0, (LPARAM)0L))
  3490. #define capPaletteAuto(hwnd, iFrames, iColors)     ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_AUTOCREATE, (WPARAM)(iFrames), (LPARAM)(DWORD)(iColors)))
  3491. #define capPaletteManual(hwnd, fGrab, iColors)     ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_MANUALCREATE, (WPARAM)(fGrab), (LPARAM)(DWORD)(iColors)))
  3492.  
  3493. // ------------------------------------------------------------------
  3494. //  Structures
  3495. // ------------------------------------------------------------------
  3496.  
  3497. typedef struct tagCapDriverCaps {
  3498.     UINT        wDeviceIndex;               // Driver index in system.ini
  3499.     BOOL        fHasOverlay;                // Can device overlay?
  3500.     BOOL        fHasDlgVideoSource;         // Has Video source dlg?
  3501.     BOOL        fHasDlgVideoFormat;         // Has Format dlg?
  3502.     BOOL        fHasDlgVideoDisplay;        // Has External out dlg?
  3503.     BOOL        fCaptureInitialized;        // Driver ready to capture?
  3504.     BOOL        fDriverSuppliesPalettes;    // Can driver make palettes?
  3505.  
  3506. // following always NULL on Win32.
  3507.     HANDLE      hVideoIn;                   // Driver In channel
  3508.     HANDLE      hVideoOut;                  // Driver Out channel
  3509.     HANDLE      hVideoExtIn;                // Driver Ext In channel
  3510.     HANDLE      hVideoExtOut;               // Driver Ext Out channel
  3511. } CAPDRIVERCAPS, *PCAPDRIVERCAPS, FAR *LPCAPDRIVERCAPS;
  3512.  
  3513. typedef struct tagCapStatus {
  3514.     UINT        uiImageWidth;               // Width of the image
  3515.     UINT        uiImageHeight;              // Height of the image
  3516.     BOOL        fLiveWindow;                // Now Previewing video?
  3517.     BOOL        fOverlayWindow;             // Now Overlaying video?
  3518.     BOOL        fScale;                     // Scale image to client?
  3519.     POINT       ptScroll;                   // Scroll position
  3520.     BOOL        fUsingDefaultPalette;       // Using default driver palette?
  3521.     BOOL        fAudioHardware;             // Audio hardware present?
  3522.     BOOL        fCapFileExists;             // Does capture file exist?
  3523.     DWORD       dwCurrentVideoFrame;        // # of video frames cap'td
  3524.     DWORD       dwCurrentVideoFramesDropped;// # of video frames dropped
  3525.     DWORD       dwCurrentWaveSamples;       // # of wave samples cap'td
  3526.     DWORD       dwCurrentTimeElapsedMS;     // Elapsed capture duration
  3527.     HPALETTE    hPalCurrent;                // Current palette in use
  3528.     BOOL        fCapturingNow;              // Capture in progress?
  3529.     DWORD       dwReturn;                   // Error value after any operation
  3530.     UINT        wNumVideoAllocated;         // Actual number of video buffers
  3531.     UINT        wNumAudioAllocated;         // Actual number of audio buffers
  3532. } CAPSTATUS, *PCAPSTATUS, FAR *LPCAPSTATUS;
  3533.  
  3534.                                             // Default values in parenthesis
  3535. typedef struct tagCaptureParms {
  3536.     DWORD       dwRequestMicroSecPerFrame;  // Requested capture rate
  3537.     BOOL        fMakeUserHitOKToCapture;    // Show "Hit OK to cap" dlg?
  3538.     UINT        wPercentDropForError;       // Give error msg if > (10%)
  3539.     BOOL        fYield;                     // Capture via background task?
  3540.     DWORD       dwIndexSize;                // Max index size in frames (32K)
  3541.     UINT        wChunkGranularity;          // Junk chunk granularity (2K)
  3542.     BOOL        fUsingDOSMemory;            // Use DOS buffers?
  3543.     UINT        wNumVideoRequested;         // # video buffers, If 0, autocalc
  3544.     BOOL        fCaptureAudio;              // Capture audio?
  3545.     UINT        wNumAudioRequested;         // # audio buffers, If 0, autocalc
  3546.     UINT        vKeyAbort;                  // Virtual key causing abort
  3547.     BOOL        fAbortLeftMouse;            // Abort on left mouse?
  3548.     BOOL        fAbortRightMouse;           // Abort on right mouse?
  3549.     BOOL        fLimitEnabled;              // Use wTimeLimit?
  3550.     UINT        wTimeLimit;                 // Seconds to capture
  3551.     BOOL        fMCIControl;                // Use MCI video source?
  3552.     BOOL        fStepMCIDevice;             // Step MCI device?
  3553.     DWORD       dwMCIStartTime;             // Time to start in MS
  3554.     DWORD       dwMCIStopTime;              // Time to stop in MS
  3555.     BOOL        fStepCaptureAt2x;           // Perform spatial averaging 2x
  3556.     UINT        wStepCaptureAverageFrames;  // Temporal average n Frames
  3557.     DWORD       dwAudioBufferSize;          // Size of audio bufs (0 = default)
  3558.     BOOL        fDisableWriteCache;         // Attempt to disable write cache
  3559.     UINT        AVStreamMaster;             // Which stream controls length?
  3560. } CAPTUREPARMS, *PCAPTUREPARMS, FAR *LPCAPTUREPARMS;
  3561.  
  3562. // ------------------------------------------------------------------
  3563. //  AVStreamMaster
  3564. //  Since Audio and Video streams generally use non-synchronized capture
  3565. //  clocks, this flag determines whether the audio stream is to be considered
  3566. //  the master or controlling clock when writing the AVI file:
  3567. //
  3568. //  AVSTREAMMASTER_AUDIO  - Audio is master, video frame duration is forced
  3569. //                          to match audio duration (VFW 1.0, 1.1 default)
  3570. //  AVSTREAMMASTER_NONE   - No master, audio and video streams may be of
  3571. //                          different lengths
  3572. // ------------------------------------------------------------------
  3573. #define AVSTREAMMASTER_AUDIO            0 /* Audio master (VFW 1.0, 1.1) */
  3574. #define AVSTREAMMASTER_NONE             1 /* No master */
  3575.  
  3576. typedef struct tagCapInfoChunk {
  3577.     FOURCC      fccInfoID;                  // Chunk ID, "ICOP" for copyright
  3578.     LPVOID      lpData;                     // pointer to data
  3579.     LONG        cbData;                     // size of lpData
  3580. } CAPINFOCHUNK, *PCAPINFOCHUNK, FAR *LPCAPINFOCHUNK;
  3581.  
  3582.  
  3583. // ------------------------------------------------------------------
  3584. //  Callback Definitions
  3585. // ------------------------------------------------------------------
  3586.  
  3587. typedef LRESULT (CALLBACK* CAPYIELDCALLBACK)  (HWND hWnd);
  3588. typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKW) (HWND hWnd, int nID, LPCWSTR lpsz);
  3589. typedef LRESULT (CALLBACK* CAPERRORCALLBACKW)  (HWND hWnd, int nID, LPCWSTR lpsz);
  3590. typedef LRESULT (CALLBACK* CAPSTATUSCALLBACKA) (HWND hWnd, int nID, LPCSTR lpsz);
  3591. typedef LRESULT (CALLBACK* CAPERRORCALLBACKA)  (HWND hWnd, int nID, LPCSTR lpsz);
  3592. #ifdef UNICODE
  3593. #define CAPSTATUSCALLBACK  CAPSTATUSCALLBACKW
  3594. #define CAPERRORCALLBACK   CAPERRORCALLBACKW
  3595. #else
  3596. #define CAPSTATUSCALLBACK  CAPSTATUSCALLBACKA
  3597. #define CAPERRORCALLBACK   CAPERRORCALLBACKA
  3598. #endif
  3599. typedef LRESULT (CALLBACK* CAPVIDEOCALLBACK)  (HWND hWnd, LPVIDEOHDR lpVHdr);
  3600. typedef LRESULT (CALLBACK* CAPWAVECALLBACK)   (HWND hWnd, LPWAVEHDR lpWHdr);
  3601. typedef LRESULT (CALLBACK* CAPCONTROLCALLBACK)(HWND hWnd, int nState);
  3602.  
  3603. // ------------------------------------------------------------------
  3604. //  CapControlCallback states
  3605. // ------------------------------------------------------------------
  3606. #define CONTROLCALLBACK_PREROLL         1 /* Waiting to start capture */
  3607. #define CONTROLCALLBACK_CAPTURING       2 /* Now capturing */
  3608.  
  3609. // ------------------------------------------------------------------
  3610. //  The only exported functions from AVICAP.DLL
  3611. // ------------------------------------------------------------------
  3612.  
  3613. HWND VFWAPI capCreateCaptureWindowA (
  3614.         LPCSTR lpszWindowName,
  3615.         DWORD dwStyle,
  3616.         int x, int y, int nWidth, int nHeight,
  3617.         HWND hwndParent, int nID);
  3618.  
  3619. BOOL VFWAPI capGetDriverDescriptionA (UINT wDriverIndex,
  3620.         LPSTR lpszName, int cbName,
  3621.         LPSTR lpszVer, int cbVer);
  3622.  
  3623. HWND VFWAPI capCreateCaptureWindowW (
  3624.         LPCWSTR lpszWindowName,
  3625.         DWORD dwStyle,
  3626.         int x, int y, int nWidth, int nHeight,
  3627.         HWND hwndParent, int nID);
  3628.  
  3629. BOOL VFWAPI capGetDriverDescriptionW (UINT wDriverIndex,
  3630.         LPWSTR lpszName, int cbName,
  3631.         LPWSTR lpszVer, int cbVer);
  3632. #ifdef UNICODE
  3633. #define capCreateCaptureWindow  capCreateCaptureWindowW
  3634. #define capGetDriverDescription capGetDriverDescriptionW
  3635. #else
  3636. #define capCreateCaptureWindow  capCreateCaptureWindowA
  3637. #define capGetDriverDescription capGetDriverDescriptionA
  3638. #endif
  3639.  
  3640. #endif  /* RC_INVOKED */
  3641.  
  3642. // ------------------------------------------------------------------
  3643. // New Information chunk IDs
  3644. // ------------------------------------------------------------------
  3645. #define infotypeDIGITIZATION_TIME  mmioFOURCC ('I','D','I','T')
  3646. #define infotypeSMPTE_TIME         mmioFOURCC ('I','S','M','P')
  3647.  
  3648. // ------------------------------------------------------------------
  3649. // String IDs from status and error callbacks
  3650. // ------------------------------------------------------------------
  3651.  
  3652. #define IDS_CAP_BEGIN               300  /* "Capture Start" */
  3653. #define IDS_CAP_END                 301  /* "Capture End" */
  3654.  
  3655. #define IDS_CAP_INFO                401  /* "%s" */
  3656. #define IDS_CAP_OUTOFMEM            402  /* "Out of memory" */
  3657. #define IDS_CAP_FILEEXISTS          403  /* "File '%s' exists -- overwrite it?" */
  3658. #define IDS_CAP_ERRORPALOPEN        404  /* "Error opening palette '%s'" */
  3659. #define IDS_CAP_ERRORPALSAVE        405  /* "Error saving palette '%s'" */
  3660. #define IDS_CAP_ERRORDIBSAVE        406  /* "Error saving frame '%s'" */
  3661. #define IDS_CAP_DEFAVIEXT           407  /* "avi" */
  3662. #define IDS_CAP_DEFPALEXT           408  /* "pal" */
  3663. #define IDS_CAP_CANTOPEN            409  /* "Cannot open '%s'" */
  3664. #define IDS_CAP_SEQ_MSGSTART        410  /* "Select OK to start capture\nof video sequence\nto %s." */
  3665. #define IDS_CAP_SEQ_MSGSTOP         411  /* "Hit ESCAPE or click to end capture" */
  3666.  
  3667. #define IDS_CAP_VIDEDITERR          412  /* "An error occurred while trying to run VidEdit." */
  3668. #define IDS_CAP_READONLYFILE        413  /* "The file '%s' is a read-only file." */
  3669. #define IDS_CAP_WRITEERROR          414  /* "Unable to write to file '%s'.\nDisk may be full." */
  3670. #define IDS_CAP_NODISKSPACE         415  /* "There is no space to create a capture file on the specified device." */
  3671. #define IDS_CAP_SETFILESIZE         416  /* "Set File Size" */
  3672. #define IDS_CAP_SAVEASPERCENT       417  /* "SaveAs: %2ld%%  Hit Escape to abort." */
  3673.  
  3674. #define IDS_CAP_DRIVER_ERROR        418  /* Driver specific error message */
  3675.  
  3676. #define IDS_CAP_WAVE_OPEN_ERROR     419  /* "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." */
  3677. #define IDS_CAP_WAVE_ALLOC_ERROR    420  /* "Error: Out of memory for wave buffers." */
  3678. #define IDS_CAP_WAVE_PREPARE_ERROR  421  /* "Error: Cannot prepare wave buffers." */
  3679. #define IDS_CAP_WAVE_ADD_ERROR      422  /* "Error: Cannot add wave buffers." */
  3680. #define IDS_CAP_WAVE_SIZE_ERROR     423  /* "Error: Bad wave size." */
  3681.  
  3682. #define IDS_CAP_VIDEO_OPEN_ERROR    424  /* "Error: Cannot open the video input device." */
  3683. #define IDS_CAP_VIDEO_ALLOC_ERROR   425  /* "Error: Out of memory for video buffers." */
  3684. #define IDS_CAP_VIDEO_PREPARE_ERROR 426  /* "Error: Cannot prepare video buffers." */
  3685. #define IDS_CAP_VIDEO_ADD_ERROR     427  /* "Error: Cannot add video buffers." */
  3686. #define IDS_CAP_VIDEO_SIZE_ERROR    428  /* "Error: Bad video size." */
  3687.  
  3688. #define IDS_CAP_FILE_OPEN_ERROR     429  /* "Error: Cannot open capture file." */
  3689. #define IDS_CAP_FILE_WRITE_ERROR    430  /* "Error: Cannot write to capture file.  Disk may be full." */
  3690. #define IDS_CAP_RECORDING_ERROR     431  /* "Error: Cannot write to capture file.  Data rate too high or disk full." */
  3691. #define IDS_CAP_RECORDING_ERROR2    432  /* "Error while recording" */
  3692. #define IDS_CAP_AVI_INIT_ERROR      433  /* "Error: Unable to initialize for capture." */
  3693. #define IDS_CAP_NO_FRAME_CAP_ERROR  434  /* "Warning: No frames captured.\nConfirm that vertical sync interrupts\nare configured and enabled." */
  3694. #define IDS_CAP_NO_PALETTE_WARN     435  /* "Warning: Using default palette." */
  3695. #define IDS_CAP_MCI_CONTROL_ERROR   436  /* "Error: Unable to access MCI device." */
  3696. #define IDS_CAP_MCI_CANT_STEP_ERROR 437  /* "Error: Unable to step MCI device." */
  3697. #define IDS_CAP_NO_AUDIO_CAP_ERROR  438  /* "Error: No audio data captured.\nCheck audio card settings." */
  3698. #define IDS_CAP_AVI_DRAWDIB_ERROR   439  /* "Error: Unable to draw this data format." */
  3699. #define IDS_CAP_COMPRESSOR_ERROR    440  /* "Error: Unable to initialize compressor." */
  3700. #define IDS_CAP_AUDIO_DROP_ERROR    441  /* "Error: Audio data was lost during capture, reduce capture rate." */
  3701. #define IDS_CAP_AUDIO_DROP_COMPERROR 442  /* "Error: Audio data was lost during capture.  Try capturing without compressing." */
  3702.  
  3703. /* status string IDs */
  3704. #define IDS_CAP_STAT_LIVE_MODE      500  /* "Live window" */
  3705. #define IDS_CAP_STAT_OVERLAY_MODE   501  /* "Overlay window" */
  3706. #define IDS_CAP_STAT_CAP_INIT       502  /* "Setting up for capture - Please wait" */
  3707. #define IDS_CAP_STAT_CAP_FINI       503  /* "Finished capture, now writing frame %ld" */
  3708. #define IDS_CAP_STAT_PALETTE_BUILD  504  /* "Building palette map" */
  3709. #define IDS_CAP_STAT_OPTPAL_BUILD   505  /* "Computing optimal palette" */
  3710. #define IDS_CAP_STAT_I_FRAMES       506  /* "%d frames" */
  3711. #define IDS_CAP_STAT_L_FRAMES       507  /* "%ld frames" */
  3712. #define IDS_CAP_STAT_CAP_L_FRAMES   508  /* "Captured %ld frames" */
  3713. #define IDS_CAP_STAT_CAP_AUDIO      509  /* "Capturing audio" */
  3714. #define IDS_CAP_STAT_VIDEOCURRENT   510  /* "Captured %ld frames (%ld dropped) %d.%03d sec." */
  3715. #define IDS_CAP_STAT_VIDEOAUDIO     511  /* "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps).  %ld audio bytes (%d,%03d sps)" */
  3716. #define IDS_CAP_STAT_VIDEOONLY      512  /* "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps)" */
  3717. #define IDS_CAP_STAT_FRAMESDROPPED  513  /* "Dropped %ld of %ld frames (%d.%02d%%) during capture." */
  3718. #endif  /* NOAVIFILE */
  3719.  
  3720. #ifdef __cplusplus
  3721. } // extern "C"
  3722. #endif  /* __cplusplus */
  3723.  
  3724. /****************************************************************************
  3725.  *
  3726.  *  ACM (Audio compression manager)
  3727.  *
  3728.  ***************************************************************************/
  3729.  
  3730. #ifndef NOMSACM
  3731.     #include <msacm.h>
  3732. #endif
  3733.  
  3734. #ifdef __cplusplus
  3735. extern "C" {            /* Assume C declarations for C++ */
  3736. #endif  /* __cplusplus */
  3737.  
  3738. /****************************************************************************
  3739.  *
  3740.  *  FilePreview dialog.
  3741.  *
  3742.  ***************************************************************************/
  3743. #ifdef OFN_READONLY
  3744.  
  3745.     BOOL
  3746.     VFWAPI
  3747.     GetOpenFileNamePreviewA(
  3748.         IN OUT LPOPENFILENAMEA lpofn
  3749.         );
  3750.  
  3751.     BOOL
  3752.     VFWAPI
  3753.     GetSaveFileNamePreviewA(
  3754.         IN OUT LPOPENFILENAMEA lpofn
  3755.         );
  3756.  
  3757.     BOOL
  3758.     VFWAPI
  3759.     GetOpenFileNamePreviewW(
  3760.         IN OUT LPOPENFILENAMEW lpofn
  3761.         );
  3762.  
  3763.     BOOL
  3764.     VFWAPI
  3765.     GetSaveFileNamePreviewW(
  3766.         IN OUT LPOPENFILENAMEW lpofn
  3767.         );
  3768.  
  3769.     #ifdef UNICODE
  3770.         #define GetOpenFileNamePreview          GetOpenFileNamePreviewW
  3771.         #define GetSaveFileNamePreview          GetSaveFileNamePreviewW
  3772.     #else
  3773.         #define GetOpenFileNamePreview          GetOpenFileNamePreviewA
  3774.         #define GetSaveFileNamePreview          GetSaveFileNamePreviewA
  3775.     #endif
  3776.  
  3777. #endif // OFN_READONLY
  3778.  
  3779. #ifndef RC_INVOKED
  3780. #include "poppack.h"
  3781. #endif
  3782.  
  3783. #ifdef __cplusplus
  3784. }                       /* End of extern "C" { */
  3785. #endif  /* __cplusplus */
  3786.  
  3787. #pragma option pop /*P_O_Pop*/
  3788. #endif  /* _INC_VFW */
  3789.