BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/VideoCapture/CaptFromIPCamera/umain.pas

136 lines
3.0 KiB
Plaintext

unit umain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, {$IfNDef VER130} Variants, {$EndIf} Controls, Forms,
Dialogs, Buttons, StdCtrls, ieview, imageenview, ExtCtrls, imageenio, iexBitmaps, hyieutils, hyiedefs,
iesettings, iexLayers, iexRulers;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
ImageEnView1: TImageEnView;
Label2: TLabel;
EditIP: TEdit;
EditAddress: TEdit;
Label3: TLabel;
Label4: TLabel;
EditUser: TEdit;
Label5: TLabel;
EditPassword: TEdit;
ButtonConnect: TSpeedButton;
procedure ButtonConnectClick(Sender: TObject);
private
{ Private declarations }
fAborting: boolean;
public
{ Public declarations }
end;
TIEJpegAcquireStream = class(TStream)
private
fData: TMemoryStream;
fStart: boolean;
public
constructor Create;
destructor Destroy; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{$R WindowsTheme.res}
constructor TIEJpegAcquireStream.Create;
begin
inherited;
fData := TMemoryStream.Create;
fStart := false;
end;
destructor TIEJpegAcquireStream.Destroy;
begin
fData.Free;
inherited;
end;
function TIEJpegAcquireStream.Write(const Buffer; Count: Longint): Longint;
var
buf: pbytearray;
i: integer;
begin
result := Count;
buf := pbytearray(@Buffer);
case fStart of
false:
// look for begin of jpeg (FFD8)
for i := 0 to Count-2 do
if (buf[i]=$FF) and (buf[i + 1]=$D8) then
begin
fData.Write( buf[i], Count-i);
fStart := true;
exit;
end;
true:
begin
// look for end of jpeg (FFD9)
for i := 0 to Count-2 do
if (buf[i]=$FF) and (buf[i + 1]=$D9) then
begin
fData.Write( buf[0], i);
fStart := false;
// acquire bitmap
fData.Position := 0;
Form1.ImageEnView1.IO.LoadFromStreamJpeg(fData);
Application.ProcessMessages;
fData.Clear;
exit;
end;
// not found, write all
fData.Write( buf[0], Count );
end;
end;
end;
function TIEJpegAcquireStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
result := fData.Seek(Offset, Origin);
end;
function TIEJpegAcquireStream.Read(var Buffer; Count: Longint): Longint;
begin
raise Exception.Create('TIEJpegAcquireStream cannot read.');
end;
// connect switch
procedure TForm1.ButtonConnectClick(Sender: TObject);
var
stream: TIEJpegAcquireStream;
fileext: string;
begin
if ButtonConnect.Down then
begin
stream := TIEJpegAcquireStream.Create;
fAborting := false;
IEGetFromURL('http://' + EditUser.Text + ':' + EditPassword.Text + '@' + EditIP.Text + EditAddress.Text, stream, '', '', '', nil, nil, @fAborting, fileext);
stream.Free;
end
else
fAborting := true;
end;
end.