Stimmt, ich denke wir reden etwas aneinander vorbei:
Im Prinzip machst du nichts anderes als das du 3 Texturen für Y, U und die V Werte hast und diese in der GPU mittels eines Shaders direkt im Grafikspeicher in
RGB umwandelst.
Du kannst das ganze auch so wie du vorschlagen willst machen:
Das ist der Punkt den du immer überliest oder falsch verstehst!
Mein Vorschlag ist
NICHT es per CPU zu machen.
Du musst nur deine beiden Codeschnipsel kombinieren:
Delphi-Quellcode:
function ConvertYuvToRgbWithOpenGL(
const Packet: TPacket): TBytes;
begin
// make OpenGL magic here
end;
procedure CopyYuv(
const Packet: TPacket; Bitmap: TBitmap);
overload;
var
BitmapData: TBitmapData;
RGBABuffer: TBytes;
begin
RGBABuffer := ConvertYUVToRGBWithOpenGL(Packet);
Bitmap.Map(TMapAccess.
Write, BitmapData);
try
System.Move(@RGBABuffer[0], BitmapData.Data, Length(RGBABuffer));
finally
Bitmap.Unmap(BitmapData);
end;
end;
Ich bin ja nicht so firm mit
OpenGL, aber anhand deiner Codezeilen kann man erkennen, dass du pro Videoframe ja eine Variable Texture (mit .Handle, .UHandle und .YHandle) hast, um die YUV-Daten aufzunehmen.
Du brauchst jetzt nur noch eine weitere Variable für eine 2D-Texture, die deine umgewandelten RGBA-Daten aufnimmt.
Den Inhalt deiner - ich nenne sie mal RGBATexture - musst du nur noch in den Speicher des FMX-Bitmaps umkopieren.
Die Farbraumkonvertierung erfolgt weiterhin mit
OpenGL auf der GPU!!!
Beim obigen Pseudocodeschnipsel kann man sich ggf. den Zwischenschritt mit den TBytes-Array sparen, wenn du direkt den TBitmapData.Data Zeiger übergibst.