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

Delphi控件源码

开发平台:

Delphi

  1. unit vfw;
  2. interface
  3. uses
  4.   Windows, MMSystem, Messages;
  5. const
  6. // ------------------------------------------------------------------
  7. //  Window Messages  WM_CAP... which can be sent to an AVICAP window
  8. // ------------------------------------------------------------------
  9. // Defines start of the message range
  10. WM_CAP_START                    = WM_USER;
  11. WM_CAP_GET_CAPSTREAMPTR         = (WM_CAP_START+  1);
  12. WM_CAP_SET_CALLBACK_ERROR       = (WM_CAP_START+  2);
  13. WM_CAP_SET_CALLBACK_STATUS      = (WM_CAP_START+  3);
  14. WM_CAP_SET_CALLBACK_YIELD       = (WM_CAP_START+  4);
  15. WM_CAP_SET_CALLBACK_FRAME       = (WM_CAP_START+  5);
  16. WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START+  6);
  17. WM_CAP_SET_CALLBACK_WAVESTREAM  = (WM_CAP_START+  7);
  18. WM_CAP_GET_USER_DATA            = (WM_CAP_START+  8);
  19. WM_CAP_SET_USER_DATA            = (WM_CAP_START+  9);
  20. WM_CAP_DRIVER_CONNECT           = (WM_CAP_START+  10);
  21. WM_CAP_DRIVER_DISCONNECT        = (WM_CAP_START+  11);
  22. WM_CAP_DRIVER_GET_NAME          = (WM_CAP_START+  12);
  23. WM_CAP_DRIVER_GET_VERSION       = (WM_CAP_START+  13);
  24. WM_CAP_DRIVER_GET_CAPS          = (WM_CAP_START+  14);
  25. WM_CAP_FILE_SET_CAPTURE_FILE    = (WM_CAP_START+  20);
  26. WM_CAP_FILE_GET_CAPTURE_FILE    = (WM_CAP_START+  21);
  27. WM_CAP_FILE_ALLOCATE            = (WM_CAP_START+  22);
  28. WM_CAP_FILE_SAVEAS              = (WM_CAP_START+  23);
  29. WM_CAP_FILE_SET_INFOCHUNK       = (WM_CAP_START+  24);
  30. WM_CAP_FILE_SAVEDIB             = (WM_CAP_START+  25);
  31. WM_CAP_EDIT_COPY                = (WM_CAP_START+  30);
  32. WM_CAP_SET_AUDIOFORMAT          = (WM_CAP_START+  35);
  33. WM_CAP_GET_AUDIOFORMAT          = (WM_CAP_START+  36);
  34. WM_CAP_DLG_VIDEOFORMAT          = (WM_CAP_START+  41);
  35. WM_CAP_DLG_VIDEOSOURCE          = (WM_CAP_START+  42);
  36. WM_CAP_DLG_VIDEODISPLAY         = (WM_CAP_START+  43);
  37. WM_CAP_GET_VIDEOFORMAT          = (WM_CAP_START+  44);
  38. WM_CAP_SET_VIDEOFORMAT          = (WM_CAP_START+  45);
  39. WM_CAP_DLG_VIDEOCOMPRESSION     = (WM_CAP_START+  46);
  40. WM_CAP_SET_PREVIEW              = (WM_CAP_START+  50);
  41. WM_CAP_SET_OVERLAY              = (WM_CAP_START+  51);
  42. WM_CAP_SET_PREVIEWRATE          = (WM_CAP_START+  52);
  43. WM_CAP_SET_SCALE                = (WM_CAP_START+  53);
  44. WM_CAP_GET_STATUS               = (WM_CAP_START+  54);
  45. WM_CAP_SET_SCROLL               = (WM_CAP_START+  55);
  46. WM_CAP_GRAB_FRAME               = (WM_CAP_START+  60);
  47. WM_CAP_GRAB_FRAME_NOSTOP        = (WM_CAP_START+  61);
  48. WM_CAP_SEQUENCE                 = (WM_CAP_START+  62);
  49. WM_CAP_SEQUENCE_NOFILE          = (WM_CAP_START+  63);
  50. WM_CAP_SET_SEQUENCE_SETUP       = (WM_CAP_START+  64);
  51. WM_CAP_GET_SEQUENCE_SETUP       = (WM_CAP_START+  65);
  52. WM_CAP_SET_MCI_DEVICE           = (WM_CAP_START+  66);
  53. WM_CAP_GET_MCI_DEVICE           = (WM_CAP_START+  67);
  54. WM_CAP_STOP                     = (WM_CAP_START+  68);
  55. WM_CAP_ABORT                    = (WM_CAP_START+  69);
  56. WM_CAP_SINGLE_FRAME_OPEN        = (WM_CAP_START+  70);
  57. WM_CAP_SINGLE_FRAME_CLOSE       = (WM_CAP_START+  71);
  58. WM_CAP_SINGLE_FRAME             = (WM_CAP_START+  72);
  59. WM_CAP_PAL_OPEN                 = (WM_CAP_START+  80);
  60. WM_CAP_PAL_SAVE                 = (WM_CAP_START+  81);
  61. WM_CAP_PAL_PASTE                = (WM_CAP_START+  82);
  62. WM_CAP_PAL_AUTOCREATE           = (WM_CAP_START+  83);
  63. WM_CAP_PAL_MANUALCREATE         = (WM_CAP_START+  84);
  64. // Following added post VFW 1.1
  65. WM_CAP_SET_CALLBACK_CAPCONTROL  = (WM_CAP_START+  85);
  66. // Defines end of the message range
  67. WM_CAP_END                      = WM_CAP_SET_CALLBACK_CAPCONTROL;
  68. // dwFlags field of TVIDEOHDR
  69. VHDR_DONE =      $00000001;  // Done bit */
  70. VHDR_PREPARED=   $00000002;  // Set if this header has been prepared */
  71. VHDR_INQUEUE =   $00000004;  // Reserved for driver */
  72. VHDR_KEYFRAME=   $00000008;  // Key Frame */
  73. // ------------------------------------------------------------------
  74. //  Structures
  75. // ------------------------------------------------------------------
  76. type
  77.  PCapDriverCaps = ^TCapDriverCaps;
  78.  TCapDriverCaps = record
  79.     wDeviceIndex            :WORD;           // Driver index in system.ini
  80.     fHasOverlay             :BOOL;           // Can device overlay?
  81.     fHasDlgVideoSource      :BOOL;           // Has Video source dlg?
  82.     fHasDlgVideoFormat      :BOOL;           // Has Format dlg?
  83.     fHasDlgVideoDisplay     :BOOL;           // Has External out dlg?
  84.     fCaptureInitialized     :BOOL;           // Driver ready to capture?
  85.     fDriverSuppliesPalettes :BOOL;           // Can driver make palettes?
  86.     hVideoIn                :THANDLE;        // Driver In channel
  87.     hVideoOut               :THANDLE;        // Driver Out channel
  88.     hVideoExtIn             :THANDLE;        // Driver Ext In channel
  89.     hVideoExtOut            :THANDLE;        // Driver Ext Out channel
  90. end;
  91.   pCapStatus = ^TCapStatus;
  92.   TCapStatus = record
  93.     uiImageWidth                :UINT;      // Width of the image
  94.     uiImageHeight               :UINT;      // Height of the image
  95.     fLiveWindow                 :BOOL;      // Now Previewing video?
  96.     fOverlayWindow              :BOOL;      // Now Overlaying video?
  97.     fScale                      :BOOL;      // Scale image to client?
  98.     ptScroll                    :TPOINT;    // Scroll position
  99.     fUsingDefaultPalette        :BOOL;      // Using default driver palette?
  100.     fAudioHardware              :BOOL;      // Audio hardware present?
  101.     fCapFileExists              :BOOL;      // Does capture file exist?
  102.     dwCurrentVideoFrame         :DWORD;     // # of video frames cap'td
  103.     dwCurrentVideoFramesDropped :DWORD;     // # of video frames dropped
  104.     dwCurrentWaveSamples        :DWORD;     // # of wave samples cap'td
  105.     dwCurrentTimeElapsedMS      :DWORD;     // Elapsed capture duration
  106.     hPalCurrent                 :HPALETTE;  // Current palette in use
  107.     fCapturingNow               :BOOL;      // Capture in progress?
  108.     dwReturn                    :DWORD;     // Error value after any operation
  109.     wNumVideoAllocated          :UINT;      // Actual number of video buffers
  110.     wNumAudioAllocated          :UINT;      // Actual number of audio buffers
  111.  end;
  112. pCaptureParms = ^TCaptureParms;
  113.  TCaptureParms = record                    // Default values in parenthesis
  114.    dwRequestMicroSecPerFrame  :DWORD;      // Requested capture rate
  115.    fMakeUserHitOKToCapture    :BOOL;       // Show "Hit OK to cap" dlg?
  116.    wPercentDropForError       :UINT;       // Give error msg if > (10%)
  117.    fYield                     :BOOL;       // Capture via background task?
  118.    dwIndexSize                :DWORD;      // Max index size in frames (32K)
  119.    wChunkGranularity          :UINT;       // Junk chunk granularity (2K)
  120.    fUsingDOSMemory            :BOOL;       // Use DOS buffers?
  121.    wNumVideoRequested         :UINT;       // # video buffers, If 0, autocalc
  122.    fCaptureAudio              :BOOL;       // Capture audio?
  123.    wNumAudioRequested         :UINT;       // # audio buffers, If 0, autocalc
  124.    vKeyAbort                  :UINT;       // Virtual key causing abort
  125.    fAbortLeftMouse            :BOOL;       // Abort on left mouse?
  126.    fAbortRightMouse           :BOOL;       // Abort on right mouse?
  127.    fLimitEnabled              :BOOL;       // Use wTimeLimit?
  128.    wTimeLimit                 :UINT;       // Seconds to capture
  129.    fMCIControl                :BOOL;       // Use MCI video source?
  130.    fStepMCIDevice             :BOOL;       // Step MCI device?
  131.    dwMCIStartTime             :DWORD;      // Time to start in MS
  132.    dwMCIStopTime              :DWORD;     // Time to stop in MS
  133.    fStepCaptureAt2x           :BOOL;      // Perform spatial averaging 2x
  134.    wStepCaptureAverageFrames  :UINT;      // Temporal average n Frames
  135.    dwAudioBufferSize          :DWORD;     // Size of audio bufs (0 = default)
  136.    fDisableWriteCache         :BOOL;     // Attempt to disable write cache
  137.    AVStreamMaster             :UINT;     // Which stream controls length?
  138. end;
  139.  PCapInfoChunk = ^TCapInfoChunk;
  140.  TCapInfoChunk = record
  141.     fccInfoID :FOURCC;  // Chunk ID, "ICOP" for copyright
  142.     lpData    :Pointer;  // pointer to data
  143.     cbData    :LongInt;         // size of lpData
  144. end;
  145. PVIDEOHDR = ^TVIDEOHDR;
  146. TVIDEOHDR = record
  147.     lpData:pByte;                 // pointer to locked data buffer
  148.     dwBufferLength:DWORD;         // Length of data buffer
  149.     dwBytesUsed:DWORD;            // Bytes actually used
  150.     dwTimeCaptured:DWORD;         // Milliseconds from start of stream
  151.     dwUser:DWORD;                 // for client's use
  152.     dwFlags:DWORD;                // assorted flags (see defines)
  153.     dwReserved: array [0..4] of DWORD;    // reserved for driver
  154. end;
  155. // ------------------------------------------------------------------
  156. //  Callback Definitions
  157. // ------------------------------------------------------------------
  158. type
  159. TCAPSTATUSCALLBACK  = function(hWnd:HWND; nID:Integer; lpsz:PChar):LongInt; stdcall;
  160. TCAPYIELDCALLBACK   = function(hWnd:HWND):LongInt; stdcall;
  161. TCAPERRORCALLBACK   = function(hWnd:HWND; nID:Integer; lpsz:Pchar):LongInt; stdcall;
  162. TCAPVIDEOSTREAMCALLBACK = function(hWnd:HWND; lpVHdr:PVIDEOHDR):LongInt; stdcall;
  163. TCAPWAVESTREAMCALLBACK   = function(hWnd:HWND; lpWHdr:PWAVEHDR):LongInt; stdcall;
  164. TCAPCONTROLCALLBACK = function(hWnd:HWND; nState:Integer):LongInt; stdcall;
  165. // ------------------------------------------------------------------
  166. //  CapControlCallback states
  167. // ------------------------------------------------------------------
  168. Const
  169. CONTROLCALLBACK_PREROLL         = 1; // Waiting to start capture
  170. CONTROLCALLBACK_CAPTURING       = 2;  // Now capturing
  171. // ------------------------------------------------------------------
  172. //  Message crackers for above
  173. // ------------------------------------------------------------------
  174. function capSetCallbackOnError (hwnd : THandle; fpProc:TCAPERRORCALLBACK):LongInt;
  175. function capSetCallbackOnStatus(hwnd : THandle; fpProc:TCAPSTATUSCALLBACK):LongInt;
  176. function capSetCallbackOnYield (hwnd : THandle; fpProc:TCAPYIELDCALLBACK):LongInt;
  177. function capSetCallbackOnFrame (hwnd : THandle; fpProc:TCAPVIDEOSTREAMCALLBACK):LongInt;  // Hier ist der Type der Callbackfunktion nicht klar !
  178. function capSetCallbackOnVideoStream(hwnd:THandle; fpProc:TCAPVIDEOSTREAMCALLBACK):LongInt;
  179. function capSetCallbackOnWaveStream (hwnd:THandle; fpProc: TCAPWAVESTREAMCALLBACK):LongInt;
  180. function capSetCallbackOnCapControl (hwnd:THandle; fpProc:TCAPCONTROLCALLBACK):LongInt;
  181. function capSetUserData(hwnd:THandle; lUser:LongInt):LongInt;
  182. function capGetUserData(hwnd:THandle):LongInt;
  183. function capDriverConnect(hwnd:THandle; I: Word) : boolean;
  184. function capDriverDisconnect(hwnd:THandle):boolean;
  185. function capDriverGetName(hwnd:THandle; szName:PChar; wSize:Word):boolean;
  186. function capDriverGetVersion(hwnd:THandle; szVer:PChar; wSize:Word):Boolean;
  187. function capDriverGetCaps(hwnd:THandle; s:PCapDriverCaps; wSize:Word):boolean;
  188. function capFileSetCaptureFile(hwnd:THandle; szName:PChar):boolean;
  189. function capFileGetCaptureFile(hwnd:THandle; szName:PChar; wSize:Word):boolean;
  190. function capFileAlloc(hwnd:THandle; dwSize:DWORD):boolean;
  191. function capFileSaveAs(hwnd:THandle; szName:Pchar):boolean;
  192. function capFileSetInfoChunk(hwnd:THandle; lpInfoChunk:pCapInfoChunk):boolean ;
  193. function capFileSaveDIB(hwnd:THandle; szName:Pchar):boolean;
  194. function capEditCopy(hwnd : THandle):boolean;
  195. function capSetAudioFormat(hwnd:THandle; s:PWaveFormatEx; wSize:Word):Boolean;
  196. function capGetAudioFormat(hwnd:THandle; s:PWaveFormatEx; wSize:Word):DWORD;
  197. function capGetAudioFormatSize(hwnd:THandle):DWORD;
  198. function capDlgVideoFormat(hwnd:THandle):boolean;
  199. function capDlgVideoSource(hwnd:THandle):boolean;
  200. function capDlgVideoDisplay(hwnd:THandle):boolean;
  201. function capDlgVideoCompression(hwnd:THandle):boolean;
  202. function capGetVideoFormat(hwnd:THandle; s:pBitmapInfo; wSize:Word):DWord;
  203. function capGetVideoFormatSize(hwnd:THandle):DWORD;
  204. function capSetVideoFormat(hwnd:THandle; s:pBitmapInfo; wSize:Word):boolean;
  205. function capPreview(hwnd:THandle; f:boolean):boolean;
  206. function capPreviewRate(hwnd:THandle; wMS:Word):boolean;
  207. function capOverlay(hwnd:THandle; f:boolean):boolean;
  208. function capPreviewScale(hwnd:THandle; f:boolean):boolean;
  209. function capGetStatus(hwnd:THandle; s:pCapStatus; wSize:Word):boolean;
  210. function capSetScrollPos(hwnd:THandle; lpP:pPoint):boolean;
  211. function capGrabFrame(hwnd:THandle):boolean;
  212. function capGrabFrameNoStop(hwnd:THandle):boolean;
  213. function capCaptureSequence(hwnd:THandle):Boolean;
  214. function capCaptureSequenceNoFile(hwnd:THandle):Boolean;
  215. function capCaptureStop(hwnd:THandle):boolean;
  216. function capCaptureAbort(hwnd:THandle):boolean;
  217. function capCaptureSingleFrameOpen(hwnd:THandle):boolean;
  218. function capCaptureSingleFrameClose(hwnd:THandle):boolean;
  219. function capCaptureSingleFrame(hwnd:THandle):boolean;
  220. function capCaptureGetSetup(hwnd:THandle; s:pCaptureParms; wSize:Word):boolean;
  221. function capCaptureSetSetup(hwnd:THandle; s:pCaptureParms; wSize:Word):boolean;
  222. function capSetMCIDeviceName(hwnd:THandle; szName:PChar):boolean;
  223. function capGetMCIDeviceName(hwnd:THandle; szName:PChar; wSize:Word):boolean;
  224. function capPaletteOpen(hwnd:THandle; szName:PChar):boolean;
  225. function capPaletteSave(hwnd:THandle; szName:PChar):boolean;
  226. function capPalettePaste(hwnd:THandle):Boolean;
  227. function capPaletteAuto(hwnd:THandle; iFrames:Word; iColors:word):boolean;
  228. function capPaletteManual(hwnd:THandle; fGrab:Word; iColors:word):boolean;
  229. // ------------------------------------------------------------------
  230. //  The only exported functions from AVICAP.DLL
  231. // ------------------------------------------------------------------
  232.   function capCreateCaptureWindow (
  233.          lpszWindowName  : PChar;
  234.                       dwStyle         : DWord;
  235.                x, y            : Integer;
  236.       nWidth, nHeight : Integer;
  237.            hwndParent      : THandle;
  238.                nID             : Integer ) : THandle; stdcall;
  239.  function capGetDriverDescription (
  240.         wDriverIndex : DWord;
  241.         lpszName     : PChar;
  242.         cbName       : Integer;
  243.         lpszVer      : PChar;
  244.         cbVer        : Integer ) : Boolean; stdcall;
  245. // ------------------------------------------------------------------
  246. // New Information chunk IDs
  247. // ------------------------------------------------------------------
  248. (*
  249. infotypeDIGITIZATION_TIME  = mmioStringToFOURCC(PChar('IDIT'), MMIO_TOUPPER);
  250. infotypeSMPTE_TIME         = mmioStringToFOURCC(PChar('ISMP'), MMIO_TOUPPER);
  251. *)
  252. // ------------------------------------------------------------------
  253. // String IDs from status and error callbacks
  254. // ------------------------------------------------------------------
  255. Const
  256. IDS_CAP_BEGIN               = 300; (* "Capture Start" *)
  257. IDS_CAP_END                 = 301; (* "Capture End" *)
  258. IDS_CAP_INFO                = 401; (* "%s" *)
  259. IDS_CAP_OUTOFMEM            = 402; (* "Out of memory" *)
  260. IDS_CAP_FILEEXISTS          = 403; (* "File '%s' exists -- overwrite it?" *)
  261. IDS_CAP_ERRORPALOPEN        = 404; (* "Error opening palette '%s'" *)
  262. IDS_CAP_ERRORPALSAVE        = 405; (* "Error saving palette '%s'" *)
  263. IDS_CAP_ERRORDIBSAVE        = 406; (* "Error saving frame '%s'" *)
  264. IDS_CAP_DEFAVIEXT           = 407; (* "avi" *)
  265. IDS_CAP_DEFPALEXT           = 408; (* "pal" *)
  266. IDS_CAP_CANTOPEN            = 409; (* "Cannot open '%s'" *)
  267. IDS_CAP_SEQ_MSGSTART        = 410; (* "Select OK to start capturenof video sequencento %s." *)
  268. IDS_CAP_SEQ_MSGSTOP         = 411; (* "Hit ESCAPE or click to end capture" *)
  269. IDS_CAP_VIDEDITERR          = 412; (* "An error occurred while trying to run VidEdit." *)
  270. IDS_CAP_READONLYFILE        = 413; (* "The file '%s' is a read-only file." *)
  271. IDS_CAP_WRITEERROR          = 414; (* "Unable to write to file '%s'.nDisk may be full." *)
  272. IDS_CAP_NODISKSPACE         = 415; (* "There is no space to create a capture file on the specified device." *)
  273. IDS_CAP_SETFILESIZE         = 416; (* "Set File Size" *)
  274. IDS_CAP_SAVEASPERCENT       = 417; (* "SaveAs: %2ld%%  Hit Escape to abort." *)
  275. IDS_CAP_DRIVER_ERROR        = 418; (* Driver specific error message *)
  276. IDS_CAP_WAVE_OPEN_ERROR     = 419; (* "Error: Cannot open the wave input device.nCheck sample size, frequency, and channels." *)
  277. IDS_CAP_WAVE_ALLOC_ERROR    = 420; (* "Error: Out of memory for wave buffers." *)
  278. IDS_CAP_WAVE_PREPARE_ERROR  = 421; (* "Error: Cannot prepare wave buffers." *)
  279. IDS_CAP_WAVE_ADD_ERROR      = 422; (* "Error: Cannot add wave buffers." *)
  280. IDS_CAP_WAVE_SIZE_ERROR     = 423; (* "Error: Bad wave size." *)
  281. IDS_CAP_VIDEO_OPEN_ERROR    = 424; (* "Error: Cannot open the video input device." *)
  282. IDS_CAP_VIDEO_ALLOC_ERROR   = 425; (* "Error: Out of memory for video buffers." *)
  283. IDS_CAP_VIDEO_PREPARE_ERROR = 426; (* "Error: Cannot prepare video buffers." *)
  284. IDS_CAP_VIDEO_ADD_ERROR     = 427; (* "Error: Cannot add video buffers." *)
  285. IDS_CAP_VIDEO_SIZE_ERROR    = 428; (* "Error: Bad video size." *)
  286. IDS_CAP_FILE_OPEN_ERROR     = 429; (* "Error: Cannot open capture file." *)
  287. IDS_CAP_FILE_WRITE_ERROR    = 430; (* "Error: Cannot write to capture file.  Disk may be full." *)
  288. IDS_CAP_RECORDING_ERROR     = 431; (* "Error: Cannot write to capture file.  Data rate too high or disk full." *)
  289. IDS_CAP_RECORDING_ERROR2    = 432; (* "Error while recording" *)
  290. IDS_CAP_AVI_INIT_ERROR      = 433; (* "Error: Unable to initialize for capture." *)
  291. IDS_CAP_NO_FRAME_CAP_ERROR  = 434; (* "Warning: No frames captured.nConfirm that vertical sync interruptsnare configured and enabled." *)
  292. IDS_CAP_NO_PALETTE_WARN     = 435; (* "Warning: Using default palette." *)
  293. IDS_CAP_MCI_CONTROL_ERROR   = 436; (* "Error: Unable to access MCI device." *)
  294. IDS_CAP_MCI_CANT_STEP_ERROR = 437; (* "Error: Unable to step MCI device." *)
  295. IDS_CAP_NO_AUDIO_CAP_ERROR  = 438; (* "Error: No audio data captured.nCheck audio card settings." *)
  296. IDS_CAP_AVI_DRAWDIB_ERROR   = 439; (* "Error: Unable to draw this data format." *)
  297. IDS_CAP_COMPRESSOR_ERROR    = 440; (* "Error: Unable to initialize compressor." *)
  298. IDS_CAP_AUDIO_DROP_ERROR    = 441; (* "Error: Audio data was lost during capture, reduce capture rate." *)
  299.   (* status string IDs *)
  300. IDS_CAP_STAT_LIVE_MODE      = 500; (* "Live window" *)
  301. IDS_CAP_STAT_OVERLAY_MODE   = 501; (* "Overlay window" *)
  302. IDS_CAP_STAT_CAP_INIT       = 502; (* "Setting up for capture - Please wait" *)
  303. IDS_CAP_STAT_CAP_FINI       = 503; (* "Finished capture, now writing frame %ld" *)
  304. IDS_CAP_STAT_PALETTE_BUILD  = 504; (* "Building palette map" *)
  305. IDS_CAP_STAT_OPTPAL_BUILD   = 505; (* "Computing optimal palette" *)
  306. IDS_CAP_STAT_I_FRAMES       = 506; (* "%d frames" *)
  307. IDS_CAP_STAT_L_FRAMES       = 507; (* "%ld frames" *)
  308. IDS_CAP_STAT_CAP_L_FRAMES   = 508; (* "Captured %ld frames" *)
  309. IDS_CAP_STAT_CAP_AUDIO      = 509; (* "Capturing audio" *)
  310. IDS_CAP_STAT_VIDEOCURRENT   = 510; (* "Captured %ld frames (%ld dropped) %d.%03d sec." *)
  311. IDS_CAP_STAT_VIDEOAUDIO     = 511; (* "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps).  %ld audio bytes (%d,%03d sps)" *)
  312. IDS_CAP_STAT_VIDEOONLY      = 512; (* "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps)" *)
  313. IDS_CAP_STAT_FRAMESDROPPED  = 513; (* "Dropped %ld of %ld frames (%d.%02d%%) during capture." *)
  314.   {== DRAWDIB - Routines for drawing to the display ============================}
  315. type
  316.     HDRAWDIB                    = THandle;  // hdd
  317. { == DrawDib Flags ============================================================}
  318. const
  319.     DDF_UPDATE                  = $0002;    // re-draw the last DIB
  320.     DDF_SAME_HDC                = $0004;    // HDC same as last call (all setup)
  321.     DDF_SAME_DRAW               = $0008;    // draw params are the same
  322.     DDF_DONTDRAW                = $0010;    // dont draw frame, just decompress
  323.     DDF_ANIMATE                 = $0020;    // allow palette animation
  324.     DDF_BUFFER                  = $0040;    // always buffer image
  325.     DDF_JUSTDRAWIT              = $0080;    // just draw it with GDI
  326.     DDF_FULLSCREEN              = $0100;    // use DisplayDib
  327.     DDF_BACKGROUNDPAL           = $0200;    // Realize palette in background
  328.     DDF_NOTKEYFRAME             = $0400;    // this is a partial frame update, hint
  329.     DDF_HURRYUP                 = $0800;    // hurry up please!
  330.     DDF_HALFTONE                = $1000;    // always halftone
  331.     DDF_PREROLL                 = DDF_DONTDRAW; // Builing up a non-keyframe
  332.     DDF_SAME_DIB                = DDF_SAME_DRAW;
  333.     DDF_SAME_SIZE               = DDF_SAME_DRAW;
  334. {== DrawDib functions ========================================================}
  335. {-- DrawDibOpen() ------------------------------------------------------------}
  336. function    DrawDibOpen: HDRAWDIB; stdcall;
  337. {-- DrawDibClose() -----------------------------------------------------------}
  338. function    DrawDibClose(hdd: HDRAWDIB): BOOL; stdcall;
  339. {-- DrawDibGetBuffer() -------------------------------------------------------}
  340. function    DrawDibGetBuffer(hdd: HDRAWDIB; lpbi: PBITMAPINFOHEADER; dwSize: DWORD; dwFlags: DWORD): Pointer;stdcall;
  341. {-- DrawDibGetPalette() - get the palette used for drawing DIBs --------------}
  342. function    DrawDibGetPalette(hdd: HDRAWDIB): HPALETTE; stdcall;
  343. {-- DrawDibSetPalette() - set the palette used for drawing DIBs --------------}
  344. function    DrawDibSetPalette(hdd: HDRAWDIB; hpal: HPALETTE): BOOL; stdcall;
  345. {-- DrawDibChangePalette() ---------------------------------------------------}
  346. function    DrawDibChangePalette(hdd: HDRAWDIB; iStart, iLen: integer; lppe: PPALETTEENTRY): BOOL; stdcall;
  347. {-- DrawDibRealize() - realize the palette in a HDD --------------------------}
  348. function    DrawDibRealize(hdd: HDRAWDIB; hdc: HDC; fBackground: BOOL): UINT; stdcall;
  349. {-- DrawDibStart() - start of streaming playback -----------------------------}
  350. function    DrawDibStart(hdd: HDRAWDIB; rate: DWORD): BOOL; stdcall;
  351. {-- DrawDibStop() - start of streaming playback ------------------------------}
  352. function    DrawDibStop(hdd: HDRAWDIB): BOOL; stdcall;
  353. {-- DrawDibBegin() - prepare to draw -----------------------------------------}
  354. function    DrawDibBegin(
  355.     hdd         : HDRAWDIB;
  356.     hdc         : HDC;
  357.     dxDst       : integer;
  358.     dyDst       : integer;
  359.     lpbi        : PBITMAPINFOHEADER;
  360.     dxSrc       : integer;
  361.     dySrc       : integer;
  362.     wFlags      : UINT
  363.     ): BOOL; stdcall;
  364. {-- DrawDibDraw() - actually draw a DIB to the screen ------------------------}
  365. function    DrawDibDraw(
  366.     hdd         : HDRAWDIB;
  367.     hdc         : HDC;
  368.     xDst        : integer;
  369.     yDst        : integer;
  370.     dxDst       : integer;
  371.     dyDst       : integer;
  372.     lpbi        : PBITMAPINFOHEADER;
  373.     lpBits      : Pointer;
  374.     xSrc        : integer;
  375.     ySrc        : integer;
  376.     dxSrc       : integer;
  377.     dySrc       : integer;
  378.     wFlags      : UINT
  379.     ): BOOL; stdcall;
  380. {-- DrawDibUpdate() - redraw last image (may only be valid with DDF_BUFFER) --}
  381. //function    DrawDibUpdate(hdd: HDRAWDIB; hdc: HDC; x, y: integer): BOOL;stdcall;
  382. {-- DrawDibEnd() -------------------------------------------------------------}
  383. function    DrawDibEnd(hdd: HDRAWDIB): BOOL; stdcall;
  384. {-- DrawDibTime() - for debugging purposes only ------------------------------}
  385. type
  386.     PDRAWDIBTIME        = ^TDRAWDIBTIME;
  387.     TDRAWDIBTIME        = record
  388.         timeCount       : DWORD;
  389.         timeDraw        : DWORD;
  390.         timeDecompress  : DWORD;
  391.         timeDither      : DWORD;
  392.         timeStretch     : DWORD;
  393.         timeBlt         : DWORD;
  394.         timeSetDIBits   : DWORD;
  395.     end;
  396. function    DrawDibTime(hdd: HDRAWDIB; lpddtime: PDRAWDIBTIME): BOOL; stdcall;
  397. {-- Display profiling --------------------------------------------------------}
  398. const
  399.     PD_CAN_DRAW_DIB             = $0001;    // if you can draw at all
  400.     PD_CAN_STRETCHDIB           = $0002;    // basicly RC_STRETCHDIB
  401.     PD_STRETCHDIB_1_1_OK        = $0004;    // is it fast?
  402.     PD_STRETCHDIB_1_2_OK        = $0008;    // ...
  403.     PD_STRETCHDIB_1_N_OK        = $0010;    // ...
  404. function    DrawDibProfileDisplay(lpbi: PBITMAPINFOHEADER): DWORD; stdcall;
  405. // Helper fucntion for FOURCC
  406. function MKFOURCC(ch0, ch1, ch2, ch3: Char): FOURCC;
  407. {== COMPMAN - Installable Compression Manager ================================}
  408. const
  409.     ICVERSION                   = $0104 ;
  410. type
  411.     HIC                         = THandle;  // Handle to an Installable Compressor
  412. //
  413. // this code in biCompression means the DIB must be accesed via
  414. // 48 bit pointers! using *ONLY* the selector given.
  415. //
  416. const
  417.     BI_1632                     = $32333631;    // '1632'
  418. function    mmioFOURCC(ch0, ch1, ch2, ch3: Char): FOURCC;
  419. type
  420.     TWOCC                       = Word;
  421. function    aviTWOCC(ch0, ch1: Char): TWOCC;
  422. const
  423.     ICTYPE_VIDEO                = $63646976; // mmioFOURCC('v', 'i', 'd', 'c')
  424.     ICTYPE_AUDIO                = $63647561; // mmioFOURCC('a', 'u', 'd', 'c')
  425. const
  426.     ICERR_OK                    = 0 ;
  427.     ICERR_DONTDRAW              = 1 ;
  428.     ICERR_NEWPALETTE            = 2 ;
  429.     ICERR_GOTOKEYFRAME          = 3 ;
  430.     ICERR_STOPDRAWING           = 4 ;
  431.     ICERR_UNSUPPORTED           = -1 ;
  432.     ICERR_BADFORMAT             = -2 ;
  433.     ICERR_MEMORY                = -3 ;
  434.     ICERR_INTERNAL              = -4 ;
  435.     ICERR_BADFLAGS              = -5 ;
  436.     ICERR_BADPARAM              = -6 ;
  437.     ICERR_BADSIZE               = -7 ;
  438.     ICERR_BADHANDLE             = -8 ;
  439.     ICERR_CANTUPDATE            = -9 ;
  440.     ICERR_ABORT                 = -10 ;
  441.     ICERR_ERROR                 = -100 ;
  442.     ICERR_BADBITDEPTH           = -200 ;
  443.     ICERR_BADIMAGESIZE          = -201 ;
  444.     ICERR_CUSTOM                = -400 ;    // errors less than ICERR_CUSTOM...
  445. {-- Values for dwFlags of ICOpen() -------------------------------------------}
  446.     ICMODE_COMPRESS             = 1 ;
  447.     ICMODE_DECOMPRESS           = 2 ;
  448.     ICMODE_FASTDECOMPRESS       = 3 ;
  449.     ICMODE_QUERY                = 4 ;
  450.     ICMODE_FASTCOMPRESS         = 5 ;
  451.     ICMODE_DRAW                 = 8 ;
  452. {-- Flags for AVI file index -------------------------------------------------}
  453.     AVIIF_LIST                  = $00000001 ;
  454.     AVIIF_TWOCC                 = $00000002 ;
  455.     AVIIF_KEYFRAME              = $00000010 ;
  456. {-- quality flags ------------------------------------------------------------}
  457.     ICQUALITY_LOW               = 0 ;
  458.     ICQUALITY_HIGH              = 10000 ;
  459.     ICQUALITY_DEFAULT           = -1 ;
  460. {-----------------------------------------------------------------------------}
  461.     ICM_USER                    = (DRV_USER+$0000) ;
  462.     ICM_RESERVED_LOW            = (DRV_USER+$1000) ;
  463.     ICM_RESERVED_HIGH           = (DRV_USER+$2000) ;
  464.     ICM_RESERVED                = ICM_RESERVED_LOW ;
  465. {-- Messages -----------------------------------------------------------------}
  466.     ICM_GETSTATE                = (ICM_RESERVED+0) ;    // Get compressor state
  467.     ICM_SETSTATE                = (ICM_RESERVED+1) ;    // Set compressor state
  468.     ICM_GETINFO                 = (ICM_RESERVED+2) ;    // Query info about the compressor
  469.     ICM_CONFIGURE               = (ICM_RESERVED+10);    // show the configure dialog
  470.     ICM_ABOUT                   = (ICM_RESERVED+11);    // show the about box
  471.     ICM_GETDEFAULTQUALITY       = (ICM_RESERVED+30);    // get the default value for quality
  472.     ICM_GETQUALITY              = (ICM_RESERVED+31);    // get the current value for quality
  473.     ICM_SETQUALITY              = (ICM_RESERVED+32);    // set the default value for quality
  474.     ICM_SET                     = (ICM_RESERVED+40);    // Tell the driver something
  475.     ICM_GET                     = (ICM_RESERVED+41);    // Ask the driver something
  476. {-- Constants for ICM_SET: ---------------------------------------------------}
  477.     ICM_FRAMERATE               = $526D7246; // mmioFOURCC('F','r','m','R')
  478.     ICM_KEYFRAMERATE            = $5279654B; // mmioFOURCC('K','e','y','R')
  479. {-- ICM specific messages ----------------------------------------------------}
  480.     ICM_COMPRESS_GET_FORMAT     = (ICM_USER+4)  ;   // get compress format or size
  481.     ICM_COMPRESS_GET_SIZE       = (ICM_USER+5)  ;   // get output size
  482.     ICM_COMPRESS_QUERY          = (ICM_USER+6)  ;   // query support for compress
  483.     ICM_COMPRESS_BEGIN          = (ICM_USER+7)  ;   // begin a series of compress calls.
  484.     ICM_COMPRESS                = (ICM_USER+8)  ;   // compress a frame
  485.     ICM_COMPRESS_END            = (ICM_USER+9)  ;   // end of a series of compress calls.
  486.     ICM_DECOMPRESS_GET_FORMAT   = (ICM_USER+10) ;   // get decompress format or size
  487.     ICM_DECOMPRESS_QUERY        = (ICM_USER+11) ;   // query support for dempress
  488.     ICM_DECOMPRESS_BEGIN        = (ICM_USER+12) ;   // start a series of decompress calls
  489.     ICM_DECOMPRESS              = (ICM_USER+13) ;   // decompress a frame
  490.     ICM_DECOMPRESS_END          = (ICM_USER+14) ;   // end a series of decompress calls
  491.     ICM_DECOMPRESS_SET_PALETTE  = (ICM_USER+29) ;   // fill in the DIB color table
  492.     ICM_DECOMPRESS_GET_PALETTE  = (ICM_USER+30) ;   // fill in the DIB color table
  493.     ICM_DRAW_QUERY              = (ICM_USER+31) ;   // query support for dempress
  494.     ICM_DRAW_BEGIN              = (ICM_USER+15) ;   // start a series of draw calls
  495.     ICM_DRAW_GET_PALETTE        = (ICM_USER+16) ;   // get the palette needed for drawing
  496.     ICM_DRAW_START              = (ICM_USER+18) ;   // start decompress clock
  497.     ICM_DRAW_STOP               = (ICM_USER+19) ;   // stop decompress clock
  498.     ICM_DRAW_END                = (ICM_USER+21) ;   // end a series of draw calls
  499.     ICM_DRAW_GETTIME            = (ICM_USER+32) ;   // get value of decompress clock
  500.     ICM_DRAW                    = (ICM_USER+33) ;   // generalized "render" message
  501.     ICM_DRAW_WINDOW             = (ICM_USER+34) ;   // drawing window has moved or hidden
  502.     ICM_DRAW_SETTIME            = (ICM_USER+35) ;   // set correct value for decompress clock
  503.     ICM_DRAW_REALIZE            = (ICM_USER+36) ;   // realize palette for drawing
  504.     ICM_DRAW_FLUSH              = (ICM_USER+37) ;   // clear out buffered frames
  505.     ICM_DRAW_RENDERBUFFER       = (ICM_USER+38) ;   // draw undrawn things in queue
  506.     ICM_DRAW_START_PLAY         = (ICM_USER+39) ;   // start of a play
  507.     ICM_DRAW_STOP_PLAY          = (ICM_USER+40) ;   // end of a play
  508.     ICM_DRAW_SUGGESTFORMAT      = (ICM_USER+50) ;   // Like ICGetDisplayFormat
  509.     ICM_DRAW_CHANGEPALETTE      = (ICM_USER+51) ;   // for animating palette
  510.     ICM_GETBUFFERSWANTED        = (ICM_USER+41) ;   // ask about prebuffering
  511.     ICM_GETDEFAULTKEYFRAMERATE  = (ICM_USER+42) ;   // get the default value for key frames
  512.     ICM_DECOMPRESSEX_BEGIN      = (ICM_USER+60) ;   // start a series of decompress calls
  513.     ICM_DECOMPRESSEX_QUERY      = (ICM_USER+61) ;   // start a series of decompress calls
  514.     ICM_DECOMPRESSEX            = (ICM_USER+62) ;   // decompress a frame
  515.     ICM_DECOMPRESSEX_END        = (ICM_USER+63) ;   // end a series of decompress calls
  516.     ICM_COMPRESS_FRAMES_INFO    = (ICM_USER+70) ;   // tell about compress to come
  517.     ICM_SET_STATUS_PROC         = (ICM_USER+72) ;   // set status callback
  518. {-----------------------------------------------------------------------------}
  519. type
  520.     PICOPEN                     = ^TICOPEN;
  521.     TICOPEN                     = record
  522.         dwSize                  : DWORD   ; // sizeof(TICOPEN)
  523.         fccType                 : DWORD   ; // 'vidc'
  524.         fccHandler              : DWORD   ; //
  525.         dwVersion               : DWORD   ; // version of compman opening you
  526.         dwFlags                 : DWORD   ; // LOWORD is type specific
  527.         dwError                 : DWORD   ; // error return.
  528.         pV1Reserved             : Pointer   ; // Reserved
  529.         pV2Reserved             : Pointer   ; // Reserved
  530.         dnDevNode               : DWORD   ; // Devnode for PnP devices
  531.     end;
  532. {-----------------------------------------------------------------------------}
  533.     PICINFO                     = ^TICINFO ;
  534.     TICINFO                     = record
  535.         dwSize                  : DWORD;    // sizeof(TICINFO)
  536.         fccType                 : DWORD;    // compressor type     'vidc' 'audc'
  537.         fccHandler              : DWORD;    // compressor sub-type 'rle ' 'jpeg' 'pcm '
  538.         dwFlags                 : DWORD;    // flags LOWORD is type specific
  539.         dwVersion               : DWORD;    // version of the driver
  540.         dwVersionICM            : DWORD;    // version of the ICM used
  541.         //
  542.         // under Win32, the driver always returns UNICODE strings.
  543.         //
  544.         szName                  : array[0..15] of WideChar  ; // short name
  545.         szDescription           : array[0..127] of WideChar ; // DWORD name
  546.         szDriver                : array[0..127] of WideChar ; // driver that contains compressor
  547.     end;
  548. {-- Flags for the <dwFlags> field of the <ICINFO> structure. -----------------}
  549. const
  550.     VIDCF_QUALITY               = $0001 ;  // supports quality
  551.     VIDCF_CRUNCH                = $0002 ;  // supports crunching to a frame size
  552.     VIDCF_TEMPORAL              = $0004 ;  // supports inter-frame compress
  553.     VIDCF_COMPRESSFRAMES        = $0008 ;  // wants the compress all frames message
  554.     VIDCF_DRAW                  = $0010 ;  // supports drawing
  555.     VIDCF_FASTTEMPORALC         = $0020 ;  // does not need prev frame on compress
  556.     VIDCF_FASTTEMPORALD         = $0080 ;  // does not need prev frame on decompress
  557.     //VIDCF_QUALITYTIME         = $0040 ;  // supports temporal quality
  558.     //VIDCF_FASTTEMPORAL        = (VIDCF_FASTTEMPORALC or VIDCF_FASTTEMPORALD)
  559. {-----------------------------------------------------------------------------}
  560.     ICCOMPRESS_KEYFRAME         = $00000001;
  561. type
  562.     PICCOMPRESS                 = ^TICCOMPRESS;
  563.     TICCOMPRESS                 = record
  564.         dwFlags                 : DWORD;                // flags
  565.         lpbiOutput              : PBITMAPINFOHEADER ;   // output format
  566.         lpOutput                : Pointer ;               // output data
  567.         lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
  568.         lpInput                 : Pointer ;               // frame data to compress
  569.         lpckid                  : PDWORD ;              // ckid for data in AVI file
  570.         lpdwFlags               : PDWORD;               // flags in the AVI index.
  571.         lFrameNum               : DWORD ;                // frame number of seq.
  572.         dwFrameSize             : DWORD ;               // reqested size in bytes. (if non zero)
  573.         dwQuality               : DWORD ;               // quality
  574.         // these are new fields
  575.         lpbiPrev                : PBITMAPINFOHEADER ;   // format of previous frame
  576.         lpPrev                  : Pointer ;              // previous frame
  577.     end;
  578. {-----------------------------------------------------------------------------}
  579. const
  580.     ICCOMPRESSFRAMES_PADDING    = $00000001 ;
  581. type
  582.     TICCompressProc             = function(lInput: LPARAM; lFrame: DWORD; lpBits: Pointer; len: DWORD): DWORD; stdcall;
  583.     PICCOMPRESSFRAMES           = ^TICCOMPRESSFRAMES;
  584.     TICCOMPRESSFRAMES           = record
  585.         dwFlags                 : DWORD ;               // flags
  586.         lpbiOutput              : PBITMAPINFOHEADER ;   // output format
  587.         lOutput                 : LPARAM ;              // output identifier
  588.         lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
  589.         lInput                  : LPARAM ;              // input identifier
  590.         lStartFrame             : DWORD ;                // start frame
  591.         lFrameCount             : DWORD ;                // # of frames
  592.         lQuality                : DWORD ;                // quality
  593.         lDataRate               : DWORD ;                // data rate
  594.         lKeyRate                : DWORD ;                // key frame rate
  595.         dwRate                  : DWORD ;               // frame rate, as always
  596.         dwScale                 : DWORD ;
  597.         dwOverheadPerFrame      : DWORD ;
  598.         dwReserved2             : DWORD ;
  599.         GetData                 : TICCompressProc;
  600.         PutData                 : TICCompressProc;
  601.     end;
  602. {-- Messages for Status callback ---------------------------------------------}
  603. const
  604.     ICSTATUS_START              = 0 ;
  605.     ICSTATUS_STATUS             = 1 ;   // l = % done
  606.     ICSTATUS_END                = 2 ;
  607.     ICSTATUS_ERROR              = 3 ;   // l = error string (LPSTR)
  608.     ICSTATUS_YIELD              = 4 ;
  609. type    
  610.     // return nonzero means abort operation in progress
  611.     TICStatusProc               = function(lParam: LPARAM; message: UINT; l: DWORD): DWORD; stdcall;
  612.     PICSETSTATUSPROC            = ^TICSETSTATUSPROC;
  613.     TICSETSTATUSPROC            = record
  614.         dwFlags                 : DWORD ;
  615.         lParam                  : LPARAM ;
  616.         Status                  : TICStatusProc;
  617.     end;
  618. {-----------------------------------------------------------------------------}
  619. const
  620.     ICDECOMPRESS_HURRYUP        = $80000000 ;   // don't draw just buffer (hurry up!)
  621.     ICDECOMPRESS_UPDATE         = $40000000 ;   // don't draw just update screen
  622.     ICDECOMPRESS_PREROLL        = $20000000 ;   // this frame is before real start
  623.     ICDECOMPRESS_NULLFRAME      = $10000000 ;   // repeat last frame
  624.     ICDECOMPRESS_NOTKEYFRAME    = $08000000 ;   // this frame is not a key frame
  625. type
  626.     PICDECOMPRESS               = ^TICDECOMPRESS;
  627.     TICDECOMPRESS               = record
  628.         dwFlags                 : DWORD ;               // flags (from AVI index...)
  629.         lpbiInput               : PBITMAPINFOHEADER ;   // BITMAPINFO of compressed data
  630.                                                         // biSizeImage has the chunk size
  631.         lpInput                 : Pointer ;               // compressed data
  632.         lpbiOutput              : PBITMAPINFOHEADER ;   // DIB to decompress to
  633.         lpOutput                : Pointer ;
  634.         ckid                    : DWORD ;               // ckid from AVI file
  635.     end;
  636.     PICDECOMPRESSEX             = ^TICDECOMPRESSEX;
  637.     TICDECOMPRESSEX             = record
  638.         //
  639.         // same as ICM_DECOMPRESS
  640.         //
  641.         dwFlags                 : DWORD;
  642.         lpbiSrc                 : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
  643.         lpSrc                   : Pointer;                // compressed data
  644.         lpbiDst                 : PBITMAPINFOHEADER;    // DIB to decompress to
  645.         lpDst                   : Pointer;                // output data
  646.         //
  647.         // new for ICM_DECOMPRESSEX
  648.         //
  649.         xDst                    : integer ; // destination rectangle
  650.         yDst                    : integer ;
  651.         dxDst                   : integer ;
  652.         dyDst                   : integer ;
  653.         xSrc                    : integer ; // source rectangle
  654.         ySrc                    : integer ;
  655.         dxSrc                   : integer ;
  656.         dySrc                   : integer ;
  657.     end;
  658. {-----------------------------------------------------------------------------}
  659. const
  660.     ICDRAW_QUERY                = $00000001 ; // test for support
  661.     ICDRAW_FULLSCREEN           = $00000002 ; // draw to full screen
  662.     ICDRAW_HDC                  = $00000004 ; // draw to a HDC/HWND
  663.     ICDRAW_ANIMATE              = $00000008 ;   // expect palette animation
  664.     ICDRAW_CONTINUE             = $00000010 ;   // draw is a continuation of previous draw
  665.     ICDRAW_MEMORYDC             = $00000020 ;   // DC is offscreen, by the way
  666.     ICDRAW_UPDATING             = $00000040 ;   // We're updating, as opposed to playing
  667.     ICDRAW_RENDER               = $00000080 ; // used to render data not draw it
  668.     ICDRAW_BUFFER               = $00000100 ; // please buffer this data offscreen, we will need to update it
  669. type
  670.     PICDRAWBEGIN                = ^TICDRAWBEGIN;
  671.     TICDRAWBEGIN                = record
  672.         dwFlags                 : DWORD ;       // flags
  673.         hpal                    : HPALETTE ;    // palette to draw with
  674.         hwnd                    : HWND ;        // window to draw to
  675.         hdc                     : HDC ;         // HDC to draw to
  676.         xDst                    : integer ;         // destination rectangle
  677.         yDst                    : integer ;
  678.         dxDst                   : integer ;
  679.         dyDst                   : integer ;
  680.         lpbi                    : PBITMAPINFOHEADER ;
  681.                                                 // format of frame to draw
  682.         xSrc                    : integer ;         // source rectangle
  683.         ySrc                    : integer ;
  684.         dxSrc                   : integer ;
  685.         dySrc                   : integer ;
  686.         dwRate                  : DWORD ;       // frames/second = (dwRate/dwScale)
  687.         dwScale                 : DWORD ;
  688.     end;
  689. {-----------------------------------------------------------------------------}
  690. const
  691.     ICDRAW_HURRYUP              = $80000000 ;   // don't draw just buffer (hurry up!)
  692.     ICDRAW_UPDATE               = $40000000 ;   // don't draw just update screen
  693.     ICDRAW_PREROLL              = $20000000 ;   // this frame is before real start
  694.     ICDRAW_NULLFRAME            = $10000000 ;   // repeat last frame
  695.     ICDRAW_NOTKEYFRAME          = $08000000 ;   // this frame is not a key frame
  696. type
  697.     PICDRAW                     = ^TICDRAW;
  698.     TICDRAW                     = record
  699.         dwFlags                 : DWORD ;   // flags
  700.         lpFormat                : Pointer ;   // format of frame to decompress
  701.         lpData                  : Pointer ;   // frame data to decompress
  702.         cbData                  : DWORD ;
  703.         lTime                   : DWORD  ;   // time in drawbegin units (see dwRate and dwScale)
  704.     end;
  705.     PICDRAWSUGGEST              = ^TICDRAWSUGGEST;
  706.     TICDRAWSUGGEST              = record
  707.         lpbiIn                  : PBITMAPINFOHEADER ;   // format to be drawn
  708.         lpbiSuggest             : PBITMAPINFOHEADER ;   // location for suggested format (or NULL to get size)
  709.         dxSrc                   : integer ;                 // source extent or 0
  710.         dySrc                   : integer ;
  711.         dxDst                   : integer ;                 // dest extent or 0
  712.         dyDst                   : integer ;
  713.         hicDecompressor         : HIC ;                 // decompressor you can talk to
  714.     end;
  715. {-----------------------------------------------------------------------------}
  716.     PICPALETTE                  = ^TICPALETTE;
  717.     TICPALETTE                  = record
  718.         dwFlags                 : DWORD ;           // flags (from AVI index...)
  719.         iStart                  : integer ;             // first palette to change
  720.         iLen                    : integer ;             // count of entries to change.
  721.         lppe                    : PPALETTEENTRY ;   // palette
  722.     end;
  723. {-- ICM function declarations ------------------------------------------------}
  724. function    ICInfo(fccType, fccHandler: DWORD; lpicinfo: PICINFO) : BOOL ; stdcall ;
  725. function    ICInstall(fccType, fccHandler: DWORD; lParam: LPARAM; szDesc: LPSTR; wFlags: UINT) : BOOL ; stdcall ;
  726. function    ICRemove(fccType, fccHandler: DWORD; wFlags: UINT) : BOOL ; stdcall ;
  727. function    ICGetInfo(hic: HIC; picinfo: PICINFO; cb: DWORD) : DWORD ; stdcall ;
  728. function    ICOpen(fccType, fccHandler: DWORD; wMode: UINT) : HIC ; stdcall ;
  729. function    ICOpenFunction(fccType, fccHandler: DWORD; wMode: UINT; lpfnHandler: TFarProc) : HIC ; stdcall ;
  730. function    ICClose(hic: HIC) : DWORD; stdcall ;
  731. function    ICSendMessage(hic: HIC; msg: UINT; dw1, dw2: integer) : DWORD ; stdcall ;
  732. {-- Values for wFlags of ICInstall -------------------------------------------}
  733. const
  734.     ICINSTALL_UNICODE           = $8000 ;
  735.     ICINSTALL_FUNCTION          = $0001 ; // lParam is a DriverProc (function ptr)
  736.     ICINSTALL_DRIVER            = $0002 ; // lParam is a driver name (string)
  737.     ICINSTALL_HDRV              = $0004 ; // lParam is a HDRVR (driver handle)
  738.     ICINSTALL_DRIVERW           = $8002 ; // lParam is a unicode driver name
  739. {-- Query macros -------------------------------------------------------------}
  740.     ICMF_CONFIGURE_QUERY        = $00000001 ;
  741.     ICMF_ABOUT_QUERY            = $00000001 ;
  742. function    ICQueryAbout(hic: HIC): BOOL;
  743. function    ICAbout(hic: HIC; hwnd: HWND): DWORD;
  744. function    ICQueryConfigure(hic: HIC): BOOL;
  745. function    ICConfigure(hic: HIC; hwnd: HWND): DWORD;
  746. {-- Get/Set state macros -----------------------------------------------------}
  747. function    ICGetState(hic: HIC; pv: Pointer; cb: DWORD): DWORD;
  748. function    ICSetState(hic: HIC; pv: Pointer; cb: DWORD): DWORD;
  749. function    ICGetStateSize(hic: HIC): DWORD;
  750. {-- Get value macros ---------------------------------------------------------}
  751. function    ICGetDefaultQuality(hic: HIC): DWORD;
  752. function    ICGetDefaultKeyFrameRate(hic: HIC): DWORD;
  753. {-- Draw window macro --------------------------------------------------------}
  754. function    ICDrawWindow(hic: HIC; prc: PRECT): DWORD;
  755. {== Compression functions ====================================================}
  756. {-- ICCompress() - compress a single frame -----------------------------------}
  757. function    ICCompress(
  758.     hic             : HIC;
  759.     dwFlags         : DWORD;                // flags
  760.     lpbiOutput      : PBITMAPINFOHEADER;    // output format
  761.     lpData          : Pointer;                // output data
  762.     lpbiInput       : PBITMAPINFOHEADER;    // format of frame to compress
  763.     lpBits          : Pointer;                // frame data to compress
  764.     lpckid          : PDWORD;               // ckid for data in AVI file
  765.     lpdwFlags       : PDWORD;               // flags in the AVI index.
  766.     lFrameNum       : DWORD;                 // frame number of seq.
  767.     dwFrameSize     : DWORD;                // reqested size in bytes. (if non zero)
  768.     dwQuality       : DWORD;                // quality within one frame
  769.     lpbiPrev        : PBITMAPINFOHEADER;    // format of previous frame
  770.     lpPrev          : Pointer                 // previous frame
  771.     ) : DWORD; cdecl;
  772. {-- ICCompressBegin() - start compression from a source fmt to a dest fmt ----}
  773. function    ICCompressBegin(hic: HIC; lpbiInput: PBITMAPINFOHEADER; lpbiOutput: PBITMAPINFOHEADER): DWORD;
  774. {-- ICCompressQuery() - determines if compression from src to dst is supp ----}
  775. function    ICCompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  776. {-- ICCompressGetFormat() - get the output format (fmt of compressed) --------}
  777. // if lpbiOutput is nil return the size in bytes needed for format.
  778. function    ICCompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  779. function    ICCompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  780. {-- ICCompressSize() - return the maximal size of a compressed frame ---------}
  781. function    ICCompressGetSize(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  782. function    ICCompressEnd(hic: HIC): DWORD;
  783. {== Decompression functions ==================================================}
  784. {-- ICDecompress() - decompress a single frame -------------------------------}
  785. function    ICDecompress(
  786.     hic             : HIC;
  787.     dwFlags         : DWORD;                // flags (from AVI index...)
  788.     lpbiFormat      : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
  789.                                             // biSizeImage has the chunk size
  790.     lpData          : Pointer;                // data
  791.     lpbi            : PBITMAPINFOHEADER;    // DIB to decompress to
  792.     lpBits          : Pointer
  793.     ): DWORD; cdecl;
  794. {-- ICDecompressBegin() - start compression from src fmt to a dest fmt -------}
  795. function    ICDecompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  796. {-- ICDecompressQuery() - determines if compression is supported -------------}
  797. function    ICDecompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  798. {-- ICDecompressGetFormat - get the output fmt (fmt of uncompressed data) ----}
  799. // if lpbiOutput is NULL return the size in bytes needed for format.
  800. function    ICDecompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  801. function    ICDecompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  802. {-- ICDecompressGetPalette() - get the output palette ------------------------}
  803. function    ICDecompressGetPalette(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  804. function    ICDecompressSetPalette(hic: HIC; lpbiPalette: PBITMAPINFOHEADER): DWORD;
  805. function    ICDecompressEnd(hic: HIC): DWORD;
  806. {== Decompression(ex) functions ==============================================}
  807. //
  808. // on Win16 these functions are macros that call ICMessage. ICMessage will
  809. // not work on NT. rather than add new entrypoints we have given
  810. // them as static inline functions
  811. //
  812. {-- ICDecompressEx() - decompress a single frame -----------------------------}
  813. function    ICDecompressEx(
  814.     hic         : HIC;
  815.     dwFlags     : DWORD;
  816.     lpbiSrc     : PBITMAPINFOHEADER;
  817.     lpSrc       : Pointer;
  818.     xSrc        : integer;
  819.     ySrc        : integer;
  820.     dxSrc       : integer;
  821.     dySrc       : integer;
  822.     lpbiDst     : PBITMAPINFOHEADER;
  823.     lpDst       : Pointer;
  824.     xDst        : integer;
  825.     yDst        : integer;
  826.     dxDst       : integer;
  827.     dyDst       : integer
  828.     ): DWORD; stdcall;
  829. {-- ICDecompressExBegin() - start compression from a src fmt to a dest fmt ---}
  830. function    ICDecompressExBegin(
  831.     hic         : HIC;
  832.     dwFlags     : DWORD;
  833.     lpbiSrc     : PBITMAPINFOHEADER;
  834.     lpSrc       : Pointer;
  835.     xSrc        : integer;
  836.     ySrc        : integer;
  837.     dxSrc       : integer;
  838.     dySrc       : integer;
  839.     lpbiDst     : PBITMAPINFOHEADER;
  840.     lpDst       : Pointer;
  841.     xDst        : integer;
  842.     yDst        : integer;
  843.     dxDst       : integer;
  844.     dyDst       : integer
  845.     ): DWORD; stdcall;
  846. {-- ICDecompressExQuery() ----------------------------------------------------}
  847. function    ICDecompressExQuery(
  848.     hic         : HIC;
  849.     dwFlags     : DWORD;
  850.     lpbiSrc     : PBITMAPINFOHEADER;
  851.     lpSrc       : Pointer;
  852.     xSrc        : integer;
  853.     ySrc        : integer;
  854.     dxSrc       : integer;
  855.     dySrc       : integer;
  856.     lpbiDst     : PBITMAPINFOHEADER;
  857.     lpDst       : Pointer;
  858.     xDst        : integer;
  859.     yDst        : integer;
  860.     dxDst       : integer;
  861.     dyDst       : integer
  862.     ): DWORD; stdcall;
  863. function    ICDecompressExEnd(hic: HIC): DWORD;
  864. {== Drawing functions ========================================================}
  865. {-- ICDrawBegin() - start decompressing data with fmt directly to screen -----}
  866. // return zero if the decompressor supports drawing.
  867. function    ICDrawBegin(
  868.     hic         : HIC;
  869.     dwFlags     : DWORD;                // flags
  870.     hpal        : HPALETTE;             // palette to draw with
  871.     hwnd        : HWND;                 // window to draw to
  872.     hdc         : HDC;                  // HDC to draw to
  873.     xDst        : integer;                  // destination rectangle
  874.     yDst        : integer;
  875.     dxDst       : integer;
  876.     dyDst       : integer;
  877.     lpbi        : PBITMAPINFOHEADER;    // format of frame to draw
  878.     xSrc        : integer;                  // source rectangle
  879.     ySrc        : integer;
  880.     dxSrc       : integer;
  881.     dySrc       : integer;
  882.     dwRate      : DWORD;                // frames/second = (dwRate/dwScale)
  883.     dwScale     : DWORD
  884.     ): DWORD; cdecl;
  885. {-- ICDraw() - decompress data directly to the screen ------------------------}
  886. function    ICDraw(
  887.     hic         : HIC;
  888.     dwFlags     : DWORD;                // flags
  889.     lpFormat    : Pointer;                // format of frame to decompress
  890.     lpData      : Pointer;                // frame data to decompress
  891.     cbData      : DWORD;                // size of data
  892.     lTime       : DWORD                  // time to draw this frame
  893.     ): DWORD; cdecl;
  894. // ICMessage is not supported on Win32, so provide a static inline function
  895. // to do the same job
  896. function    ICDrawSuggestFormat(
  897.     hic         : HIC;
  898.     lpbiIn      : PBITMAPINFOHEADER;
  899.     lpbiOut     : PBITMAPINFOHEADER;
  900.     dxSrc       : integer;
  901.     dySrc       : integer;
  902.     dxDst       : integer;
  903.     dyDst       : integer;
  904.     hicDecomp   : HIC
  905.     ): DWORD; stdcall;
  906. {-- ICDrawQuery() - determines if the compressor is willing to render fmt ----}
  907. function    ICDrawQuery(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  908. function    ICDrawChangePalette(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  909. function    ICGetBuffersWanted(hic: HIC; lpdwBuffers: PDWORD): DWORD;
  910. function    ICDrawEnd(hic: HIC): DWORD;
  911. function    ICDrawStart(hic: HIC): DWORD;
  912. function    ICDrawStartPlay(hic: HIC; lFrom, lTo: DWORD): DWORD;
  913. function    ICDrawStop(hic: HIC): DWORD;
  914. function    ICDrawStopPlay(hic: HIC): DWORD;
  915. function    ICDrawGetTime(hic: HIC; lplTime: PDWORD): DWORD;
  916. function    ICDrawSetTime(hic: HIC; lTime: DWORD): DWORD;
  917. function    ICDrawRealize(hic: HIC; hdc: HDC; fBackground: BOOL): DWORD;
  918. function    ICDrawFlush(hic: HIC): DWORD;
  919. function    ICDrawRenderBuffer(hic: HIC): DWORD;
  920. {== Status callback functions ================================================}
  921. {-- ICSetStatusProc() - Set the status callback function ---------------------}
  922. // ICMessage is not supported on NT
  923. function    ICSetStatusProc(
  924.     hic         : HIC;
  925.     dwFlags     : DWORD;
  926.     lParam      : DWORD;
  927.     fpfnStatus  : TICStatusProc
  928.     ): DWORD; stdcall;
  929. {== Helper routines for DrawDib and MCIAVI... ================================}
  930. function    ICLocate(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER; wFlags: WORD): HIC; stdcall;
  931. function    ICGetDisplayFormat(hic: HIC; lpbiIn, lpbiOut: PBITMAPINFOHEADER; BitDepth: integer; dx, dy: integer): HIC; stdcall;
  932. function    ICDecompressOpen(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER): HIC;
  933. function    ICDrawOpen(fccType, fccHandler: DWORD; lpbiIn: PBITMAPINFOHEADER): HIC;
  934. {== Higher level functions ===================================================}
  935. function    ICImageCompress(
  936.     hic         : HIC;                  // compressor to use
  937.     uiFlags     : UINT;                 // flags (none yet)
  938.     lpbiIn      : PBITMAPINFO;          // format to compress from
  939.     lpBits      : Pointer;                // data to compress
  940.     lpbiOut     : PBITMAPINFO;          // compress to this (NULL ==> default)
  941.     lQuality    : DWORD;                 // quality to use
  942.     plSize      : PDWORD                 // compress to this size (0=whatever)
  943.     ): THANDLE; stdcall;
  944. function    ICImageDecompress(
  945.     hic         : HIC;                  // compressor to use
  946.     uiFlags     : UINT;                 // flags (none yet)
  947.     lpbiIn      : PBITMAPINFO;          // format to decompress from
  948.     lpBits      : Pointer;                // data to decompress
  949.     lpbiOut     : PBITMAPINFO           // decompress to this (NULL ==> default)
  950.     ): THANDLE; stdcall;
  951. {-- TCompVars ----------------------------------------------------------------}
  952.     
  953. //
  954. // Structure used by ICSeqCompressFrame and ICCompressorChoose routines
  955. // Make sure this matches the autodoc in icm.c!
  956. //
  957. type
  958.     PCOMPVARS       = ^TCOMPVARS;
  959.     TCOMPVARS       = record
  960.         cbSize      : DWORD;             // set to sizeof(COMPVARS) before
  961.                                         // calling ICCompressorChoose
  962.         dwFlags     : DWORD;            // see below...
  963.         hic         : HIC;              // HIC of chosen compressor
  964.         fccType     : DWORD;            // basically ICTYPE_VIDEO
  965.         fccHandler  : DWORD;            // handler of chosen compressor or
  966.                                         // "" or "DIB "
  967.         lpbiIn      : PBITMAPINFO;      // input format
  968.         lpbiOut     : PBITMAPINFO;      // output format - will compress to this
  969.         lpBitsOut   : Pointer;
  970.         lpBitsPrev  : Pointer;
  971.         lFrame      : DWORD;
  972.         lKey        : DWORD;             // key frames how often?
  973.         lDataRate   : DWORD;             // desired data rate KB/Sec
  974.         lQ          : DWORD;             // desired quality
  975.         lKeyCount   : DWORD;
  976.         lpState     : Pointer;            // state of compressor
  977.         cbState     : DWORD;             // size of the state
  978.     end;
  979. // FLAGS for dwFlags element of COMPVARS structure:
  980. // set this flag if you initialize COMPVARS before calling ICCompressorChoose
  981. const
  982.     ICMF_COMPVARS_VALID         = $00000001;    // COMPVARS contains valid data
  983. {-- ICCompressorChoose() - allows user to choose compressor, quality etc... --}
  984. function    ICCompressorChoose(
  985.     hwnd        : HWND;                     // parent window for dialog
  986.     uiFlags     : UINT;                     // flags
  987.     pvIn        : Pointer;                    // input format (optional)
  988.     lpData      : Pointer;                    // input data (optional)
  989.     pc          : PCOMPVARS;                // data about the compressor/dlg
  990.     lpszTitle   : LPSTR                     // dialog title (optional)
  991.     ): BOOL; stdcall;
  992. // defines for uiFlags
  993. const
  994.     ICMF_CHOOSE_KEYFRAME        = $0001;    // show KeyFrame Every box
  995.     ICMF_CHOOSE_DATARATE        = $0002;    // show DataRate box
  996.     ICMF_CHOOSE_PREVIEW         = $0004;    // allow expanded preview dialog
  997.     ICMF_CHOOSE_ALLCOMPRESSORS  = $0008;    // don't only show those that
  998.                                             // can handle the input format
  999.                                             // or input data
  1000. function    ICSeqCompressFrameStart(pc: PCOMPVARS; lpbiIn: PBITMAPINFO): BOOL; stdcall;
  1001. procedure   ICSeqCompressFrameEnd(pc: PCOMPVARS); stdcall;
  1002. function    ICSeqCompressFrame(
  1003.     pc          : PCOMPVARS;                // set by ICCompressorChoose
  1004.     uiFlags     : UINT;                     // flags
  1005.     lpBits      : Pointer;                    // input DIB bits
  1006.     pfKey       : PBOOL;                    // did it end up being a key frame?
  1007.     plSize      : PDWORD                     // size to compress to/of returned image
  1008.     ): Pointer; stdcall;
  1009. procedure   ICCompressorFree(pc: PCOMPVARS); stdcall;
  1010. implementation
  1011. // Dlls
  1012. const
  1013.   AVICAP32      = 'AVICAP32.dll';
  1014.   VFWDLL        = 'MSVFW32.DLL';
  1015. (* Externals from AVICAP.DLL *)
  1016. function capGetDriverDescription; external AVICAP32 name 'capGetDriverDescriptionA';
  1017. function capCreateCaptureWindow;  external AVICAP32 name 'capCreateCaptureWindowA';
  1018. (* Message crackers for above *)
  1019. function capSetCallbackOnError(hwnd : THandle; fpProc:TCAPERRORCALLBACK) : LongInt;
  1020. begin
  1021. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0,LPARAM(@fpProc));
  1022. end;
  1023. function capSetCallbackOnStatus(hwnd : THandle; fpProc:TCAPSTATUSCALLBACK):LongInt;
  1024. begin
  1025. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, LPARAM(@fpProc));
  1026. end;
  1027. function capSetCallbackOnYield (hwnd : THandle; fpProc:TCAPYIELDCALLBACK):LongInt;
  1028. begin
  1029. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, LPARAM(@fpProc));
  1030. end;
  1031. function capSetCallbackOnFrame (hwnd : THandle; fpProc:TCAPVIDEOSTREAMCALLBACK):LongInt;
  1032. begin
  1033. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0,LPARAM( @fpProc));
  1034. end;
  1035. function capSetCallbackOnVideoStream(hwnd:THandle; fpProc:TCAPVIDEOSTREAMCALLBACK):LongInt;
  1036. begin
  1037. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, LPARAM(@fpProc));
  1038. end;
  1039. function capSetCallbackOnWaveStream (hwnd:THandle; fpProc:TCAPWAVESTREAMCALLBACK):LongInt;
  1040. begin
  1041. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, LPARAM(@fpProc));
  1042. end;
  1043. function capSetCallbackOnCapControl (hwnd:THandle; fpProc:TCAPCONTROLCALLBACK):longint;
  1044. begin
  1045. Result := SendMessage(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, LPARAM(@fpProc));
  1046. end;
  1047. function capSetUserData(hwnd:THandle; lUser:LongInt):LongInt;
  1048. begin
  1049. Result := SendMessage(hwnd, WM_CAP_SET_USER_DATA, 0, lUser);
  1050. end;
  1051. function capGetUserData(hwnd:THandle):LongInt;
  1052. begin
  1053. Result := SendMessage(hwnd, WM_CAP_GET_USER_DATA, 0, 0);
  1054. end;
  1055. function capDriverConnect(hwnd:THandle; I: Word) : boolean;
  1056. begin
  1057. Result :=boolean( SendMessage(hwnd, WM_CAP_DRIVER_CONNECT, WPARAM(I), 0));
  1058. end;
  1059. function capDriverDisconnect(hwnd:THandle):Boolean;
  1060. begin
  1061. Result := boolean(SendMessage(hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0));
  1062. end;
  1063. function capDriverGetName(hwnd:THandle; szName:PChar; wSize:Word):boolean;
  1064. begin
  1065. Result :=boolean( SendMessage(hwnd, WM_CAP_DRIVER_GET_NAME, WPARAM(wSize), LPARAM( szName)));
  1066. end;
  1067. function capDriverGetVersion(hwnd:THandle; szVer:PChar; wSize:Word):boolean;
  1068. begin
  1069. Result :=boolean( SendMessage(hwnd, WM_CAP_DRIVER_GET_VERSION, WPARAM(wSize),LPARAM( szVer)));
  1070. end;
  1071. function capDriverGetCaps(hwnd:THandle; s:pCapDriverCaps; wSize:Word):boolean;
  1072. begin
  1073. Result := boolean(SendMessage(hwnd, WM_CAP_DRIVER_GET_CAPS, WPARAM(wSize),LPARAM(s)));
  1074. end;
  1075. function capFileSetCaptureFile(hwnd:THandle; szName:PChar):boolean;
  1076. begin
  1077. Result := Boolean(SendMessage(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, LPARAM(szName)));
  1078. end;
  1079. function capFileGetCaptureFile(hwnd:THandle; szName:PChar; wSize:Word):Boolean;
  1080. begin
  1081. Result := Boolean(SendMessage(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, LPARAM(szName)));
  1082. end;
  1083. function capFileAlloc(hwnd:THandle; dwSize:DWord):boolean;
  1084. begin
  1085. Result := Boolean(SendMessage(hwnd, WM_CAP_FILE_ALLOCATE, 0, LPARAM(dwSize)));
  1086. end;
  1087. function capFileSaveAs(hwnd:THandle; szName:Pchar):Boolean;
  1088. begin
  1089. Result := Boolean(SendMessage(hwnd, WM_CAP_FILE_SAVEAS, 0,LPARAM(szName)));
  1090. end;
  1091. function capFileSetInfoChunk(hwnd:THandle; lpInfoChunk:pCapInfoChunk):boolean;
  1092. begin
  1093. Result := Boolean(SendMessage(hwnd, WM_CAP_FILE_SET_INFOCHUNK, 0, LPARAM(lpInfoChunk)));
  1094. end;
  1095. function capFileSaveDIB(hwnd:THandle; szName:Pchar):Boolean;
  1096. begin
  1097. Result :=Boolean(SendMessage(hwnd, WM_CAP_FILE_SAVEDIB, 0,LPARAM(szName)));
  1098. end;
  1099. function capEditCopy(hwnd : THandle):Boolean;
  1100. begin
  1101. Result := Boolean(SendMessage(hwnd, WM_CAP_EDIT_COPY, 0, 0));
  1102. end;
  1103. function capSetAudioFormat(hwnd:THandle; s:PWaveFormatEx; wSize:Word):boolean;
  1104. begin
  1105. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_AUDIOFORMAT, WPARAM(wSize),LPARAM(s)));
  1106. end;
  1107. function capGetAudioFormat(hwnd:THandle; s:PWaveFormatEx; wSize:Word):DWORD;
  1108. begin
  1109. Result :=DWORD( SendMessage(hwnd, WM_CAP_GET_AUDIOFORMAT, WPARAM(wSize),LPARAM(s)));
  1110. end;
  1111. function capGetAudioFormatSize(hwnd:THandle):DWORD;
  1112. begin
  1113. Result := DWORD(SendMessage(hwnd, WM_CAP_GET_AUDIOFORMAT, 0, 0));
  1114. end;
  1115. function capDlgVideoFormat(hwnd:THandle):boolean;
  1116. begin
  1117. Result :=boolean(SendMessage(hwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0));
  1118. end;
  1119. function capDlgVideoSource(hwnd:THandle):boolean;
  1120. begin
  1121. Result :=boolean (SendMessage(hwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0));
  1122. end;
  1123. function capDlgVideoDisplay(hwnd:THandle):boolean;
  1124. begin
  1125. Result := boolean(SendMessage(hwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0));
  1126. end;
  1127. function capDlgVideoCompression(hwnd:THandle):boolean;
  1128. begin
  1129. Result := boolean(SendMessage(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0));
  1130. end;
  1131. function capGetVideoFormat(hwnd:THandle; s:pBitmapInfo; wSize:Word):DWord;
  1132. begin
  1133. Result := DWord(SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, Wparam(wSize), LPARAM(s)));
  1134. end;
  1135. function capGetVideoFormatSize(hwnd:THandle):DWord;
  1136. begin
  1137. Result := DWord(SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0));
  1138. end;
  1139. function capSetVideoFormat(hwnd:THandle; s:PBitmapInfo; wSize:Word):Boolean;
  1140. begin
  1141. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_VIDEOFORMAT, WPARAM(wSize), LPARAM(s)));
  1142. end;
  1143. function capPreview(hwnd:THandle; f:boolean):boolean;
  1144. begin
  1145. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_PREVIEW, WPARAM(f), 0));
  1146. end;
  1147. function capPreviewRate(hwnd:THandle; wMS:Word):boolean;
  1148. begin
  1149. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_PREVIEWRATE, WPARAM(wMS), 0));
  1150. end;
  1151. function capOverlay(hwnd:THandle; f:boolean):boolean;
  1152. begin
  1153. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_OVERLAY, WPARAM(f), 0));
  1154. end;
  1155. function capPreviewScale(hwnd:THandle; f:boolean):Boolean;
  1156. begin
  1157. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_SCALE,WPARAM(f), 0));
  1158. end;
  1159. function capGetStatus(hwnd:THandle; s:PCapStatus; wSize:Word):boolean;
  1160. begin
  1161. Result := Boolean(SendMessage(hwnd, WM_CAP_GET_STATUS, WPARAM(wSize),LPARAM(s)));
  1162. end;
  1163. function capSetScrollPos(hwnd:THandle; lpP:pPoint):Boolean;
  1164. begin
  1165. Result := Boolean(SendMessage(hwnd, WM_CAP_SET_SCROLL, 0, LParam(lpP)));
  1166. end;
  1167. function capGrabFrame(hwnd:THandle):boolean;
  1168. begin
  1169.      Result := Boolean(SendMessage(hwnd, WM_CAP_GRAB_FRAME, 0, 0));
  1170. end;
  1171. function capGrabFrameNoStop(hwnd:THandle):boolean;
  1172. begin
  1173. Result := Boolean(SendMessage(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0));
  1174. end;
  1175. function capCaptureSequence(hwnd:THandle):boolean;
  1176. begin
  1177. Result := Boolean(SendMessage(hwnd, WM_CAP_SEQUENCE, 0, 0));
  1178. end;
  1179. function capCaptureSequenceNoFile(hwnd:THandle):boolean;
  1180. begin
  1181. Result :=Boolean(SendMessage(hwnd, WM_CAP_SEQUENCE_NOFILE, 0, 0));
  1182. end;
  1183. function capCaptureStop(hwnd:THandle):boolean;
  1184. begin
  1185. Result := Boolean(SendMessage(hwnd, WM_CAP_STOP, 0, 0));
  1186. end;
  1187. function capCaptureAbort(hwnd:THandle):Boolean;
  1188. begin
  1189. Result := Boolean(SendMessage(hwnd, WM_CAP_ABORT, 0, 0));
  1190. end;
  1191. function capCaptureSingleFrameOpen(hwnd:THandle):boolean;
  1192. begin
  1193. Result := Boolean(SendMessage(hwnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0));
  1194. end;
  1195. function capCaptureSingleFrameClose(hwnd:THandle):boolean ;
  1196. begin
  1197. Result := Boolean(SendMessage(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0));
  1198. end;
  1199. function capCaptureSingleFrame(hwnd:THandle):boolean;
  1200. begin
  1201. Result :=Boolean(SendMessage(hwnd, WM_CAP_SINGLE_FRAME, 0, 0));
  1202. end;
  1203. function capCaptureGetSetup(hwnd:THandle; s:pCaptureParms; wSize:Word):boolean;
  1204. begin
  1205. Result :=Boolean( SendMessage(hwnd, WM_CAP_GET_SEQUENCE_SETUP, WPARAM(wSize),LPARAM(s)));
  1206. end;
  1207. function capCaptureSetSetup(hwnd:THandle; s:pCaptureParms; wSize:Word):boolean;
  1208. begin
  1209. Result := Boolean (SendMessage(hwnd, WM_CAP_SET_SEQUENCE_SETUP, WParam(wSize),LParam(s)));
  1210. end;
  1211. function capSetMCIDeviceName(hwnd:THandle; szName:Pchar):Boolean;
  1212. begin
  1213. Result :=Boolean( SendMessage(hwnd, WM_CAP_SET_MCI_DEVICE, 0, LParam(szName)));
  1214. end;
  1215. function capGetMCIDeviceName(hwnd:THandle; szName:Pchar; wSize:Word):Boolean;
  1216. begin
  1217. Result := Boolean(SendMessage(hwnd, WM_CAP_GET_MCI_DEVICE, Wparam(wSize), LPARAM(szName)));
  1218. end;
  1219. function capPaletteOpen(hwnd:THandle; szName:PChar):Boolean;
  1220. begin
  1221. Result := Boolean(SendMessage(hwnd, WM_CAP_PAL_OPEN, 0, LParam(szName)));
  1222. end;
  1223. function capPaletteSave(hwnd:THandle; szName:PChar):boolean;
  1224. begin
  1225. Result := Boolean(SendMessage(hwnd, WM_CAP_PAL_SAVE, 0,LParam(szName)));
  1226. end;
  1227. function capPalettePaste(hwnd:THandle):Boolean;
  1228. begin
  1229. Result :=Boolean( SendMessage(hwnd, WM_CAP_PAL_PASTE, 0, 0));
  1230. end;
  1231. function capPaletteAuto(hwnd:THandle; iFrames:Word; iColors:word):Boolean;
  1232. begin
  1233. Result :=Boolean( SendMessage(hwnd, WM_CAP_PAL_AUTOCREATE, WPARAM(iFrames),LPARAM(iColors)));
  1234. end;
  1235. function capPaletteManual(hwnd:THandle; fGrab:Word; iColors:word):Boolean;
  1236. begin
  1237. Result := Boolean(SendMessage(hwnd, WM_CAP_PAL_MANUALCREATE, WPARAM(fGrab),LPARAM(iColors)));
  1238. end;
  1239. {== DrawDib functions ========================================================}
  1240. {-- DrawDibOpen() ------------------------------------------------------------}
  1241. function    DrawDibOpen: HDRAWDIB; stdcall; external VFWDLL;
  1242. {-- DrawDibClose() -----------------------------------------------------------}
  1243. function    DrawDibClose(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
  1244. {-- DrawDibGetBuffer() -------------------------------------------------------}
  1245. function    DrawDibGetBuffer(hdd: HDRAWDIB; lpbi: PBITMAPINFOHEADER; dwSize: DWORD; dwFlags: DWORD): Pointer; stdcall; external VFWDLL;
  1246. {-- DrawDibGetPalette() - get the palette used for drawing DIBs --------------}
  1247. function    DrawDibGetPalette(hdd: HDRAWDIB): HPALETTE; stdcall; external VFWDLL;
  1248. {-- DrawDibSetPalette() - set the palette used for drawing DIBs --------------}
  1249. function    DrawDibSetPalette(hdd: HDRAWDIB; hpal: HPALETTE): BOOL; stdcall; external VFWDLL;
  1250. {-- DrawDibChangePalette() ---------------------------------------------------}
  1251. function    DrawDibChangePalette(hdd: HDRAWDIB; iStart, iLen: integer; lppe: PPALETTEENTRY): BOOL; stdcall; external VFWDLL;
  1252. {-- DrawDibRealize() - realize the palette in a HDD --------------------------}
  1253. function    DrawDibRealize(hdd: HDRAWDIB; hdc: HDC; fBackground: BOOL): UINT; stdcall; external VFWDLL;
  1254. {-- DrawDibStart() - start of streaming playback -----------------------------}
  1255. function    DrawDibStart(hdd: HDRAWDIB; rate: DWORD): BOOL; stdcall; external VFWDLL;
  1256. {-- DrawDibStop() - start of streaming playback ------------------------------}
  1257. function    DrawDibStop(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
  1258. {-- DrawDibBegin() - prepare to draw -----------------------------------------}
  1259. function    DrawDibBegin(
  1260.     hdd         : HDRAWDIB;
  1261.     hdc         : HDC;
  1262.     dxDst       : integer;
  1263.     dyDst       : integer;
  1264.     lpbi        : PBITMAPINFOHEADER;
  1265.     dxSrc       : integer;
  1266.     dySrc       : integer;
  1267.     wFlags      : UINT
  1268.     ): BOOL; stdcall; external VFWDLL;
  1269. {-- DrawDibDraw() - actually draw a DIB to the screen ------------------------}
  1270. function    DrawDibDraw(
  1271.     hdd         : HDRAWDIB;
  1272.     hdc         : HDC;
  1273.     xDst        : integer;
  1274.     yDst        : integer;
  1275.     dxDst       : integer;
  1276.     dyDst       : integer;
  1277.     lpbi        : PBITMAPINFOHEADER;
  1278.     lpBits      : Pointer;
  1279.     xSrc        : integer;
  1280.     ySrc        : integer;
  1281.     dxSrc       : integer;
  1282.     dySrc       : integer;
  1283.     wFlags      : UINT
  1284.     ): BOOL; stdcall; external VFWDLL;
  1285. {-- DrawDibEnd() -------------------------------------------------------------}
  1286. function    DrawDibEnd(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
  1287. {-- DrawDibTime() - for debugging purposes only ------------------------------}
  1288. function    DrawDibTime(hdd: HDRAWDIB; lpddtime: PDRAWDIBTIME): BOOL; stdcall; external VFWDLL;
  1289. {-- Display profiling --------------------------------------------------------}
  1290. function    DrawDibProfileDisplay(lpbi: PBITMAPINFOHEADER): DWORD; stdcall; external VFWDLL;
  1291. // Installable Compression Manager
  1292. function    MKFOURCC( ch0, ch1, ch2, ch3: Char ): FOURCC;
  1293. begin
  1294.     Result := (DWord(Ord(ch0))) or
  1295.               (DWord(Ord(ch1)) shl 8) or
  1296.               (DWord(Ord(ch2)) shl 16) or
  1297.               (DWord(Ord(ch3)) shl 24);
  1298. end;
  1299. function    mmioFOURCC( ch0, ch1, ch2, ch3: Char ): FOURCC;
  1300. begin
  1301.     Result := MKFOURCC(ch0,ch1,ch2,ch3);
  1302. end;
  1303. function    aviTWOCC(ch0, ch1: Char): TWOCC;
  1304. begin
  1305.     Result := (Word(Ord(ch0))) or
  1306.               (Word(Ord(ch1)) shl 8);
  1307. end;
  1308. {-- Query macros -------------------------------------------------------------}
  1309. function    ICQueryAbout(hic: HIC): BOOL;
  1310. begin
  1311.     Result := ICSendMessage(hic, ICM_ABOUT, -1, ICMF_ABOUT_QUERY) = ICERR_OK;
  1312. end;
  1313. function    ICAbout(hic: HIC; hwnd: HWND): DWORD;
  1314. begin
  1315.     Result := ICSendMessage(hic, ICM_ABOUT, hwnd, 0);
  1316. end;
  1317. function    ICQueryConfigure(hic: HIC): BOOL;
  1318. begin
  1319.     Result := ICSendMessage(hic, ICM_CONFIGURE, -1, ICMF_CONFIGURE_QUERY) = ICERR_OK;
  1320. end;
  1321. function    ICConfigure(hic: HIC; hwnd: HWND): DWORD;
  1322. begin
  1323.     Result := ICSendMessage(hic, ICM_CONFIGURE, hwnd, 0);
  1324. end;
  1325. {-- Get/Set state macros -----------------------------------------------------}
  1326. function    ICGetState(hic: HIC; pv: Pointer; cb: DWORD): DWORD;
  1327. begin
  1328.     Result := ICSendMessage(hic, ICM_GETSTATE, DWORD(pv), cb);
  1329. end;
  1330. function    ICSetState(hic: HIC; pv: Pointer; cb: DWORD): DWORD;
  1331. begin
  1332.     Result := ICSendMessage(hic, ICM_SETSTATE, DWORD(pv), cb);
  1333. end;
  1334. function    ICGetStateSize(hic: HIC): DWORD;
  1335. begin
  1336.     Result := ICGetState(hic, nil, 0);
  1337. end;
  1338. {-- Get value macros ---------------------------------------------------------}
  1339. function    ICGetDefaultQuality(hic: HIC): DWORD;
  1340. begin
  1341.     ICSendMessage(hic, ICM_GETDEFAULTQUALITY, DWORD(@Result), sizeof(Result));
  1342. end;
  1343. function    ICGetDefaultKeyFrameRate(hic: HIC): DWORD;
  1344. begin
  1345.     ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, DWORD(@Result), sizeof(Result));
  1346. end;
  1347. {-- Draw window macro --------------------------------------------------------}
  1348. function    ICDrawWindow(hic: HIC; prc: PRECT): DWORD;
  1349. begin
  1350.     Result := ICSendMessage(hic, ICM_DRAW_WINDOW, DWORD(prc), sizeof(prc^));
  1351. end;
  1352. {-- ICCompressBegin() - start compression from a source fmt to a dest fmt ----}
  1353. function    ICCompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1354. begin
  1355.     Result := ICSendMessage(hic, ICM_COMPRESS_BEGIN, DWORD(lpbiInput), DWORD(lpbiOutput));
  1356. end;
  1357. {-- ICCompressQuery() - determines if compression from src to dst is supp ----}
  1358. function    ICCompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1359. begin
  1360.     Result := ICSendMessage(hic, ICM_COMPRESS_QUERY, DWORD(lpbiInput), DWORD(lpbiOutput));
  1361. end;
  1362. {-- ICCompressGetFormat() - get the output format (fmt of compressed) --------}
  1363. // if lpbiOutput is nil return the size in bytes needed for format.
  1364. function    ICCompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1365. begin
  1366.     Result := ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, DWORD(lpbiInput), DWORD(lpbiOutput));
  1367. end;
  1368. function    ICCompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  1369. begin
  1370.     Result := ICCompressGetFormat(hic, lpbi, nil);
  1371. end;
  1372. {-- ICCompressSize() - return the maximal size of a compressed frame ---------}
  1373. function    ICCompressGetSize(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1374. begin
  1375.     Result := ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, DWORD(lpbiInput), DWORD(lpbiOutput));
  1376. end;
  1377. function    ICCompressEnd(hic: HIC): DWORD;
  1378. begin
  1379.     Result := ICSendMessage(hic, ICM_COMPRESS_END, 0, 0);
  1380. end;
  1381. {-- ICDecompressBegin() - start compression from src fmt to a dest fmt -------}
  1382. function    ICDecompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1383. begin
  1384.     Result := ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, DWORD(lpbiInput), DWORD(lpbiOutput));
  1385. end;
  1386. {-- ICDecompressQuery() - determines if compression is supported -------------}
  1387. function    ICDecompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1388. begin
  1389.     Result := ICSendMessage(hic, ICM_DECOMPRESS_QUERY, DWORD(lpbiInput), DWORD(lpbiOutput));
  1390. end;
  1391. {-- ICDecompressGetFormat - get the output fmt (fmt of uncompressed data) ----}
  1392. // if lpbiOutput is NULL return the size in bytes needed for format.
  1393. function    ICDecompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1394. begin
  1395.     Result := ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, DWORD(lpbiInput), DWORD(lpbiOutput));
  1396. end;
  1397. function    ICDecompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
  1398. begin
  1399.     Result := ICDecompressGetFormat(hic, lpbi, nil);
  1400. end;
  1401. {-- ICDecompressGetPalette() - get the output palette ------------------------}
  1402. function    ICDecompressGetPalette(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
  1403. begin
  1404.     Result := ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, DWORD(lpbiInput), DWORD(lpbiOutput));
  1405. end;
  1406. function    ICDecompressSetPalette(hic: HIC; lpbiPalette: PBITMAPINFOHEADER): DWORD;
  1407. begin
  1408.     Result := ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, DWORD(lpbiPalette), 0);
  1409. end;
  1410. function    ICDecompressEnd(hic: HIC): DWORD;
  1411. begin
  1412.     Result := ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0);
  1413. end;
  1414. {-- ICM function declarations ------------------------------------------------}
  1415. function    ICInfo(fccType, fccHandler: DWORD; lpicinfo: PICINFO) : BOOL ; stdcall ; external VFWDLL;
  1416. function    ICInstall(fccType, fccHandler: DWORD; lParam: LPARAM; szDesc: LPSTR; wFlags: UINT) : BOOL ; stdcall ; external VFWDLL;
  1417. function    ICRemove(fccType, fccHandler: DWORD; wFlags: UINT) : BOOL ; stdcall ; external VFWDLL;
  1418. function    ICGetInfo(hic: HIC; picinfo: PICINFO; cb: DWORD) : DWORD ; stdcall ; external VFWDLL;
  1419. function    ICOpen(fccType, fccHandler: DWORD; wMode: UINT) : HIC ; stdcall ; external VFWDLL;
  1420. function    ICOpenFunction(fccType, fccHandler: DWORD; wMode: UINT; lpfnHandler: TFarProc) : HIC ; stdcall ; external VFWDLL;
  1421. function    ICClose(hic: HIC) : DWORD ; stdcall ; external VFWDLL;
  1422. function    ICSendMessage(hic: HIC; msg: UINT; dw1, dw2: integer) : DWORD ; stdcall ; external VFWDLL;
  1423. {== Compression functions ====================================================}
  1424. {-- ICCompress() - compress a single frame -----------------------------------}
  1425. function    ICCompress(
  1426.     hic             : HIC;
  1427.     dwFlags         : DWORD;                // flags
  1428.     lpbiOutput      : PBITMAPINFOHEADER;    // output format
  1429.     lpData          : Pointer;                // output data
  1430.     lpbiInput       : PBITMAPINFOHEADER;    // format of frame to compress
  1431.     lpBits          : Pointer;                // frame data to compress
  1432.     lpckid          : PDWORD;               // ckid for data in AVI file
  1433.     lpdwFlags       : PDWORD;               // flags in the AVI index.
  1434.     lFrameNum       : DWORD;                 // frame number of seq.
  1435.     dwFrameSize     : DWORD;                // reqested size in bytes. (if non zero)
  1436.     dwQuality       : DWORD;                // quality within one frame
  1437.     lpbiPrev        : PBITMAPINFOHEADER;    // format of previous frame
  1438.     lpPrev          : Pointer                 // previous frame
  1439.     ) : DWORD; cdecl; external VFWDLL;
  1440. {== Decompression functions ==================================================}
  1441. {-- ICDecompress() - decompress a single frame -------------------------------}
  1442. function    ICDecompress(
  1443.     hic             : HIC;
  1444.     dwFlags         : DWORD;                // flags (from AVI index...)
  1445.     lpbiFormat      : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
  1446.                                             // biSizeImage has the chunk size
  1447.     lpData          : Pointer;                // data
  1448.     lpbi            : PBITMAPINFOHEADER;    // DIB to decompress to
  1449.     lpBits          : Pointer
  1450.     ): DWORD; cdecl; external VFWDLL;
  1451. {== Drawing functions ========================================================}
  1452. {-- ICDrawBegin() - start decompressing data with fmt directly to screen -----}
  1453. // return zero if the decompressor supports drawing.
  1454. function    ICDrawBegin(
  1455.     hic         : HIC;
  1456.     dwFlags     : DWORD;                // flags
  1457.     hpal        : HPALETTE;             // palette to draw with
  1458.     hwnd        : HWND;                 // window to draw to
  1459.     hdc         : HDC;                  // HDC to draw to
  1460.     xDst        : integer;                  // destination rectangle
  1461.     yDst        : integer;
  1462.     dxDst       : integer;
  1463.     dyDst       : integer;
  1464.     lpbi        : PBITMAPINFOHEADER;    // format of frame to draw
  1465.     xSrc        : integer;                  // source rectangle
  1466.     ySrc        : integer;
  1467.     dxSrc       : integer;
  1468.     dySrc       : integer;
  1469.     dwRate      : DWORD;                // frames/second = (dwRate/dwScale)
  1470.     dwScale     : DWORD
  1471.     ): DWORD; cdecl; external VFWDLL;
  1472. {-- ICDraw() - decompress data directly to the screen ------------------------}
  1473. function    ICDraw(
  1474.     hic         : HIC;
  1475.     dwFlags     : DWORD;                // flags
  1476.     lpFormat    : Pointer;                // format of frame to decompress
  1477.     lpData      : Pointer;                // frame data to decompress
  1478.     cbData      : DWORD;                // size of data
  1479.     lTime       : DWORD                  // time to draw this frame
  1480.     ): DWORD; cdecl; external VFWDLL;
  1481. {== Helper routines for DrawDib and MCIAVI... ================================}
  1482. function    ICLocate(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER; wFlags: WORD): HIC; stdcall; external VFWDLL;
  1483. function    ICGetDisplayFormat(hic: HIC; lpbiIn, lpbiOut: PBITMAPINFOHEADER; BitDepth: integer; dx, dy: integer): HIC; stdcall; external VFWDLL;
  1484. {== Higher level functions ===================================================}
  1485. function    ICImageCompress(
  1486.     hic         : HIC;                  // compressor to use
  1487.     uiFlags     : UINT;                 // flags (none yet)
  1488.     lpbiIn      : PBITMAPINFO;          // format to compress from
  1489.     lpBits      : Pointer;                // data to compress
  1490.     lpbiOut     : PBITMAPINFO;          // compress to this (NULL ==> default)
  1491.     lQuality    : DWORD;                 // quality to use
  1492.     plSize      : PDWORD                 // compress to this size (0=whatever)
  1493.     ): THANDLE; stdcall; external VFWDLL;
  1494. function    ICImageDecompress(
  1495.     hic         : HIC;                  // compressor to use
  1496.     uiFlags     : UINT;                 // flags (none yet)
  1497.     lpbiIn      : PBITMAPINFO;          // format to decompress from
  1498.     lpBits      : Pointer;                // data to decompress
  1499.     lpbiOut     : PBITMAPINFO           // decompress to this (NULL ==> default)
  1500.     ): THANDLE; stdcall; external VFWDLL;
  1501. {-- ICCompressorChoose() - allows user to choose compressor, quality etc... --}
  1502. function    ICCompressorChoose(
  1503.     hwnd        : HWND;                     // parent window for dialog
  1504.     uiFlags     : UINT;                     // flags
  1505.     pvIn        : Pointer;                    // input format (optional)
  1506.     lpData      : Pointer;                    // input data (optional)
  1507.     pc          : PCOMPVARS;                // data about the compressor/dlg
  1508.     lpszTitle   : LPSTR                     // dialog title (optional)
  1509.     ): BOOL; stdcall; external VFWDLL;
  1510. function    ICSeqCompressFrameStart(pc: PCOMPVARS; lpbiIn: PBITMAPINFO): BOOL; stdcall; external VFWDLL;
  1511. procedure   ICSeqCompressFrameEnd(pc: PCOMPVARS); stdcall; external VFWDLL;
  1512. function    ICSeqCompressFrame(
  1513.     pc          : PCOMPVARS;                // set by ICCompressorChoose
  1514.     uiFlags     : UINT;                     // flags
  1515.     lpBits      : Pointer;                    // input DIB bits
  1516.     pfKey       : PBOOL;                    // did it end up being a key frame?
  1517.     plSize      : PDWORD                     // size to compress to/of returned image
  1518.     ): Pointer; stdcall; external VFWDLL;
  1519. procedure   ICCompressorFree(pc: PCOMPVARS); stdcall; external VFWDLL;
  1520. {-- ICDecompressEx() - decompress a single frame -----------------------------}
  1521. function    ICDecompressEx(
  1522.     hic     : HIC;
  1523.     dwFlags : DWORD;
  1524.     lpbiSrc : PBITMAPINFOHEADER;
  1525.     lpSrc   : Pointer;
  1526.     xSrc    : integer;
  1527.     ySrc    : integer;
  1528.     dxSrc   : integer;
  1529.     dySrc   : integer;
  1530.     lpbiDst : PBITMAPINFOHEADER;
  1531.     lpDst   : Pointer;
  1532.     xDst    : integer;
  1533.     yDst    : integer;
  1534.     dxDst   : integer;
  1535.     dyDst   : integer
  1536.     ): DWORD; stdcall;
  1537. var
  1538.     ic : TICDECOMPRESSEX;
  1539. begin
  1540.     ic.dwFlags  := dwFlags;
  1541.     ic.lpbiSrc  := lpbiSrc;
  1542.     ic.lpSrc    := lpSrc;
  1543.     ic.xSrc     := xSrc;
  1544.     ic.ySrc     := ySrc;
  1545.     ic.dxSrc    := dxSrc;
  1546.     ic.dySrc    := dySrc;
  1547.     ic.lpbiDst  := lpbiDst;
  1548.     ic.lpDst    := lpDst;
  1549.     ic.xDst     := xDst;
  1550.     ic.yDst     := yDst;
  1551.     ic.dxDst    := dxDst;
  1552.     ic.dyDst    := dyDst;
  1553.     // note that ICM swaps round the length and pointer
  1554.     // length in lparam2, pointer in lparam1
  1555.     Result := ICSendMessage(hic, ICM_DECOMPRESSEX, DWORD(@ic), sizeof(ic));
  1556. end;
  1557. {-- ICDecompressExBegin() - start compression from a src fmt to a dest fmt ---}
  1558. function    ICDecompressExBegin(
  1559.     hic     : HIC;
  1560.     dwFlags : DWORD;
  1561.     lpbiSrc : PBITMAPINFOHEADER;
  1562.     lpSrc   : Pointer;
  1563.     xSrc    : integer;
  1564.     ySrc    : integer;
  1565.     dxSrc   : integer;
  1566.     dySrc   : integer;
  1567.     lpbiDst : PBITMAPINFOHEADER;
  1568.     lpDst   : Pointer;
  1569.     xDst    : integer;
  1570.     yDst    : integer;
  1571.     dxDst   : integer;
  1572.     dyDst   : integer
  1573.     ): DWORD; stdcall;
  1574. var
  1575.     ic : TICDECOMPRESSEX ;
  1576. begin
  1577.     ic.dwFlags  := dwFlags;
  1578.     ic.lpbiSrc  := lpbiSrc;
  1579.     ic.lpSrc    := lpSrc;
  1580.     ic.xSrc     := xSrc;
  1581.     ic.ySrc     := ySrc;
  1582.     ic.dxSrc    := dxSrc;
  1583.     ic.dySrc    := dySrc;
  1584.     ic.lpbiDst  := lpbiDst;
  1585.     ic.lpDst    := lpDst;
  1586.     ic.xDst     := xDst;
  1587.     ic.yDst     := yDst;
  1588.     ic.dxDst    := dxDst;
  1589.     ic.dyDst    := dyDst;
  1590.     // note that ICM swaps round the length and pointer
  1591.     // length in lparam2, pointer in lparam1
  1592.     Result      := ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, DWORD(@ic), sizeof(ic));
  1593. end;
  1594. {-- ICDecompressExQuery() ----------------------------------------------------}
  1595. function    ICDecompressExQuery(
  1596.     hic     : HIC;
  1597.     dwFlags : DWORD;
  1598.     lpbiSrc : PBITMAPINFOHEADER;
  1599.     lpSrc   : Pointer;
  1600.     xSrc    : integer;
  1601.     ySrc    : integer;
  1602.     dxSrc   : integer;
  1603.     dySrc   : integer;
  1604.     lpbiDst : PBITMAPINFOHEADER;
  1605.     lpDst   : Pointer;
  1606.     xDst    : integer;
  1607.     yDst    : integer;
  1608.     dxDst   : integer;
  1609.     dyDst   : integer
  1610.     ): DWORD; stdcall;
  1611. var
  1612.     ic : TICDECOMPRESSEX;
  1613. begin
  1614.     ic.dwFlags  := dwFlags;
  1615.     ic.lpbiSrc  := lpbiSrc;
  1616.     ic.lpSrc    := lpSrc;
  1617.     ic.xSrc     := xSrc;
  1618.     ic.ySrc     := ySrc;
  1619.     ic.dxSrc    := dxSrc;
  1620.     ic.dySrc    := dySrc;
  1621.     ic.lpbiDst  := lpbiDst;
  1622.     ic.lpDst    := lpDst;
  1623.     ic.xDst     := xDst;
  1624.     ic.yDst     := yDst;
  1625.     ic.dxDst    := dxDst;
  1626.     ic.dyDst    := dyDst;
  1627.     // note that ICM swaps round the length and pointer
  1628.     // length in lparam2, pointer in lparam1
  1629.     Result      := ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, DWORD(@ic), sizeof(ic));
  1630. end;
  1631. function    ICDecompressExEnd(hic: HIC): DWORD;
  1632. begin
  1633.     Result := ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0)
  1634. end;
  1635. function    ICDrawSuggestFormat(
  1636.     hic         : HIC;
  1637.     lpbiIn      : PBITMAPINFOHEADER;
  1638.     lpbiOut     : PBITMAPINFOHEADER;
  1639.     dxSrc       : integer;
  1640.     dySrc       : integer;
  1641.     dxDst       : integer;
  1642.     dyDst       : integer;
  1643.     hicDecomp   : HIC
  1644.     ): DWORD; stdcall;
  1645. var
  1646.     ic : TICDRAWSUGGEST;
  1647. begin
  1648.     ic.lpbiIn           := lpbiIn;
  1649.     ic.lpbiSuggest      := lpbiOut;
  1650.     ic.dxSrc            := dxSrc;
  1651.     ic.dySrc            := dySrc;
  1652.     ic.dxDst            := dxDst;
  1653.     ic.dyDst            := dyDst;
  1654.     ic.hicDecompressor  := hicDecomp;
  1655.     // note that ICM swaps round the length and pointer
  1656.     // length in lparam2, pointer in lparam1
  1657.     Result := ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, DWORD(@ic), sizeof(ic));
  1658. end;
  1659. {-- ICDrawQuery() - determines if the compressor is willing to render fmt ----}
  1660. function    ICDrawQuery(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  1661. begin
  1662.     Result := ICSendMessage(hic, ICM_DRAW_QUERY, DWORD(lpbiInput), 0);
  1663. end;
  1664. function    ICDrawChangePalette(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
  1665. begin
  1666.     Result := ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, DWORD(lpbiInput), 0);
  1667. end;
  1668. function    ICGetBuffersWanted(hic: HIC; lpdwBuffers: PDWORD): DWORD;
  1669. begin
  1670.     Result := ICSendMessage(hic, ICM_GETBUFFERSWANTED, DWORD(lpdwBuffers), 0);
  1671. end;
  1672. function    ICDrawEnd(hic: HIC): DWORD;
  1673. begin
  1674.     Result := ICSendMessage(hic, ICM_DRAW_END, 0, 0);
  1675. end;
  1676. function    ICDrawStart(hic: HIC): DWORD;
  1677. begin
  1678.     Result := ICSendMessage(hic, ICM_DRAW_START, 0, 0);
  1679. end;
  1680. function    ICDrawStartPlay(hic: HIC; lFrom, lTo: DWORD): DWORD;
  1681. begin
  1682.     Result := ICSendMessage(hic, ICM_DRAW_START_PLAY, lFrom, lTo);
  1683. end;
  1684. function    ICDrawStop(hic: HIC): DWORD;
  1685. begin
  1686.     Result := ICSendMessage(hic, ICM_DRAW_STOP, 0, 0);
  1687. end;
  1688. function    ICDrawStopPlay(hic: HIC): DWORD;
  1689. begin
  1690.     Result := ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0);
  1691. end;
  1692. function    ICDrawGetTime(hic: HIC; lplTime: PDWORD): DWORD;
  1693. begin
  1694.     Result := ICSendMessage(hic, ICM_DRAW_GETTIME, DWORD(lplTime), 0);
  1695. end;
  1696. function    ICDrawSetTime(hic: HIC; lTime: DWORD): DWORD;
  1697. begin
  1698.     Result := ICSendMessage(hic, ICM_DRAW_SETTIME, lTime, 0);
  1699. end;
  1700. function    ICDrawRealize(hic: HIC; hdc: HDC; fBackground: BOOL): DWORD;
  1701. begin
  1702.     Result := ICSendMessage(hic, ICM_DRAW_REALIZE, DWORD(hdc), DWORD(fBackground));
  1703. end;
  1704. function    ICDrawFlush(hic: HIC): DWORD;
  1705. begin
  1706.     Result := ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0);
  1707. end;
  1708. function    ICDrawRenderBuffer(hic: HIC): DWORD;
  1709. begin
  1710.     Result := ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0);
  1711. end;
  1712. {-- ICSetStatusProc() - Set the status callback function ---------------------}
  1713. // ICMessage is not supported on NT
  1714. function    ICSetStatusProc(
  1715.     hic         : HIC;
  1716.     dwFlags     : DWORD;
  1717.     lParam      : DWORD;
  1718.     fpfnStatus  : TICStatusProc
  1719.     ): DWORD; stdcall;
  1720. var
  1721.     ic : TICSETSTATUSPROC;
  1722. begin
  1723.     ic.dwFlags  := dwFlags;
  1724.     ic.lParam   := lParam;
  1725.     ic.Status   := fpfnStatus;
  1726.     // note that ICM swaps round the length and pointer
  1727.     // length in lparam2, pointer in lparam1
  1728.     Result      := ICSendMessage(hic, ICM_SET_STATUS_PROC, DWORD(@ic), sizeof(ic));
  1729. end;
  1730. {== Helper routines for DrawDib and MCIAVI... ================================}
  1731. function    ICDecompressOpen(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER): HIC;
  1732. begin
  1733.     Result := ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS);
  1734. end;
  1735. function    ICDrawOpen(fccType, fccHandler: DWORD; lpbiIn: PBITMAPINFOHEADER): HIC;
  1736. begin
  1737.     Result := ICLocate(fccType, fccHandler, lpbiIn, nil, ICMODE_DRAW);
  1738. end;
  1739. end.