Page 1 of 1
Is it possible to use libvlc.dll directly instead of ActiveX
Posted: 05 Oct 2006 17:04
by aagis
Hello everyone,
I've been dealing with some nasty issues while trying to incorporate the VLC ActiveX in an application and was wondering wether it is possible to use a dll (libvlc.dll) directly to simplify the design and hopefully avoid these issues. Does anybody know if something like that is possible?
Thank you,
Agis Andreou.
Posted: 05 Oct 2006 18:23
by Jean-Baptiste Kempf
Yes, it should be possible and will be better in next versions (0.9.0).
Be careful, if you link against libvlc.dll, your soft needs to be GPL.
Posted: 19 Oct 2006 16:27
by aagis
Thank you for your reply, is there any documentation of that API?
Thanks agains,
Agis Andreou.
Posted: 19 Oct 2006 17:20
by Jean-Baptiste Kempf
Hmm... Yes. look in the developper section on the website.
Look into the source code .h
Posted: 24 Oct 2006 08:22
by BorPas
can somebody write a simple example of creating and placing on form vlc video window using libvlc.dll for msvc6 or delphi(vcl or winapi) ? i want to get rid of activex one day
Posted: 25 Oct 2006 17:35
by Odysee
I'm trying this too!
I have taken a look in the activex source. But it is not working yet
Witch steps must be done, to show a video in my own window ?
Here is my code. What is missing ???
Code: Select all
...
// create vlc instance
m_iVlcInstance = VLC_Create();
// init vlc
char *ppsz_argv[2] = { "C:\\Programme\\VideoLAN\\VLC", "--no-one-instance" };
VLC_Init(m_iVlcInstance, 2, ppsz_argv);
...
/* set internal video width and height */
vlc_value_t val;
val.i_int = rcClient.right - rcClient.left;
int iResult = VariableSet(m_iVlcInstance, "conf::width", val);
val.i_int = rcClient.bottom-rcClient.top;
iResult = VLC_VariableSet(m_iVlcInstance, "conf::height", val);
/* set internal video parent window */
/* horrible cast there */
val.i_int = reinterpret_cast<int>(m_hWnd); // -> thisis my window handle!!!
iResult = VLC_VariableSet(m_iVlcInstance, "drawable", val);
// add video stream
iResult = VLC_AddTarget(m_iVlcInstance, "D:\\videostream.mpeg", NULL, 0, PLAYLIST_APPEND , PLAYLIST_END);
// play
iResult = VLC_Play(m_iVlcInstance);
ciao Odysee
Posted: 25 Oct 2006 18:22
by Odysee
I have found the problem!
When i copy the exe into the vlc directory it works!
But how must i initialize libvlc, when the program is not in the vlc directory ???
Working code in the vlc directory:
char *ppsz_argv[2] = { "vlc", "--no-one-instance" };
-> Problem sloved
char *ppsz_argv[2] = { "C:\\Programme\\VideoLAN\\VLC\\vlc", "--no-one-instance"};
thanks!
Posted: 26 Oct 2006 20:09
by aagis
Thanks!! the code worked fine in my delphi application. Just some issues I came accross for general reference:
-- note to use the cdecl calling convention when importing the functions (it took me some time to figure that out)
-- set vlc_value_t to int64 as (correct me if I'm wrong) there are no union structures in delphi. thus a function as the following is needed
type
vlc_value_t=int64;
function vlc_int(i:integer):vlc_value_t;
type PInt=^integer;
begin
Result := 0;
PInt(@Result)^ := i;
end;
function vlc_int(const val:vlc_value_t):integer;
type PInt=^integer;
begin
Result := PInt(@val)^;
end;
Thanks again,
Agis
Posted: 27 Oct 2006 16:57
by aagis
Here is the delphi code
libvlc wrapper
Code: Select all
unit vlc;
interface
type
vlc_bool_t=integer;
vlc_int64_t=int64;
//typedef struct vlc_list_t vlc_list_t;
//typedef struct vlc_object_t vlc_object_t;
const
VLC_VAR_VOID =$0010;
VLC_VAR_BOOL =$0020;
VLC_VAR_INTEGER =$0030;
VLC_VAR_HOTKEY =$0031;
VLC_VAR_STRING =$0040;
VLC_VAR_MODULE =$0041;
VLC_VAR_FILE =$0042;
VLC_VAR_DIRECTORY=$0043;
VLC_VAR_VARIABLE =$0044;
VLC_VAR_FLOAT =$0050;
VLC_VAR_TIME =$0060;
VLC_VAR_ADDRESS =$0070;
VLC_VAR_MUTEX =$0080;
VLC_VAR_LIST =$0090;
type
vlc_value_t=packed record
a, b, c, d, e, f, g, h:char;
end;
//typedef union
//{
// int i_int;
// vlc_bool_t b_bool;
// float f_float;
// char * psz_string;
// void * p_address;
// vlc_object_t * p_object;
// vlc_list_t * p_list;
// vlc_int64_t i_time;
//
// struct { char *psz_name; int i_object_id; } var;
//
// /* Make sure the structure is at least 64bits */
// struct { char a, b, c, d, e, f, g, h; } padding;
//} ;
function vlc_int(const val:vlc_value_t):integer;overload;
function vlc_int(val:integer):vlc_value_t;overload;
function vlc_bool(const val:vlc_value_t):vlc_bool_t;overload;
function vlc_bool(val:vlc_bool_t):vlc_value_t;overload;
function vlc_pchar(const val:vlc_value_t):Pchar;overload;
function vlc_pchar(val:Pchar):vlc_value_t;overload;
function vlc_time(const val:vlc_value_t):vlc_int64_t;overload;
function vlc_time(val:vlc_int64_t):vlc_value_t;overload;
//struct vlc_list_t
//{
// int i_count;
// vlc_value_t * p_values;
// int * pi_types;
//};
//*****************************************************************************
// * Error values
// *****************************************************************************/
const
VLC_SUCCESS =-0;// /* No error */
VLC_ENOMEM =-1;// /* Not enough memory */
VLC_ETHREAD =-2;// /* Thread error */
VLC_ETIMEOUT =-3;// /* Timeout */
VLC_ENOMOD =-10;// /* Module not found */
VLC_ENOOBJ =-20;// /* Object not found */
VLC_EBADOBJ =-21;// /* Bad object type */
VLC_ENOVAR =-30;// /* Variable not found */
VLC_EBADVAR =-31;// /* Bad variable value */
VLC_EEXIT =-255;// /* Program exited */
VLC_EEXITSUCCESS =-999;// /* Program exited successfully */
VLC_EGENERIC =-666;// /* Generic error */
//*****************************************************************************
// * Booleans
//*****************************************************************************/
VLC_FALSE =0;
VLC_TRUE =1;
///*****************************************************************************
// * Playlist
// *****************************************************************************/
///* Used by VLC_AddTarget() */
PLAYLIST_INSERT =$0001;
PLAYLIST_REPLACE =$0002;
PLAYLIST_APPEND =$0004;
PLAYLIST_GO =$0008;
PLAYLIST_CHECK_INSERT =$0010;
PLAYLIST_PREPARSE =$0020;
PLAYLIST_INSERTANDGO =$0009;
PLAYLIST_END =-666;
function VLC_Version ( ):PChar;cdecl;
function VLC_CompileTime ():PChar;cdecl;
function VLC_CompileBy ( ):Pchar;cdecl;
function VLC_CompileHost ():Pchar;cdecl;
function VLC_CompileDomain ():Pchar;cdecl;
function VLC_Compiler ( ):Pchar;cdecl;
function VLC_Changeset ( ):Pchar;cdecl;
function VLC_Error ( i_err:integer ):PChar;cdecl;
function VLC_Create( ):integer;cdecl;
function VLC_Init( i_obj,i_argc:integer;ppsz_argv:PPChar ):integer;cdecl;
function VLC_AddIntf( i_obj:integer;psz_module:Pchar;b_block,b_play:vlc_bool_t ):integer;cdecl;
function VLC_Die( i_obj:integer ):integer;cdecl;
function VLC_CleanUp(i_obj:integer ):integer;cdecl;
function VLC_Destroy(i_obj:integer ):integer;cdecl;
function VLC_VariableSet( i_obj:integer; psz_var:PChar;value:vlc_value_t ):integer;cdecl;
function VLC_VariableGet( i_obj:integer; psz_var:PChar;var value:vlc_value_t ):integer;cdecl;
function VLC_VariableType( i_obj:integer; psz_var:PChar;var pi_type:integer ):integer;cdecl;
function VLC_AddTarget(i_object:integer;psz_target:Pchar;ppsz_options:PPChar;
i_options,i_mode,i_pos:integer ):integer;cdecl;
function VLC_Play( i_obj:integer ):integer;cdecl;
function VLC_Pause( i_obj:integer ):integer;cdecl;
function VLC_Stop( i_obj:integer ):integer;cdecl;
function VLC_IsPlaying( i_obj:integer ):vlc_bool_t;cdecl;
function VLC_PositionGet( i_obj:integer ):single;cdecl;
function VLC_PositionSet( i_obj:integer;pos:single ):single;cdecl;
function VLC_TimeGet( i_obj:integer ):integer;cdecl;
function VLC_TimeSet( i_obj,i_seconds:integer;b_relative:vlc_bool_t ):integer;cdecl;
function VLC_LengthGet( i_obj:integer ):integer;cdecl;
function VLC_SpeedFaster( i_obj:integer ):Single;cdecl;
function VLC_SpeedSlower( i_obj:integer ):Single;cdecl;
function VLC_PlaylistIndex( i_obj:integer ):integer;cdecl;
function VLC_PlaylistNumberOfItems( i_obj:integer ):integer;cdecl;
function VLC_PlaylistNext( i_obj:integer ):integer;cdecl;
function VLC_PlaylistPrev( i_obj:integer ):integer;cdecl;
function VLC_PlaylistClear( i_obj:integer ):integer;cdecl;
function VLC_VolumeSet( i_obj,volume:integer):integer;cdecl;
function VLC_VolumeGet( i_obj:integer):integer;cdecl;
function VLC_VolumeMute( i_obj:integer):integer;cdecl;
function VLC_FullScreen( i_obj:integer):integer;cdecl;
implementation
const
VLC_DLL='libvlc.dll';
function vlc_int(val:integer):vlc_value_t;
type P=^integer;
begin
FillChar(Result,sizeof(vlc_value_t),0);
P(@Result)^ := val;
end;
function vlc_int(const val:vlc_value_t):integer;
type P=^integer;
begin
Result := P(@val)^;
end;
function vlc_bool(val:vlc_bool_t):vlc_value_t;
type P=^vlc_bool_t;
begin
FillChar(Result,sizeof(vlc_value_t),0);
P(@Result)^ := val;
end;
function vlc_bool(const val:vlc_value_t):vlc_bool_t;
type P=^vlc_bool_t;
begin
Result := P(@val)^;
end;
function vlc_pchar(val:Pchar):vlc_value_t;
type P=^Pchar;
begin
FillChar(Result,sizeof(vlc_value_t),0);
P(@Result)^ := val;
end;
function vlc_pchar(const val:vlc_value_t):PChar;
type P=^Pchar;
begin
Result := P(@val)^;
end;
function vlc_time(val:vlc_int64_t):vlc_value_t;
type P=^vlc_int64_t;
begin
FillChar(Result,sizeof(vlc_value_t),0);
P(@Result)^ := val;
end;
function vlc_time(const val:vlc_value_t):vlc_int64_t;
type P=^vlc_int64_t;
begin
Result := P(@val)^;
end;
function VLC_Version ( ):PChar;external VLC_DLL;
function VLC_CompileTime ():PChar;external VLC_DLL;
function VLC_CompileBy ( ):Pchar;external VLC_DLL;
function VLC_CompileHost ():Pchar;external VLC_DLL;
function VLC_CompileDomain ():Pchar;external VLC_DLL;
function VLC_Compiler ( ):Pchar;external VLC_DLL;
function VLC_Changeset ( ):Pchar;external VLC_DLL;
function VLC_Error ( i_err:integer ):PChar;external VLC_DLL;
function VLC_Create( ):integer;external VLC_DLL;
function VLC_Init( i_obj,i_argc:integer;ppsz_argv:PPChar ):integer;external VLC_DLL;
function VLC_AddIntf( i_obj:integer;psz_module:Pchar;b_block,b_play:vlc_bool_t ):integer;external VLC_DLL;
function VLC_Die( i_obj:integer ):integer;external VLC_DLL;
function VLC_CleanUp(i_obj:integer ):integer;external VLC_DLL;
function VLC_Destroy(i_obj:integer ):integer;external VLC_DLL;
function VLC_VariableSet( i_obj:integer; psz_var:PChar;value:vlc_value_t ):integer;external VLC_DLL;
function VLC_VariableGet( i_obj:integer; psz_var:PChar;var value:vlc_value_t ):integer;external VLC_DLL;
function VLC_VariableType( i_obj:integer; psz_var:PChar;var pi_type:integer ):integer;external VLC_DLL;
function VLC_AddTarget(i_object:integer;psz_target:Pchar;ppsz_options:PPChar;
i_options,i_mode,i_pos:integer ):integer;external VLC_DLL;
function VLC_Play( i_obj:integer ):integer;external VLC_DLL;
function VLC_Pause( i_obj:integer ):integer;external VLC_DLL;
function VLC_Stop( i_obj:integer ):integer;external VLC_DLL;
function VLC_IsPlaying( i_obj:integer ):vlc_bool_t;external VLC_DLL;
function VLC_PositionGet( i_obj:integer ):single;external VLC_DLL;
function VLC_PositionSet( i_obj:integer;pos:single ):single;external VLC_DLL;
function VLC_TimeGet( i_obj:integer ):integer;external VLC_DLL;
function VLC_TimeSet( i_obj,i_seconds:integer;b_relative:vlc_bool_t ):integer;external VLC_DLL;
function VLC_LengthGet( i_obj:integer ):integer;external VLC_DLL;
function VLC_SpeedFaster( i_obj:integer ):Single;external VLC_DLL;
function VLC_SpeedSlower( i_obj:integer ):Single;external VLC_DLL;
function VLC_PlaylistIndex( i_obj:integer ):integer;external VLC_DLL;
function VLC_PlaylistNumberOfItems( i_obj:integer ):integer;external VLC_DLL;
function VLC_PlaylistNext( i_obj:integer ):integer;external VLC_DLL;
function VLC_PlaylistPrev( i_obj:integer ):integer;external VLC_DLL;
function VLC_PlaylistClear( i_obj:integer ):integer;external VLC_DLL;
function VLC_VolumeSet( i_obj,volume:integer):integer;external VLC_DLL;
function VLC_VolumeGet( i_obj:integer):integer;external VLC_DLL;
function VLC_VolumeMute( i_obj:integer):integer;external VLC_DLL;
function VLC_FullScreen( i_obj:integer):integer;external VLC_DLL;
end.
And the in object code (interchangable with the activeX)
Code: Select all
unit vlcwrap;
interface
uses vlc,SysUtils,Classes,Windows,Forms,extctrls,Variants;
const
VlcPlayListInsert = PLAYLIST_INSERT;
VlcPlayListInsertAndGo = PLAYLIST_INSERT+PLAYLIST_GO;
type
TVLCPlugin=class
private
Panel:TPanel;
handle:THandle;
i_object:integer;
function getVolume: integer;
procedure setVolume(const Value: integer);
function getVisible: boolean;
procedure setVisible(const Value: boolean);
function getLength: integer;
function getTime: integer;
procedure setTime(const Value: integer);
function getPlaying: boolean;
public
constructor Create(Panel:TPanel);
destructor Destroy;override;
property Volume:integer read getVolume write setVolume;
property Visible:boolean read getVisible write setVisible;
property Time:integer read getTime write setTime;
property Length:integer read getLength;
property Playing:boolean read getPlaying;
procedure play;
procedure pause;
procedure stop;
procedure shuttle(seconds:integer);
procedure playFaster;
procedure playSlower;
procedure playListClear;
function AddTarget(psz_target:string;options:Variant;
i_mode,i_pos:integer ):integer;cdecl;
end;
implementation
{ TVLCPlugin }
function TVLCPlugin.AddTarget(psz_target: string; options: Variant;
i_mode,i_pos: integer): integer;
begin
assert(options=null,'Options not supported');
VLC_AddTarget(i_object,Pchar(psz_target),nil,0,i_mode,-666);
end;
constructor TVLCPlugin.Create(Panel: TPanel);
label ERROR;
var
psz_option:PChar;
i_result:integer;
val:vlc_value_t;
msg:string;
begin
inherited Create;
Self.Panel := Panel;
Handle:=Panel.Handle;
i_object := VLC_Create();
psz_option := 'C:\Program Files (x86)\VideoLAN\VLC\vlc.exe';
i_result := VLC_Init(i_object,1,@psz_option);
if i_result<0 then goto ERROR;
i_result :=VLC_VariableSet(i_object,'conf::width',vlc_int(Panel.Width));
if i_result<0 then goto ERROR;
i_result :=VLC_VariableSet(i_object,'conf::height',vlc_int(Panel.Height));
if i_result<0 then goto ERROR;
i_result :=VLC_VariableSet(i_object,'drawable',vlc_int(Panel.Handle));
if i_result<0 then goto ERROR;
i_result := VLC_VariableGet(i_object,'drawable',val);
if i_result<0 then goto ERROR;
exit;
ERROR:
msg := 'Error '+IntToStr(i_result) + ' :';
msg := msg + VLC_ERROR(i_result);
MessageBox(handle,Pchar(msg),'error',MB_ICONWARNING);
exit;
end;
destructor TVLCPlugin.destroy;
begin
VLC_CleanUp(i_object);
VLC_Destroy(i_object);
inherited;
end;
function TVLCPlugin.getLength: integer;
begin
Result := VLC_LengthGet(i_object);
end;
function TVLCPlugin.getPlaying: boolean;
begin
Result := VLC_IsPlaying(i_object)<>VLC_FALSE;
end;
function TVLCPlugin.getTime: integer;
begin
Result := VLC_TimeGet(i_object);
end;
function TVLCPlugin.getVisible: boolean;
begin
Result := Panel.Visible;
end;
function TVLCPlugin.getVolume: integer;
begin
Result := VLC_VolumeGet(i_object);
end;
procedure TVLCPlugin.pause;
begin
VLC_pause(i_object);
end;
procedure TVLCPlugin.play;
begin
VLC_Play(i_object);
end;
procedure TVLCPlugin.playFaster;
begin
VLC_SpeedFaster(i_object);
end;
procedure TVLCPlugin.playListClear;
begin
VLC_PlayListClear(i_object);
end;
procedure TVLCPlugin.playSlower;
begin
VLC_SpeedSlower(i_object);
end;
procedure TVLCPlugin.setTime(const Value: integer);
begin
VLC_TimeSet(i_object,Value,VLC_FALSE);
end;
procedure TVLCPlugin.setVisible(const Value: boolean);
begin
Panel.Visible := Value;
end;
procedure TVLCPlugin.setVolume(const Value: integer);
begin
VLC_volumeSet(i_object,Value);
end;
procedure TVLCPlugin.shuttle(seconds: integer);
begin
VLC_TimeSet(i_object,seconds,VLC_TRUE);
end;
procedure TVLCPlugin.stop;
begin
VLC_Stop(i_object);
end;
Hope this helps
Posted: 27 Oct 2006 18:38
by BorPas
many thanks aagis, it is greate!
Posted: 07 Nov 2006 17:55
by Fritivi
Another implementation and example can also be found here :
http://tothpaul.free.fr/zip/VLD.zip
I use Paul Toth's version and it has the advantage of having a clearer to use type (TValue) to send and retrieve data with vlc functions. It also finds vlclib using the Registry, i think you should include the same code in your unit aagis.
For those who want to test things with direct access to vlclib the example included in vld.zip will let you know what happens and what vlc functions send back, i found it very usefull.
VLD has been available for two months now and a link is present in the Wiki page about Delphi and the Active X, reading the wiki would have saved you a lot of time
Posted: 08 Nov 2006 00:03
by darianmiller
VLC_AddTarget() Anyone passing in options using Delphi with success? I haven't seen any samples on this and I'm running out of ideas.
Thanks,
Darian
Posted: 08 Nov 2006 12:46
by BorPas
I just do all needed VLC_setVariable before addTarget///
Posted: 08 Nov 2006 14:35
by keypad
Hello !
I try VLD with Delphi and it works great !
However, i can enable goom effect by doing this
Code: Select all
val.AsPChar:= 'goom';
call('VLC_VariableSet',VLC_VariableSet(vlc,'conf::audio-visual',val));
but how can i disable it when i want to ?
thanks
Posted: 10 Nov 2006 09:27
by keypad
Hello !
I just want to inform you that i find the answer...
To disable the goom effect, just do this !
Code: Select all
val.AsPChar:= '0';
call('VLC_VariableSet',VLC_VariableSet(vlc,'conf::audio-visual',val));
it works perfectly !
Posted: 11 Nov 2006 14:59
by BorPas
by the way, did anyone succeed in changing parameters of vout and aout in realtime : you know, to make something like this using libvlc.dll ?
Code: Select all
vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find(p_intf,
VLC_OBJECT_VOUT, FIND_ANYWHERE);
if( p_vout == NULL )
{
switch( event.GetId() )
{
case Hue_Event:
config_PutInt( p_intf , "hue" , event.GetPosition() );
break;
...............
}
any the same with p_aout ...