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

Delphi控件源码

开发平台:

Delphi

  1. unit Video;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls,stdctrls,
  5.   ExtCtrls,vfw,mmsystem;
  6. ///////////////////////////////////////////////////////////////////////////////
  7. // Video Capturing
  8. type
  9. // Types for audio-settings
  10.  TChannel = (Stereo, Mono);
  11.  TFrequency = (f8000Hz, f11025Hz, f22050Hz, f44100Hz);
  12.  TResolution  = (r8Bit, r16Bit);
  13. // Types for event-procedures
  14. type
  15.   TCapStatusProc = procedure(Sender: TObject) of object;
  16.   TCapStatusCallback = procedure (Sender:TObject;nID:integer;status:string) of object;
  17.   TVideoStream = procedure (sender:TObject;lpVhdr:PVIDEOHDR) of object;
  18.   TAudioStream = procedure (sender:TObject;lpWHdr:PWAVEHDR) of object;
  19.   TError       = procedure (sender:TObject;nID:integer; errorstr:string) of object;
  20. // Exceptions
  21. type ENoDriverException      = class(Exception);
  22. type ENoCapWindowException   = class(Exception);
  23. type ENotConnectException    = class(Exception);
  24. type ENoOverlayException     = class(Exception);
  25. type EFalseFormat            = class(Exception);
  26. type ENotOpen                = class(Exception);
  27. type
  28. TAudioFormat = class (TPersistent)
  29.    private
  30.     FChannels :TChannel;
  31.     FFrequency:TFrequency;
  32.     FRes      :TResolution;
  33.   private
  34.     procedure SetAudio(handle:Thandle); // Setting Audio Data to Capture Window
  35.   public
  36.    constructor create;
  37.    published
  38.      property Channels: TChannel read FChannels write Fchannels     default Mono;
  39.      property Frequency: TFrequency read FFrequency write fFrequency default f8000Hz;
  40.      property Resolution : TResolution read FRes write FRes         default r8Bit;
  41.  end;
  42. type
  43.   TVideoCap = class(TCustomControl)
  44.   private
  45.    fdriverIndex:integer;   // Videodriver index
  46.    fVideoDriverName     : string;  // name of videodriver
  47.    fhCapWnd             : THandle;  // handle for CAP-Window
  48.    fpDrivercaps         : PCapDriverCaps; // propertys of videodriver
  49.    fpDriverStatus       : pCapStatus; // status of capdriver
  50.    fscale               : boolean;  // window scaling
  51.    fprop                : boolean;  // proportional scaling
  52.    fpreviewrate         : word;  // Frames p. sec during preview
  53.    fmicrosecpframe      : cardinal; // framerate as microsconds
  54.    fCapVideoFileName       : string; // name of the capture file
  55.    fCapSingleImageFileName : string; // name of the file for a single image
  56.    fcapAudio               :boolean; // Capture also audio stream
  57.    fcapTimeLimit           :word;    // Time limit for captureing
  58.    fIndexSize             :cardinal; // size of the index in the capture file
  59.    fcapToFile             : boolean;  // Write frames to file druing capturing
  60.    FAudioFormat           : TAudioFormat;// Audio Format
  61.    fCapStatusProcedure     : TCapStatusProc;      // Event procedure for internal component status
  62.    fcapStatusCallBack      : TCapStatusCallback;  // Event procedure for status of then driver
  63.    fcapVideoStream         : TVideoStream;        // Event procedure for each Video frame during capturing
  64.    fcapAudioStream         : TAudiostream;        // Event procedure for each Audio buffer
  65.    fcapFrameCallback       : TVideoStream;        // Event procedure for each Video frame during preview
  66.    fcapError               : TError;              // Event procedure for Error
  67.    procedure setsize(var msg:TMessage); message WM_SIZE;  // Changing size of cap window
  68.    function GetDriverCaps:boolean;                        // get driver capitiyties
  69.    procedure DeleteDriverProps;                           // delete driver capitilyites
  70.    function GetDriverStatus(callback:boolean):boolean; // Getting state of driver
  71.    Procedure SetDriverOpen(value:boolean) ;         // Open and Close the driver
  72.    function GetDriverOpen:boolean;                        // is Driver open ?
  73.    function GetPreview:boolean;   // previwe mode
  74.    function GetOverlay:Boolean;   // overlay eode;
  75.    procedure SizeCap;             // calc size of the Capture Window
  76.    procedure Setprop(value:Boolean); // Stretch Picture proportional to Window Size
  77.    procedure SetMicroSecPerFrame(value:cardinal);    // micro seconds between two frames
  78.    procedure setFrameRate(value:word);               // Setting Frames p. second
  79.    function  GetFrameRate:word;                      // Getting Frames p. second.
  80.  // Handlers for Propertys
  81.    procedure SetDriverIndex(value:integer);// Select Driver by setting driver index
  82.    function CreateCapWindow:boolean;       // Opening driver, create capture window
  83.    procedure DestroyCapwindow;             //  Closing Driver, destrying capture window
  84.     function GetCapWidth:word;              // Width and Heigth of Video-Frame
  85.     function GetCapHeight:word;
  86.     function  GetHasDlgVFormat  : Boolean;  // Driver has a format dialog
  87.     function  GetHasDlgVDisplay : Boolean;  // Driver has a display dialog
  88.     function  GetHasDlgVSource  : Boolean;  // Driver has a source dialog
  89.     function  GetHasVideoOverlay: Boolean;  // Driver has overlay mode
  90.     procedure Setoverlay(value:boolean);  // Driver will use overlay mode
  91.     procedure SetPreview(value:boolean);  // Driver will use preview mode
  92.     procedure SetScale(value:Boolean);   //  Stretching Frame to component size
  93.     procedure SetpreviewRate(value:word); // Setting preview frame rate
  94.     function GetCapInProgress:boolean;    // Capturing  in progress
  95.     procedure SetIndexSize(value:cardinal); // Setting index size in capture file
  96.     function GetBitMapInfoNP:TBITMAPINFO; //  Bitmapinfo Without Palette
  97.     function GetBitmapHeader:TBitmapInfoHeader; //Get only Header;
  98.     procedure SetBitmapHeader(Header:TBitmapInfoHeader); // Set only Header
  99.   // Setting callbacks as events
  100.     procedure SetStatCallBack(value:TCapStatusCallback);
  101.     procedure SetCapVideoStream(value:TVideoStream);
  102.     procedure SetCapAudioStream(value:TAudioStream);
  103.     procedure SetCapFrameCallback(value:TVideoStream);
  104.     procedure SetCapError(value:TError);
  105.   public
  106.      procedure SetDriverName(value:String); // Select Driver by setting driver name
  107.     constructor Create(AOwner: TComponent); override;
  108.     destructor destroy; override;
  109.     property  HasDlgFormat:Boolean read GetHasDlgVFormat;    // Driver has a format dialog
  110.     property  HasDlgDisplay:Boolean read GetHasDlgVDisplay;  // Driver has a display dialog
  111.     property  HasDlgSource:Boolean read GetHasDlgVSource;    // Driver has a sourve dialog
  112.     property  HasVideoOverlay:boolean read GetHasVideoOverlay;  // Driver has overlay mode
  113.     property  CapWidth: word read GetCapWidth;                  // Width of the captured frames
  114.     property  CapHeight: word read GetCapHeight;                // Hight of the captured frames
  115.     property  CapInProgess: boolean read getCapinProgress;      /// capturing is progress
  116.     property  BitMapInfo:TBitmapinfo read GetBitmapInfoNP;      // Get the Bitmapinfo of the frames wiht no legal palette
  117.    //Header of the Bitmapinfo
  118.     function DlgVFormat:Boolean;                              // Shows VideoFormat dialog of the Driver
  119.     function DlgVDisplay:boolean;                            // Shows VideoDisplay dialog of the Driver
  120.     function DlgVSource:boolean;                           // Shows   VideoSource  dialog of the Driver
  121.     function DlgVCompression:Boolean;                      // Shows  VideoCompression dialog from VfW
  122.     function GrabFrame:boolean;                          // Capture one Frame and stops overlay or preview mode
  123.     function GrabFrameNoStop:boolean;                    // Capture one frame without stoppin overlay or preview
  124.     function SaveAsDIB:Boolean;                          // saves actual frame as DIB
  125.     function SaveToClipboard:Boolean;                    // Puts actual fasme to then Clipboard
  126.     function StartCapture:Boolean;                       // Starts Capturing
  127.     function StopCapture:Boolean;                        // Stops capturing
  128.     function GetBitmapInfo(var p:Pointer):integer;       // The whole Bitmap-Info with complete palette
  129.     procedure SetBitmapInfo(p:Pointer;size:integer);    // Setting whole Bitmap-Info with complete palette
  130.     property  BitMapInfoHeader:TBitmapInfoHeader read GetBitmapHeader write SetBitmapHeader;
  131.  published
  132.    property align;
  133.    property color;
  134.    property visible;
  135.    property DriverOpen: boolean read getDriveropen write setDriverOpen; // Opens the Driver / or is Driver open
  136.    property DriverIndex:integer read fdriverindex write SetDriverIndex;  // Index of driver
  137.    property DriverName: string read fVideoDriverName write SetDrivername;    // Name of the Driver
  138.    property VideoOverlay:boolean read GetOverlay write SetOverlay;   // Overlay - Mode
  139.    property VideoPreview:boolean read GetPreview write SetPreview;  // Preview - Mode
  140.    property PreviewScaleToWindow:boolean read fscale write Setscale; // Stretching Frame to component size
  141.    property PreviewScaleProportional:boolean read  fprop write Setprop; // Stretching Frame poportional to original size
  142.    property PreviewRate:word read fpreviewrate write SetpreviewRate;    //Preview frame rate
  143.    property MicroSecPerFrame:cardinal read  fmicrosecpframe write SetMicroSecPerFrame;  //micro seconds between two frames
  144.    property FrameRate:word read  getFramerate write setFrameRate; //Frames p. second
  145.    Property CapAudio:Boolean read fcapAudio write fcapAudio;  // Captue audio stream to
  146.    property VideoFileName:string read fCapVideoFileName   write fCapVideoFileName  ; // Name of capture file
  147.    property SingleImageFile:string read FCapSingleImageFileName write FCapSingleImageFileName;  // Name of file for single image
  148.    property CapTimeLimit:word read fCapTimeLimit write fCapTimeLimit; // time limit for Capturing
  149.    property CapIndexSize:cardinal read findexSize write setIndexSize; // Size of the index for capture file
  150.    property CapToFile:boolean read fcaptoFile write fcapToFile;       // Write Frames to capture file
  151.    property CapAudioFormat:TAudioformat read FAudioformat write FAudioFormat; // Format of captuing Audiodata
  152.   // Internal Events and Callbacks as Events
  153.    property OnStatus:TCapStatusProc read fCapStatusProcedure write FCapStatusProcedure;
  154.    property OnStatusCallback:TCapStatusCallback read fcapStatuscallback write SetStatCallback;
  155.    property OnVideoStream:TVideoStream read fcapVideoStream write SetCapVideoStream;
  156.    property OnFrameCallback:TVideoStream read FcapFramecallback write SetCapFrameCallback;
  157.    property OnAudioStream:TAudioStream read fcapAudioStream write SetCapAudioStream;
  158.    property OnError:TError read fcapError write SetCapError;
  159.    property OnMouseMove;
  160.    property OnMouseUp;
  161.    property OnMouseDown;
  162.    property OnClick;
  163.    Property OnDblClick;
  164.  end;
  165. Function GetDriverList:TStringList;  // Fill stringlist with names and versioninfo of all installed capture drivers
  166. procedure FrameToBitmap(Bitmap:TBitmap;FrameBuffer:pointer; BitmapInfo:TBitmapInfo);  // Make a TBitmap from a Frame
  167. procedure BitmapToFrame(Bitmap:TBitmap; FrameBuffer:pointer; BitmapInfo:TBitmapInfo); // Make a Frame form a Bitmap
  168. //////////////////////////////////////////////////////////////////////////////////
  169. // Video  Display
  170. type ENoHDD  = class(Exception);
  171. type
  172.   TVideoDisp = class(TCustomControl)
  173.    private
  174.     Hdd:HDrawDib;   // Handle of the DrawDibDC
  175.     fBitmapInfoHeader:TBitmapinfoHeader; // Info Header of Frames
  176.     fstreaming:Boolean; // True when Video Stream is running
  177.     frate:integer; // Streaming Rate
  178.     fscale:boolean;   // Scale Bitmap to window
  179.     fprop:boolean;
  180.     fBiWidth:integer; // Height and Width for DrawDibDraw
  181.     fbiHeight:integer;
  182.     procedure SetInfoHeader(Header:TBitmapInfoHeader);  // Setting BitmapInfo Header
  183.     procedure SetStreaming(streaming:Boolean);    // Streaming On / Off
  184.     procedure SetRate(rate:integer);            // Rate of Streaming
  185.     procedure SetSize(var Msg:TMessage); message wm_size; // Handling Sizing
  186.     procedure calcSize(w,h:integer);  // calc size of Output
  187.     procedure SetScale(scaling:Boolean);  // Set Scaling
  188.     procedure SetProp(prop:Boolean);
  189.   public
  190.     constructor Create(AOwner: TComponent); override;
  191.     destructor destroy; override;
  192.     procedure DrawStream(Frame:Pointer; KeyFrame:Boolean);
  193.     property  BitMapInfoHeader:TBitmapInfoHeader read fbitmapInfoHeader write SetInfoHeader;
  194.     property  Streaming:boolean read fstreaming write SetStreaming;
  195.   published
  196.     property ScaleToWindow:boolean read FScale write setScale;
  197.     property StreamRate:integer read frate write setRate;
  198.     property ScaleProportional:boolean read fprop  write SetProp;
  199.     property align;
  200.     property color;
  201.     property visible;
  202.     property OnMouseMove;
  203.     property OnMouseUp;
  204.     property OnMouseDown;
  205.     property OnClick;
  206.     Property OnDblClick;
  207.  end;
  208. procedure Register;
  209. implementation
  210. // Callback for status of video captures
  211. function StatusCallbackProc(hWnd : HWND; nID : Integer; lpsz : Pchar): LongInt; stdcall;
  212. var Control:TVideoCap;
  213. begin
  214.   control:=TVideoCap(capGetUserData(hwnd));
  215.   if assigned(control) then
  216.    begin
  217.        if assigned(control.fcapStatusCallBack) then
  218.               control.fcapStatusCallBack(control,nId,strPas(lpsz));
  219.    end;
  220.   result:= 1;
  221. end;
  222. // Callback for video stream
  223. function VideoStreamCallbackProc(hWnd:Hwnd; lpVHdr:PVIDEOHDR):longint; stdcall;
  224.  var Control:TVideoCap;
  225. begin
  226.    control:= TVideoCap(capGetUserData(hwnd));
  227.   if assigned(control) then
  228.    begin
  229.     if assigned(control.fcapVideoStream ) then
  230.          control.fcapVideoStream(control,lpvHdr);
  231.    end;
  232.  result:= 1;
  233. end;
  234. //Callback for Frames during Preview
  235. function FrameCallbackProc(hwnd:Hwnd; lpvhdr:PVideoHdr):longint;stdcall;
  236. var Control:TVideoCap;
  237. begin
  238.   control:= TVideoCap(capGetUserData(hwnd));
  239.   if assigned(control) then
  240.    begin
  241.     if assigned(control.fcapVideoStream ) then
  242.          control.fcapFrameCallback(control,lpvHdr);
  243.    end;
  244.  result:= 1;
  245. end;
  246. // Callback for audio stream
  247. function AudioStreamCallbackProc(hwnd:HWND;lpWHdr:PWaveHdr):longInt; stdcall;
  248. var control:TVideoCap;
  249. begin
  250.  control:= TVideoCap(capGetUserData(hwnd));
  251.  if assigned(control) then
  252.   if assigned(control.fcapAudioStream) then
  253.     begin
  254.      control.fcapAudioStream(control,lpwhdr);
  255.     end;
  256.  result:= 1;
  257. end;
  258. // Callback for Error
  259. function ErrorCallbackProc(hwnd:HWND;nId:integer;lzError:Pchar):longint;stdcall;
  260. var Control:TVideoCap;
  261.  begin
  262.  control:= TVideoCap(capGetUserData(hwnd));
  263.  if assigned(control) then
  264.   if assigned(control.fcapAudioStream) then
  265.     begin
  266.      control.fcapError(control,nId,StrPas(lzError));
  267.     end;
  268.  result:= 1;
  269. end;
  270. // New Window-Procedure for CaputreWindow to post messages like WM_MouseMove to Component
  271. function WCapproc(hw:THandle;messa:DWord; w:wParam; l:lParam):integer;stdcall;
  272.  var oldwndProc:Pointer;
  273.      parentWnd:Thandle;
  274.  begin
  275.     oldwndproc:=Pointer(GetWindowLong(hw,GWL_USERDATA));
  276.     case Messa of
  277.      WM_MOUSEMOVE,
  278.      WM_LBUTTONDBLCLK,
  279.      WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_MBUTTONDOWN ,
  280.      WM_LBUTTONUP,WM_RBUTTONUP,WM_MBUTTONUP:
  281.        begin
  282.         ParentWnd:=Thandle(GetWindowLong(hw,GWL_HWNDPARENT));
  283.         sendMessage(ParentWnd,messa,w,l);
  284.         result := integer(true);
  285.        end
  286.     else
  287.        result:= callWindowProc(oldwndproc,hw,messa,w,l);
  288.    end;
  289.  end;
  290. (*---------------------------------------------------------------*)
  291. // constructor and Destructor
  292. constructor TVideoCap.Create(aowner:TComponent);
  293. begin
  294.  inherited create(aowner);
  295.  height                  := 100;
  296.  width                   := 100;
  297.  Color                   :=clblack;
  298.  fVideoDriverName        := '';
  299.  fdriverindex            := -1 ;
  300.  fhCapWnd                := 0;
  301.  fCapVideoFileName       := 'Video.avi';
  302.  fCapSingleImageFileName := 'Capture.bmp';
  303.  fscale                  := false;
  304.  fprop                   := false;
  305.  fpreviewrate            := 30;
  306.  fmicrosecpframe         := 66667;
  307.  fpDrivercaps            := nil;
  308.  fpDriverStatus          := nil;
  309.  fcapToFile              := true;
  310.  fCapStatusProcedure     := nil;
  311.  fcapStatusCallBack      := nil;
  312.  fcapVideoStream         := nil;
  313.  fcapAudioStream         := nil;
  314.  FAudioformat:=TAudioFormat.Create;
  315. end;
  316.  destructor TVideoCap.destroy;
  317.   begin
  318.     DestroyCapWindow;
  319.     deleteDriverProps;
  320.     fAudioformat.free;
  321.     inherited destroy;
  322.   end;
  323. (*---------------------------------------------------------------*)
  324. // Messagehandler for sizing the capture window
  325.  procedure TVideoCap.SetSize(var msg:TMessage);
  326.   begin
  327.   if (fhCapWnd <> 0) and (Fscale) then
  328.     begin
  329.      if msg.msg = WM_SIZE then SizeCap;
  330.     end;
  331.   end;
  332. // Sizing capture window
  333.  procedure TVideoCap.SizeCap;
  334.  var h,w:integer;
  335.      f,cf:single;
  336.  begin
  337.   if not fscale then
  338.       MoveWindow(fhcapWnd,0,0,Capwidth,capheight,true)
  339.     else
  340.       begin
  341.        if fprop then
  342.         begin
  343.         f:= Width/height;
  344.         cf:= CapWidth/CapHeight;
  345.         if f >  cf then
  346.          begin
  347.           h:= height;
  348.           w:= round(h*cf);
  349.          end
  350.         else
  351.           begin
  352.           w:= width;
  353.           h:= round(w*1/cf);
  354.          end
  355.         end
  356.        else
  357.         begin
  358.          h:= height;
  359.          w:= Width;
  360.        end;
  361.        MoveWindow(fhcapWnd,0,0,w, h,true);
  362.      end;
  363.  end;
  364.   (*---------------------------------------------------------------*)
  365. // Delete driver infos
  366. procedure TVideoCap.DeleteDriverProps;
  367.  begin
  368.    if assigned(fpDrivercaps) then
  369.     begin
  370.       dispose(fpDrivercaps);
  371.       fpDriverCaps:= nil;
  372.     end;
  373.     if assigned(fpDriverStatus) then
  374.      begin
  375.        dispose(fpDriverStatus);
  376.        fpDriverStatus:= nil;
  377.      end;
  378.  end;
  379. (*---------------------------------------------------------------*)
  380. // Capitilies of the Driver
  381.  function TVideoCap.GetDriverCaps:boolean;
  382.  var savestat : integer;
  383.  begin
  384.    result:= false;
  385.    if assigned(fpDrivercaps) then
  386.      begin
  387.        result:= true;
  388.        exit;
  389.      end;
  390.    if fdriverIndex = -1 then exit;
  391.    savestat := fhCapwnd;  // save state of the window
  392.    if fhCapWnd = 0 then CreateCapWindow;
  393.    if fhCapWnd = 0 then exit;
  394.    new(fpDrivercaps);
  395.    if capDriverGetCaps(fhCapWnd, fpDriverCaps, sizeof(TCapDriverCaps)) then
  396.     begin
  397.      result:= true;
  398.      if savestat = 0 then destroyCapWindow;
  399.      exit;
  400.     end;
  401.    dispose(fpDriverCaps);  // Error can't open then Driver
  402.    fpDriverCaps := nil;
  403.    if savestat = 0 then destroyCapWindow;
  404.  end;
  405. (*---------------------------------------------------------------*)
  406.  // BitmapInfo without a Palette
  407. function TVideoCap.GetBitMapInfoNp:TBitmapinfo;
  408.  var  e:Exception;
  409.  begin
  410.   if driveropen then
  411.    begin
  412.      capGetVideoFormat(fhcapWnd, @result,sizeof(TBitmapInfo));
  413.      exit;
  414.    end ;
  415.   fillchar(result,sizeof(TBitmapInfo),0);
  416.   e:= ENotOpen.Create('Driver not Open');
  417.   raise e;
  418.  end;
  419. // Whole BitmapInfo
  420. function TVideoCap.GetBitMapInfo(var p:Pointer):integer;
  421. var size:integer;
  422.     e:Exception;
  423. begin
  424.   p:=nil;
  425.   result:=0;
  426.   if driverOpen then
  427.     begin
  428.       size:= capGetVideoFormat(fhcapWnd,p,0);
  429.       getmem(p,size);
  430.       capGetVideoFormat(fhcapwnd,p,size);
  431.       result:=size;
  432.       exit;
  433.     end;
  434.  e:= ENotOpen.Create('Driver not Open');
  435.  raise e;
  436. end;
  437. // Setting whole BitmapInfo
  438. procedure TVideoCap.SetBitmapInfo(p:Pointer;size:integer);
  439. var e:Exception;
  440.     supported:boolean;
  441. begin
  442.  if driverOpen then
  443.   begin
  444.     supported:=capSetVideoFormat(fhcapWnd,p,size);
  445.     if not supported then
  446.     begin
  447.      e:=EFalseFormat.Create('Not supported Frame Format' );
  448.      raise e;
  449.     end;
  450.    exit;
  451.   end;
  452.  e:= ENotOpen.Create('Driver not Open');
  453.  raise e;
  454. end;
  455. // Only Header of BitmapInfo
  456. function TVideoCap.GetBitMapHeader:TBitmapinfoHeader;
  457.  var e:Exception;
  458.  begin
  459.   if driveropen then
  460.    begin
  461.     capGetVideoFormat(fhcapWnd, @result,sizeof(TBitmapInfoHeader));
  462.     exit;
  463.    end ;
  464.  fillchar(result,sizeof(TBitmapInfoHeader),0);
  465.  e:= ENotOpen.Create('Driver not Open');
  466.  raise e;
  467. end;
  468. procedure TVideoCap.SetBitMapHeader(header:TBitmapInfoHeader);
  469.  var e:exception;
  470.  begin
  471.   if driveropen then
  472.    begin
  473.     if not capSetVideoFormat(fhcapWnd,@header,sizeof(TBitmapInfoHeader)) then
  474.      begin
  475.       e:= EFalseFormat.Create('Not supported Frame Format');
  476.       raise e;
  477.      end;
  478.     exit;
  479.    end
  480.   else
  481.    begin
  482.     e:= ENotOpen.Create('Driver not Open');
  483.     raise e;
  484.    end;
  485.  end;
  486.  (*---------------------------------------------------------------*)
  487. function TVideoCap.getDriverStatus(callback:boolean):boolean;
  488. begin
  489.   result := false;
  490.   if fhCapWnd <> 0 then
  491.   begin
  492.   if not assigned(fpDriverstatus) then new(fpDriverStatus);
  493.   if capGetStatus(fhCapWnd,fpdriverstatus, sizeof(TCapStatus)) then
  494.    begin
  495.      result:= true;
  496.   end;
  497.   end;
  498.  if assigned(fCapStatusProcedure)and callback then fcapStatusProcedure ( self);
  499. end;
  500. (*---------------------------------------------------------------*)
  501. // Setting name of driver
  502. procedure TVideoCap.SetDrivername(value:string);
  503. var i:integer;
  504.     name:array[0..80] of char;
  505.     ver :array[0..80] of char;
  506. begin
  507.  if fVideoDrivername = value then exit;
  508.  for i:= 0 to 9 do
  509.   if capGetDriverDescription( i,name,80,ver,80) then
  510.     if strpas(name) = value then
  511.      begin
  512.       fVideoDriverName := value;
  513.       Driverindex:= i;
  514.       exit;
  515.     end;
  516.  fVideoDrivername:= '';
  517.  DriverIndex:= -1;
  518. end;
  519. (*---------------------------------------------------------------*)
  520. procedure TVideoCap.SetDriverIndex(value:integer);
  521. var  name:array[0..80] of char;
  522.      ver :array[0..80] of char;
  523. begin
  524.   if value = fdriverindex then exit;
  525.   destroyCapWindow;
  526.   deleteDriverProps;  // Alte Treiberf鋒igkeiten L鰏chen
  527.   if value > -1 then
  528.     begin
  529.      if capGetDriverDescription(value,name,80,ver,80) then
  530.         fVideoDriverName:= StrPas(name)
  531.      else
  532.        value:= -1;
  533.    end;
  534.  if value = -1 then  fvideoDriverName:= '';
  535.  fdriverindex:= value;
  536. end;
  537. (*---------------------------------------------------------------*)
  538. function TVideoCap.CreateCapWindow;
  539.  var Ex:Exception;
  540.      savewndproc:integer;
  541.  begin
  542.  result:= false;
  543.    if fhCapWnd <> 0 then
  544.      begin
  545.       result:= true;
  546.       exit;
  547.     end;
  548.    if fdriverIndex = -1 then
  549.     begin
  550.      Ex := ENoDriverException.Create('No capture driver selected');
  551.      GetDriverStatus(true);
  552.      raise ex;
  553.      exit;
  554.     end;
  555.    fhCapWnd := capCreateCaptureWindow( PChar(Name),
  556.               WS_CHILD or WS_VISIBLE , 0, 0,
  557.                Width, Height,
  558.               Handle, 5001);
  559.    if fhCapWnd =0 then
  560.      begin
  561.        Ex:= ENoCapWindowException.Create('Can not create capture window');
  562.        GetDriverStatus(true);
  563.        raise ex;
  564.        exit;
  565.       end;
  566. // Set ouwer own Adress to the CapWindow
  567.  capSetUserData(fhCapwnd,integer(self));
  568. // Set ouer own window procedure to Capture-Window
  569.  savewndproc:=SetWindowLong(fhcapWnd,GWL_WNDPROC,integer(@WCapProc));
  570. // User Data for old WndProc adress
  571.  SetWindowLong(fhcapWnd,GWL_USERDATA,savewndProc);
  572.  // Setting callbacks as events
  573. if assigned(fcapStatusCallBack ) then
  574.   capSetCallbackOnStatus(fhcapWnd ,StatusCallbackProc);
  575. if assigned(fcapFrameCallback) then
  576.   capSetCallbackOnFrame(fhcapWnd,FrameCallbackProc);
  577. if assigned(fcapError) then
  578.    capSetCallbackOnError(fhcapWnd,ErrorCallBackProc);
  579. if assigned(fcapVideoStream) then
  580.    capSetCallbackOnVideoStream(fhcapwnd,VideoStreamCallbackProc);
  581. if assigned(fcapAudioStream) then
  582.        capSetCallbackOnWaveStream(fhcapWnd,AudioStreamCallbackProc);
  583.  if not capDriverConnect(fhCapWnd, fdriverIndex) then
  584.      begin
  585.        Ex:= ENotConnectException.Create('Can not connect capture driver with capture window');
  586.      //  MessageDlg('Can not connect capture driver with capture window',mterror,[mbOK],0);
  587.        Destroycapwindow;
  588.        GetDriverStatus(true);
  589.        raise ex;
  590.        exit;
  591.    end;
  592.  capPreviewScale(fhCapWnd, fscale);
  593.  capPreviewRate(fhCapWnd, round( 1/fpreviewrate*1000));
  594.  GetDriverStatus(true);
  595.  Sizecap;
  596.  result:= true;
  597. end;
  598. (*------------------------------------------------------------------------*)
  599. // Setting callbacks as events
  600. procedure TVideoCap.SetStatCallBack(value:TCapStatusCallback);
  601. begin
  602.  fcapStatusCallBack := value;
  603.  if DriverOpen then
  604.    if assigned(fcapStatusCallBack) then
  605.       capSetCallbackOnStatus(fhcapWnd ,StatusCallbackProc)
  606.    else
  607.     capSetCallbackOnStatus(fhcapWnd ,nil);
  608. end;
  609. procedure TVideoCap.SetCapVideoStream(value:TVideoStream);
  610.  begin
  611.   fcapVideoStream:= value;
  612.   if DriverOpen then
  613.    if assigned(fcapVideoStream) then
  614.      capSetCallbackOnVideoStream(fhcapwnd,VideoStreamCallbackProc)
  615.    else
  616.     capSetCallbackOnVideoStream(fhcapwnd, nil);
  617.  end;
  618. procedure TVideoCap.SetCapFrameCallback(value:TVideoStream);
  619. begin
  620.  fcapframeCallback:= value;
  621.  if DriverOpen then
  622.    if assigned(fcapFrameCallback) then
  623.      capSetCallbackOnFrame(fhcapwnd,FrameCallBackProc)
  624.    else
  625.     capSetCallbackOnFrame(fhcapwnd, nil);
  626.  end;
  627.  procedure TVideoCap.SetCapAudioStream(value:TAudioStream);
  628.   begin
  629.    fcapAudioStream:= value;
  630.     if DriverOpen then
  631.      if assigned(fcapAudioStream) then
  632.        capSetCallbackOnWaveStream(fhcapWnd,AudioStreamCallbackProc)
  633.      else
  634.       capSetCallbackOnWaveStream(fhcapWnd,nil);
  635.   end;
  636.  procedure TVideoCap.SetCapError(value:TError);
  637.  begin
  638.   fcapError:= value;
  639.   if DriverOpen then
  640.      if assigned(fcapError) then
  641.        capSetCallbackOnError(fhcapWnd,ErrorCallbackProc)
  642.      else
  643.       capSetCallbackOnError(fhcapWnd,nil);
  644.  end;
  645. (*---------------------------------------------------------------*)
  646. procedure TVideoCap.DestroyCapWindow;
  647. begin
  648.   if fhCapWnd = 0 then exit;
  649.   CapDriverDisconnect(fhCapWnd);
  650.   SetWindowLong(fhcapWnd,GWL_WNDPROC,GetWindowLong(fhcapwnd,GWL_USERDATA)); // Old windowproc
  651.   DestroyWindow( fhCapWnd ) ;
  652.   fhCapWnd := 0;
  653. end;
  654. (*---------------------------------------------------------------*)
  655. function  TVideoCap.GetHasVideoOverlay:Boolean;
  656. begin
  657.    if getDriverCaps then
  658.      Result := fpDriverCaps^.fHasOverlay
  659.    else
  660.      result:= false;
  661.  end;
  662. (*---------------------------------------------------------------*)
  663. function  TVideoCap.GetHasDlgVFormat:Boolean;
  664. begin
  665.   if getDriverCaps then
  666.      Result := fpDriverCaps^.fHasDlgVideoFormat
  667.    else
  668.      result:= false;
  669. end;
  670. (*---------------------------------------------------------------*)
  671. function  TVideoCap.GetHasDlgVDisplay : Boolean;
  672. begin
  673.   if getDriverCaps then
  674.      Result := fpDriverCaps^.fHasDlgVideoDisplay
  675.    else
  676.      result:= false;
  677. end;
  678. (*---------------------------------------------------------------*)
  679. function  TVideoCap.GetHasDlgVSource  : Boolean;
  680. begin
  681.   if getDriverCaps then
  682.      Result := fpDriverCaps^.fHasDlgVideoSource
  683.    else
  684.      result:= false;
  685. end;
  686. (*---------------------------------------------------------------*)
  687. function TVideoCap.DlgVFormat:boolean;
  688. var    savestat : integer;
  689. begin
  690.    result:= false;
  691.    if fdriverIndex = -1 then exit;
  692.    savestat := fhCapwnd;
  693.    if fhCapWnd = 0 then
  694.         if not CreateCapWindow then exit;
  695.    result :=capDlgVideoFormat(fhCapWnd);
  696.    if result then GetDriverStatus(true);
  697.    if savestat = 0 then destroyCapWindow;
  698.    if result then
  699.    begin
  700.     Sizecap;
  701.     Repaint;
  702.   end;
  703.  end;
  704. (*---------------------------------------------------------------*)
  705. function TVideoCap.DlgVDisplay:boolean;
  706. var savestat : integer;
  707. begin
  708.    result:= false;
  709.    if fdriverIndex = -1 then exit;
  710.    savestat := fhCapwnd;
  711.    if fhCapWnd = 0 then
  712.        if not CreateCapWindow then exit;
  713.    result:=capDlgVideoDisplay(fhCapWnd) ;
  714.    if result then GetDriverStatus(true);
  715.    if savestat = 0 then destroyCapWindow;
  716.    if result then
  717.    begin
  718.     SizeCap;
  719.     Repaint;
  720.   end;
  721. end;
  722. (*---------------------------------------------------------------*)
  723. function TVideoCap.DlgVSource:boolean;
  724. var savestat : integer;
  725. begin
  726.  result:= false;
  727.  if fdriverIndex = -1 then exit;
  728.   savestat := fhCapwnd;
  729.   if fhCapWnd = 0 then
  730.    if not createCapWindow then exit;
  731.   result:= capDlgVideoSource(fhCapWnd);
  732.   if result then GetDriverStatus(true);
  733.   if savestat = 0 then destroyCapWindow;
  734.   if result then
  735.   begin
  736.    SizeCap;
  737.    Repaint;
  738.  end;
  739. end;
  740. (*---------------------------------------------------------------*)
  741. function TVideoCap.DlgVCompression;
  742. var savestat : integer;
  743. begin
  744.  result:= false;
  745.  if fdriverIndex = -1 then exit;
  746.   savestat := fhCapwnd;
  747.   if fhCapWnd = 0 then
  748.    if not createCapWindow then exit;
  749.    result:=capDlgVideoCompression(fhCapWnd);
  750.   if savestat = 0 then destroyCapWindow;
  751.  end;
  752. (*---------------------------------------------------------------*)
  753.  // Single Frame Grabbling
  754.  function TVideoCap.GrabFrame:boolean;
  755.  begin
  756.   result:= false;
  757.   if not DriverOpen then exit;
  758.   Result:= capGrabFrame(fhcapwnd);
  759.   if result then GetDriverStatus(true);
  760.  end;
  761.  function TVideoCap.GrabFrameNoStop:boolean;
  762.  begin
  763.   result:= false;
  764.   if not DriverOpen then exit;
  765.   Result:= capGrabFrameNoStop(fhcapwnd);
  766.   if result then GetDriverStatus(true);
  767.  end;
  768.  (*---------------------------------------------------------------*)
  769. // save frame as DIP
  770. function TVideoCap.SaveAsDIB:Boolean;
  771.   var s:array[0..MAX_PATH] of char;
  772. begin
  773.    result:= false;
  774.    if not DriverOpen then exit;
  775.    result := capFileSaveDIB(fhcapwnd,strpCopy(s,fCapSingleImageFileName));
  776. end;
  777. function  TVideoCap.SaveToClipboard:boolean;
  778. begin
  779.  result:= false;
  780.  if not Driveropen then exit;
  781.  result:= capeditCopy(fhcapwnd);
  782. end;
  783. (*---------------------------------------------------------------*)
  784. procedure TVideoCap.Setoverlay(value:boolean);
  785. var ex:Exception;
  786. begin
  787.  if value = GetOverlay then exit;
  788.  if gethasVideoOverlay = false then
  789.    begin
  790.     Ex:= ENoOverlayException.Create('Driver has no overlay mode');
  791.     raise ex;
  792.     //MessageDlg('Treiber kann kein Overlay',mtError,[mbOK],0);
  793.     exit;
  794.    end;
  795.  if value = true then
  796.   begin
  797.    if fhcapWnd = 0 then  CreateCapWindow;
  798.    GrabFrame;
  799.   end;
  800.  capOverlay(fhCapWnd,value);
  801.  GetDriverStatus(true);
  802.  invalidate;
  803.  end;
  804. function TVideoCap.GetOverlay:boolean;
  805. begin
  806.  if fhcapWnd = 0 then result := false
  807.  else
  808.   result:= fpDriverStatus^.fOverlayWindow;
  809. end;
  810. (*---------------------------------------------------------------*)
  811. procedure TVideoCap.SetPreview(value:boolean);
  812. begin
  813.  if value = GetPreview then exit;
  814.  if value = true then
  815.    if fhcapWnd = 0 then  CreateCapWindow;
  816.  capPreview(fhCapWnd,value);
  817.  GetDriverStatus(true);
  818.  invalidate;
  819. end;
  820. function TVideoCap.GetPreview:boolean;
  821. begin
  822.  if fhcapWnd = 0 then result := false
  823.  else
  824.   result:= fpDriverStatus^.fLiveWindow;
  825. end;
  826. procedure TVideoCap.SetPreviewRate(value:word);
  827. begin
  828.  if value = fpreviewrate then exit;
  829.  if value < 1 then value := 1;
  830.  if value > 30 then value := 30;
  831.  fpreviewrate:= value;
  832.  if DriverOpen then capPreviewRate(fhCapWnd, round( 1/fpreviewrate*1000));
  833. end;
  834. (*---------------------------------------------------------------*)
  835.  procedure TVideoCap.SetMicroSecPerFrame(value:cardinal);
  836.  begin
  837.   if value =  fmicrosecpframe then exit;
  838.   if value < 33333 then value := 33333;
  839.    fmicrosecpframe := value;
  840. end;
  841. procedure TVideoCap.setFrameRate(value:word);
  842. begin
  843.  if value <> 0 then fmicrosecpframe:= round(1.0/value*1000000.0);
  844. end;
  845. function  TVideoCap.GetFrameRate:word;
  846. begin
  847.  if fmicrosecpFrame > 0   then
  848.    result:= round(1./ fmicrosecpframe * 1000000.0)
  849. else
  850.   result:= 0;
  851. end;
  852. function TVideoCap.StartCapture;
  853. var CapParms:TCAPTUREPARMS;
  854.     name:array[0..MAX_PATH] of char;
  855.  begin
  856.    result := false;
  857.    if not DriverOpen then exit;
  858.    capCaptureGetSetup(fhCapWnd, @CapParms, sizeof(TCAPTUREPARMS));
  859.    capFileSetCaptureFile(fhCapWnd,strpCopy(name, fCapVideoFileName));
  860.    CapParms.dwRequestMicroSecPerFrame := fmicrosecpframe;
  861.    CapParms.fLimitEnabled    := BOOL(FCapTimeLimit);
  862.    CapParms.wTimeLimit       := fCapTimeLimit;
  863.    CapParms.fCaptureAudio    := fCapAudio;
  864.    CapParms.fMCIControl      := FALSE;
  865.    CapParms.fYield           := TRUE;
  866.    CapParms.vKeyAbort        := VK_ESCAPE;
  867.    CapParms.fAbortLeftMouse  := FALSE;
  868.    CapParms.fAbortRightMouse := FALSE;
  869.    capCaptureSetSetup(fhCapWnd, @CapParms, sizeof(TCAPTUREPARMS));
  870.    if fCapAudio then FAudioformat.SetAudio(fhcapWnd);
  871.    if CapToFile then
  872.     result:= capCaptureSequence(fhCapWnd)
  873.    else
  874.     result := capCaptureSequenceNoFile(fhCapWnd);
  875.    GetDriverStatus(true);
  876.  end;
  877. function TVideoCap.StopCapture;
  878. begin
  879.  result:=false;
  880.  if not DriverOpen then exit;
  881.  result:=CapCaptureStop(fhcapwnd);
  882.  getDriverstatus(true);
  883. end;
  884.  procedure TVideoCap.SetIndexSize(value:cardinal);
  885.   begin
  886.    if value = 0 then
  887.     begin
  888.       findexSize:= 0;
  889.       exit;
  890.     end;
  891.    if value < 1800 then value := 1800;
  892.    if value > 324000 then value := 324000;
  893.   findexsize:= value;
  894.  end;
  895. function TVideoCap.GetCapInProgress:boolean;
  896.   begin
  897.    result:= false;
  898.    if not DriverOpen then exit;
  899.    GetDriverStatus(false);
  900.    result:= fpDriverStatus^.fCapturingNow ;
  901.  end;
  902.  (*---------------------------------------------------------------*)
  903. Procedure TVideoCap.SetScale(value:boolean);
  904. begin
  905.  if value = fscale then  exit;
  906.  fscale:= value;
  907.  if DriverOpen then
  908.    begin
  909.     capPreviewScale(fhCapWnd, fscale);
  910.     SizeCap;
  911.    end;
  912.  Repaint;
  913. end;
  914. Procedure TVideoCap.Setprop(value:Boolean);
  915. begin
  916.  if value = fprop then exit;
  917.  fprop:=value;
  918.  if DriverOpen then Sizecap;
  919.  Repaint;
  920. end;
  921. (*---------------------------------------------------------------*)
  922. function TVideoCap.GetCapWidth;
  923. begin
  924.  if assigned(fpDriverStatus) then
  925.    result:= fpDriverStatus^.uiImageWidth
  926. else
  927.    result:= 0;
  928. end;
  929. function TVideoCap.GetCapHeight;
  930. begin
  931.  if assigned(fpDriverStatus) then
  932.    result:= fpDriverStatus^.uiImageHeight
  933. else
  934.    result:= 0;
  935. end;
  936. (*---------------------------------------------------------------*)
  937.  Procedure TVideoCap.SetDriverOpen(value:boolean);
  938.  begin
  939.    if value = GetDriverOpen then exit;
  940.    if value = false then DestroyCapWindow;
  941.    if value = true then CreateCapWindow;
  942.  end;
  943. function TVideoCap.GetDriverOpen:boolean;
  944. begin
  945.  result := fhcapWnd <> 0;
  946. end;
  947. ///////////////////////////////////////////////////////////////////////////
  948. constructor TAudioFormat.create;
  949. begin
  950.      inherited create;
  951.      FChannels:=Mono;
  952.      FFrequency:=f8000Hz;
  953.      Fres:=r8Bit;
  954. end;
  955. procedure TAudioFormat.SetAudio(handle:Thandle);
  956. Var WAVEFORMATEX:TWAVEFORMATEX;
  957. begin
  958.      if handle= 0 then exit;  // No CapWindow
  959.      capGetAudioFormat(handle,@WAVEFORMATEX, SizeOf(TWAVEFORMATEX));
  960.      case FFrequency of
  961.           f8000hz  :WAVEFORMATEX.nSamplesPerSec:=8000;
  962.           f11025Hz:WAVEFORMATEX.nSamplesPerSec:=11025;
  963.           f22050Hz:WAVEFORMATEX.nSamplesPerSec:=22050;
  964.           f44100Hz:WAVEFORMATEX.nSamplesPerSec:=44100;
  965.      end;
  966.      WAVEFORMATEX.nAvgBytesPerSec:= WAVEFORMATEX.nSamplesPerSec;
  967.      if FChannels=Mono then
  968.           WAVEFORMATEX.nChannels:=1
  969.      else
  970.           WAVEFORMATEX.nChannels:=2;
  971.      if FRes=r8Bit then
  972.         WAVEFORMATEX.wBitsPerSample:=8
  973.      else
  974.         WAVEFORMATEX.wBitsPerSample:=16;
  975.      capSetAudioFormat(handle,@WAVEFORMATEX, SizeOf(TWAVEFORMATEX));
  976. end;
  977. ///////////////////////////////////////////////////////////////////////////
  978. // Creating a list with capture drivers
  979. Function GetDriverList:TStringList;
  980. var i:integer;
  981.     name:array[0..80] of char;
  982.     ver :array[0..80] of char;
  983. begin
  984.  result:= TStringList.Create;
  985.  result.Capacity:= 10;
  986.  result.Sorted:= false;
  987.  for i:= 0 to 9 do
  988.    if capGetDriverDescription( i,name,80,ver,80) then
  989.       result.Add(StrPas(name)+ ' '+strpas(ver))
  990.    else
  991.      break;
  992.  end;
  993. procedure FrameToBitmap(Bitmap:TBitmap;FrameBuffer:pointer; BitmapInfo:TBitmapInfo);
  994.  var ex:Exception;
  995.      hdd:Thandle;
  996. begin
  997. // if bitmapInfo.bmiHeader.BiCompression <> bi_RGB then
  998. //  begin
  999. //    ex:=  EFalseFormat.Create('Not Supported DIB format');
  1000. //    raise ex ;
  1001. //  end;
  1002.  with Bitmap  do
  1003.  begin
  1004.   Width:= BitmapInfo.bmiHeader.biWidth;      // New size of Bitmap
  1005.   Height:=Bitmapinfo.bmiHeader.biHeight;
  1006.  //  if bitmapInfo.bmiHeader.BiCompression <> bi_RGB then
  1007. //     setDiBits(canvas.handle,handle,0,BitmapInfo.bmiHeader.biheight,FrameBuffer,BitmapInfo,DIB_RGB_COLORS)
  1008.  //  else
  1009. //     begin
  1010.       hdd:= DrawDibOpen;
  1011.        DrawDibDraw(hdd,canvas.handle,0,0,BitmapInfo.BmiHeader.biwidth,BitmapInfo.bmiheader.biheight,@BitmapInfo.bmiHeader,
  1012.                        frameBuffer,0,0,bitmapInfo.bmiHeader.biWidth,bitmapInfo.bmiHeader.biheight,0);
  1013.       DrawDibClose(hdd);
  1014. //     end;
  1015. end;
  1016. end;
  1017. procedure BitmapToFrame(Bitmap:TBitmap; FrameBuffer:pointer; BitmapInfo:TBitmapInfo);
  1018.  var ex:Exception;
  1019. begin
  1020.   if bitmapInfo.bmiHeader.BiCompression <> bi_RGB then
  1021.   begin
  1022.     ex:=  EFalseFormat.Create('Not Supported DIB format');
  1023.     raise ex ;
  1024.   end;
  1025.   with Bitmap do
  1026.    GetDiBits(canvas.handle,handle,0,BitmapInfo.bmiHeader.biheight,FrameBuffer,BitmapInfo,DIB_RGB_COLORS);
  1027.  end;
  1028. ///////////////////////////////////////////////////////////////////////////////
  1029. // Video Display
  1030. constructor TVideoDisp.Create(AOwner: TComponent);
  1031. var e:Exception;
  1032.  begin
  1033.    inherited Create(aOwner);
  1034.    Width:= 100;
  1035.    height:=75;
  1036.    color := clblack;
  1037.    fstreaming:= false;
  1038.    frate:= 66667;
  1039.    hdd:=DrawDibOpen;
  1040.    fbitmapinfoheader.biWidth := 100;
  1041.    fbitmapinfoheader.biHeight:= 100;
  1042.    fbitmapInfoHeader.biSize:=0;
  1043.    if hdd = 0 then
  1044.     begin
  1045.      e:=ENoHDD.Create('Can not Create HDRAWDIB');
  1046.      raise e;
  1047.     end;
  1048.   end;
  1049. destructor TVideoDisp.Destroy;
  1050. begin
  1051.  DrawDibClose(hdd);
  1052.  inherited Destroy;
  1053. end;
  1054. procedure TVideoDisp.SetInfoHeader(Header:TBitmapInfoHeader);
  1055. begin
  1056.  fBitmapInfoHeader:= header;
  1057.  calcSize(width,height);
  1058. end;
  1059. // Draw a new Picture of the Frame
  1060. procedure TVideoDisp.DrawStream(Frame:Pointer;KeyFrame:Boolean);
  1061. var Flags:word;
  1062.   //  e:Exception;
  1063. begin
  1064.  if bitmapinfoHeader.bisize = 0 then exit;
  1065.  flags := DDF_SAME_HDC or DDF_SAME_DRAW;
  1066.  if not Keyframe then Flags:= flags or DDF_NOTKEYFRAME  ;
  1067.  DrawDibDraw(hdd,canvas.handle,0,0,fbiwidth,fbiheight,@fBitmapInfoHeader,
  1068.              frame,0,0,fBitmapInfoHeader.biWidth,fbitmapInfoHeader.biheight,flags);
  1069. end;
  1070. // Set Streaming Rate
  1071. procedure TVideoDisp.SetRate(rate:integer);
  1072. begin
  1073.   if fstreaming then DrawDibStop(hdd);
  1074.   frate := rate;
  1075.   if Streaming then DrawDibStart(hdd,frate);
  1076. end;
  1077. // Toggeling Streaming mode
  1078.  procedure TVideoDisp.SetStreaming(streaming:boolean);
  1079.  begin
  1080.    if streaming = fstreaming then exit;
  1081.    if fstreaming then
  1082.      DrawDibStop(hdd)
  1083.    else
  1084.      DrawDibStart(hdd,frate);
  1085.     fstreaming := streaming;
  1086.  end;
  1087. procedure TVideoDisp.SetSize(var Msg:TMessage);
  1088. begin
  1089.    calcsize(LOWORD(msg.lParam),HIWORD(msg.lParam));
  1090. end;
  1091. procedure TVideoDisp.calcSize(w,h:integer);
  1092.  var f,cf:double;
  1093. begin
  1094.  if fscale then
  1095.    begin
  1096.      if fprop then
  1097.         begin
  1098.         f:= W/h;
  1099.         cf:= fBitmapInfoHeader.biWidth/fbitmapInfoHeader.biHeight;
  1100.         if cf  <  f then
  1101.          begin
  1102.           fbiWidth:= round(h*cf);
  1103.           fbiHeight:= h;
  1104.          end
  1105.         else
  1106.           begin
  1107.           fbiWidth:= w;
  1108.           fbiHeight:= round(w*1/cf);
  1109.          end
  1110.    end
  1111.    else
  1112.     begin
  1113.      fbiheight:= h;
  1114.      fbiwidth:=  w;
  1115.     end
  1116.   end
  1117.    else
  1118.      begin
  1119.       fbiheight:=fbitmapInfoHeader.biHeight;
  1120.       fbiwidth:= fbitmapInfoHeader.biWidth;
  1121.     end;
  1122.   if fbitmapInfoHeader.biSize <> 0 then
  1123.    DrawDibBegin(hdd,canvas.handle,fbiwidth,fbiheight,@fBitmapInfoHeader,
  1124.             fBitmapInfoHeader.biWidth,fbitmapInfoHeader.biheight,0);
  1125. end;
  1126. procedure TVideoDisp.SetScale(scaling:Boolean);
  1127.  begin
  1128.   if scaling = fscale then exit;
  1129.   fscale:= scaling;
  1130.   calcSize(width,height);
  1131. end;
  1132. procedure TVideoDisp.SetProp(prop:Boolean);
  1133.  begin
  1134.   if fprop = prop then exit;
  1135.   fprop:=prop;
  1136.   calcSize(width,height);
  1137. end;
  1138. procedure Register;
  1139. begin
  1140.   RegisterComponents( 'Video', [TVideoCap,TVideoDisp]);
  1141. end;
  1142. end.