- unit Unit1;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
- StdCtrls, PasLibVlcUnit, {$IFDEF WINDOWS}Windows,{$ELSE} {$ENDIF} dglOpenGL,
- glBitmap;
- type
- tRGBA = record
- r,g,b,a : byte;
- end;
- tVLCcontext = record
- VLCpixels:array of tRGBA;
- end;
- { TForm1 }
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- Edit1: TEdit;
- Panel1: TPanel;
- Timer2: TTimer;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
- procedure FormCreate(Sender: TObject);
- private
- { private declarations }
- StartTime, TimeCount, FrameCount,fc : Cardinal; //FrameCounter
- Frames, DrawTime,VLCRenderTime : Cardinal; //& Timebased Movement
- DoPlay,NewFrame,fClose: Boolean;
- fTexture1: TglBitmap2D; // Instanz unserer Textur
- procedure SetupGL;
- procedure Render;
- procedure RenderVLC;
- procedure RenderGL;
- public
- { public declarations }
- libvlc_instance :libvlc_instance_t_ptr;
- libvlc_media :libvlc_media_t_ptr;
- libvlc_media_player :libvlc_media_player_t_ptr;
- libvlc_media_track_info:libvlc_media_track_info_t_ptr;
- VideoWidth,VideoHeight:Integer;
- VLCctx:tVLCcontext;
- DC : HDC; //Handle auf Zeichenfläche
- RC : HGLRC;//Rendering Context
- end;
- function libvlc_video_lock(opaque : Pointer; var planes : Pointer) : Pointer; cdecl;
- function libvlc_video_unlock(opaque : Pointer; picture : Pointer; planes : Pointer) : Pointer; cdecl;
- function libvlc_video_display(opaque : Pointer; picture : Pointer) : Pointer; cdecl;
- var
- Form1: TForm1;
- implementation
- {$R *.lfm}
- { TForm1 }
- procedure TForm1.Button1Click(Sender: TObject);
- var i:Integer;
- begin
- libvlc_media := libvlc_media_new_path(libvlc_instance, PChar(Edit1.Text));
- libvlc_media_parse(libvlc_media);
- libvlc_media_get_tracks_info(libvlc_media,libvlc_media_track_info);
- VideoWidth :=0;
- VideoHeight:=0;
- if libvlc_media_track_info = nil then ShowMessage('kein Medium geladen!')
- else
- begin
- for i:=0 to 2 do
- begin
- if (libvlc_media_track_info+i)^.i_type = libvlc_track_video then
- begin
- VideoWidth :=(libvlc_media_track_info+i)^.video.i_width;
- VideoHeight:=(libvlc_media_track_info+i)^.video.i_height;
- end;
- end;
- end;
- libvlc_media_player := libvlc_media_player_new_from_media(libvlc_media);
- libvlc_media_release(libvlc_media);
- Setlength(VLCctx.vlcpixels,VideoWidth*VideoHeight*4);
- libvlc_video_set_format(libvlc_media_player,'RGBA',VideoWidth,VideoHeight,VideoWidth*4);
- libvlc_video_set_callbacks(libvlc_media_player,@libvlc_video_lock,@libvlc_video_unlock,@libvlc_video_display,@VLCctx);
- libvlc_media_player_play(libvlc_media_player);
- Timer2.Enabled:=true;
- DoPlay:=true;
- StartTime:= GetTickCount;
- while DoPlay do
- begin
- Render;
- Application.ProcessMessages;
- end;
- if fClose then libvlc_media_player_stop(libvlc_media_player);
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- //BorderStyle:=bsNone;
- WindowState:=wsFullscreen;
- Panel1.Width :=ClientWidth;
- Panel1.Height:=ClientHeight;
- glViewport(0, 0, ClientWidth, ClientHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- glOrtho(0,1024,0,768,0,128);
- glMatrixMode(GL_MODELVIEW);
- end;
- procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
- begin
- fClose:=True;
- DoPlay:=false;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- libvlc_dynamic_dll_init_with_path('C:\Program Files (x86)\VideoLAN\VLC'); //Prozedur zum auffinden der Bibliothek einfügen!
- libvlc_instance := libvlc_new(0, nil);
- //OpenGL:
- DC:= GetDC(Panel1.Handle);
- if not InitOpenGL then Application.Terminate;
- RC:= CreateRenderingContext( DC,
- [opDoubleBuffered],
- 32,
- 24,
- 0,0,0,
- 0);
- ActivateRenderingContext(DC, RC);
- SetupGL;
- TimeCount:=0;
- FrameCount:=0;
- fc:=0;
- DoPlay:=false;
- NewFrame:=false;
- end;
- procedure TForm1.RenderVLC;
- var pp: TglBitmapPixelPosition;
- pf: TglBitmapPixelPositionFields;
- begin
- pf:=[ffX];
- pp.Fields:=pf;
- pp.X:=VideoWidth;
- pp.Y:=VideoHeight;
- if fTexture1 = nil then
- begin
- fTexture1 := TglBitmap2D.Create(pp,ifRGBA8);
- fTexture1.AddAlphaFromValue(255);
- fTexture1.FreeDataAfterGenTexture := False;
- end;
- Move(VLCctx.vlcpixels[0],tRGBA(fTexture1.Scanline[0]^),VideoHeight*VideoWidth*4);
- fTexture1.GenTexture;
- glActiveTexture(GL_TEXTURE0);
- fTexture1.Bind;
- end;
- function libvlc_video_lock(opaque : Pointer; var planes : Pointer) : Pointer; cdecl;
- begin
- planes := @(Form1.VLCctx.vlcpixels[0]);
- Result:=nil;
- end;
- function libvlc_video_unlock(opaque : Pointer; picture : Pointer; planes : Pointer) : Pointer; cdecl;
- begin
- Inc(Form1.fc);
- Form1.NewFrame:=true;
- Form1.VLCRenderTime:=GetTickCount;
- Result:=nil;
- end;
- function libvlc_video_display(opaque : Pointer; picture : Pointer) : Pointer; cdecl;
- begin
- ////////////////
- end;
- procedure TForm1.SetupGL;
- begin
- glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
- glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
- glEnable(GL_CULL_FACE); //Backface Culling aktivieren
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GREATER, 0.1);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- glOrtho(0,1024,0,768,0,128);
- glMatrixMode(GL_MODELVIEW);
- end;
- procedure TForm1.RenderGL;
- begin
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glLoadIdentity;
- glTranslatef(0, 0, -5);
- glBegin(GL_QUADS);
- glVertex3f( 0, 0, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,1); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,1);
- glVertex3f(1024, 0, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,0);
- glVertex3f(1024, 768, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,0);
- glVertex3f( 0, 768, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,1); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,1);
- glEnd;
- SwapBuffers(DC);
- end;
- procedure TForm1.Render;
- begin
- if not DoPlay then begin sleep(20); exit; end;
- if NewFrame then
- begin
- NewFrame:=false;
- RenderVLC;
- RenderGL;
- TimeCount:= GetTickCount - StartTime;
- Inc(FrameCount);
- Frames:= FrameCount*1000 div TimeCount;
- Drawtime:=TimeCount div FrameCount;
- end
- else
- begin
- sleep(1);
- end;
- end;
- end.