vfw.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:187k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit VFW;
  2. interface
  3. {$UNDEF UNICODE}
  4. (****************************************************************************
  5.  *
  6.  *      VfW.H - Video for windows include file for WIN32
  7.  *
  8.  *      Copyright (c) 1991-1999, Microsoft Corp.  All rights reserved.
  9.  *
  10.  *      This include files defines interfaces to the following
  11.  *      video components
  12.  *
  13.  *          COMPMAN         - Installable Compression Manager.
  14.  *          DRAWDIB         - Routines for drawing to the display.
  15.  *          VIDEO           - Video Capture Driver Interface
  16.  *
  17.  *          AVIFMT          - AVI File Format structure definitions.
  18.  *          MMREG           - FOURCC and other things
  19.  *
  20.  *          AVIFile         - Interface for reading AVI Files and AVI Streams
  21.  *          MCIWND          - MCI/AVI window class
  22.  *          AVICAP          - AVI Capture Window class
  23.  *
  24.  *          MSACM           - Audio compression manager.
  25.  *
  26.  *      The following symbols control inclusion of various parts of this file:
  27.  *
  28.  *          NOCOMPMAN       - dont include COMPMAN
  29.  *          NODRAWDIB       - dont include DRAWDIB
  30.  *          NOVIDEO         - dont include video capture interface
  31.  *
  32.  *          NOAVIFMT        - dont include AVI file format structs
  33.  *          NOMMREG         - dont include MMREG
  34.  *
  35.  *          NOAVIFILE       - dont include AVIFile interface
  36.  *          NOMCIWND        - dont include AVIWnd class.
  37.  *          NOAVICAP        - dont include AVICap class.
  38.  *
  39.  *          NOMSACM         - dont include ACM stuff.
  40.  *
  41.  ****************************************************************************)
  42. (******************************************************************************)
  43. (*                                                                            *)
  44. (*  VFW.PAS Conversion by Ronald Dittrich                                     *)
  45. (*                                                                            *)
  46. (*  E-Mail: info@swiftsoft.de                                                 *)
  47. (*  http://www.swiftsoft.de                                                   *)
  48. (*                                                                            *)
  49. (******************************************************************************)
  50. (******************************************************************************)
  51. (*                                                                            *)
  52. (*  Modyfied: 25.April.2000                                                   *)
  53. (*                                                                            *)
  54. (*  E-Mail:                                                                   *)
  55. (*  Ivo Steinmann: isteinmann@bluewin.ch                                      *)
  56. (*                                                                            *)
  57. (*  Please send all messages regarding specific errors and lacks of this unit *)
  58. (*  to Ivo Steinmann                                                          *)
  59. (*                                                                            *)
  60. (******************************************************************************)
  61. (******************************************************************************)
  62. (*                                                                            *)
  63. (*  Modyfied: 2000-12-07                                                      *)
  64. (*                                                                            *)
  65. (*  E-Mail:                                                                   *)
  66. (*  Peter Haas: PeterJHaas@t-online.de                                        *)
  67. (*                                                                            *)
  68. (*  Only modified line 1380  ( TAVIPALCHANGE.peNew )                          *)
  69. (*                                                                            *)
  70. (******************************************************************************)
  71. uses
  72.     Windows,
  73.     MMSystem,
  74.     Messages,
  75.     CommDlg,
  76.     ActiveX,
  77.     Dialogs;
  78. (****************************************************************************
  79.  *
  80.  *  types
  81.  *
  82.  ***************************************************************************)
  83. type
  84.   PVOID = pointer;
  85.   LONG  = longint;
  86.   PLONG = ^LONG;
  87.   int   = integer;
  88. (****************************************************************************
  89.  *
  90.  *  VideoForWindowsVersion() - returns version of VfW
  91.  *
  92.  ***************************************************************************)
  93. function VideoForWindowsVersion: DWORD; pascal;
  94. (****************************************************************************
  95.  *
  96.  *  call these to start stop using VfW from your app.
  97.  *
  98.  ***************************************************************************)
  99.                                 {
  100. function InitVFW: LONG; stdcall;
  101. function TermVFW: LONG; stdcall;  }
  102. (****************************************************************************/
  103. /*                                                                          */
  104. /*        Macros                                                            */
  105. /*                                                                          */
  106. /*  should we define this??                                                 */
  107. /*                                                                          */
  108. /****************************************************************************)
  109. function MKFOURCC(ch0, ch1, ch2, ch3: Char): FOURCC;
  110. (****************************************************************************
  111.  *
  112.  *  COMPMAN - Installable Compression Manager.
  113.  *
  114.  ****************************************************************************)
  115. const
  116.   ICVERSION                   = $0104 ;
  117. type
  118.   HIC                         = THandle;  // Handle to an Installable Compressor
  119. //
  120. // this code in biCompression means the DIB must be accesed via
  121. // 48 bit pointers! using *ONLY* the selector given.
  122. //
  123. const
  124.   BI_1632                     = $32333631;    // '1632'
  125. function mmioFOURCC(ch0, ch1, ch2, ch3: Char): FOURCC;
  126. type
  127.   TWOCC                       = word;
  128. function aviTWOCC(ch0, ch1: Char): TWOCC;
  129. const
  130.   ICTYPE_VIDEO                = $63646976;  {vidc}
  131.   ICTYPE_AUDIO                = $63647561;  {audc}
  132. const
  133.   ICERR_OK                    = 0 ;
  134.   ICERR_DONTDRAW              = 1 ;
  135.   ICERR_NEWPALETTE            = 2 ;
  136.   ICERR_GOTOKEYFRAME          = 3 ;
  137.   ICERR_STOPDRAWING           = 4 ;
  138.   ICERR_UNSUPPORTED           = -1 ;
  139.   ICERR_BADFORMAT             = -2 ;
  140.   ICERR_MEMORY                = -3 ;
  141.   ICERR_INTERNAL              = -4 ;
  142.   ICERR_BADFLAGS              = -5 ;
  143.   ICERR_BADPARAM              = -6 ;
  144.   ICERR_BADSIZE               = -7 ;
  145.   ICERR_BADHANDLE             = -8 ;
  146.   ICERR_CANTUPDATE            = -9 ;
  147.   ICERR_ABORT                 = -10 ;
  148.   ICERR_ERROR                 = -100 ;
  149.   ICERR_BADBITDEPTH           = -200 ;
  150.   ICERR_BADIMAGESIZE          = -201 ;
  151.   ICERR_CUSTOM                = -400 ;    // errors less than ICERR_CUSTOM...
  152. {-- Values for dwFlags of ICOpen() -------------------------------------------}
  153.   ICMODE_COMPRESS             = 1 ;
  154.   ICMODE_DECOMPRESS           = 2 ;
  155.   ICMODE_FASTDECOMPRESS       = 3 ;
  156.   ICMODE_QUERY                = 4 ;
  157.   ICMODE_FASTCOMPRESS         = 5 ;
  158.   ICMODE_DRAW                 = 8 ;
  159. {-- Flags for AVI file index -------------------------------------------------}
  160.   AVIIF_LIST                  = $00000001 ;
  161.   AVIIF_TWOCC                 = $00000002 ;
  162.   AVIIF_KEYFRAME              = $00000010 ;
  163. {-- quality flags ------------------------------------------------------------}
  164.   ICQUALITY_LOW               = 0 ;
  165.   ICQUALITY_HIGH              = 10000 ;
  166.   ICQUALITY_DEFAULT           = -1 ;
  167. (************************************************************************
  168. ************************************************************************)
  169.   ICM_USER                    = (DRV_USER+$0000) ;
  170.   ICM_RESERVED_LOW            = (DRV_USER+$1000) ;
  171.   ICM_RESERVED_HIGH           = (DRV_USER+$2000) ;
  172.   ICM_RESERVED                = ICM_RESERVED_LOW ;
  173. (************************************************************************
  174.     messages.
  175. ************************************************************************)
  176.   ICM_GETSTATE                = (ICM_RESERVED+0) ;    // Get compressor state
  177.   ICM_SETSTATE                = (ICM_RESERVED+1) ;    // Set compressor state
  178.   ICM_GETINFO                 = (ICM_RESERVED+2) ;    // Query info about the compressor
  179.   ICM_CONFIGURE               = (ICM_RESERVED+10);    // show the configure dialog
  180.   ICM_ABOUT                   = (ICM_RESERVED+11);    // show the about box
  181.   ICM_GETDEFAULTQUALITY       = (ICM_RESERVED+30);    // get the default value for quality
  182.   ICM_GETQUALITY              = (ICM_RESERVED+31);    // get the current value for quality
  183.   ICM_SETQUALITY              = (ICM_RESERVED+32);    // set the default value for quality
  184.   ICM_SET                     = (ICM_RESERVED+40);    // Tell the driver something
  185.   ICM_GET                     = (ICM_RESERVED+41);    // Ask the driver something
  186. {-- Constants for ICM_SET: ---------------------------------------------------}
  187.   ICM_FRAMERATE               = $526D7246;  {FrmR}
  188.   ICM_KEYFRAMERATE            = $5279654B;  {KeyR}
  189. (************************************************************************
  190.     ICM specific messages.
  191. ************************************************************************)
  192.   ICM_COMPRESS_GET_FORMAT     = (ICM_USER+4)  ;   // get compress format or size
  193.   ICM_COMPRESS_GET_SIZE       = (ICM_USER+5)  ;   // get output size
  194.   ICM_COMPRESS_QUERY          = (ICM_USER+6)  ;   // query support for compress
  195.   ICM_COMPRESS_BEGIN          = (ICM_USER+7)  ;   // begin a series of compress calls.
  196.   ICM_COMPRESS                = (ICM_USER+8)  ;   // compress a frame
  197.   ICM_COMPRESS_END            = (ICM_USER+9)  ;   // end of a series of compress calls.
  198.   ICM_DECOMPRESS_GET_FORMAT   = (ICM_USER+10) ;   // get decompress format or size
  199.   ICM_DECOMPRESS_QUERY        = (ICM_USER+11) ;   // query support for dempress
  200.   ICM_DECOMPRESS_BEGIN        = (ICM_USER+12) ;   // start a series of decompress calls
  201.   ICM_DECOMPRESS              = (ICM_USER+13) ;   // decompress a frame
  202.   ICM_DECOMPRESS_END          = (ICM_USER+14) ;   // end a series of decompress calls
  203.   ICM_DECOMPRESS_SET_PALETTE  = (ICM_USER+29) ;   // fill in the DIB color table
  204.   ICM_DECOMPRESS_GET_PALETTE  = (ICM_USER+30) ;   // fill in the DIB color table
  205.   ICM_DRAW_QUERY              = (ICM_USER+31) ;   // query support for dempress
  206.   ICM_DRAW_BEGIN              = (ICM_USER+15) ;   // start a series of draw calls
  207.   ICM_DRAW_GET_PALETTE        = (ICM_USER+16) ;   // get the palette needed for drawing
  208.   ICM_DRAW_START              = (ICM_USER+18) ;   // start decompress clock
  209.   ICM_DRAW_STOP               = (ICM_USER+19) ;   // stop decompress clock
  210.   ICM_DRAW_END                = (ICM_USER+21) ;   // end a series of draw calls
  211.   ICM_DRAW_GETTIME            = (ICM_USER+32) ;   // get value of decompress clock
  212.   ICM_DRAW                    = (ICM_USER+33) ;   // generalized "render" message
  213.   ICM_DRAW_WINDOW             = (ICM_USER+34) ;   // drawing window has moved or hidden
  214.   ICM_DRAW_SETTIME            = (ICM_USER+35) ;   // set correct value for decompress clock
  215.   ICM_DRAW_REALIZE            = (ICM_USER+36) ;   // realize palette for drawing
  216.   ICM_DRAW_FLUSH              = (ICM_USER+37) ;   // clear out buffered frames
  217.   ICM_DRAW_RENDERBUFFER       = (ICM_USER+38) ;   // draw undrawn things in queue
  218.   ICM_DRAW_START_PLAY         = (ICM_USER+39) ;   // start of a play
  219.   ICM_DRAW_STOP_PLAY          = (ICM_USER+40) ;   // end of a play
  220.   ICM_DRAW_SUGGESTFORMAT      = (ICM_USER+50) ;   // Like ICGetDisplayFormat
  221.   ICM_DRAW_CHANGEPALETTE      = (ICM_USER+51) ;   // for animating palette
  222.   ICM_GETBUFFERSWANTED        = (ICM_USER+41) ;   // ask about prebuffering
  223.   ICM_GETDEFAULTKEYFRAMERATE  = (ICM_USER+42) ;   // get the default value for key frames
  224.   ICM_DECOMPRESSEX_BEGIN      = (ICM_USER+60) ;   // start a series of decompress calls
  225.   ICM_DECOMPRESSEX_QUERY      = (ICM_USER+61) ;   // start a series of decompress calls
  226.   ICM_DECOMPRESSEX            = (ICM_USER+62) ;   // decompress a frame
  227.   ICM_DECOMPRESSEX_END        = (ICM_USER+63) ;   // end a series of decompress calls
  228.   ICM_COMPRESS_FRAMES_INFO    = (ICM_USER+70) ;   // tell about compress to come
  229.   ICM_SET_STATUS_PROC         = (ICM_USER+72) ;   // set status callback
  230. (************************************************************************
  231. ************************************************************************)
  232. type
  233.   PICOPEN = ^TICOPEN;
  234.   TICOPEN = packed record
  235.     dwSize                  : DWORD   ; // sizeof(ICOPEN)
  236.     fccType                 : DWORD   ; // 'vidc'
  237.     fccHandler              : DWORD   ; //
  238.     dwVersion               : DWORD   ; // version of compman opening you
  239.     dwFlags                 : DWORD   ; // LOWORD is type specific
  240.     dwError                 : DWORD   ; // error return.
  241.     pV1Reserved             : PVOID   ; // Reserved
  242.     pV2Reserved             : PVOID   ; // Reserved
  243.     dnDevNode               : DWORD   ; // Devnode for PnP devices
  244.   end;
  245. (************************************************************************
  246. ************************************************************************)
  247.   PICINFO = ^TICINFO;
  248.   TICINFO = packed record
  249.     dwSize                  : DWORD;    // sizeof(ICINFO)
  250.     fccType                 : DWORD;    // compressor type     'vidc' 'audc'
  251.     fccHandler              : DWORD;    // compressor sub-type 'rle ' 'jpeg' 'pcm '
  252.     dwFlags                 : DWORD;    // flags LOWORD is type specific
  253.     dwVersion               : DWORD;    // version of the driver
  254.     dwVersionICM            : DWORD;    // version of the ICM used
  255.     //
  256.     // under Win32, the driver always returns UNICODE strings.
  257.     //
  258.     szName                  : array[0..15] of WChar  ; // short name
  259.     szDescription           : array[0..127] of WChar ; // DWORD name
  260.     szDriver                : array[0..127] of WChar ; // driver that contains compressor
  261.   end;
  262. {-- Flags for the <dwFlags> field of the <ICINFO> structure. ------------}
  263. const
  264.   VIDCF_QUALITY               = $0001 ;  // supports quality
  265.   VIDCF_CRUNCH                = $0002 ;  // supports crunching to a frame size
  266.   VIDCF_TEMPORAL              = $0004 ;  // supports inter-frame compress
  267.   VIDCF_COMPRESSFRAMES        = $0008 ;  // wants the compress all frames message
  268.   VIDCF_DRAW                  = $0010 ;  // supports drawing
  269.   VIDCF_FASTTEMPORALC         = $0020 ;  // does not need prev frame on compress
  270.   VIDCF_FASTTEMPORALD         = $0080 ;  // does not need prev frame on decompress
  271.   //VIDCF_QUALITYTIME         = $0040 ;  // supports temporal quality
  272.   //VIDCF_FASTTEMPORAL        = (VIDCF_FASTTEMPORALC or VIDCF_FASTTEMPORALD)
  273. (************************************************************************
  274. ************************************************************************)
  275.   ICCOMPRESS_KEYFRAME         = $00000001;
  276. type
  277.   PICCOMPRESS = ^TICCOMPRESS;
  278.   TICCOMPRESS = packed record
  279.     dwFlags                 : DWORD;                // flags
  280.     lpbiOutput              : PBITMAPINFOHEADER ;   // output format
  281.     lpOutput                : PVOID ;               // output data
  282.     lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
  283.     lpInput                 : PVOID ;               // frame data to compress
  284.     lpckid                  : PDWORD ;              // ckid for data in AVI file
  285.     lpdwFlags               : PDWORD;               // flags in the AVI index.
  286.     lFrameNum               : LONG ;               // frame number of seq.
  287.     dwFrameSize             : DWORD ;               // reqested size in bytes. (if non zero)
  288.     dwQuality               : DWORD ;               // quality
  289.     // these are new fields
  290.     lpbiPrev                : PBITMAPINFOHEADER ;   // format of previous frame
  291.     lpPrev                  : PVOID ;               // previous frame
  292.   end;
  293. (************************************************************************
  294. ************************************************************************)
  295. const
  296.   ICCOMPRESSFRAMES_PADDING    = $00000001 ;
  297. type
  298.   TICCompressProc    = function(lInputOutput: LPARAM; lFrame: DWORD; lpBits: PVOID; len: LONG): LONG; stdcall;
  299.   PICCOMPRESSFRAMES  = ^TICCOMPRESSFRAMES;
  300.   TICCOMPRESSFRAMES  = packed record
  301.     dwFlags                 : DWORD ;               // flags
  302.     lpbiOutput              : PBITMAPINFOHEADER ;   // output format
  303.     lOutput                 : LPARAM ;              // output identifier
  304.     lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
  305.     lInput                  : LPARAM ;              // input identifier
  306.     lStartFrame             : LONG ;                // start frame
  307.     lFrameCount             : LONG ;                // # of frames
  308.     lQuality                : LONG ;                // quality
  309.     lDataRate               : LONG ;                // data rate
  310.     lKeyRate                : LONG ;                // key frame rate
  311.     dwRate                  : DWORD ;               // frame rate, as always
  312.     dwScale                 : DWORD ;
  313.     dwOverheadPerFrame      : DWORD ;
  314.     dwReserved2             : DWORD ;
  315.     GetData                 : TICCompressProc;
  316.     PutData                 : TICCompressProc;
  317.   end;
  318. {-- Messages for Status callback ---------------------------------------------}
  319. const
  320.     ICSTATUS_START              = 0 ;
  321.     ICSTATUS_STATUS             = 1 ;   // l = % done
  322.     ICSTATUS_END                = 2 ;
  323.     ICSTATUS_ERROR              = 3 ;   // l = error string (LPSTR)
  324.     ICSTATUS_YIELD              = 4 ;
  325. type
  326.   // return nonzero means abort operation in progress
  327.   TICStatusProc    = function(lParam: LPARAM; message: UINT; l: LONG): LONG; stdcall;
  328.   PICSETSTATUSPROC = ^TICSETSTATUSPROC;
  329.   TICSETSTATUSPROC = packed record
  330.     dwFlags                 : DWORD ;
  331.     lParam                  : LPARAM ;
  332.     Status                  : TICStatusProc;
  333.   end;
  334. (************************************************************************
  335. ************************************************************************)
  336. const
  337.     ICDECOMPRESS_HURRYUP        = $80000000 ;   // don't draw just buffer (hurry up!)
  338.     ICDECOMPRESS_UPDATE         = $40000000 ;   // don't draw just update screen
  339.     ICDECOMPRESS_PREROLL        = $20000000 ;   // this frame is before real start
  340.     ICDECOMPRESS_NULLFRAME      = $10000000 ;   // repeat last frame
  341.     ICDECOMPRESS_NOTKEYFRAME    = $08000000 ;   // this frame is not a key frame
  342. type
  343.   PICDECOMPRESS = ^TICDECOMPRESS;
  344.   TICDECOMPRESS = packed record
  345.     dwFlags                 : DWORD ;               // flags (from AVI index...)
  346.     lpbiInput               : PBITMAPINFOHEADER ;   // BITMAPINFO of compressed data
  347.                                                         // biSizeImage has the chunk size
  348.     lpInput                 : PVOID ;               // compressed data
  349.     lpbiOutput              : PBITMAPINFOHEADER ;   // DIB to decompress to
  350.     lpOutput                : PVOID ;
  351.     ckid                    : DWORD ;               // ckid from AVI file
  352.   end;
  353.   PICDECOMPRESSEX = ^TICDECOMPRESSEX;
  354.   TICDECOMPRESSEX = packed record
  355.     //
  356.     // same as ICM_DECOMPRESS
  357.     //
  358.     dwFlags                 : DWORD;
  359.     lpbiSrc                 : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
  360.     lpSrc                   : PVOID;                // compressed data
  361.     lpbiDst                 : PBITMAPINFOHEADER;    // DIB to decompress to
  362.     lpDst                   : PVOID;                // output data
  363.     //
  364.     // new for ICM_DECOMPRESSEX
  365.     //
  366.     xDst                    : int; // destination rectangle
  367.     yDst                    : int;
  368.     dxDst                   : int;
  369.     dyDst                   : int;
  370.     xSrc                    : int; // source rectangle
  371.     ySrc                    : int;
  372.     dxSrc                   : int;
  373.     dySrc                   : int;
  374.   end;
  375. (************************************************************************
  376. ************************************************************************)
  377. const
  378.     ICDRAW_QUERY                = $00000001 ; // test for support
  379.     ICDRAW_FULLSCREEN           = $00000002 ; // draw to full screen
  380.     ICDRAW_HDC                  = $00000004 ; // draw to a HDC/HWND
  381.     ICDRAW_ANIMATE              = $00000008 ;   // expect palette animation
  382.     ICDRAW_CONTINUE             = $00000010 ;   // draw is a continuation of previous draw
  383.     ICDRAW_MEMORYDC             = $00000020 ;   // DC is offscreen, by the way
  384.     ICDRAW_UPDATING             = $00000040 ;   // We're updating, as opposed to playing
  385.     ICDRAW_RENDER               = $00000080 ; // used to render data not draw it
  386.     ICDRAW_BUFFER               = $00000100 ; // please buffer this data offscreen, we will need to update it
  387. type
  388.   PICDRAWBEGIN = ^TICDRAWBEGIN;
  389.   TICDRAWBEGIN = packed record
  390.     dwFlags                 : DWORD ;       // flags
  391.     hpal                    : HPALETTE ;    // palette to draw with
  392.     hwnd                    : HWND ;        // window to draw to
  393.     hdc                     : HDC ;         // HDC to draw to
  394.     xDst                    : int ;         // destination rectangle
  395.     yDst                    : int ;
  396.     dxDst                   : int ;
  397.     dyDst                   : int ;
  398.     lpbi                    : PBITMAPINFOHEADER ;
  399.                                                 // format of frame to draw
  400.     xSrc                    : int ;         // source rectangle
  401.     ySrc                    : int ;
  402.     dxSrc                   : int ;
  403.     dySrc                   : int ;
  404.     dwRate                  : DWORD ;       // frames/second = (dwRate/dwScale)
  405.     dwScale                 : DWORD ;
  406.   end;
  407. (************************************************************************
  408. ************************************************************************)
  409. const
  410.     ICDRAW_HURRYUP              = $80000000 ;   // don't draw just buffer (hurry up!)
  411.     ICDRAW_UPDATE               = $40000000 ;   // don't draw just update screen
  412.     ICDRAW_PREROLL              = $20000000 ;   // this frame is before real start
  413.     ICDRAW_NULLFRAME            = $10000000 ;   // repeat last frame
  414.     ICDRAW_NOTKEYFRAME          = $08000000 ;   // this frame is not a key frame
  415. type
  416.     PICDRAW                     = ^TICDRAW;
  417.     TICDRAW                     = packed record
  418.         dwFlags                 : DWORD ;   // flags
  419.         lpFormat                : PVOID ;   // format of frame to decompress
  420.         lpData                  : PVOID ;   // frame data to decompress
  421.         cbData                  : DWORD ;
  422.         lTime                   : LONG  ;   // time in drawbegin units (see dwRate and dwScale)
  423.     end;
  424.     PICDRAWSUGGEST              = ^TICDRAWSUGGEST;
  425.     TICDRAWSUGGEST              = packed record
  426.         lpbiIn                  : PBITMAPINFOHEADER ;   // format to be drawn
  427.         lpbiSuggest             : PBITMAPINFOHEADER ;   // location for suggested format (or NULL to get size)
  428.         dxSrc                   : int ;                 // source extent or 0
  429.         dySrc                   : int ;
  430.         dxDst                   : int ;                 // dest extent or 0
  431.         dyDst                   : int ;
  432.         hicDecompressor         : HIC ;                 // decompressor you can talk to
  433.     end;
  434. (************************************************************************
  435. ************************************************************************)
  436.     PICPALETTE                  = ^TICPALETTE;
  437.     TICPALETTE                  = packed record
  438.         dwFlags                 : DWORD ;           // flags (from AVI index...)
  439.         iStart                  : int ;             // first palette to change
  440.         iLen                    : int ;             // count of entries to change.
  441.         lppe                    : PPALETTEENTRY ;   // palette
  442.     end;
  443. (************************************************************************
  444.     ICM function declarations
  445. ************************************************************************)
  446. function    ICInfo(fccType, fccHandler: DWORD; lpicinfo: PICINFO) : BOOL ; stdcall ;
  447. function    ICInstall(fccType, fccHandler: DWORD; lParam: LPARAM; szDesc: LPSTR; wFlags: UINT) : BOOL ; stdcall ;
  448. function    ICRemove(fccType, fccHandler: DWORD; wFlags: UINT) : BOOL ; stdcall ;
  449. function    ICGetInfo(hic: HIC; picinfo: PICINFO; cb: DWORD) : DWORD ; stdcall ;
  450. function    ICOpen(fccType, fccHandler: DWORD; wMode: UINT) : HIC ; stdcall ;
  451. function    ICOpenFunction(fccType, fccHandler: DWORD; wMode: UINT; lpfnHandler: TFarProc) : HIC ; stdcall ;
  452. function    ICClose(hic: HIC) : DWORD; stdcall ;
  453. function    ICSendMessage(hic: HIC; msg: UINT; dw1, dw2: DWORD) : DWORD ; stdcall ;
  454. {-- Values for wFlags of ICInstall -------------------------------------------}
  455. const
  456.     ICINSTALL_UNICODE           = $8000 ;
  457.     ICINSTALL_FUNCTION          = $0001 ; // lParam is a DriverProc (function ptr)
  458.     ICINSTALL_DRIVER            = $0002 ; // lParam is a driver name (string)
  459.     ICINSTALL_HDRV              = $0004 ; // lParam is a HDRVR (driver handle)
  460.     ICINSTALL_DRIVERW           = $8002 ; // lParam is a unicode driver name
  461. {-- Query macros -------------------------------------------------------------}
  462.     ICMF_CONFIGURE_QUERY        = $00000001 ;
  463.     ICMF_ABOUT_QUERY            = $00000001 ;
  464. function    ICQueryAbout(hic: HIC): BOOL;
  465. function    ICAbout(hic: HIC; hwnd: HWND): DWORD;
  466. function    ICQueryConfigure(hic: HIC): BOOL;
  467. function    ICConfigure(hic: HIC; hwnd: HWND): DWORD;
  468. {-- Get/Set state macros -----------------------------------------------------}
  469. function    ICGetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
  470. function    ICSetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
  471. function    ICGetStateSize(hic: HIC): DWORD;
  472. {-- Get value macros ---------------------------------------------------------}
  473. function    ICGetDefaultQuality(hic: HIC): DWORD;
  474. function    ICGetDefaultKeyFrameRate(hic: HIC): DWORD;
  475. {-- Draw window macro --------------------------------------------------------}
  476. function    ICDrawWindow(hic: HIC; prc: PRECT): DWORD;
  477. (************************************************************************
  478.     compression functions
  479. ************************************************************************/
  480. /*
  481.  *  ICCompress()
  482.  *
  483.  *  compress a single frame
  484.  *
  485.  *)
  486. function ICCompress(
  487.     hic             : HIC;
  488.     dwFlags         : DWORD;                // flags
  489.     lpbiOutput      : PBITMAPINFOHEADER;    // output format
  490.     lpData          : PVOID;                // output data
  491.     lpbiInput       : PBITMAPINFOHEADER;    // format of frame to compress
  492.     lpBits          : PVOID;                // frame data to compress
  493.     lpckid          : PDWORD;               // ckid for data in AVI file
  494.     lpdwFlags       : PDWORD;               // flags in the AVI index.
  495.     lFrameNum       : DWORD;                 // frame number of seq.
  496.     dwFrameSize     : DWORD;                // reqested size in bytes. (if non zero)
  497.     dwQuality       : DWORD;                // quality within one frame
  498.     lpbiPrev        : PBITMAPINFOHEADER;    // format of previous frame
  499.     lpPrev          : PVOID                 // previous frame
  500.     ): DWORD; cdecl;
  501. (*
  502.  *  ICCompressBegin()
  503.  *
  504.  *  start compression from a source format (lpbiInput) to a dest
  505.  *  format (lpbiOuput) is supported.
  506.  *
  507.  *)
  508. function    ICCompressBegin(hic: HIC; lpbiInput: PBITMAPINFOHEADER; lpbiOutput: PBITMAPINFOHEADER): DWORD;
  509. (*
  510.  *  ICCompressQuery()
  511.  *
  512.  *  determines if compression from a source format (lpbiInput) to a dest
  513.  *  format (lpbiOuput) is supported.
  514.  *
  515.  *)
  516. function    ICCompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  517. (*
  518.  *  ICCompressGetFormat()
  519.  *
  520.  *  get the output format, (format of compressed data)
  521.  *  if lpbiOutput is NULL return the size in bytes needed for format.
  522.  *
  523.  *)
  524. function    ICCompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  525. function    ICCompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  526. (*
  527.  *  ICCompressSize()
  528.  *
  529.  *  return the maximal size of a compressed frame
  530.  *
  531.  *)
  532. function    ICCompressGetSize(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  533. function    ICCompressEnd(hic: HIC): DWORD;
  534. (************************************************************************
  535.     decompression functions
  536. ************************************************************************)
  537. (*
  538.  *  ICDecompress()
  539.  *
  540.  *  decompress a single frame
  541.  *
  542.  *)
  543. function    ICDecompress(
  544.     hic             : HIC;
  545.     dwFlags         : DWORD;                // flags (from AVI index...)
  546.     lpbiFormat      : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
  547.                                             // biSizeImage has the chunk size
  548.     lpData          : PVOID;                // data
  549.     lpbi            : PBITMAPINFOHEADER;    // DIB to decompress to
  550.     lpBits          : PVOID
  551.     ): DWORD; cdecl;
  552. (*
  553.  *  ICDecompressBegin()
  554.  *
  555.  *  start compression from a source format (lpbiInput) to a dest
  556.  *  format (lpbiOutput) is supported.
  557.  *
  558.  *)
  559. function    ICDecompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  560. (*
  561.  *  ICDecompressQuery()
  562.  *
  563.  *  determines if compression from a source format (lpbiInput) to a dest
  564.  *  format (lpbiOutput) is supported.
  565.  *
  566.  *)
  567. function    ICDecompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  568. (*
  569.  *  ICDecompressGetFormat()
  570.  *
  571.  *  get the output format, (format of un-compressed data)
  572.  *  if lpbiOutput is NULL return the size in bytes needed for format.
  573.  *
  574.  *)
  575. function    ICDecompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  576. function    ICDecompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  577. (*
  578.  *  ICDecompressGetPalette()
  579.  *
  580.  *  get the output palette
  581.  *
  582.  *)
  583. function    ICDecompressGetPalette(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  584. function    ICDecompressSetPalette(hic: HIC; lpbiPalette: PBITMAPINFOHEADER): DWORD;
  585. function    ICDecompressEnd(hic: HIC): DWORD;
  586. (************************************************************************
  587.     decompression (ex) functions
  588. ************************************************************************)
  589. //
  590. // on Win16 these functions are macros that call ICMessage. ICMessage will
  591. // not work on NT. rather than add new entrypoints we have given
  592. // them as static inline functions
  593. //
  594. (*
  595.  *  ICDecompressEx()
  596.  *
  597.  *  decompress a single frame
  598.  *
  599.  *)
  600. function    ICDecompressEx(
  601.     hic         : HIC;
  602.     dwFlags     : DWORD;
  603.     lpbiSrc     : PBITMAPINFOHEADER;
  604.     lpSrc       : PVOID;
  605.     xSrc        : int;
  606.     ySrc        : int;
  607.     dxSrc       : int;
  608.     dySrc       : int;
  609.     lpbiDst     : PBITMAPINFOHEADER;
  610.     lpDst       : PVOID;
  611.     xDst        : int;
  612.     yDst        : int;
  613.     dxDst       : int;
  614.     dyDst       : int
  615.     ): DWORD; stdcall;
  616. (*
  617.  *  ICDecompressExBegin()
  618.  *
  619.  *  start compression from a source format (lpbiInput) to a dest
  620.  *  format (lpbiOutput) is supported.
  621.  *
  622.  *)
  623. function    ICDecompressExBegin(
  624.     hic         : HIC;
  625.     dwFlags     : DWORD;
  626.     lpbiSrc     : PBITMAPINFOHEADER;
  627.     lpSrc       : PVOID;
  628.     xSrc        : int;
  629.     ySrc        : int;
  630.     dxSrc       : int;
  631.     dySrc       : int;
  632.     lpbiDst     : PBITMAPINFOHEADER;
  633.     lpDst       : PVOID;
  634.     xDst        : int;
  635.     yDst        : int;
  636.     dxDst       : int;
  637.     dyDst       : int
  638.     ): DWORD; stdcall;
  639. (*
  640.  *  ICDecompressExQuery()
  641.  *
  642.  *)
  643. function    ICDecompressExQuery(
  644.     hic         : HIC;
  645.     dwFlags     : DWORD;
  646.     lpbiSrc     : PBITMAPINFOHEADER;
  647.     lpSrc       : PVOID;
  648.     xSrc        : int;
  649.     ySrc        : int;
  650.     dxSrc       : int;
  651.     dySrc       : int;
  652.     lpbiDst     : PBITMAPINFOHEADER;
  653.     lpDst       : PVOID;
  654.     xDst        : int;
  655.     yDst        : int;
  656.     dxDst       : int;
  657.     dyDst       : int
  658.     ): DWORD; stdcall;
  659. function ICDecompressExEnd(hic: HIC): DWORD;
  660. (************************************************************************
  661.     drawing functions
  662. ************************************************************************)
  663. (*
  664.  *  ICDrawBegin()
  665.  *
  666.  *  start decompressing data with format (lpbiInput) directly to the screen
  667.  *
  668.  *  return zero if the decompressor supports drawing.
  669.  *
  670.  *)
  671. function    ICDrawBegin(
  672.     hic         : HIC;
  673.     dwFlags     : DWORD;                // flags
  674.     hpal        : HPALETTE;             // palette to draw with
  675.     hwnd        : HWND;                 // window to draw to
  676.     hdc         : HDC;                  // HDC to draw to
  677.     xDst        : int;                  // destination rectangle
  678.     yDst        : int;
  679.     dxDst       : int;
  680.     dyDst       : int;
  681.     lpbi        : PBITMAPINFOHEADER;    // format of frame to draw
  682.     xSrc        : int;                  // source rectangle
  683.     ySrc        : int;
  684.     dxSrc       : int;
  685.     dySrc       : int;
  686.     dwRate      : DWORD;                // frames/second = (dwRate/dwScale)
  687.     dwScale     : DWORD
  688.     ): DWORD; cdecl;
  689. (*
  690.  *  ICDraw()
  691.  *
  692.  *  decompress data directly to the screen
  693.  *
  694.  *)
  695. function    ICDraw(
  696.     hic         : HIC;
  697.     dwFlags     : DWORD;                // flags
  698.     lpFormat    : PVOID;                // format of frame to decompress
  699.     lpData      : PVOID;                // frame data to decompress
  700.     cbData      : DWORD;                // size of data
  701.     lTime       : DWORD                  // time to draw this frame
  702.     ): DWORD; cdecl;
  703. // ICMessage is not supported on Win32, so provide a static inline function
  704. // to do the same job
  705. function    ICDrawSuggestFormat(
  706.     hic         : HIC;
  707.     lpbiIn      : PBITMAPINFOHEADER;
  708.     lpbiOut     : PBITMAPINFOHEADER;
  709.     dxSrc       : int;
  710.     dySrc       : int;
  711.     dxDst       : int;
  712.     dyDst       : int;
  713.     hicDecomp   : HIC
  714.     ): DWORD; stdcall;
  715. (*
  716.  *  ICDrawQuery()
  717.  *
  718.  *  determines if the compressor is willing to render the specified format.
  719.  *
  720.  *)
  721. function    ICDrawQuery(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  722. function    ICDrawChangePalette(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  723. function    ICGetBuffersWanted(hic: HIC; lpdwBuffers: PDWORD): DWORD;
  724. function    ICDrawEnd(hic: HIC): DWORD;
  725. function    ICDrawStart(hic: HIC): DWORD;
  726. function    ICDrawStartPlay(hic: HIC; lFrom, lTo: DWORD): DWORD;
  727. function    ICDrawStop(hic: HIC): DWORD;
  728. function    ICDrawStopPlay(hic: HIC): DWORD;
  729. function    ICDrawGetTime(hic: HIC; lplTime: PDWORD): DWORD;
  730. function    ICDrawSetTime(hic: HIC; lTime: DWORD): DWORD;
  731. function    ICDrawRealize(hic: HIC; hdc: HDC; fBackground: BOOL): DWORD;
  732. function    ICDrawFlush(hic: HIC): DWORD;
  733. function    ICDrawRenderBuffer(hic: HIC): DWORD;
  734. (************************************************************************
  735.     Status callback functions
  736. ************************************************************************/
  737. /*
  738.  *  ICSetStatusProc()
  739.  *
  740.  *  Set the status callback function
  741.  *
  742.  *)
  743. // ICMessage is not supported on NT
  744. function    ICSetStatusProc(
  745.     hic         : HIC;
  746.     dwFlags     : DWORD;
  747.     lParam      : DWORD;
  748.     fpfnStatus  : TICStatusProc
  749.     ): DWORD; stdcall;
  750. (************************************************************************
  751. helper routines for DrawDib and MCIAVI...
  752. ************************************************************************)
  753. function    ICLocate(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER; wFlags: WORD): HIC; stdcall;
  754. function    ICGetDisplayFormat(hic: HIC; lpbiIn, lpbiOut: PBITMAPINFOHEADER; BitDepth: int; dx, dy: int): HIC; stdcall;
  755. function    ICDecompressOpen(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER): HIC;
  756. function    ICDrawOpen(fccType, fccHandler: DWORD; lpbiIn: PBITMAPINFOHEADER): HIC;
  757. (************************************************************************
  758. Higher level functions
  759. ************************************************************************)
  760. function    ICImageCompress(
  761.     hic         : HIC;                  // compressor to use
  762.     uiFlags     : UINT;                 // flags (none yet)
  763.     lpbiIn      : PBITMAPINFO;          // format to compress from
  764.     lpBits      : PVOID;                // data to compress
  765.     lpbiOut     : PBITMAPINFO;          // compress to this (NULL ==> default)
  766.     lQuality    : LONG;                 // quality to use
  767.     plSize      : PDWORD                 // compress to this size (0=whatever)
  768.     ): THANDLE; stdcall;
  769. function    ICImageDecompress(
  770.     hic         : HIC;                  // compressor to use
  771.     uiFlags     : UINT;                 // flags (none yet)
  772.     lpbiIn      : PBITMAPINFO;          // format to decompress from
  773.     lpBits      : PVOID;                // data to decompress
  774.     lpbiOut     : PBITMAPINFO           // decompress to this (NULL ==> default)
  775.     ): THANDLE; stdcall;
  776. {-- TCompVars ----------------------------------------------------------------}
  777. //
  778. // Structure used by ICSeqCompressFrame and ICCompressorChoose routines
  779. // Make sure this matches the autodoc in icm.c!
  780. //
  781. type
  782.   PCOMPVARS       = ^TCOMPVARS;
  783.   TCOMPVARS       = packed record
  784.         cbSize      : DWORD;            // set to sizeof(COMPVARS) before
  785.                                         // calling ICCompressorChoose
  786.         dwFlags     : DWORD;            // see below...
  787.         hic         : HIC;              // HIC of chosen compressor
  788.         fccType     : DWORD;            // basically ICTYPE_VIDEO
  789.         fccHandler  : DWORD;            // handler of chosen compressor or
  790.                                         // "" or "DIB "
  791.         lpbiIn      : PBITMAPINFO;      // input format
  792.         lpbiOut     : PBITMAPINFO;      // output format - will compress to this
  793.         lpBitsOut   : PVOID;
  794.         lpBitsPrev  : PVOID;
  795.         lFrame      : LONG;
  796.         lKey        : LONG;             // key frames how often?
  797.         lDataRate   : LONG;             // desired data rate KB/Sec
  798.         lQ          : LONG;             // desired quality
  799.         lKeyCount   : LONG;
  800.         lpState     : PVOID;            // state of compressor
  801.         cbState     : LONG;             // size of the state
  802.     end;
  803. // FLAGS for dwFlags element of COMPVARS structure:
  804. // set this flag if you initialize COMPVARS before calling ICCompressorChoose
  805. const
  806.     ICMF_COMPVARS_VALID         = $00000001;    // COMPVARS contains valid data
  807. //
  808. //  allows user to choose compressor, quality etc...
  809. //
  810. function    ICCompressorChoose(
  811.     hwnd        : HWND;                     // parent window for dialog
  812.     uiFlags     : UINT;                     // flags
  813.     pvIn        : PVOID;                    // input format (optional)
  814.     lpData      : PVOID;                    // input data (optional)
  815.     pc          : PCOMPVARS;                // data about the compressor/dlg
  816.     lpszTitle   : LPSTR                     // dialog title (optional)
  817.     ): BOOL; stdcall;
  818. // defines for uiFlags
  819. const
  820.     ICMF_CHOOSE_KEYFRAME        = $0001;    // show KeyFrame Every box
  821.     ICMF_CHOOSE_DATARATE        = $0002;    // show DataRate box
  822.     ICMF_CHOOSE_PREVIEW         = $0004;    // allow expanded preview dialog
  823.     ICMF_CHOOSE_ALLCOMPRESSORS  = $0008;    // don't only show those that
  824.                                             // can handle the input format
  825.                                             // or input data
  826. function    ICSeqCompressFrameStart(pc: PCOMPVARS; lpbiIn: PBITMAPINFO): BOOL; stdcall;
  827. procedure   ICSeqCompressFrameEnd(pc: PCOMPVARS); stdcall;
  828. function    ICSeqCompressFrame(
  829.     pc          : PCOMPVARS;                // set by ICCompressorChoose
  830.     uiFlags     : UINT;                     // flags
  831.     lpBits      : PVOID;                    // input DIB bits
  832.     pfKey       : PBOOL;                    // did it end up being a key frame?
  833.     plSize      : PDWORD                     // size to compress to/of returned image
  834.     ): PVOID; stdcall;
  835. procedure   ICCompressorFree(pc: PCOMPVARS); stdcall;
  836. (**************************************************************************
  837.  *
  838.  *  DRAWDIB - Routines for drawing to the display.
  839.  *
  840.  *************************************************************************)
  841. type
  842.     HDRAWDIB                    = THandle;  // hdd
  843. (*********************************************************************
  844.   DrawDib Flags
  845. **********************************************************************)
  846. const
  847.     DDF_UPDATE                  = $0002;    // re-draw the last DIB
  848.     DDF_SAME_HDC                = $0004;    // HDC same as last call (all setup)
  849.     DDF_SAME_DRAW               = $0008;    // draw params are the same
  850.     DDF_DONTDRAW                = $0010;    // dont draw frame, just decompress
  851.     DDF_ANIMATE                 = $0020;    // allow palette animation
  852.     DDF_BUFFER                  = $0040;    // always buffer image
  853.     DDF_JUSTDRAWIT              = $0080;    // just draw it with GDI
  854.     DDF_FULLSCREEN              = $0100;    // use DisplayDib
  855.     DDF_BACKGROUNDPAL           = $0200;    // Realize palette in background
  856.     DDF_NOTKEYFRAME             = $0400;    // this is a partial frame update, hint
  857.     DDF_HURRYUP                 = $0800;    // hurry up please!
  858.     DDF_HALFTONE                = $1000;    // always halftone
  859.     DDF_PREROLL                 = DDF_DONTDRAW; // Builing up a non-keyframe
  860.     DDF_SAME_DIB                = DDF_SAME_DRAW;
  861.     DDF_SAME_SIZE               = DDF_SAME_DRAW;
  862. (*********************************************************************
  863.     DrawDib functions
  864. *********************************************************************)
  865. {-- DrawDibOpen() ------------------------------------------------------------}
  866. function    DrawDibOpen: HDRAWDIB; stdcall;
  867. {-- DrawDibClose() -----------------------------------------------------------}
  868. function    DrawDibClose(hdd: HDRAWDIB): BOOL; stdcall;
  869. {-- DrawDibGetBuffer() -------------------------------------------------------}
  870. function    DrawDibGetBuffer(hdd: HDRAWDIB; lpbi: PBITMAPINFOHEADER; dwSize: DWORD; dwFlags: DWORD): PVOID; stdcall;
  871. {-- DrawDibGetPalette() - get the palette used for drawing DIBs --------------}
  872. function    DrawDibGetPalette(hdd: HDRAWDIB): HPALETTE; stdcall;
  873. {-- DrawDibSetPalette() - set the palette used for drawing DIBs --------------}
  874. function    DrawDibSetPalette(hdd: HDRAWDIB; hpal: HPALETTE): BOOL; stdcall;
  875. {-- DrawDibChangePalette() ---------------------------------------------------}
  876. function    DrawDibChangePalette(hdd: HDRAWDIB; iStart, iLen: int; lppe: PPALETTEENTRY): BOOL; stdcall;
  877. {-- DrawDibRealize() - realize the palette in a HDD --------------------------}
  878. function    DrawDibRealize(hdd: HDRAWDIB; hdc: HDC; fBackground: BOOL): UINT; stdcall;
  879. {-- DrawDibStart() - start of streaming playback -----------------------------}
  880. function    DrawDibStart(hdd: HDRAWDIB; rate: DWORD): BOOL; stdcall;
  881. {-- DrawDibStop() - start of streaming playback ------------------------------}
  882. function    DrawDibStop(hdd: HDRAWDIB): BOOL; stdcall;
  883. {-- DrawDibBegin() - prepare to draw -----------------------------------------}
  884. function    DrawDibBegin(
  885.     hdd         : HDRAWDIB;
  886.     hdc         : HDC;
  887.     dxDst       : int;
  888.     dyDst       : int;
  889.     lpbi        : PBITMAPINFOHEADER;
  890.     dxSrc       : int;
  891.     dySrc       : int;
  892.     wFlags      : UINT
  893.     ): BOOL; stdcall;
  894. {-- DrawDibDraw() - actually draw a DIB to the screen ------------------------}
  895. function    DrawDibDraw(
  896.     hdd         : HDRAWDIB;
  897.     hdc         : HDC;
  898.     xDst        : int;
  899.     yDst        : int;
  900.     dxDst       : int;
  901.     dyDst       : int;
  902.     lpbi        : PBITMAPINFOHEADER;
  903.     lpBits      : PVOID;
  904.     xSrc        : int;
  905.     ySrc        : int;
  906.     dxSrc       : int;
  907.     dySrc       : int;
  908.     wFlags      : UINT
  909.     ): BOOL; stdcall;
  910. {-- DrawDibUpdate() - redraw last image (may only be valid with DDF_BUFFER) --}
  911. function    DrawDibUpdate(hdd: HDRAWDIB; hdc: HDC; x, y: int): BOOL;
  912. {-- DrawDibEnd() -------------------------------------------------------------}
  913. function    DrawDibEnd(hdd: HDRAWDIB): BOOL; stdcall;
  914. {-- DrawDibTime() - for debugging purposes only ------------------------------}
  915. type
  916.     PDRAWDIBTIME        = ^TDRAWDIBTIME;
  917.     TDRAWDIBTIME        = packed record
  918.         timeCount       : LONG;
  919.         timeDraw        : LONG;
  920.         timeDecompress  : LONG;
  921.         timeDither      : LONG;
  922.         timeStretch     : LONG;
  923.         timeBlt         : LONG;
  924.         timeSetDIBits   : LONG;
  925.     end;
  926. function    DrawDibTime(hdd: HDRAWDIB; lpddtime: PDRAWDIBTIME): BOOL; stdcall;
  927. procedure StretchDIB(
  928.   biDst   : PBITMAPINFOHEADER;
  929.   lpvDst  : PVOID;
  930.   DstX    : Integer;
  931.   DstY    : Integer;
  932.   DstXE   : Integer;
  933.   DstYE   : Integer;
  934.   biSrc   : PBITMAPINFOHEADER;
  935.   lpvSrc  : PVOID;
  936.   SrcX    : Integer;
  937.   SrcY    : Integer;
  938.   SrcXE   : Integer;
  939.   SrcYE   : Integer
  940. ); stdcall;
  941. {-- Display profiling --------------------------------------------------------}
  942. const
  943.     PD_CAN_DRAW_DIB             = $0001;    // if you can draw at all
  944.     PD_CAN_STRETCHDIB           = $0002;    // basicly RC_STRETCHDIB
  945.     PD_STRETCHDIB_1_1_OK        = $0004;    // is it fast?
  946.     PD_STRETCHDIB_1_2_OK        = $0008;    // ...
  947.     PD_STRETCHDIB_1_N_OK        = $0010;    // ...
  948. function    DrawDibProfileDisplay(lpbi: PBITMAPINFOHEADER): DWORD; stdcall;
  949. (****************************************************************************
  950.  *
  951.  *  AVIFMT - AVI file format definitions
  952.  *
  953.  ****************************************************************************)
  954. //
  955. // The following is a short description of the AVI file format.  Please
  956. // see the accompanying documentation for a full explanation.
  957. //
  958. // An AVI file is the following RIFF form:
  959. //
  960. //  RIFF('AVI'
  961. //        LIST('hdrl'
  962. //          avih(<MainAVIHeader>)
  963. //                  LIST ('strl'
  964. //                      strh(<Stream header>)
  965. //                      strf(<Stream format>)
  966. //                      ... additional header data
  967. //            LIST('movi'
  968. //            { LIST('rec'
  969. //                    SubChunk...
  970. //                 )
  971. //                | SubChunk } ....
  972. //            )
  973. //            [ <AVIIndex> ]
  974. //      )
  975. //
  976. //  The main file header specifies how many streams are present.  For
  977. //  each one, there must be a stream header chunk and a stream format
  978. //  chunk, enlosed in a 'strl' LIST chunk.  The 'strf' chunk contains
  979. //  type-specific format information; for a video stream, this should
  980. //  be a BITMAPINFO structure, including palette.  For an audio stream,
  981. //  this should be a WAVEFORMAT (or PCMWAVEFORMAT) structure.
  982. //
  983. //  The actual data is contained in subchunks within the 'movi' LIST
  984. //  chunk.  The first two characters of each data chunk are the
  985. //  stream number with which that data is associated.
  986. //
  987. //  Some defined chunk types:
  988. //           Video Streams:
  989. //                  ##db:   RGB DIB bits
  990. //                  ##dc:   RLE8 compressed DIB bits
  991. //                  ##pc:   Palette Change
  992. //
  993. //           Audio Streams:
  994. //                  ##wb:   waveform audio bytes
  995. //
  996. // The grouping into LIST 'rec' chunks implies only that the contents of
  997. //   the chunk should be read into memory at the same time.  This
  998. //   grouping is used for files specifically intended to be played from
  999. //   CD-ROM.
  1000. //
  1001. // The index chunk at the end of the file should contain one entry for
  1002. //   each data chunk in the file.
  1003. //
  1004. // Limitations for the current software:
  1005. //  Only one video stream and one audio stream are allowed.
  1006. //  The streams must start at the beginning of the file.
  1007. //
  1008. //
  1009. // To register codec types please obtain a copy of the Multimedia
  1010. // Developer Registration Kit from:
  1011. //
  1012. //  Microsoft Corporation
  1013. //  Multimedia Systems Group
  1014. //  Product Marketing
  1015. //  One Microsoft Way
  1016. //  Redmond, WA 98052-6399
  1017. //
  1018. {-- form types, list types and chunk types -----------------------------------}
  1019. const
  1020.     formtypeAVI                 = $20495641; // mmioFOURCC('A', 'V', 'I', ' ')
  1021.     listtypeAVIHEADER           = $6C726468; // mmioFOURCC('h', 'd', 'r', 'l')
  1022.     ckidAVIMAINHDR              = $68697661; // mmioFOURCC('a', 'v', 'i', 'h')
  1023.     listtypeSTREAMHEADER        = $6C727473; // mmioFOURCC('s', 't', 'r', 'l')
  1024.     ckidSTREAMHEADER            = $68727473; // mmioFOURCC('s', 't', 'r', 'h')
  1025.     ckidSTREAMFORMAT            = $66727473; // mmioFOURCC('s', 't', 'r', 'f')
  1026.     ckidSTREAMHANDLERDATA       = $64727473; // mmioFOURCC('s', 't', 'r', 'd')
  1027.     ckidSTREAMNAME              = $6E727473; // mmioFOURCC('s', 't', 'r', 'n')
  1028.     listtypeAVIMOVIE            = $69766F6D; // mmioFOURCC('m', 'o', 'v', 'i')
  1029.     listtypeAVIRECORD           = $20636572; // mmioFOURCC('r', 'e', 'c', ' ')
  1030.     ckidAVINEWINDEX             = $31786469; // mmioFOURCC('i', 'd', 'x', '1')
  1031. {-- Stream types for the <fccType> field of the stream header ----------------}
  1032.     streamtypeVIDEO             = $73646976; // mmioFOURCC('v', 'i', 'd', 's')
  1033.     streamtypeAUDIO             = $73647561; // mmioFOURCC('a', 'u', 'd', 's')
  1034.     streamtypeMIDI              = $7364696D; // mmioFOURCC('m', 'i', 'd', 's')
  1035.     streamtypeTEXT              = $73747874; // mmioFOURCC('t', 'x', 't', 's')
  1036. {-- Basic chunk types --------------------------------------------------------}
  1037.     cktypeDIBbits               = $6264; // aviTWOCC('d', 'b')
  1038.     cktypeDIBcompressed         = $6364; // aviTWOCC('d', 'c')
  1039.     cktypePALchange             = $6370; // aviTWOCC('p', 'c')
  1040.     cktypeWAVEbytes             = $6277; // aviTWOCC('w', 'b')
  1041. {-- Chunk id to use for extra chunks for padding -----------------------------}
  1042.     ckidAVIPADDING              = $4B4E554A; // mmioFOURCC('J', 'U', 'N', 'K')
  1043. (*
  1044. ** Useful macros
  1045. **
  1046. ** Warning: These are nasty macro, and MS C 6.0 compiles some of them
  1047. ** incorrectly if optimizations are on.  Ack.
  1048. *)
  1049. {-- Macro to get stream number out of a FOURCC ckid --------------------------}
  1050. function    FromHex(n: BYTE): BYTE;
  1051. function    StreamFromFOURCC(fcc: DWORD): BYTE;
  1052. {-- Macro to get TWOCC chunk type out of a FOURCC ckid -----------------------}
  1053. function    TWOCCFromFOURCC(fcc: DWORD): WORD;
  1054. {-- Macro to make a ckid for a chunk out of a TWOCC and a stream num (0-255) -}
  1055. function    ToHex(n: BYTE): BYTE;
  1056. function    MAKEAVICKID(tcc: WORD; stream: BYTE): DWORD;
  1057. {-- Main AVI file header -----------------------------------------------------}
  1058. {-- flags for use in <dwFlags> in AVIFileHdr ---------------------------------}
  1059. const
  1060.     AVIF_HASINDEX               = $00000010;    // Index at end of file?
  1061.     AVIF_MUSTUSEINDEX           = $00000020;
  1062.     AVIF_ISINTERLEAVED          = $00000100;
  1063.     AVIF_TRUSTCKTYPE            = $00000800;    // Use CKType to find key frames?
  1064.     AVIF_WASCAPTUREFILE         = $00010000;
  1065.     AVIF_COPYRIGHTED            = $00020000;
  1066. {-- The AVI File Header LIST chunk should be padded to this size -------------}
  1067. const
  1068.     AVI_HEADERSIZE              = 2048;         // size of AVI header list
  1069. type
  1070.     PMainAVIHeader              = ^TMainAVIHeader;
  1071.     TMainAVIHeader              = packed record
  1072.         dwMicroSecPerFrame      : DWORD;        // frame display rate (or 0L)
  1073.         dwMaxBytesPerSec        : DWORD;        // max. transfer rate
  1074.         dwPaddingGranularity    : DWORD;        // pad to multiples of this
  1075.                                                 // size; normally 2K.
  1076.         dwFlags                 : DWORD;        // the ever-present flags
  1077.         dwTotalFrames           : DWORD;        // # frames in file
  1078.         dwInitialFrames         : DWORD;
  1079.         dwStreams               : DWORD;
  1080.         dwSuggestedBufferSize   : DWORD;
  1081.         dwWidth                 : DWORD;
  1082.         dwHeight                : DWORD;
  1083.         dwReserved              : array[0..3] of DWORD;
  1084.     end;
  1085. {-- Stream header ------------------------------------------------------------}
  1086. const
  1087.     AVISF_DISABLED              = $00000001;
  1088.     AVISF_VIDEO_PALCHANGES      = $00010000;
  1089. type
  1090.     PAVIStreamHeader            = ^TAVIStreamHeader;
  1091.     TAVIStreamHeader            = packed record
  1092.         fccType                 : FOURCC;
  1093.         fccHandler              : FOURCC;
  1094.         dwFlags                 : DWORD;        // Contains AVITF_* flags
  1095.         wPriority               : WORD;
  1096.         wLanguage               : WORD;
  1097.         dwInitialFrames         : DWORD;
  1098.         dwScale                 : DWORD;
  1099.         dwRate                  : DWORD;        // dwRate / dwScale == samples/second
  1100.         dwStart                 : DWORD;
  1101.         dwLength                : DWORD;        // In units above...
  1102.         dwSuggestedBufferSize   : DWORD;
  1103.         dwQuality               : DWORD;
  1104.         dwSampleSize            : DWORD;
  1105.         rcFrame                 : TRECT;
  1106.     end;
  1107. {-- Flags for index ----------------------------------------------------------}
  1108. const
  1109.     AVIIF_NOTIME                = $00000100;    // this frame doesn't take any time
  1110.     AVIIF_COMPUSE               = $0FFF0000;    // these bits are for compressor use
  1111. type
  1112.     PAVIINDEXENTRY              = ^TAVIINDEXENTRY;
  1113.     TAVIINDEXENTRY              = packed record
  1114.         ckid                    : DWORD;
  1115.         dwFlags                 : DWORD;
  1116.         dwChunkOffset           : DWORD;        // Position of chunk
  1117.         dwChunkLength           : DWORD;        // Length of chunk
  1118.     end;
  1119. {-- Palette change chunk (used in video streams) -----------------------------}
  1120.     PAVIPALCHANGE               = ^TAVIPALCHANGE;
  1121.     TAVIPALCHANGE               = packed record
  1122.         bFirstEntry             : BYTE;         // first entry to change
  1123.         bNumEntries             : BYTE;         // # entries to change (0 if 256)
  1124.         wFlags                  : WORD;         // Mostly to preserve alignment...
  1125.         peNew                   : array[0..0] of TPALETTEENTRY; // New color specifications
  1126.     end;
  1127. (****************************************************************************
  1128.  *
  1129.  *  AVIFile - routines for reading/writing standard AVI files
  1130.  *
  1131.  ***************************************************************************)
  1132. //
  1133. // Ansi - Unicode thunking.
  1134. //
  1135. // Unicode or Ansi-only apps can call the avifile APIs.
  1136. // any Win32 app who wants to use
  1137. // any of the AVI COM interfaces must be UNICODE - the AVISTREAMINFO and
  1138. // AVIFILEINFO structures used in the Info methods of these interfaces are
  1139. // the unicode variants, and no thunking to or from ansi takes place
  1140. // except in the AVIFILE api entrypoints.
  1141. //
  1142. // For Ansi/Unicode thunking: for each entrypoint or structure that
  1143. // uses chars or strings, two versions are declared in the Win32 version,
  1144. // ApiNameW and ApiNameA. The default name ApiName is #defined to one or
  1145. // other of these depending on whether UNICODE is defined (during
  1146. // compilation of the app that is including this header). The source will
  1147. // contain ApiName and ApiNameA (with ApiName being the Win16 implementation,
  1148. // and also #defined to ApiNameW, and ApiNameA being the thunk entrypoint).
  1149. //
  1150. // For GetFrame::SetFormat - use the best format for the display
  1151. const
  1152.     AVIGETFRAMEF_BESTDISPLAYFMT = 1;
  1153. //
  1154. // Structures used by AVIStreamInfo & AVIFileInfo.
  1155. //
  1156. // These are related to, but not identical to, the header chunks
  1157. // in an AVI file.
  1158. //
  1159. {-- AVISTREAMINFO ------------------------------------------------------------}
  1160. // for Unicode/Ansi thunking we need to declare three versions of this!
  1161. type
  1162.     PAVIStreamInfoW             = ^TAVIStreamInfoW;
  1163.     TAVIStreamInfoW             = packed record
  1164.         fccType                 : DWORD;
  1165.         fccHandler              : DWORD;
  1166.         dwFlags                 : DWORD;        // Contains AVITF_* flags
  1167.         dwCaps                  : DWORD;
  1168.         wPriority               : WORD;
  1169.         wLanguage               : WORD;
  1170.         dwScale                 : DWORD;
  1171.         dwRate                  : DWORD;        // dwRate / dwScale == samples/second
  1172.         dwStart                 : DWORD;
  1173.         dwLength                : DWORD;        // In units above...
  1174.         dwInitialFrames         : DWORD;
  1175.         dwSuggestedBufferSize   : DWORD;
  1176.         dwQuality               : DWORD;
  1177.         dwSampleSize            : DWORD;
  1178.         rcFrame                 : TRECT;
  1179.         dwEditCount             : DWORD;
  1180.         dwFormatChangeCount     : DWORD;
  1181.         szName                  : array[0..63] of WideChar;
  1182.     end;
  1183.     PAVIStreamInfoA             = ^TAVIStreamInfoA;
  1184.     TAVIStreamInfoA             = packed record
  1185.         fccType                 : DWORD;
  1186.         fccHandler              : DWORD;
  1187.         dwFlags                 : DWORD;        // Contains AVITF_* flags
  1188.         dwCaps                  : DWORD;
  1189.         wPriority               : WORD;
  1190.         wLanguage               : WORD;
  1191.         dwScale                 : DWORD;
  1192.         dwRate                  : DWORD;        // dwRate / dwScale == samples/second
  1193.         dwStart                 : DWORD;
  1194.         dwLength                : DWORD;        // In units above...
  1195.         dwInitialFrames         : DWORD;
  1196.         dwSuggestedBufferSize   : DWORD;
  1197.         dwQuality               : DWORD;
  1198.         dwSampleSize            : DWORD;
  1199.         rcFrame                 : TRECT;
  1200.         dwEditCount             : DWORD;
  1201.         dwFormatChangeCount     : DWORD;
  1202.         szName                  : array[0..63] of AnsiChar;
  1203.     end;
  1204.   PAVIStreamInfo = ^TAVIStreamInfo;
  1205. {$IFDEF UNICODE}
  1206.   TAVIStreamInfo = TAVIStreamInfoW;
  1207. {$ELSE}
  1208.   TAVIStreamInfo = TAVIStreamInfoA;
  1209. {$ENDIF}
  1210. const
  1211.     AVISTREAMINFO_DISABLED      = $00000001;
  1212.     AVISTREAMINFO_FORMATCHANGES = $00010000;
  1213. {-- AVIFILEINFO --------------------------------------------------------------}
  1214. type
  1215.     PAVIFileInfoW               = ^TAVIFileInfoW;
  1216.     TAVIFileInfoW               = packed record
  1217.         dwMaxBytesPerSec        : DWORD;        // max. transfer rate
  1218.         dwFlags                 : DWORD;        // the ever-present flags
  1219.         dwCaps                  : DWORD;
  1220.         dwStreams               : DWORD;
  1221.         dwSuggestedBufferSize   : DWORD;
  1222.         dwWidth                 : DWORD;
  1223.         dwHeight                : DWORD;
  1224.         dwScale                 : DWORD;
  1225.         dwRate                  : DWORD;        // dwRate / dwScale == samples/second
  1226.         dwLength                : DWORD;
  1227.         dwEditCount             : DWORD;
  1228.         szFileType              : array[0..63] of WideChar;
  1229.                                                 // descriptive string for file type?
  1230.     end;
  1231.     PAVIFileInfoA               = ^TAVIFileInfoA;
  1232.     TAVIFileInfoA               = packed record
  1233.         dwMaxBytesPerSec        : DWORD;        // max. transfer rate
  1234.         dwFlags                 : DWORD;        // the ever-present flags
  1235.         dwCaps                  : DWORD;
  1236.         dwStreams               : DWORD;
  1237.         dwSuggestedBufferSize   : DWORD;
  1238.         dwWidth                 : DWORD;
  1239.         dwHeight                : DWORD;
  1240.         dwScale                 : DWORD;
  1241.         dwRate                  : DWORD;        // dwRate / dwScale == samples/second
  1242.         dwLength                : DWORD;
  1243.         dwEditCount             : DWORD;
  1244.         szFileType              : array[0..63] of AnsiChar;
  1245.                                                 // descriptive string for file type?
  1246.     end;
  1247.   PAVIFileInfo = ^TAVIFileInfo;
  1248. {$IFDEF UNICODE}
  1249.   TAVIFileInfo = TAVIFileInfoW;
  1250. {$ELSE}
  1251.   TAVIFileInfo = TAVIFileInfoA;
  1252. {$ENDIF}
  1253. {-- Flags for dwFlags --------------------------------------------------------}
  1254. const
  1255.     AVIFILEINFO_HASINDEX            = $00000010;
  1256.     AVIFILEINFO_MUSTUSEINDEX        = $00000020;
  1257.     AVIFILEINFO_ISINTERLEAVED       = $00000100;
  1258.     AVIFILEINFO_WASCAPTUREFILE      = $00010000;
  1259.     AVIFILEINFO_COPYRIGHTED         = $00020000;
  1260. {-- Flags for dwCaps ---------------------------------------------------------}
  1261.     AVIFILECAPS_CANREAD             = $00000001;
  1262.     AVIFILECAPS_CANWRITE            = $00000002;
  1263.     AVIFILECAPS_ALLKEYFRAMES        = $00000010;
  1264.     AVIFILECAPS_NOCOMPRESSION       = $00000020;
  1265. type
  1266.     TAVISAVECALLBACK                = function(i: int): BOOL; pascal;
  1267. {-- AVICOMPRESSOPTIONS -------------------------------------------------------}
  1268. // Make sure it matches the AutoDoc in avisave.c !!!
  1269. type
  1270.     PAVICOMPRESSOPTIONS             = ^TAVICOMPRESSOPTIONS;
  1271.     TAVICOMPRESSOPTIONS             = packed record
  1272.         fccType                     : DWORD;    // stream type, for consistency
  1273.         fccHandler                  : DWORD;    // compressor
  1274.         dwKeyFrameEvery             : DWORD;    // keyframe rate
  1275.         dwQuality                   : DWORD;    // compress quality 0-10,000
  1276.         dwBytesPerSecond            : DWORD;    // bytes per second
  1277.         dwFlags                     : DWORD;    // flags... see below
  1278.         lpFormat                    : PVOID;    // save format
  1279.         cbFormat                    : DWORD;
  1280.         lpParms                     : PVOID;    // compressor options
  1281.         cbParms                     : DWORD;
  1282.         dwInterleaveEvery           : DWORD;    // for non-video streams only
  1283.     end;
  1284. //
  1285. // Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct
  1286. // Each of these flags determines if the appropriate field in the structure
  1287. // (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed
  1288. // attention to.  See the autodoc in avisave.c for details.
  1289. //
  1290. const
  1291.     AVICOMPRESSF_INTERLEAVE         = $00000001;    // interleave
  1292.     AVICOMPRESSF_DATARATE           = $00000002;    // use a data rate
  1293.     AVICOMPRESSF_KEYFRAMES          = $00000004;    // use keyframes
  1294.     AVICOMPRESSF_VALID              = $00000008;    // has valid data?
  1295. (* - - - - - - - - */
  1296. /****** AVI Stream Interface *******************************************)
  1297. type
  1298.     IAVIStream = interface(IUnknown)
  1299.         function Create(lParam1, lParam2: LPARAM): HResult; stdcall;
  1300.         function Info(var psi: TAVIStreamInfoW; lSize: LONG): HResult; stdcall;
  1301.         function FindSample(lPos: LONG; lFlags: LONG): LONG; stdcall;
  1302.         function ReadFormat(lPos: LONG; lpFormat: PVOID; var lpcbFormat: LONG): HResult; stdcall;
  1303.         function SetFormat(lPos: LONG; lpFormat: PVOID; cbFormat: LONG): HResult; stdcall;
  1304.         function Read(lStart: LONG; lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; var plBytes, plSamples: LONG): HResult; stdcall;
  1305.         function Write(lStart: LONG; lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten, plBytesWritten: LONG): HResult; stdcall;
  1306.         function Delete(lStart: LONG; lSamples: LONG): HResult; stdcall;
  1307.         function ReadData(fcc: DWORD; lp: PVOID; var lpcb: LONG): HResult; stdcall;
  1308.         function WriteData(fcc: DWORD; lp: PVOID; cb: LONG): HResult; stdcall;
  1309.         function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; stdcall;
  1310.     end;
  1311.     IAVIStreaming = interface(IUnknown)
  1312.         function _Begin(lStart, lEnd : LONG; lRate : LONG): HResult; stdcall;
  1313.         function _End: HResult; stdcall;
  1314.     end;
  1315.     IAVIEditStream = interface(IUnknown)
  1316.         function Cut(var plStart, plLength: LONG; var ppResult: IAVIStream): HResult; stdcall;
  1317.         function Copy(var plStart, plLength: LONG; var ppResult: IAVIStream): HResult; stdcall;
  1318.         function Paste(var plPos: LONG; var plLength: LONG; pstream: IAVIStream; lStart, lEnd: LONG): HResult; stdcall;
  1319.         function Clone(var ppResult: IAVIStream): HResult; stdcall;
  1320.         function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; stdcall;
  1321.     end;
  1322. {-- AVIFile ------------------------------------------------------------------}
  1323.     IAVIFile = interface(IUnknown)
  1324.         function Info(var pfi: TAVIFileInfoW; iSize: LONG): HResult; stdcall;
  1325.         function GetStream(var ppStream: IAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
  1326.         function CreateStream(var ppStream: IAVISTREAM; var psi: TAVIStreamInfoW): HResult; stdcall;
  1327.         function WriteData(ckid: DWORD; lpData: PVOID; cbData: LONG): HResult; stdcall;
  1328.         function ReadData(ckid: DWORD; lpData: PVOID; lpcbData: PLONG): HResult; stdcall;
  1329.         function EndRecord: HResult; stdcall;
  1330.         function DeleteStream(fccType: DWORD; lParam: LONG): HResult; stdcall;
  1331.     end;
  1332. {-- GetFrame -----------------------------------------------------------------}
  1333.      // The functions 'BeginExtraction' and 'EndExtraction' have actually
  1334.      // the names 'Begin' and 'End', but we cannot use that identifiers for
  1335.      // obvious reasons.
  1336.      IGetFrame = interface(IUnknown)
  1337.        function GetFrame(lPos: LONG): PBitmapInfoHeader; stdcall;
  1338.        function BeginExtraction(lStart, lEnd, lRate: LONG): HResult; stdcall;
  1339.        function EndExtraction: HResult; stdcall;
  1340.        function SetFormat(var lpbi: TBitmapInfoHeader; lpBits: Pointer; x, y, dx, dy: Integer): HResult; stdcall;
  1341.      end;
  1342. {-- GUIDs --------------------------------------------------------------------}
  1343. const
  1344.     IID_IAVIFile      : TGUID = (D1: $00020020; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1345.     IID_IAVIStream    : TGUID = (D1: $00020021; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1346.     IID_IAVIStreaming : TGUID = (D1: $00020022; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1347.     IID_IGetFrame     : TGUID = (D1: $00020023; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1348.     IID_IAVIEditStream: TGUID = (D1: $00020024; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1349.     CLSID_AVISimpleUnMarshal : TGUID = (D1: $00020009; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1350.     CLSID_AVIFile            : TGUID = (D1: $00020000; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
  1351.     AVIFILEHANDLER_CANREAD          = $0001;
  1352.     AVIFILEHANDLER_CANWRITE         = $0002;
  1353.     AVIFILEHANDLER_CANACCEPTNONRGB  = $0004;
  1354. {-- Functions ----------------------------------------------------------------}
  1355. procedure   AVIFileInit; stdcall;   // Call this first!
  1356. procedure   AVIFileExit; stdcall;
  1357. function    AVIFileAddRef(pfile: IAVIFile): ULONG; stdcall;
  1358. function    AVIFileRelease(pfile: IAVIFile): ULONG; stdcall;
  1359. function    AVIFileOpenA(var ppfile: IAVIFile; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
  1360. function    AVIFileOpenW(var ppfile: IAVIFile; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
  1361. {$IFDEF UNICODE}
  1362. function    AVIFileOpen(var ppfile: IAVIFile; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
  1363. {$ELSE}
  1364. function    AVIFileOpen(var ppfile: IAVIFile; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
  1365. {$ENDIF}
  1366. function    AVIFileInfoW(pfile: IAVIFile; var pfi: TAVIFILEINFOW; lSize: LONG): HResult; stdcall;
  1367. function    AVIFileInfoA(pfile: IAVIFile; var pfi: TAVIFILEINFOA; lSize: LONG): HResult; stdcall;
  1368. function    AVIFileInfo(pfile: IAVIFile; var pfi: TAVIFILEINFO; lSize: LONG): HResult; stdcall;
  1369. function    AVIFileGetStream(pfile: IAVIFile; var ppavi: IAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
  1370. function    AVIFileCreateStreamW(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOW): HResult; stdcall;
  1371. function    AVIFileCreateStreamA(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOA): HResult; stdcall;
  1372. function    AVIFileCreateStream(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFO): HResult; stdcall;
  1373. function    AVIFileWriteData(pfile: IAVIFile; ckid: DWORD; lpData: PVOID; cbData: LONG): HResult; stdcall;
  1374. function    AVIFileReadData(pfile: IAVIFile; ckid: DWORD; lpData: PVOID; var lpcbData: LONG): HResult; stdcall;
  1375. function    AVIFileEndRecord(pfile: IAVIFile): HResult; stdcall;
  1376. function    AVIStreamAddRef(pavi: IAVIStream): ULONG; stdcall;
  1377. function    AVIStreamRelease(pavi: IAVIStream): ULONG; stdcall;
  1378. function    AVIStreamInfoW (pavi: IAVIStream; var psi: TAVISTREAMINFOW; lSize: LONG): HResult; stdcall;
  1379. function    AVIStreamInfoA (pavi: IAVIStream; var psi: TAVISTREAMINFOA; lSize: LONG): HResult; stdcall;
  1380. function    AVIStreamInfo(pavi: IAVIStream; var psi: TAVISTREAMINFO; lSize: LONG): HResult; stdcall;
  1381. function    AVIStreamFindSample(pavi: IAVIStream; lPos: LONG; lFlags: LONG): LONG; stdcall;
  1382. function    AVIStreamReadFormat(pavi: IAVIStream; lPos: LONG; lpFormat: PVOID; lpcbFormat: PLONG): HResult; stdcall;
  1383. function    AVIStreamSetFormat(pavi: IAVIStream; lPos: LONG; lpFormat: PVOID; cbFormat: LONG): HResult; stdcall;
  1384. function    AVIStreamReadData(pavi: IAVIStream; fcc: DWORD; lp: PVOID; lpcb: PLONG): HResult; stdcall;
  1385. function    AVIStreamWriteData(pavi: IAVIStream; fcc: DWORD; lp: PVOID; cb: LONG): HResult; stdcall;
  1386. function    AVIStreamRead(
  1387.     pavi            : IAVISTREAM;
  1388.     lStart          : LONG;
  1389.     lSamples        : LONG;
  1390.     lpBuffer        : PVOID;
  1391.     cbBuffer        : LONG;
  1392.     plBytes         : PLONG;
  1393.     plSamples       : PLONG
  1394.     ): HResult; stdcall;
  1395. const
  1396.     AVISTREAMREAD_CONVENIENT    = -1;
  1397. function    AVIStreamWrite(
  1398.     pavi            : IAVISTREAM;
  1399.     lStart          : LONG;
  1400.     lSamples        : LONG;
  1401.     lpBuffer        : PVOID;
  1402.     cbBuffer        : LONG;
  1403.     dwFlags         : DWORD;
  1404.     plSampWritten   : PLONG;
  1405.     plBytesWritten  : PLONG
  1406.     ): HResult; stdcall;
  1407. // Right now, these just use AVIStreamInfo() to get information, then
  1408. // return some of it.  Can they be more efficient?
  1409. function    AVIStreamStart(pavi: IAVIStream): LONG; stdcall;
  1410. function    AVIStreamLength(pavi: IAVIStream): LONG; stdcall;
  1411. function    AVIStreamTimeToSample(pavi: IAVIStream; lTime: LONG): LONG; stdcall;
  1412. function    AVIStreamSampleToTime(pavi: IAVIStream; lSample: LONG): LONG; stdcall;
  1413. function    AVIStreamBeginStreaming(pavi: IAVIStream; lStart, lEnd: LONG; lRate: LONG): HResult; stdcall;
  1414. function    AVIStreamEndStreaming(pavi: IAVIStream): HResult; stdcall;
  1415. {-- Helper functions for using IGetFrame -------------------------------------}
  1416. function    AVIStreamGetFrameOpen(pavi: IAVIStream; lpbiWanted: PBitmapInfoHeader): IGetFrame; stdcall;
  1417. function    AVIStreamGetFrame(pg: IGetFrame; lPos: LONG): PBitmapInfoHeader; stdcall;
  1418. function    AVIStreamGetFrameClose(pg: IGetFrame): HResult; stdcall;
  1419. // !!! We need some way to place an advise on a stream....
  1420. // STDAPI AVIStreamHasChanged   (PAVISTREAM pavi);
  1421. {-- Shortcut function --------------------------------------------------------}
  1422. function    AVIStreamOpenFromFileA(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
  1423.                                    lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
  1424. function    AVIStreamOpenFromFileW(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
  1425.                                    lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
  1426. {$IFDEF UNICODE}
  1427.    function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
  1428.      lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
  1429. {$ELSE}
  1430.    function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
  1431.      lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
  1432. {$ENDIF}
  1433. {-- Use to create disembodied streams ----------------------------------------}
  1434. function    AVIStreamCreate(var ppavi: IAVISTREAM; lParam1, lParam2: LONG; pclsidHandler: PCLSID): HResult; stdcall;
  1435. // PHANDLER    AVIAPI AVIGetHandler         (PAVISTREAM pavi, PAVISTREAMHANDLER psh);
  1436. // PAVISTREAM  AVIAPI AVIGetStream          (PHANDLER p);
  1437. {-- Flags for AVIStreamFindSample --------------------------------------------}
  1438. const
  1439.     FIND_DIR                        = $0000000F;    // direction
  1440.     FIND_NEXT                       = $00000001;    // go forward
  1441.     FIND_PREV                       = $00000004;    // go backward
  1442.     FIND_FROM_START                 = $00000008;    // start at the logical beginning
  1443.     FIND_TYPE                       = $000000F0;    // type mask
  1444.     FIND_KEY                        = $00000010;    // find key frame.
  1445.     FIND_ANY                        = $00000020;    // find any (non-empty) sample
  1446.     FIND_FORMAT                     = $00000040;    // find format change
  1447.     FIND_RET                        = $0000F000;    // return mask
  1448.     FIND_POS                        = $00000000;    // return logical position
  1449.     FIND_LENGTH                     = $00001000;    // return logical size
  1450.     FIND_OFFSET                     = $00002000;    // return physical position
  1451.     FIND_SIZE                       = $00003000;    // return physical size
  1452.     FIND_INDEX                      = $00004000;    // return physical index position
  1453. {-- Stuff to support backward compat. ----------------------------------------}
  1454. function    AVIStreamFindKeyFrame(var pavi: IAVISTREAM; lPos: LONG; lFlags: LONG): DWORD; stdcall; // AVIStreamFindSample
  1455. // Non-portable: this is alias for method name
  1456. // FindKeyFrame FindSample
  1457. function    AVIStreamClose(pavi: IAVISTREAM): ULONG; stdcall; // AVIStreamRelease
  1458. function    AVIFileClose(pfile: IAVIFILE): ULONG; stdcall; // AVIFileRelease
  1459. procedure   AVIStreamInit; stdcall; // AVIFileInit
  1460. procedure   AVIStreamExit; stdcall; // AVIFileExit
  1461. const
  1462.     SEARCH_NEAREST                  = FIND_PREV;
  1463.     SEARCH_BACKWARD                 = FIND_PREV;
  1464.     SEARCH_FORWARD                  = FIND_NEXT;
  1465.     SEARCH_KEY                      = FIND_KEY;
  1466.     SEARCH_ANY                      = FIND_ANY;
  1467. {-- Helper macros ------------------------------------------------------------}
  1468. function    AVIStreamSampleToSample(pavi1, pavi2: IAVISTREAM; l: LONG): LONG;
  1469. function    AVIStreamNextSample(pavi: IAVISTREAM; l: LONG): LONG;
  1470. function    AVIStreamPrevSample(pavi: IAVISTREAM; l: LONG): LONG;
  1471. function    AVIStreamNearestSample(pavi: IAVISTREAM; l: LONG): LONG;
  1472. function    AVIStreamNextKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
  1473. function    AVIStreamPrevKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
  1474. function    AVIStreamNearestKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
  1475. function    AVIStreamIsKeyFrame(pavi: IAVISTREAM; l: LONG): BOOL;
  1476. function    AVIStreamPrevSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
  1477. function    AVIStreamNextSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
  1478. function    AVIStreamNearestSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
  1479. function    AVIStreamNextKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
  1480. function    AVIStreamPrevKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
  1481. function    AVIStreamNearestKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
  1482. function    AVIStreamStartTime(pavi: IAVISTREAM): LONG;
  1483. function    AVIStreamLengthTime(pavi: IAVISTREAM): LONG;
  1484. function    AVIStreamEnd(pavi: IAVISTREAM): LONG;
  1485. function    AVIStreamEndTime(pavi: IAVISTREAM): LONG;
  1486. function    AVIStreamSampleSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): LONG;
  1487. function    AVIStreamFormatSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): HResult;
  1488. function    AVIStreamDataSize(pavi: IAVISTREAM; fcc: DWORD; plSize: PLONG): HResult;
  1489. {== AVISave routines and structures ==========================================}
  1490. const
  1491.     comptypeDIB                     = $20424944; // mmioFOURCC('D', 'I', 'B', ' ')
  1492. function    AVIMakeCompressedStream(
  1493.     var ppsCompressed   : IAVISTREAM;
  1494.     ppsSource           : IAVISTREAM;
  1495.     lpOptions           : PAVICOMPRESSOPTIONS;
  1496.     pclsidHandler       : PCLSID
  1497.     ): HResult; stdcall;
  1498. // Non-portable: uses variable number of params
  1499. // EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
  1500. //      CLSID FAR *pclsidHandler,
  1501. //      AVISAVECALLBACK     lpfnCallback,
  1502. //      int                 nStreams,
  1503. //      PAVISTREAM      pfile,
  1504. //      LPAVICOMPRESSOPTIONS lpOptions,
  1505. //      ...);
  1506. function    AVISaveVA(
  1507.     szFile          : LPCSTR;
  1508.     pclsidHandler   : PCLSID;
  1509.     lpfnCallback    : TAVISAVECALLBACK;
  1510.     nStreams        : int;
  1511.     var ppavi       : IAVISTREAM;
  1512.     var plpOptions  : PAVICOMPRESSOPTIONS
  1513.     ): HResult; stdcall;
  1514. // Non-portable: uses variable number of params
  1515. // EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
  1516. //      CLSID FAR *pclsidHandler,
  1517. //      AVISAVECALLBACK     lpfnCallback,
  1518. //      int                 nStreams,
  1519. //      PAVISTREAM      pfile,
  1520. //      LPAVICOMPRESSOPTIONS lpOptions,
  1521. //      ...);
  1522. function    AVISaveVW(
  1523.     szFile          : LPCWSTR;
  1524.     pclsidHandler   : PCLSID;
  1525.     lpfnCallback    : TAVISAVECALLBACK;
  1526.     nStreams        : int;
  1527.     var ppavi       : IAVISTREAM;
  1528.     var plpOptions  : PAVICOMPRESSOPTIONS
  1529.     ): HResult; stdcall;
  1530. // #define AVISave      AVISaveA
  1531. function    AVISaveV(
  1532.     szFile          : LPCSTR;
  1533.     pclsidHandler   : PCLSID;
  1534.     lpfnCallback    : TAVISAVECALLBACK;
  1535.     nStreams        : int;
  1536.     var ppavi       : IAVISTREAM;
  1537.     var plpOptions  : PAVICOMPRESSOPTIONS
  1538.     ): HResult; stdcall; // AVISaveVA
  1539. function    AVISaveOptions(
  1540.     hwnd            : HWND;
  1541.     uiFlags         : UINT;
  1542.     nStreams        : int;
  1543.     var ppavi       : IAVISTREAM;
  1544.     var plpOptions  : PAVICOMPRESSOPTIONS
  1545.     ): BOOL; stdcall;
  1546. function    AVISaveOptionsFree(nStreams: int; var plpOptions: PAVICOMPRESSOPTIONS): HResult; stdcall;
  1547. {-- FLAGS FOR uiFlags --------------------------------------------------------}
  1548. // Same as the flags for ICCompressorChoose (see compman.h)
  1549. // These determine what the compression options dialog for video streams
  1550. // will look like.
  1551. function    AVIBuildFilterW(lpszFilter: LPWSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall;
  1552. function    AVIBuildFilterA(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall;
  1553. function    AVIBuildFilter(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall; // AVIBuildFilterA
  1554. function    AVIMakeFileFromStreams(var ppfile: IAVIFILE; nStreams: int; var papStreams: IAVISTREAM): HResult; stdcall;
  1555. function    AVIMakeStreamFromClipboard(cfFormat: UINT; hGlobal: THANDLE; var ppstream: IAVISTREAM): HResult; stdcall;
  1556. {-- Clipboard routines -------------------------------------------------------}
  1557. function    AVIPutFileOnClipboard(pf: IAVIFILE): HResult; stdcall;
  1558. function    AVIGetFromClipboard(var lppf: IAVIFILE): HResult; stdcall;
  1559. function    AVIClearClipboard: HResult; stdcall;
  1560. {-- Editing routines ---------------------------------------------------------}
  1561. function    CreateEditableStream(var ppsEditable: IAVISTREAM; psSource: IAVISTREAM): HResult; stdcall;
  1562. function    EditStreamCut(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall;
  1563. function    EditStreamCopy(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall;
  1564. function    EditStreamPaste(pavi: IAVISTREAM; var plPos, plLength: LONG; pstream: IAVISTREAM; lStart, lEnd: LONG): HResult; stdcall;
  1565. function    EditStreamClone(pavi: IAVISTREAM; var ppResult: IAVISTREAM): HResult; stdcall;
  1566. function    EditStreamSetNameA(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall;
  1567. function    EditStreamSetNameW(pavi: IAVISTREAM; lpszName: LPCWSTR): HResult; stdcall;
  1568. function    EditStreamSetInfoW(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOW; cbInfo: LONG): HResult; stdcall;
  1569. function    EditStreamSetInfoA(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall;
  1570. function    EditStreamSetInfo(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall; // EditStreamSetInfoA
  1571. function    EditStreamSetName(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall; // EditStreamSetNameA
  1572. {-- Error handling -----------------------------------------------------------}
  1573. const
  1574.     AVIERR_OK                       = 0;
  1575. // !!! Questions to be answered:
  1576. // How can you get a string form of these errors?
  1577. // Which of these errors should be replaced by errors in SCODE.H?
  1578. const
  1579.     AVIERR_UNSUPPORTED              = $80044065; // MAKE_AVIERR(101)
  1580.     AVIERR_BADFORMAT                = $80044066; // MAKE_AVIERR(102)
  1581.     AVIERR_MEMORY                   = $80044067; // MAKE_AVIERR(103)
  1582.     AVIERR_INTERNAL                 = $80044068; // MAKE_AVIERR(104)
  1583.     AVIERR_BADFLAGS                 = $80044069; // MAKE_AVIERR(105)
  1584.     AVIERR_BADPARAM                 = $8004406A; // MAKE_AVIERR(106)
  1585.     AVIERR_BADSIZE                  = $8004406B; // MAKE_AVIERR(107)
  1586.     AVIERR_BADHANDLE                = $8004406C; // MAKE_AVIERR(108)
  1587.     AVIERR_FILEREAD                 = $8004406D; // MAKE_AVIERR(109)
  1588.     AVIERR_FILEWRITE                = $8004406E; // MAKE_AVIERR(110)
  1589.     AVIERR_FILEOPEN                 = $8004406F; // MAKE_AVIERR(111)
  1590.     AVIERR_COMPRESSOR               = $80044070; // MAKE_AVIERR(112)
  1591.     AVIERR_NOCOMPRESSOR             = $80044071; // MAKE_AVIERR(113)
  1592.     AVIERR_READONLY                 = $80044072; // MAKE_AVIERR(114)
  1593.     AVIERR_NODATA                   = $80044073; // MAKE_AVIERR(115)
  1594.     AVIERR_BUFFERTOOSMALL           = $80044074; // MAKE_AVIERR(116)
  1595.     AVIERR_CANTCOMPRESS             = $80044075; // MAKE_AVIERR(117)
  1596.     AVIERR_USERABORT                = $800440C6; // MAKE_AVIERR(198)
  1597.     AVIERR_ERROR                    = $800440C7; // MAKE_AVIERR(199)
  1598. {== MCIWnd - Window class for MCI objects ====================================}
  1599. //
  1600. //  MCIWnd
  1601. //
  1602. //    MCIWnd window class header file.
  1603. //
  1604. //    the MCIWnd window class is a window class for controling MCI devices
  1605. //    MCI devices include, wave files, midi files, AVI Video, cd audio,
  1606. //    vcr, video disc, and others..
  1607. //
  1608. //    to learn more about MCI and mci command sets see the
  1609. //    "Microsoft Multimedia Programmers's guide" in the Win31 SDK
  1610. //
  1611. //    the easiest use of the MCIWnd class is like so:
  1612. //
  1613. //          hwnd = MCIWndCreate(hwndParent, hInstance, 0, "chimes.wav");
  1614. //          ...
  1615. //          MCIWndPlay(hwnd);
  1616. //          MCIWndStop(hwnd);
  1617. //          MCIWndPause(hwnd);
  1618. //          ....
  1619. //          MCIWndDestroy(hwnd);
  1620. //
  1621. //    this will create a window with a play/pause, stop and a playbar
  1622. //    and start the wave file playing.
  1623. //
  1624. //    mciwnd.h defines macros for all the most common MCI commands, but
  1625. //    any string command can be used if needed.
  1626. //
  1627. //    Note: unlike the mciSendString() API, no alias or file name needs
  1628. //    to be specifed, since the device to use is implied by the window handle.
  1629. //
  1630. //          MCIWndSendString(hwnd, "setaudio stream to 2");
  1631. //
  1632. //    (C) Copyright Microsoft Corp. 1991-1995.  All rights reserved.
  1633. //
  1634. // WIN32:
  1635. //
  1636. //    MCIWnd supports both ansi and unicode interfaces. For any message that
  1637. //    takes or returns a text string, two versions of the message are defined,
  1638. //    appended with A or W for Ansi or Wide Char. The message or api itself
  1639. //    is defined to be one or other of these depending on whether you have
  1640. //    UNICODE defined in your application.
  1641. //    Thus for the api MCIWndCreate, there are in fact two apis,
  1642. //    MCIWndCreateA and MCIWndCreateW. If you call MCIWndCreate, this will be
  1643. //    re-routed to MCIWndCreateA unless UNICODE is defined when building your
  1644. //    application. In any one application, you can mix calls to the
  1645. //    Ansi and Unicode entrypoints.
  1646. //
  1647. //    If you use SendMessage instead of the macros below such as MCIWndOpen(),
  1648. //    you will see that the messages have changed for WIN32, to support Ansi
  1649. //    and Unicode entrypoints. In particular, MCI_OPEN has been replaced by
  1650. //    MCWNDM_OPENA, or MCIWNDM_OPENW (MCIWNDM_OPEN is defined to be one or
  1651. //    other of these).
  1652. //
  1653. //    Also, note that the WIN32 implementation of MCIWnd uses UNICODE
  1654. //    so all apis and messages supporting ANSI strings do so by mapping them
  1655. //    UNICODE strings and then calling the corresponding UNICODE entrypoint.
  1656. //
  1657. function    MCIWndSM(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): DWORD;
  1658. const                               
  1659.     MCIWND_WINDOW_CLASS             = 'MCIWndClass' ;
  1660. function    MCIWndCreateA(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl;
  1661. function    MCIWndCreateW(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCWSTR): HWND; cdecl;
  1662. function    MCIWndCreate(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl; // MCIWndCreateA
  1663. function    MCIWndRegisterClass: BOOL; cdecl;
  1664. {-- Flags for the MCIWndOpen command -----------------------------------------}
  1665. const
  1666.     MCIWNDOPENF_NEW                 = $0001;    // open a new file
  1667. {-- Window styles ------------------------------------------------------------}
  1668.     MCIWNDF_NOAUTOSIZEWINDOW        = $0001;    // when movie size changes
  1669.     MCIWNDF_NOPLAYBAR               = $0002;    // no toolbar
  1670.     MCIWNDF_NOAUTOSIZEMOVIE         = $0004;    // when window size changes
  1671.     MCIWNDF_NOMENU                  = $0008;    // no popup menu from RBUTTONDOWN
  1672.     MCIWNDF_SHOWNAME                = $0010;    // show name in caption
  1673.     MCIWNDF_SHOWPOS                 = $0020;    // show position in caption
  1674.     MCIWNDF_SHOWMODE                = $0040;    // show mode in caption
  1675.     MCIWNDF_SHOWALL                 = $0070;    // show all
  1676.     MCIWNDF_NOTIFYMODE              = $0100;    // tell parent of mode change
  1677.     MCIWNDF_NOTIFYPOS               = $0200;    // tell parent of pos change
  1678.     MCIWNDF_NOTIFYSIZE              = $0400;    // tell parent of size change
  1679.     MCIWNDF_NOTIFYERROR             = $1000;    // tell parent of an error
  1680.     MCIWNDF_NOTIFYALL               = $1F00;    // tell all
  1681.     MCIWNDF_NOTIFYANSI              = $0080;
  1682. // The MEDIA notification includes a text string.
  1683. // To receive notifications in ANSI instead of unicode set the
  1684. // MCIWNDF_NOTIFYANSI style bit. The macro below includes this bit
  1685. // by default unless you define UNICODE in your application.
  1686.     MCIWNDF_NOTIFYMEDIAA            = $0880;    // tell parent of media change
  1687.     MCIWNDF_NOTIFYMEDIAW            = $0800;    // tell parent of media change
  1688.     MCIWNDF_NOTIFYMEDIA             = MCIWNDF_NOTIFYMEDIAA;
  1689.     MCIWNDF_RECORD                  = $2000;    // Give a record button
  1690.     MCIWNDF_NOERRORDLG              = $4000;    // Show Error Dlgs for MCI cmds?
  1691.     MCIWNDF_NOOPEN                  = $8000;    // Don't allow user to open things
  1692. {-- Can macros ---------------------------------------------------------------}
  1693. function    MCIWndCanPlay(hwnd: HWND): BOOL;
  1694. function    MCIWndCanRecord(hwnd: HWND): BOOL;
  1695. function    MCIWndCanSave(hwnd: HWND): BOOL;
  1696. function    MCIWndCanWindow(hwnd: HWND): BOOL;
  1697. function    MCIWndCanEject(hwnd: HWND): BOOL;
  1698. function    MCIWndCanConfig(hwnd: HWND): BOOL;
  1699. function    MCIWndPaletteKick(hwnd: HWND): BOOL;
  1700. function    MCIWndSave(hwnd: HWND; szFile: LPCSTR): DWORD;
  1701. function    MCIWndSaveDialog(hwnd: HWND): DWORD;
  1702. // If you dont give a device it will use the current device....
  1703. function    MCIWndNew(hwnd: HWND; lp: PVOID): DWORD;
  1704. function    MCIWndRecord(hwnd: HWND): DWORD;
  1705. function    MCIWndOpen(hwnd: HWND; sz: LPCSTR; f: BOOL): DWORD;
  1706. function    MCIWndOpenDialog(hwnd: HWND): DWORD;
  1707. function    MCIWndClose(hwnd: HWND): DWORD;
  1708. function    MCIWndPlay(hwnd: HWND): DWORD;
  1709. function    MCIWndStop(hwnd: HWND): DWORD;
  1710. function    MCIWndPause(hwnd: HWND): DWORD;
  1711. function    MCIWndResume(hwnd: HWND): DWORD;
  1712. function    MCIWndSeek(hwnd: HWND; lPos: DWORD): DWORD;
  1713. function    MCIWndEject(hwnd: HWND): DWORD;
  1714. function    MCIWndHome(hwnd: HWND): DWORD;
  1715. function    MCIWndEnd(hwnd: HWND): DWORD;
  1716. function    MCIWndGetSource(hwnd: HWND; prc: PRECT): DWORD;
  1717. function    MCIWndPutSource(hwnd: HWND; prc: PRECT): DWORD;
  1718. function    MCIWndGetDest(hwnd: HWND; prc: PRECT): DWORD;
  1719. function    MCIWndPutDest(hwnd: HWND; prc: PRECT): DWORD;
  1720. function    MCIWndPlayReverse(hwnd: HWND): DWORD;
  1721. function    MCIWndPlayFrom(hwnd: HWND; lPos: DWORD): DWORD;
  1722. function    MCIWndPlayTo(hwnd: HWND; lPos: DWORD): DWORD;
  1723. function    MCIWndPlayFromTo(hwnd: HWND; lStart, lEnd: DWORD): DWORD;
  1724. function    MCIWndGetDeviceID(hwnd: HWND): UINT;
  1725. function    MCIWndGetAlias(hwnd: HWND): UINT;
  1726. function    MCIWndGetMode(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1727. function    MCIWndGetPosition(hwnd: HWND): DWORD;
  1728. function    MCIWndGetPositionString(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1729. function    MCIWndGetStart(hwnd: HWND): DWORD;
  1730. function    MCIWndGetLength(hwnd: HWND): DWORD;
  1731. function    MCIWndGetEnd(hwnd: HWND): DWORD;
  1732. function    MCIWndStep(hwnd: HWND; n: DWORD): DWORD;
  1733. procedure   MCIWndDestroy(hwnd: HWND);
  1734. procedure   MCIWndSetZoom(hwnd: HWND; iZoom: UINT);
  1735. function    MCIWndGetZoom(hwnd: HWND): UINT;
  1736. function    MCIWndSetVolume(hwnd: HWND; iVol: UINT): DWORD;
  1737. function    MCIWndGetVolume(hwnd: HWND): DWORD;
  1738. function    MCIWndSetSpeed(hwnd: HWND; iSpeed: UINT): DWORD;
  1739. function    MCIWndGetSpeed(hwnd: HWND): DWORD;
  1740. function    MCIWndSetTimeFormat(hwnd: HWND; lp: LPCSTR): DWORD;
  1741. function    MCIWndGetTimeFormat(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1742. procedure   MCIWndValidateMedia(hwnd: HWND);
  1743. procedure   MCIWndSetRepeat(hwnd: HWND; f: BOOL);
  1744. function    MCIWndGetRepeat(hwnd: HWND): BOOL;
  1745. function    MCIWndUseFrames(hwnd: HWND): DWORD;
  1746. function    MCIWndUseTime(hwnd: HWND): DWORD;
  1747. procedure   MCIWndSetActiveTimer(hwnd: HWND; active: UINT);
  1748. procedure   MCIWndSetInactiveTimer(hwnd: HWND; inactive: UINT);
  1749. procedure   MCIWndSetTimers(hwnd: HWND; active, inactive: UINT);
  1750. function    MCIWndGetActiveTimer(hwnd: HWND): UINT;
  1751. function    MCIWndGetInactiveTimer(hwnd: HWND): UINT;
  1752. function    MCIWndRealize(hwnd: HWND; fBkgnd: BOOL): DWORD;
  1753. function    MCIWndSendString(hwnd: HWND; sz: LPCSTR): DWORD;
  1754. function    MCIWndReturnString(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1755. function    MCIWndGetError(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1756. // #define MCIWndActivate(hwnd, f)     (void)MCIWndSM(hwnd, WM_ACTIVATE, (WPARAM)(BOOL)(f), 0)
  1757. function    MCIWndGetPalette(hwnd: HWND): HPALETTE;
  1758. function    MCIWndSetPalette(hwnd: HWND; hpal: HPALETTE): DWORD;
  1759. function    MCIWndGetFileName(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1760. function    MCIWndGetDevice(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
  1761. function    MCIWndGetStyles(hwnd: HWND): UINT;
  1762. function    MCIWndChangeStyles(hwnd: HWND; mask: UINT; value: DWORD): DWORD;
  1763. type
  1764.     PUnknown    = ^IUnknown;
  1765. function    MCIWndOpenInterface(hwnd: HWND; pUnk: PUnknown): DWORD;
  1766. function    MCIWndSetOwner(hwnd: HWND; hwndP: HWND): DWORD;
  1767. {-- Messages an app will send to MCIWND --------------------------------------}
  1768. // all the text-related messages are defined out of order above (they need
  1769. // to be defined before the MCIWndOpen() macros
  1770. const
  1771.     MCIWNDM_GETDEVICEID             = WM_USER + 100;
  1772.     MCIWNDM_GETSTART                = WM_USER + 103;
  1773.     MCIWNDM_GETLENGTH               = WM_USER + 104;
  1774.     MCIWNDM_GETEND                  = WM_USER + 105;
  1775.     MCIWNDM_EJECT                   = WM_USER + 107;
  1776.     MCIWNDM_SETZOOM                 = WM_USER + 108;
  1777.     MCIWNDM_GETZOOM                 = WM_USER + 109;
  1778.     MCIWNDM_SETVOLUME               = WM_USER + 110;
  1779.     MCIWNDM_GETVOLUME               = WM_USER + 111;
  1780.     MCIWNDM_SETSPEED                = WM_USER + 112;
  1781.     MCIWNDM_GETSPEED                = WM_USER + 113;
  1782.     MCIWNDM_SETREPEAT               = WM_USER + 114;
  1783.     MCIWNDM_GETREPEAT               = WM_USER + 115;
  1784.     MCIWNDM_REALIZE                 = WM_USER + 118;
  1785.     MCIWNDM_VALIDATEMEDIA           = WM_USER + 121;
  1786.     MCIWNDM_PLAYFROM                = WM_USER + 122;
  1787.     MCIWNDM_PLAYTO                  = WM_USER + 123;
  1788.     MCIWNDM_GETPALETTE              = WM_USER + 126;
  1789.     MCIWNDM_SETPALETTE              = WM_USER + 127;
  1790.     MCIWNDM_SETTIMERS               = WM_USER + 129;
  1791.     MCIWNDM_SETACTIVETIMER          = WM_USER + 130;
  1792.     MCIWNDM_SETINACTIVETIMER        = WM_USER + 131;
  1793.     MCIWNDM_GETACTIVETIMER          = WM_USER + 132;
  1794.     MCIWNDM_GETINACTIVETIMER        = WM_USER + 133;
  1795.     MCIWNDM_CHANGESTYLES            = WM_USER + 135;
  1796.     MCIWNDM_GETSTYLES               = WM_USER + 136;
  1797.     MCIWNDM_GETALIAS                = WM_USER + 137;
  1798.     MCIWNDM_PLAYREVERSE             = WM_USER + 139;
  1799.     MCIWNDM_GET_SOURCE              = WM_USER + 140;
  1800.     MCIWNDM_PUT_SOURCE              = WM_USER + 141;
  1801.     MCIWNDM_GET_DEST                = WM_USER + 142;
  1802.     MCIWNDM_PUT_DEST                = WM_USER + 143;
  1803.     MCIWNDM_CAN_PLAY                = WM_USER + 144;
  1804.     MCIWNDM_CAN_WINDOW              = WM_USER + 145;
  1805.     MCIWNDM_CAN_RECORD              = WM_USER + 146;
  1806.     MCIWNDM_CAN_SAVE                = WM_USER + 147;
  1807.     MCIWNDM_CAN_EJECT               = WM_USER + 148;
  1808.     MCIWNDM_CAN_CONFIG              = WM_USER + 149;
  1809.     MCIWNDM_PALETTEKICK             = WM_USER + 150;
  1810.     MCIWNDM_OPENINTERFACE           = WM_USER + 151;
  1811.     MCIWNDM_SETOWNER                = WM_USER + 152;
  1812. {-- Define both A and W messages ---------------------------------------------}
  1813.     MCIWNDM_SENDSTRINGA             = WM_USER + 101;
  1814.     MCIWNDM_GETPOSITIONA            = WM_USER + 102;
  1815.     MCIWNDM_GETMODEA                = WM_USER + 106;
  1816.     MCIWNDM_SETTIMEFORMATA          = WM_USER + 119;
  1817.     MCIWNDM_GETTIMEFORMATA          = WM_USER + 120;
  1818.     MCIWNDM_GETFILENAMEA            = WM_USER + 124;
  1819.     MCIWNDM_GETDEVICEA              = WM_USER + 125;
  1820.     MCIWNDM_GETERRORA               = WM_USER + 128;
  1821.     MCIWNDM_NEWA                    = WM_USER + 134;
  1822.     MCIWNDM_RETURNSTRINGA           = WM_USER + 138;
  1823.     MCIWNDM_OPENA                   = WM_USER + 153;
  1824.     MCIWNDM_SENDSTRINGW             = WM_USER + 201;
  1825.     MCIWNDM_GETPOSITIONW            = WM_USER + 202;
  1826.     MCIWNDM_GETMODEW                = WM_USER + 206;
  1827.     MCIWNDM_SETTIMEFORMATW          = WM_USER + 219;
  1828.     MCIWNDM_GETTIMEFORMATW          = WM_USER + 220;
  1829.     MCIWNDM_GETFILENAMEW            = WM_USER + 224;
  1830.     MCIWNDM_GETDEVICEW              = WM_USER + 225;
  1831.     MCIWNDM_GETERRORW               = WM_USER + 228;
  1832.     MCIWNDM_NEWW                    = WM_USER + 234;
  1833.     MCIWNDM_RETURNSTRINGW           = WM_USER + 238;
  1834.     MCIWNDM_OPENW                   = WM_USER + 252;
  1835. {-- Map defaults to A --------------------------------------------------------}
  1836.     MCIWNDM_SENDSTRING              = MCIWNDM_SENDSTRINGA;
  1837.     MCIWNDM_GETPOSITION             = MCIWNDM_GETPOSITIONA;
  1838.     MCIWNDM_GETMODE                 = MCIWNDM_GETMODEA;
  1839.     MCIWNDM_SETTIMEFORMAT           = MCIWNDM_SETTIMEFORMATA;
  1840.     MCIWNDM_GETTIMEFORMAT           = MCIWNDM_GETTIMEFORMATA;
  1841.     MCIWNDM_GETFILENAME             = MCIWNDM_GETFILENAMEA;
  1842.     MCIWNDM_GETDEVICE               = MCIWNDM_GETDEVICEA;
  1843.     MCIWNDM_GETERROR                = MCIWNDM_GETERRORA;
  1844.     MCIWNDM_NEW                     = MCIWNDM_NEWA;
  1845.     MCIWNDM_RETURNSTRING            = MCIWNDM_RETURNSTRINGA;
  1846.     MCIWNDM_OPEN                    = MCIWNDM_OPENA;
  1847. // note that the source text for MCIWND will thus contain
  1848. // support for eg MCIWNDM_SENDSTRING (both the 16-bit entrypoint and
  1849. // in win32 mapped to MCIWNDM_SENDSTRINGW), and MCIWNDM_SENDSTRINGA (the
  1850. // win32 ansi thunk).
  1851. {-- Messages MCIWND will send to an app --------------------------------------}
  1852. const
  1853.     MCIWNDM_NOTIFYMODE              = WM_USER + 200;    // wp = hwnd, lp = mode
  1854.     MCIWNDM_NOTIFYPOS               = WM_USER + 201;    // wp = hwnd, lp = pos
  1855.     MCIWNDM_NOTIFYSIZE              = WM_USER + 202;    // wp = hwnd
  1856.     MCIWNDM_NOTIFYMEDIA             = WM_USER + 203;    // wp = hwnd, lp = fn
  1857.     MCIWNDM_NOTIFYERROR             = WM_USER + 205;    // wp = hwnd, lp = error
  1858. {-- Special seek values for START and END ------------------------------------}
  1859.     MCIWND_START                    = dword(-1) ;
  1860.     MCIWND_END                      = dword(-2) ;
  1861. {== VIDEO - Video capture driver interface ===================================}
  1862. type
  1863.     HVIDEO                          = THandle;
  1864.     PHVIDEO                         = ^HVIDEO;
  1865. {-- Error return values ------------------------------------------------------}
  1866. const
  1867.     DV_ERR_OK                       = 0;                    // No error
  1868.     DV_ERR_BASE                     = 1;                    // Error Base 
  1869.     DV_ERR_NONSPECIFIC              = DV_ERR_BASE;
  1870.     DV_ERR_BADFORMAT                = DV_ERR_BASE + 1;      // unsupported video format 
  1871.     DV_ERR_STILLPLAYING             = DV_ERR_BASE + 2;      // still something playing 
  1872.     DV_ERR_UNPREPARED               = DV_ERR_BASE + 3;      // header not prepared 
  1873.     DV_ERR_SYNC                     = DV_ERR_BASE + 4;      // device is synchronous 
  1874.     DV_ERR_TOOMANYCHANNELS          = DV_ERR_BASE + 5;      // number of channels exceeded 
  1875.     DV_ERR_NOTDETECTED              = DV_ERR_BASE + 6;      // HW not detected 
  1876.     DV_ERR_BADINSTALL               = DV_ERR_BASE + 7;      // Can not get Profile 
  1877.     DV_ERR_CREATEPALETTE            = DV_ERR_BASE + 8;
  1878.     DV_ERR_SIZEFIELD                = DV_ERR_BASE + 9;
  1879.     DV_ERR_PARAM1                   = DV_ERR_BASE + 10;
  1880.     DV_ERR_PARAM2                   = DV_ERR_BASE + 11;
  1881.     DV_ERR_CONFIG1                  = DV_ERR_BASE + 12;
  1882.     DV_ERR_CONFIG2                  = DV_ERR_BASE + 13;
  1883.     DV_ERR_FLAGS                    = DV_ERR_BASE + 14;
  1884.     DV_ERR_13                       = DV_ERR_BASE + 15;
  1885.     DV_ERR_NOTSUPPORTED             = DV_ERR_BASE + 16;     // function not suported 
  1886.     DV_ERR_NOMEM                    = DV_ERR_BASE + 17;     // out of memory 
  1887.     DV_ERR_ALLOCATED                = DV_ERR_BASE + 18;     // device is allocated 
  1888.     DV_ERR_BADDEVICEID              = DV_ERR_BASE + 19;
  1889.     DV_ERR_INVALHANDLE              = DV_ERR_BASE + 20;
  1890.     DV_ERR_BADERRNUM                = DV_ERR_BASE + 21;
  1891.     DV_ERR_NO_BUFFERS               = DV_ERR_BASE + 22;     // out of buffers 
  1892.     DV_ERR_MEM_CONFLICT             = DV_ERR_BASE + 23;     // Mem conflict detected 
  1893.     DV_ERR_IO_CONFLICT              = DV_ERR_BASE + 24;     // I/O conflict detected 
  1894.     DV_ERR_DMA_CONFLICT             = DV_ERR_BASE + 25;     // DMA conflict detected
  1895.     DV_ERR_INT_CONFLICT             = DV_ERR_BASE + 26;     // Interrupt conflict detected