sooo da bin ich mal wieder
folgendes hat sich getan:
ich hol mir jetz das komprimierte und bild und verschicke es per UDP vom Client an den Server.
Der server hat die nötige prozedur zur dekomprimierung der daten.
hier mal quelltext:
Die Client Methoden:
Holen der Daten vom VideoImage
Delphi-Quellcode:
procedure TVideoImage.GetFrameData(VAR FrameData: pointer; VAR FrameDataSize: integer; VAR FourCC : cardinal; VAR Width,Height:integer);
begin
FrameData := fImagePtr[fImagePtrIndex];
FrameDataSize := fImagePtrSize[fImagePtrIndex];
FourCC := fFourCC; //codec
Width:=fWidth;
Height:=fHeight;
end;
Verschicken der Daten
Delphi-Quellcode:
procedure TForm1.sendStream;
var MStream:TMemoryStream;
Data:string;
FrPointer:Pointer;
FrSize,fWidth,fHeight,bSize:integer;
Codec:Cardinal;
begin
fVideoImage.GetFrameData(FrPointer,FrSize,Codec,fWidth,fHeight);
FrSize:=FrSize+3;
setLength(Data,8192); //#0#13#0
try
Move(FrPointer^,Data[1],8192);
// Data:=IntToStr(8192);
WebcamStream.Client.Send(Data);
except
end;
while FrSize>8192 do begin
try
Data:='';
setLength(Data,8192);
Move(FrPointer^,Data[1],8192);
WebcamStream.Client.Send(Data);
except
end;
FrSize:=FrSize-8192;
end;
Data:='';
setLength(Data,FrSize);
try
Move(FrPointer^,Data[1],FrSize);
Data:=Data+#0#13#0;
WebcamStream.Client.Send(Data);
except
end;
end;
Server methoden:
Empfangen der Daten
Delphi-Quellcode:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
var i:integer;
buffer,data:string;
MStream:TMemoryStream;
bmp:TBitmap;
begin
//MStream:=TMemoryStream.Create;
buffer:=AThread.Server.ReceiveString(-1);
data:=buffer;
while(Pos(#0#13#0,buffer)<1) do begin
buffer:=AThread.Server.ReceiveString(-1);
data:=data+buffer;
end;
//buffer
//MStream.Read(buffer,Length(buffer));
Decoder.DecodeFrame(data);
//Form2.Image1.Picture.Bitmap.LoadFromStream(MStream);
//if Pos(#0#13#0,buffer)>0 then Showmessage('okkk');
//MStream.Free;
end;
dekomprimieren der daten
Delphi-Quellcode:
procedure TDecoder.DecodeFrame(Bitmap:TBitmap;Data:String);
var fp:^string;
begin
fp:=@Data;
YUY2_to_RGB(fp,Data);
end;
Delphi-Quellcode:
procedure TDecoder.YUY2_to_RGB(pData: pointer;data:
string);
// [url]http://msdn.microsoft.com/en-us/library/ms893078.aspx[/url]
// [url]http://en.wikipedia.org/wiki/YCbCr[/url]
type
TFour =
ARRAY[0..3]
OF byte;
VAR
L, X, Y : integer;
ps : pbyte;
pf : ^TFour;
FrPointer:Pointer;
FrSize,fWidth,fHeight,i:integer;
Codec:Cardinal;
bmp:TBitmap;
begin
bmp:=TBitmap.Create;
bmp.PixelFormat:=pf24Bit;
pf:=pData;
//fVideoImage.GetFrameData(FrPointer,FrsIze,Codec,fWidth,fHeight);
fWidth:=640;
fHeight:=480;
bmp.Width:=fWidth;
bmp.Height:=fHeight;
Showmessage(IntToStr(Length(Data)));
PrepareTables;
FOR Y := 0
TO bmp.Height-1
DO
BEGIN
ps := bmp.ScanLine[Y];
FOR X := 0
TO (bmp.Width
div 2)-1
DO
begin
L := ValueY_298[pf^[0]];
// HIER KOMMT DER FEHLER
ps^ := ValueClip[(L + ValueU_516[pf^[1]] )
div 256];
Inc(ps);
ps^ := ValueClip[(L + ValueU_100[pf^[1]] + ValueV_208[pf^[3]])
div 256];
Inc(ps);
ps^ := ValueClip[(L + ValueV_409[pf^[3]])
div 256];
Inc(ps);
L := ValueY_298[pf^[2]];
ps^ := ValueClip[(L + ValueU_516[pf^[1]] )
div 256];
Inc(ps);
ps^ := ValueClip[(L + ValueU_100[pf^[1]] + ValueV_208[pf^[3]])
div 256];
Inc(ps);
ps^ := ValueClip[(L + ValueV_409[pf^[3]])
div 256];
Inc(ps);
Inc(pf);
end;
END;
Form2.Image1.Picture.Assign(bmp);
bmp.Free;
end;
so ich hänge jetzt an der letzten funktion.
Diese berechnet das bild zurück
Die Value Arrays enthalten umrechnungszahlen für die einzelnen pixel.
der pointer pf soll auf die Data zeigen.
Das Problem ist jetzt, dass ich bei der letzten funktion ne
access violation kriege, siehe Kommentar im quelltext.
Die kommt allerdings erst nach etwa dem 20. durchlauf der For schleife mit Y.
Raised exception class C000005
hat jemand ne Idee ?