diff options
Diffstat (limited to 'src/3rdparty/libvlc')
-rw-r--r-- | src/3rdparty/libvlc/README.txt | 11 | ||||
-rw-r--r-- | src/3rdparty/libvlc/fpg_vlc.pas | 81 | ||||
-rw-r--r-- | src/3rdparty/libvlc/libvlc.pas | 1156 | ||||
-rw-r--r-- | src/3rdparty/libvlc/vlc.pas | 1746 |
4 files changed, 2994 insertions, 0 deletions
diff --git a/src/3rdparty/libvlc/README.txt b/src/3rdparty/libvlc/README.txt new file mode 100644 index 00000000..0b1f1147 --- /dev/null +++ b/src/3rdparty/libvlc/README.txt @@ -0,0 +1,11 @@ + +VLC Library 2.x + +This directory contains header translations of the VLC library v2.x, as well +as unit containing a non-gui Media Player class. There is also a fpGUI Media +Player descendant class added, which allows you to embed the video output +inside a fpGUI widget. + +This code was commissioned by Master Maths [http://www.mastermaths.co.za] +(my employer), and kindly donated to the Free Pascal and fpGUI Toolkit +projects. diff --git a/src/3rdparty/libvlc/fpg_vlc.pas b/src/3rdparty/libvlc/fpg_vlc.pas new file mode 100644 index 00000000..0eb8daba --- /dev/null +++ b/src/3rdparty/libvlc/fpg_vlc.pas @@ -0,0 +1,81 @@ +unit fpg_vlc; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, libvlc, vlc, fpg_main; + +Type + + { TFpgVLCPlayer } + + TFpgVLCPlayer = Class(TVLCMediaPlayer) + private + FParentWindow: TfpgWindow; + procedure SetParentWindowControl(AValue: TfpgWindow); + Protected + Procedure SetParentWindow; override; + Procedure SetParentWindowSize(AWidth,AHeight : Cardinal); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + Published + Property ParentWindow : TfpgWindow Read FParentWindow Write SetParentWindowControl; + end; + +implementation + +{ TFpgVLCPlayer } + +procedure TFpgVLCPlayer.SetParentWindowControl(AValue: TfpgWindow); +begin + if FParentWindow=AValue then Exit; + If Assigned(FParentWindow) then + FParentWindow.RemoveFreeNotification(Self); + FParentWindow:=AValue; + If Assigned(FParentWindow) then + FParentWindow.FreeNotification(Self); +end; + +procedure TFpgVLCPlayer.SetParentWindow; + +begin + if Assigned(ParentWindow) then + begin + {$IFDEF UNIX} + libvlc_media_player_set_xwindow(Instance, ParentWindow.WinHandle); + {$ENDIF} + {$IFDEF MSWINDOWS} + libvlc_media_player_set_hwnd(Instance, Pointer(ParentWindow.WinHandle)); + {$ENDIF} + end + else if HaveInstance then + begin + {$IFDEF UNIX} + libvlc_media_player_set_xwindow(Instance, 0); + {$ENDIF} + {$IFDEF MSWINDOWS} + libvlc_media_player_set_hwnd(Instance, Nil); + {$ENDIF} + end +end; + +procedure TFpgVLCPlayer.SetParentWindowSize(AWidth, AHeight: Cardinal); +begin + If Assigned(ParentWindow) then + begin + ParentWindow.Width:=AWidth; + ParentWindow.Height:=AHeight; + end; +end; + +procedure TFpgVLCPlayer.Notification(AComponent: TComponent; + Operation: TOperation); +begin + Inherited; + if (Operation=opRemove) and (AComponent=FParentWindow) then + FParentWindow:=Nil; +end; + +end. + diff --git a/src/3rdparty/libvlc/libvlc.pas b/src/3rdparty/libvlc/libvlc.pas new file mode 100644 index 00000000..cfdc1e52 --- /dev/null +++ b/src/3rdparty/libvlc/libvlc.pas @@ -0,0 +1,1156 @@ + +{$mode objfpc} +unit libvlc; +interface + +uses + ctypes; + +{$IFDEF FPC} +{$PACKRECORDS C} +{$ENDIF} + +Const + +{$ifdef unix} + libname = 'libvlc.so'; +{$else} +{$ifdef windows} + DefaultlibPath = 'C:\Program files\Videolan\VLC\'; + corelibname = 'libvlccore.dll'; + libname = 'libvlc.dll'; +{$endif} +{$endif} + + Type + _bool = cint; + Ppcchar = ^Pcchar; + + // Opaque types. + libvlc_event_manager_t = record end; + Libvlc_instance_t = record end; + Libvlc_log_iterator_t = record end; + Libvlc_log_t = record end; + Libvlc_media_discoverer_t = record end; + Libvlc_media_library_t = record end; + Libvlc_media_list_player_t = record end; + Libvlc_media_list_t = record end; + Libvlc_media_player_t = record end; + Libvlc_media_t = record end; + + Plibvlc_audio_output_t = ^libvlc_audio_output_t; + Plibvlc_event_manager_t = ^libvlc_event_manager_t; + Plibvlc_event_t = ^libvlc_event_t; + Plibvlc_instance_t = ^libvlc_instance_t; + Plibvlc_log_iterator_t = ^libvlc_log_iterator_t; + Plibvlc_log_message_t = ^libvlc_log_message_t; + Plibvlc_log_t = ^libvlc_log_t; + Plibvlc_media_discoverer_t = ^libvlc_media_discoverer_t; + Plibvlc_media_library_t = ^libvlc_media_library_t; + Plibvlc_media_list_player_t = ^libvlc_media_list_player_t; + Plibvlc_media_list_t = ^libvlc_media_list_t; + Plibvlc_media_player_t = ^libvlc_media_player_t; + Plibvlc_media_stats_t = ^libvlc_media_stats_t; + Plibvlc_media_t = ^libvlc_media_t; + Plibvlc_media_track_info_t = ^libvlc_media_track_info_t; + Plibvlc_module_description_t = ^libvlc_module_description_t; + Plibvlc_track_description_t = ^libvlc_track_description_t; + + int8_t = cschar; + int16_t = csint; + int32_t = cint; + int64_t = clong; + uint8_t = cuchar; + uint16_t = csint; + uint32_t = cuint; + uint64_t = culong; + int_least8_t = cschar; + int_least16_t = csint; + int_least32_t = cint; + int_least64_t = clong; + uint_least8_t = cuchar; + uint_least16_t = csint; + uint_least32_t = cuint; + uint_least64_t = culong; + int_fast8_t = cschar; + int_fast16_t = clong; + int_fast32_t = clong; + int_fast64_t = clong; + uint_fast8_t = cuchar; + uint_fast16_t = culong; + uint_fast32_t = culong; + uint_fast64_t = culong; + intptr_t = clong; + uintptr_t = culong; + intmax_t = clong; + uintmax_t = culong; + + libvlc_time_t = int64_t; + libvlc_log_message_t = record + i_severity : cint; + psz_type : ^cchar; + psz_name : ^cchar; + psz_header : ^cchar; + psz_message : ^cchar; + end; + + libvlc_event_type_t = cint; + libvlc_callback_t = procedure (_para1:Plibvlc_event_t; _para2:pointer);cdecl; + + libvlc_module_description_t = record + psz_name : ^cchar; + psz_shortname : ^cchar; + psz_longname : ^cchar; + psz_help : ^cchar; + p_next : ^libvlc_module_description_t; + end; + +{ +static inline int64_t libvlc_delay(int64_t pts) + + return pts - libvlc_clock(); + + } + + + libvlc_meta_t = (libvlc_meta_Title,libvlc_meta_Artist, + libvlc_meta_Genre,libvlc_meta_Copyright, + libvlc_meta_Album,libvlc_meta_TrackNumber, + libvlc_meta_Description,libvlc_meta_Rating, + libvlc_meta_Date,libvlc_meta_Setting, + libvlc_meta_URL,libvlc_meta_Language, + libvlc_meta_NowPlaying,libvlc_meta_Publisher, + libvlc_meta_EncodedBy,libvlc_meta_ArtworkURL, + libvlc_meta_TrackID); + + libvlc_state_t = (libvlc_NothingSpecial := 0,libvlc_Opening, + libvlc_Buffering,libvlc_Playing,libvlc_Paused, + libvlc_Stopped,libvlc_Ended,libvlc_Error + ); + + libvlc_media_option_t = (libvlc_media_option_trusted := $2,libvlc_media_option_unique := $100 + ); + + libvlc_track_type_t = (libvlc_track_unknown := -(1),libvlc_track_audio := 0, + libvlc_track_video := 1,libvlc_track_text := 2 + ); + + libvlc_media_stats_t = record + i_read_bytes : cint; + f_input_bitrate : cfloat; + i_demux_read_bytes : cint; + f_demux_bitrate : cfloat; + i_demux_corrupted : cint; + i_demux_discontinuity : cint; + i_decoded_video : cint; + i_decoded_audio : cint; + i_displayed_pictures : cint; + i_lost_pictures : cint; + i_played_abuffers : cint; + i_lost_abuffers : cint; + i_sent_packets : cint; + i_sent_bytes : cint; + f_send_bitrate : cfloat; + end; + + libvlc_media_track_info_t = record + i_codec : uint32_t; + i_id : cint; + i_type : libvlc_track_type_t; + i_profile : cint; + i_level : cint; + u : record + case longint of + 0 : ( audio : record + i_channels : cunsigned; + i_rate : cunsigned; + end ); + 1 : ( video : record + i_height : cunsigned; + i_width : cunsigned; + end ); + end; + end; + + + libvlc_track_description_t = record + i_id : cint; + psz_name : ^cchar; + p_next : ^libvlc_track_description_t; + end; + + libvlc_audio_output_t = record + psz_name : ^cchar; + psz_description : ^cchar; + p_next : ^libvlc_audio_output_t; + end; + + libvlc_rectangle_t = record + top : cint; + left : cint; + bottom : cint; + right : cint; + end; + + libvlc_video_marquee_option_t = (libvlc_marquee_Enable := 0,libvlc_marquee_Text, + libvlc_marquee_Color,libvlc_marquee_Opacity, + libvlc_marquee_Position,libvlc_marquee_Refresh, + libvlc_marquee_Size,libvlc_marquee_Timeout, + libvlc_marquee_X,libvlc_marquee_Y); + + libvlc_navigate_mode_t = (libvlc_navigate_activate := 0,libvlc_navigate_up, + libvlc_navigate_down,libvlc_navigate_left, + libvlc_navigate_right); + + + libvlc_video_lock_cb = function (opaque:pointer; planes:Ppointer):pointer;cdecl; + libvlc_video_unlock_cb = procedure (opaque:pointer; picture:pointer; planes:Ppointer);cdecl; + libvlc_video_display_cb = procedure (opaque:pointer; picture:pointer);cdecl; + libvlc_video_format_cb = function (opaque:Ppointer; chroma:pcchar; width:pcunsigned; height:pcunsigned; pitches:pcunsigned; + lines:pcunsigned):cunsigned;cdecl; + libvlc_video_cleanup_cb = procedure (opaque:pointer);cdecl; + libvlc_audio_play_cb = procedure (data:pointer; samples:pointer; count:cunsigned; pts:int64_t);cdecl; + libvlc_audio_pause_cb = procedure (data:pointer; pts:int64_t);cdecl; + libvlc_audio_resume_cb = procedure (data:pointer; pts:int64_t);cdecl; + libvlc_audio_flush_cb = procedure (data:pointer; pts:int64_t);cdecl; + libvlc_audio_drain_cb = procedure (data:pointer);cdecl; + libvlc_audio_set_volume_cb = procedure (data:pointer; volume:cfloat; mute:_Bool);cdecl; + libvlc_audio_setup_cb = function (data:Ppointer; format:pcchar; rate:pcunsigned; channels:pcunsigned):cint;cdecl; + libvlc_audio_cleanup_cb = procedure (data:pointer);cdecl; + libvlc_video_logo_option_t = (libvlc_logo_enable,libvlc_logo_file,libvlc_logo_x, + libvlc_logo_y,libvlc_logo_delay,libvlc_logo_repeat, + libvlc_logo_opacity,libvlc_logo_position + ); + libvlc_video_adjust_option_t = (libvlc_adjust_Enable := 0,libvlc_adjust_Contrast, + libvlc_adjust_Brightness,libvlc_adjust_Hue, + libvlc_adjust_Saturation,libvlc_adjust_Gamma + ); + libvlc_audio_output_device_types_t = (libvlc_AudioOutputDevice_Error := -(1), + libvlc_AudioOutputDevice_Mono := 1, + libvlc_AudioOutputDevice_Stereo := 2, + libvlc_AudioOutputDevice_2F2R := 4, + libvlc_AudioOutputDevice_3F2R := 5, + libvlc_AudioOutputDevice_5_1 := 6,libvlc_AudioOutputDevice_6_1 := 7, + libvlc_AudioOutputDevice_7_1 := 8,libvlc_AudioOutputDevice_SPDIF := 10 + ); + + libvlc_audio_output_channel_t = (libvlc_AudioChannel_Error := -(1),libvlc_AudioChannel_Stereo := 1, + libvlc_AudioChannel_RStereo := 2,libvlc_AudioChannel_Left := 3, + libvlc_AudioChannel_Right := 4,libvlc_AudioChannel_Dolbys := 5 + ); + libvlc_playback_mode_t = (libvlc_playback_mode_default,libvlc_playback_mode_loop, + libvlc_playback_mode_repeat); + + libvlc_event_e = (libvlc_MediaMetaChanged := 0, + libvlc_MediaSubItemAdded, + libvlc_MediaDurationChanged,libvlc_MediaParsedChanged, + libvlc_MediaFreed,libvlc_MediaStateChanged, + libvlc_MediaPlayerMediaChanged := $100, + libvlc_MediaPlayerNothingSpecial,libvlc_MediaPlayerOpening, + libvlc_MediaPlayerBuffering,libvlc_MediaPlayerPlaying, + libvlc_MediaPlayerPaused,libvlc_MediaPlayerStopped, + libvlc_MediaPlayerForward,libvlc_MediaPlayerBackward, + libvlc_MediaPlayerEndReached,libvlc_MediaPlayerEncounteredError, + libvlc_MediaPlayerTimeChanged,libvlc_MediaPlayerPositionChanged, + libvlc_MediaPlayerSeekableChanged,libvlc_MediaPlayerPausableChanged, + libvlc_MediaPlayerTitleChanged,libvlc_MediaPlayerSnapshotTaken, + libvlc_MediaPlayerLengthChanged,libvlc_MediaPlayerVout, + libvlc_MediaListItemAdded := $200,libvlc_MediaListWillAddItem, + libvlc_MediaListItemDeleted,libvlc_MediaListWillDeleteItem, + libvlc_MediaListViewItemAdded := $300, + libvlc_MediaListViewWillAddItem,libvlc_MediaListViewItemDeleted, + libvlc_MediaListViewWillDeleteItem,libvlc_MediaListPlayerPlayed := $400, + libvlc_MediaListPlayerNextItemSet,libvlc_MediaListPlayerStopped, + libvlc_MediaDiscovererStarted := $500, + libvlc_MediaDiscovererEnded,libvlc_VlmMediaAdded := $600, + libvlc_VlmMediaRemoved,libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted,libvlc_VlmMediaInstanceStopped, + libvlc_VlmMediaInstanceStatusInit,libvlc_VlmMediaInstanceStatusOpening, + libvlc_VlmMediaInstanceStatusPlaying, + libvlc_VlmMediaInstanceStatusPause,libvlc_VlmMediaInstanceStatusEnd, + libvlc_VlmMediaInstanceStatusError); + + + libvlc_event_t = record + _type : cint; + p_obj : pointer; + case longint of + 0 : ( media_meta_changed : record + meta_type : libvlc_meta_t; + end ); + 1 : ( media_subitem_added : record + new_child : ^libvlc_media_t; + end ); + 2 : ( media_duration_changed : record + new_duration : int64_t; + end ); + 3 : ( media_parsed_changed : record + new_status : cint; + end ); + 4 : ( media_freed : record + md : ^libvlc_media_t; + end ); + 5 : ( media_state_changed : record + new_state : libvlc_state_t; + end ); + 6 : ( media_player_buffering : record + new_cache : cfloat; + end ); + 7 : ( media_player_position_changed : record + new_position : cfloat; + end ); + 8 : ( media_player_time_changed : record + new_time : libvlc_time_t; + end ); + 9 : ( media_player_title_changed : record + new_title : cint; + end ); + 10 : ( media_player_seekable_changed : record + new_seekable : cint; + end ); + 11 : ( media_player_pausable_changed : record + new_pausable : cint; + end ); + 12 : ( media_player_vout : record + new_count : cint; + end ); + 13 : ( media_list_item_added : record + item : ^libvlc_media_t; + index : cint; + end ); + 14 : ( media_list_will_add_item : record + item : ^libvlc_media_t; + index : cint; + end ); + 15 : ( media_list_item_deleted : record + item : ^libvlc_media_t; + index : cint; + end ); + 16 : ( media_list_will_delete_item : record + item : ^libvlc_media_t; + index : cint; + end ); + 17 : ( media_list_player_next_item_set : record + item : ^libvlc_media_t; + end ); + 18 : ( media_player_snapshot_taken : record + psz_filename : ^cchar; + end ); + 19 : ( media_player_length_changed : record + new_length : libvlc_time_t; + end ); + 20 : ( vlm_media_event : record + psz_media_name : ^cchar; + psz_instance_name : ^cchar; + end ); + 21 : ( media_player_media_changed : record + new_media : ^libvlc_media_t; + end ); + end; + + PPlibvlc_media_track_info_t = ^Plibvlc_media_track_info_t; + cbtype1 = procedure (_para1:pointer); cdecl; + +Var + libvlc_media_player_new : function(p_libvlc_instance:Plibvlc_instance_t):plibvlc_media_player_t; cdecl; + libvlc_media_player_new_from_media : function(p_md:Plibvlc_media_t):plibvlc_media_player_t; cdecl; + libvlc_media_player_release : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_retain : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_set_media : procedure(p_mi:Plibvlc_media_player_t; p_md:Plibvlc_media_t); cdecl; + libvlc_media_player_get_media : function(p_mi:Plibvlc_media_player_t):plibvlc_media_t; cdecl; + libvlc_media_player_event_manager : function(p_mi:Plibvlc_media_player_t):plibvlc_event_manager_t; cdecl; + libvlc_media_player_is_playing : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_play : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_set_pause : procedure(mp:Plibvlc_media_player_t; do_pause:cint); cdecl; + libvlc_media_player_pause : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_stop : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_new_location : function(p_instance:Plibvlc_instance_t; psz_mrl:pcchar):plibvlc_media_t; cdecl; + libvlc_media_new_path : function(p_instance:Plibvlc_instance_t; path:pcchar):plibvlc_media_t; cdecl; + libvlc_media_new_fd : function(p_instance:Plibvlc_instance_t; fd:cint):plibvlc_media_t; cdecl; + libvlc_media_new_as_node : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):plibvlc_media_t; cdecl; + libvlc_media_add_option : procedure(p_md:Plibvlc_media_t; ppsz_options:pcchar); cdecl; + libvlc_media_add_option_flag : procedure(p_md:Plibvlc_media_t; ppsz_options:pcchar; i_flags:cunsigned); cdecl; + libvlc_media_retain : procedure(p_md:Plibvlc_media_t); cdecl; + libvlc_media_release : procedure(p_md:Plibvlc_media_t); cdecl; + libvlc_media_get_mrl : function(p_md:Plibvlc_media_t):pcchar; cdecl; + libvlc_media_duplicate : function(p_md:Plibvlc_media_t):plibvlc_media_t; cdecl; + libvlc_media_get_meta : function(p_md:Plibvlc_media_t; e_meta:libvlc_meta_t):pcchar; cdecl; + libvlc_media_set_meta : procedure(p_md:Plibvlc_media_t; e_meta:libvlc_meta_t; psz_value:pcchar); cdecl; + libvlc_media_save_meta : function(p_md:Plibvlc_media_t):cint; cdecl; + libvlc_media_get_state : function(p_md:Plibvlc_media_t):libvlc_state_t; cdecl; + libvlc_media_get_stats : function(p_md:Plibvlc_media_t; p_stats:Plibvlc_media_stats_t):cint; cdecl; + libvlc_media_subitems : function(p_md:Plibvlc_media_t):plibvlc_media_list_t; cdecl; + libvlc_media_event_manager : function(p_md:Plibvlc_media_t):plibvlc_event_manager_t; cdecl; + libvlc_media_get_duration : function(p_md:Plibvlc_media_t):libvlc_time_t; cdecl; + libvlc_media_parse : procedure(p_md:Plibvlc_media_t); cdecl; + libvlc_media_parse_async : procedure(p_md:Plibvlc_media_t); cdecl; + libvlc_media_is_parsed : function(p_md:Plibvlc_media_t):cint; cdecl; + libvlc_media_set_user_data : procedure(p_md:Plibvlc_media_t; p_new_user_data:pointer); cdecl; + libvlc_media_get_user_data : function(p_md:Plibvlc_media_t):pointer; cdecl; + libvlc_media_get_tracks_info : function(p_md:Plibvlc_media_t; tracks:PPlibvlc_media_track_info_t):cint; cdecl; + libvlc_module_description_list_release : procedure(p_list:Plibvlc_module_description_t); cdecl; + libvlc_audio_filter_list_get : function(p_instance:Plibvlc_instance_t):plibvlc_module_description_t; cdecl; + libvlc_video_filter_list_get : function(p_instance:Plibvlc_instance_t):plibvlc_module_description_t; cdecl; + libvlc_clock : function:int64_t; cdecl; + + libvlc_errmsg : function:pcchar; cdecl; + libvlc_clearerr : procedure; cdecl; + libvlc_printerr : function(fmt:pcchar):pcchar;varargs; cdecl; + + libvlc_new : function(argc:cint; argv:Ppcchar):plibvlc_instance_t; cdecl; + libvlc_release : procedure(p_instance:Plibvlc_instance_t); cdecl; + libvlc_retain : procedure(p_instance:Plibvlc_instance_t); cdecl; + libvlc_add_intf : function(p_instance:Plibvlc_instance_t; name:pcchar):cint; cdecl; + libvlc_set_exit_handler : procedure(p_instance:Plibvlc_instance_t; cb:cbtype1; opaque:pointer); cdecl; + libvlc_wait : procedure(p_instance:Plibvlc_instance_t); cdecl; + libvlc_set_user_agent : procedure(p_instance:Plibvlc_instance_t; name:pcchar; http:pcchar); cdecl; + libvlc_get_version : function:pcchar; cdecl; + libvlc_get_compiler : function:pcchar; cdecl; + libvlc_get_changeset : function:pcchar; cdecl; + libvlc_free : procedure(ptr:pointer); cdecl; + libvlc_event_attach : function(p_event_manager:Plibvlc_event_manager_t; i_event_type:libvlc_event_type_t; f_callback:libvlc_callback_t; user_data:pointer):cint; cdecl; + libvlc_event_detach : procedure(p_event_manager:Plibvlc_event_manager_t; i_event_type:libvlc_event_type_t; f_callback:libvlc_callback_t; p_user_data:pointer); cdecl; + libvlc_event_type_name : function(event_type:libvlc_event_type_t):pcchar; cdecl; + libvlc_get_log_verbosity : function(p_instance:Plibvlc_instance_t):cunsigned; cdecl; + libvlc_set_log_verbosity : procedure(p_instance:Plibvlc_instance_t; level:cunsigned); cdecl; + libvlc_log_open : function(p_instance:Plibvlc_instance_t):plibvlc_log_t; cdecl; + libvlc_log_close : procedure(p_log:Plibvlc_log_t); cdecl; + libvlc_log_count : function(p_log:Plibvlc_log_t):cunsigned; cdecl; + libvlc_log_clear : procedure(p_log:Plibvlc_log_t); cdecl; + libvlc_log_get_iterator : function(p_log:Plibvlc_log_t):plibvlc_log_iterator_t; cdecl; + libvlc_log_iterator_free : procedure(p_iter:Plibvlc_log_iterator_t); cdecl; + libvlc_log_iterator_has_next : function(p_iter:Plibvlc_log_iterator_t):cint; cdecl; + libvlc_log_iterator_next : function(p_iter:Plibvlc_log_iterator_t; p_buffer:Plibvlc_log_message_t):plibvlc_log_message_t; cdecl; + libvlc_audio_output_list_get : function(p_instance:Plibvlc_instance_t):plibvlc_audio_output_t; cdecl; + libvlc_audio_output_list_release : procedure(p_list:Plibvlc_audio_output_t); cdecl; + libvlc_audio_output_set : function(p_mi:Plibvlc_media_player_t; psz_name:pcchar):cint; cdecl; + libvlc_audio_output_device_count : function(p_instance:Plibvlc_instance_t; psz_audio_output:pcchar):cint; cdecl; + libvlc_audio_output_device_longname : function(p_instance:Plibvlc_instance_t; psz_audio_output:pcchar; i_device:cint):pcchar; cdecl; + libvlc_audio_output_device_id : function(p_instance:Plibvlc_instance_t; psz_audio_output:pcchar; i_device:cint):pcchar; cdecl; + libvlc_audio_output_device_set : procedure(p_mi:Plibvlc_media_player_t; psz_audio_output:pcchar; psz_device_id:pcchar); cdecl; + libvlc_audio_output_get_device_type : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_output_set_device_type : procedure(p_mi:Plibvlc_media_player_t; device_type:cint); cdecl; + libvlc_audio_toggle_mute : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_audio_get_mute : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_set_mute : procedure(p_mi:Plibvlc_media_player_t; status:cint); cdecl; + libvlc_audio_get_volume : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_set_volume : function(p_mi:Plibvlc_media_player_t; i_volume:cint):cint; cdecl; + libvlc_audio_get_track_count : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_get_track_description : function(p_mi:Plibvlc_media_player_t):plibvlc_track_description_t; cdecl; + libvlc_audio_get_track : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_set_track : function(p_mi:Plibvlc_media_player_t; i_track:cint):cint; cdecl; + libvlc_audio_get_channel : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_audio_set_channel : function(p_mi:Plibvlc_media_player_t; channel:cint):cint; cdecl; + libvlc_audio_get_delay : function(p_mi:Plibvlc_media_player_t):int64_t; cdecl; + libvlc_audio_set_delay : function(p_mi:Plibvlc_media_player_t; i_delay:int64_t):cint; cdecl; + libvlc_media_list_new : function(p_instance:Plibvlc_instance_t):plibvlc_media_list_t; cdecl; + libvlc_media_list_release : procedure(p_ml:Plibvlc_media_list_t); cdecl; + libvlc_media_list_retain : procedure(p_ml:Plibvlc_media_list_t); cdecl; + + libvlc_media_list_add_file_content : function(p_ml:Plibvlc_media_list_t; psz_uri:pcchar):cint; cdecl; + libvlc_media_list_set_media : procedure(p_ml:Plibvlc_media_list_t; p_md:Plibvlc_media_t); cdecl; + libvlc_media_list_media : function(p_ml:Plibvlc_media_list_t):plibvlc_media_t; cdecl; + libvlc_media_list_add_media : function(p_ml:Plibvlc_media_list_t; p_md:Plibvlc_media_t):cint; cdecl; + libvlc_media_list_insert_media : function(p_ml:Plibvlc_media_list_t; p_md:Plibvlc_media_t; i_pos:cint):cint; cdecl; + libvlc_media_list_remove_index : function(p_ml:Plibvlc_media_list_t; i_pos:cint):cint; cdecl; + libvlc_media_list_count : function(p_ml:Plibvlc_media_list_t):cint; cdecl; + libvlc_media_list_item_at_index : function(p_ml:Plibvlc_media_list_t; i_pos:cint):plibvlc_media_t; cdecl; + libvlc_media_list_index_of_item : function(p_ml:Plibvlc_media_list_t; p_md:Plibvlc_media_t):cint; cdecl; + libvlc_media_list_is_readonly : function(p_ml:Plibvlc_media_list_t):cint; cdecl; + libvlc_media_list_lock : procedure(p_ml:Plibvlc_media_list_t); cdecl; + libvlc_media_list_unlock : procedure(p_ml:Plibvlc_media_list_t); cdecl; + libvlc_media_list_event_manager : function(p_ml:Plibvlc_media_list_t):plibvlc_event_manager_t; cdecl; + libvlc_media_list_player_new : function(p_instance:Plibvlc_instance_t):plibvlc_media_list_player_t; cdecl; + libvlc_media_list_player_release : procedure(p_mlp:Plibvlc_media_list_player_t); cdecl; + libvlc_media_list_player_retain : procedure(p_mlp:Plibvlc_media_list_player_t); cdecl; + libvlc_media_list_player_event_manager : function(p_mlp:Plibvlc_media_list_player_t):plibvlc_event_manager_t; cdecl; + libvlc_media_list_player_set_media_player : procedure(p_mlp:Plibvlc_media_list_player_t; p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_list_player_set_media_list : procedure(p_mlp:Plibvlc_media_list_player_t; p_mlist:Plibvlc_media_list_t); cdecl; + libvlc_media_list_player_play : procedure(p_mlp:Plibvlc_media_list_player_t); cdecl; + libvlc_media_list_player_pause : procedure(p_mlp:Plibvlc_media_list_player_t); cdecl; + libvlc_media_list_player_is_playing : function(p_mlp:Plibvlc_media_list_player_t):cint; cdecl; + libvlc_media_list_player_get_state : function(p_mlp:Plibvlc_media_list_player_t):libvlc_state_t; cdecl; + libvlc_media_list_player_play_item_at_index : function(p_mlp:Plibvlc_media_list_player_t; i_index:cint):cint; cdecl; + libvlc_media_list_player_play_item : function(p_mlp:Plibvlc_media_list_player_t; p_md:Plibvlc_media_t):cint; cdecl; + libvlc_media_list_player_stop : procedure(p_mlp:Plibvlc_media_list_player_t); cdecl; + libvlc_media_list_player_next : function(p_mlp:Plibvlc_media_list_player_t):cint; cdecl; + libvlc_media_list_player_previous : function(p_mlp:Plibvlc_media_list_player_t):cint; cdecl; + libvlc_media_list_player_set_playback_mode : procedure(p_mlp:Plibvlc_media_list_player_t; e_mode:libvlc_playback_mode_t); cdecl; + libvlc_media_library_new : function(p_instance:Plibvlc_instance_t):plibvlc_media_library_t; cdecl; + libvlc_media_library_release : procedure(p_mlib:Plibvlc_media_library_t); cdecl; + libvlc_media_library_retain : procedure(p_mlib:Plibvlc_media_library_t); cdecl; + libvlc_media_library_load : function(p_mlib:Plibvlc_media_library_t):cint; cdecl; + libvlc_media_library_media_list : function(p_mlib:Plibvlc_media_library_t):plibvlc_media_list_t; cdecl; + libvlc_video_get_adjust_int : function(p_mi:Plibvlc_media_player_t; option:cunsigned):cint; cdecl; + libvlc_video_set_adjust_int : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; value:cint); cdecl; + libvlc_video_get_adjust_float : function(p_mi:Plibvlc_media_player_t; option:cunsigned):cfloat; cdecl; + libvlc_video_set_adjust_float : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; value:cfloat); cdecl; + libvlc_video_get_logo_int : function(p_mi:Plibvlc_media_player_t; option:cunsigned):cint; cdecl; + libvlc_video_set_logo_int : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; value:cint); cdecl; + libvlc_video_set_logo_string : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; psz_value:pcchar); cdecl; + libvlc_audio_set_format_callbacks : procedure(mp:Plibvlc_media_player_t; setup:libvlc_audio_setup_cb; cleanup:libvlc_audio_cleanup_cb); cdecl; + libvlc_audio_set_format : procedure(mp:Plibvlc_media_player_t; format:pcchar; rate:cunsigned; channels:cunsigned); cdecl; + libvlc_media_player_get_length : function(p_mi:Plibvlc_media_player_t):libvlc_time_t; cdecl; + libvlc_media_player_get_time : function(p_mi:Plibvlc_media_player_t):libvlc_time_t; cdecl; + libvlc_media_player_set_time : procedure(p_mi:Plibvlc_media_player_t; i_time:libvlc_time_t); cdecl; + libvlc_media_player_get_position : function(p_mi:Plibvlc_media_player_t):cfloat; cdecl; + libvlc_media_player_set_position : procedure(p_mi:Plibvlc_media_player_t; f_pos:cfloat); cdecl; + libvlc_media_player_set_chapter : procedure(p_mi:Plibvlc_media_player_t; i_chapter:cint); cdecl; + libvlc_media_player_get_chapter : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_get_chapter_count : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_will_play : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_get_chapter_count_for_title : function(p_mi:Plibvlc_media_player_t; i_title:cint):cint; cdecl; + libvlc_media_player_set_title : procedure(p_mi:Plibvlc_media_player_t; i_title:cint); cdecl; + libvlc_media_player_get_title : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_get_title_count : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_previous_chapter : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_next_chapter : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_get_rate : function(p_mi:Plibvlc_media_player_t):cfloat; cdecl; + libvlc_media_player_set_rate : function(p_mi:Plibvlc_media_player_t; rate:cfloat):cint; cdecl; + libvlc_media_player_get_state : function(p_mi:Plibvlc_media_player_t):libvlc_state_t; cdecl; + libvlc_media_player_get_fps : function(p_mi:Plibvlc_media_player_t):cfloat; cdecl; + libvlc_media_player_has_vout : function(p_mi:Plibvlc_media_player_t):cunsigned; cdecl; + libvlc_media_player_is_seekable : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_can_pause : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_media_player_next_frame : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_media_player_navigate : procedure(p_mi:Plibvlc_media_player_t; navigate:cunsigned); cdecl; + libvlc_track_description_list_release : procedure(p_track_description:Plibvlc_track_description_t); cdecl; + libvlc_track_description_release : procedure(p_track_description:Plibvlc_track_description_t); cdecl; + libvlc_toggle_fullscreen : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_set_fullscreen : procedure(p_mi:Plibvlc_media_player_t; b_fullscreen:cint); cdecl; + libvlc_get_fullscreen : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_set_key_input : procedure(p_mi:Plibvlc_media_player_t; on:cunsigned); cdecl; + libvlc_video_set_mouse_input : procedure(p_mi:Plibvlc_media_player_t; on:cunsigned); cdecl; + libvlc_video_get_size : function(p_mi:Plibvlc_media_player_t; num:cunsigned; px:pcunsigned; py:pcunsigned):cint; cdecl; + libvlc_video_get_height : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_get_width : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_get_cursor : function(p_mi:Plibvlc_media_player_t; num:cunsigned; px:pcint; py:pcint):cint; cdecl; + libvlc_video_get_scale : function(p_mi:Plibvlc_media_player_t):cfloat; cdecl; + libvlc_video_set_scale : procedure(p_mi:Plibvlc_media_player_t; f_factor:cfloat); cdecl; + libvlc_video_get_aspect_ratio : function(p_mi:Plibvlc_media_player_t):pcchar; cdecl; + libvlc_video_set_aspect_ratio : procedure(p_mi:Plibvlc_media_player_t; psz_aspect:pcchar); cdecl; + libvlc_video_get_spu : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_get_spu_count : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_get_spu_description : function(p_mi:Plibvlc_media_player_t):plibvlc_track_description_t; cdecl; + libvlc_video_set_spu : function(p_mi:Plibvlc_media_player_t; i_spu:cunsigned):cint; cdecl; + libvlc_video_set_subtitle_file : function(p_mi:Plibvlc_media_player_t; psz_subtitle:pcchar):cint; cdecl; + libvlc_video_get_spu_delay : function(p_mi:Plibvlc_media_player_t):int64_t; cdecl; + libvlc_video_set_spu_delay : function(p_mi:Plibvlc_media_player_t; i_delay:int64_t):cint; cdecl; + libvlc_video_get_title_description : function(p_mi:Plibvlc_media_player_t):plibvlc_track_description_t; cdecl; + libvlc_video_get_chapter_description : function(p_mi:Plibvlc_media_player_t; i_title:cint):plibvlc_track_description_t; cdecl; + libvlc_video_get_crop_geometry : function(p_mi:Plibvlc_media_player_t):pcchar; cdecl; + libvlc_video_set_crop_geometry : procedure(p_mi:Plibvlc_media_player_t; psz_geometry:pcchar); cdecl; + libvlc_video_get_teletext : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_set_teletext : procedure(p_mi:Plibvlc_media_player_t; i_page:cint); cdecl; + libvlc_toggle_teletext : procedure(p_mi:Plibvlc_media_player_t); cdecl; + libvlc_video_get_track_count : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_get_track_description : function(p_mi:Plibvlc_media_player_t):plibvlc_track_description_t; cdecl; + libvlc_video_get_track : function(p_mi:Plibvlc_media_player_t):cint; cdecl; + libvlc_video_set_track : function(p_mi:Plibvlc_media_player_t; i_track:cint):cint; cdecl; + libvlc_video_take_snapshot : function(p_mi:Plibvlc_media_player_t; num:cunsigned; psz_filepath:pcchar; i_width:cuint; i_height:cuint):cint; cdecl; + libvlc_video_set_deinterlace : procedure(p_mi:Plibvlc_media_player_t; psz_mode:pcchar); cdecl; + libvlc_video_get_marquee_int : function(p_mi:Plibvlc_media_player_t; option:cunsigned):cint; cdecl; + libvlc_video_get_marquee_string : function(p_mi:Plibvlc_media_player_t; option:cunsigned):pcchar; cdecl; + libvlc_video_set_marquee_int : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; i_val:cint); cdecl; + libvlc_video_set_marquee_string : procedure(p_mi:Plibvlc_media_player_t; option:cunsigned; psz_text:pcchar); cdecl; + libvlc_audio_set_callbacks : procedure(mp:Plibvlc_media_player_t; play:libvlc_audio_play_cb; pause:libvlc_audio_pause_cb; resume:libvlc_audio_resume_cb; flush:libvlc_audio_flush_cb; + drain:libvlc_audio_drain_cb; opaque:pointer); cdecl; + libvlc_audio_set_volume_callback : procedure(mp:Plibvlc_media_player_t; set_volume:libvlc_audio_set_volume_cb); cdecl; + libvlc_video_set_callbacks : procedure(mp:Plibvlc_media_player_t; lock:libvlc_video_lock_cb; unlock:libvlc_video_unlock_cb; display:libvlc_video_display_cb; opaque:pointer); cdecl; + libvlc_video_set_format : procedure(mp:Plibvlc_media_player_t; chroma:pcchar; width:cunsigned; height:cunsigned; pitch:cunsigned); cdecl; + libvlc_video_set_format_callbacks : procedure(mp:Plibvlc_media_player_t; setup:libvlc_video_format_cb; cleanup:libvlc_video_cleanup_cb); cdecl; + libvlc_media_player_set_nsobject : procedure(p_mi:Plibvlc_media_player_t; drawable:pointer); cdecl; + libvlc_media_player_get_nsobject : function(p_mi:Plibvlc_media_player_t):pointer; cdecl; + libvlc_media_player_set_agl : procedure(p_mi:Plibvlc_media_player_t; drawable:uint32_t); cdecl; + libvlc_media_player_get_agl : function(p_mi:Plibvlc_media_player_t):uint32_t; cdecl; + libvlc_media_player_set_xwindow : procedure(p_mi:Plibvlc_media_player_t; drawable:uint32_t); cdecl; + libvlc_media_player_get_xwindow : function(p_mi:Plibvlc_media_player_t):uint32_t; cdecl; + libvlc_media_player_set_hwnd : procedure(p_mi:Plibvlc_media_player_t; drawable:pointer); cdecl; + libvlc_media_player_get_hwnd : function(p_mi:Plibvlc_media_player_t):pointer; cdecl; + libvlc_media_discoverer_new_from_name : function(p_inst:Plibvlc_instance_t; psz_name:pcchar):plibvlc_media_discoverer_t; cdecl; + libvlc_media_discoverer_release : procedure(p_mdis:Plibvlc_media_discoverer_t); cdecl; + libvlc_media_discoverer_localized_name : function(p_mdis:Plibvlc_media_discoverer_t):pcchar; cdecl; + libvlc_media_discoverer_media_list : function(p_mdis:Plibvlc_media_discoverer_t):plibvlc_media_list_t; cdecl; + libvlc_media_discoverer_event_manager : function(p_mdis:Plibvlc_media_discoverer_t):plibvlc_event_manager_t; cdecl; + libvlc_media_discoverer_is_running : function(p_mdis:Plibvlc_media_discoverer_t):cint; cdecl; + libvlc_vlm_release : procedure(p_instance:Plibvlc_instance_t); cdecl; + libvlc_vlm_add_broadcast : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_input:pcchar; psz_output:pcchar; i_options:cint; + ppsz_options:Ppcchar; b_enabled:cint; b_loop:cint):cint; cdecl; + libvlc_vlm_add_vod : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_input:pcchar; i_options:cint; ppsz_options:Ppcchar; + b_enabled:cint; psz_mux:pcchar):cint; cdecl; + libvlc_vlm_del_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):cint; cdecl; + libvlc_vlm_set_enabled : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; b_enabled:cint):cint; cdecl; + libvlc_vlm_set_output : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_output:pcchar):cint; cdecl; + libvlc_vlm_set_input : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_input:pcchar):cint; cdecl; + libvlc_vlm_add_input : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_input:pcchar):cint; cdecl; + libvlc_vlm_set_loop : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; b_loop:cint):cint; cdecl; + libvlc_vlm_set_mux : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_mux:pcchar):cint; cdecl; + libvlc_vlm_change_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; psz_input:pcchar; psz_output:pcchar; i_options:cint; + ppsz_options:Ppcchar; b_enabled:cint; b_loop:cint):cint; cdecl; + libvlc_vlm_play_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):cint; cdecl; + libvlc_vlm_stop_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):cint; cdecl; + libvlc_vlm_pause_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):cint; cdecl; + libvlc_vlm_seek_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; f_percentage:cfloat):cint; cdecl; + libvlc_vlm_show_media : function(p_instance:Plibvlc_instance_t; psz_name:pcchar):pcchar; cdecl; + libvlc_vlm_get_media_instance_position : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; i_instance:cint):cfloat; cdecl; + libvlc_vlm_get_media_instance_time : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; i_instance:cint):cint; cdecl; + libvlc_vlm_get_media_instance_length : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; i_instance:cint):cint; cdecl; + libvlc_vlm_get_media_instance_rate : function(p_instance:Plibvlc_instance_t; psz_name:pcchar; i_instance:cint):cint; cdecl; + libvlc_vlm_get_event_manager : function(p_instance:Plibvlc_instance_t):plibvlc_event_manager_t; cdecl; + libvlc_playlist_play : procedure(p_instance:Plibvlc_instance_t; i_id:cint; i_options:cint; ppsz_options:Ppcchar); cdecl; + +Procedure Freelibvlc; +Procedure Loadlibvlc(lib : AnsiString; CheckProcNames : Boolean = False); + +implementation + +uses + SysUtils, dynlibs; + +var + hlib : tlibhandle; + LibRefCount : Integer; + +procedure Freelibvlc; + +begin + if (LibRefCount>0) then + Dec(LibRefCount); + if LibRefCount>0 then + exit; + FreeLibrary(hlib); + libvlc_errmsg:=nil; + libvlc_clearerr:=nil; + libvlc_printerr:=nil; + libvlc_new:=nil; + libvlc_release:=nil; + libvlc_retain:=nil; + libvlc_add_intf:=nil; + libvlc_set_exit_handler:=nil; + libvlc_wait:=nil; + libvlc_set_user_agent:=nil; + libvlc_get_version:=nil; + libvlc_get_compiler:=nil; + libvlc_get_changeset:=nil; + libvlc_free:=nil; + libvlc_event_attach:=nil; + libvlc_event_detach:=nil; + libvlc_event_type_name:=nil; + libvlc_get_log_verbosity:=nil; + libvlc_set_log_verbosity:=nil; + libvlc_log_open:=nil; + libvlc_log_close:=nil; + libvlc_log_count:=nil; + libvlc_log_clear:=nil; + libvlc_log_get_iterator:=nil; + libvlc_log_iterator_free:=nil; + libvlc_log_iterator_has_next:=nil; + libvlc_log_iterator_next:=nil; + libvlc_module_description_list_release:=nil; + libvlc_audio_filter_list_get:=nil; + libvlc_video_filter_list_get:=nil; + libvlc_clock:=nil; + libvlc_media_new_location:=nil; + libvlc_media_new_path:=nil; + libvlc_media_new_fd:=nil; + libvlc_media_new_as_node:=nil; + libvlc_media_add_option:=nil; + libvlc_media_add_option_flag:=nil; + libvlc_media_retain:=nil; + libvlc_media_release:=nil; + libvlc_media_get_mrl:=nil; + libvlc_media_duplicate:=nil; + libvlc_media_get_meta:=nil; + libvlc_media_set_meta:=nil; + libvlc_media_save_meta:=nil; + libvlc_media_get_state:=nil; + libvlc_media_get_stats:=nil; + libvlc_media_subitems:=nil; + libvlc_media_event_manager:=nil; + libvlc_media_get_duration:=nil; + libvlc_media_parse:=nil; + libvlc_media_parse_async:=nil; + libvlc_media_is_parsed:=nil; + libvlc_media_set_user_data:=nil; + libvlc_media_get_user_data:=nil; + libvlc_media_get_tracks_info:=nil; + libvlc_media_player_new:=nil; + libvlc_media_player_new_from_media:=nil; + libvlc_media_player_release:=nil; + libvlc_media_player_retain:=nil; + libvlc_media_player_set_media:=nil; + libvlc_media_player_get_media:=nil; + libvlc_media_player_event_manager:=nil; + libvlc_media_player_is_playing:=nil; + libvlc_media_player_play:=nil; + libvlc_media_player_set_pause:=nil; + libvlc_media_player_pause:=nil; + libvlc_media_player_stop:=nil; + libvlc_video_set_callbacks:=nil; + libvlc_video_set_format:=nil; + libvlc_video_set_format_callbacks:=nil; + libvlc_media_player_set_nsobject:=nil; + libvlc_media_player_get_nsobject:=nil; + libvlc_media_player_set_agl:=nil; + libvlc_media_player_get_agl:=nil; + libvlc_media_player_set_xwindow:=nil; + libvlc_media_player_get_xwindow:=nil; + libvlc_media_player_set_hwnd:=nil; + libvlc_media_player_get_hwnd:=nil; + libvlc_audio_set_callbacks:=nil; + libvlc_audio_set_volume_callback:=nil; + libvlc_audio_set_format_callbacks:=nil; + libvlc_audio_set_format:=nil; + libvlc_media_player_get_length:=nil; + libvlc_media_player_get_time:=nil; + libvlc_media_player_set_time:=nil; + libvlc_media_player_get_position:=nil; + libvlc_media_player_set_position:=nil; + libvlc_media_player_set_chapter:=nil; + libvlc_media_player_get_chapter:=nil; + libvlc_media_player_get_chapter_count:=nil; + libvlc_media_player_will_play:=nil; + libvlc_media_player_get_chapter_count_for_title:=nil; + libvlc_media_player_set_title:=nil; + libvlc_media_player_get_title:=nil; + libvlc_media_player_get_title_count:=nil; + libvlc_media_player_previous_chapter:=nil; + libvlc_media_player_next_chapter:=nil; + libvlc_media_player_get_rate:=nil; + libvlc_media_player_set_rate:=nil; + libvlc_media_player_get_state:=nil; + libvlc_media_player_get_fps:=nil; + libvlc_media_player_has_vout:=nil; + libvlc_media_player_is_seekable:=nil; + libvlc_media_player_can_pause:=nil; + libvlc_media_player_next_frame:=nil; + libvlc_media_player_navigate:=nil; + libvlc_track_description_list_release:=nil; + libvlc_track_description_release:=nil; + libvlc_toggle_fullscreen:=nil; + libvlc_set_fullscreen:=nil; + libvlc_get_fullscreen:=nil; + libvlc_video_set_key_input:=nil; + libvlc_video_set_mouse_input:=nil; + libvlc_video_get_size:=nil; + libvlc_video_get_height:=nil; + libvlc_video_get_width:=nil; + libvlc_video_get_cursor:=nil; + libvlc_video_get_scale:=nil; + libvlc_video_set_scale:=nil; + libvlc_video_get_aspect_ratio:=nil; + libvlc_video_set_aspect_ratio:=nil; + libvlc_video_get_spu:=nil; + libvlc_video_get_spu_count:=nil; + libvlc_video_get_spu_description:=nil; + libvlc_video_set_spu:=nil; + libvlc_video_set_subtitle_file:=nil; + libvlc_video_get_spu_delay:=nil; + libvlc_video_set_spu_delay:=nil; + libvlc_video_get_title_description:=nil; + libvlc_video_get_chapter_description:=nil; + libvlc_video_get_crop_geometry:=nil; + libvlc_video_set_crop_geometry:=nil; + libvlc_video_get_teletext:=nil; + libvlc_video_set_teletext:=nil; + libvlc_toggle_teletext:=nil; + libvlc_video_get_track_count:=nil; + libvlc_video_get_track_description:=nil; + libvlc_video_get_track:=nil; + libvlc_video_set_track:=nil; + libvlc_video_take_snapshot:=nil; + libvlc_video_set_deinterlace:=nil; + libvlc_video_get_marquee_int:=nil; + libvlc_video_get_marquee_string:=nil; + libvlc_video_set_marquee_int:=nil; + libvlc_video_set_marquee_string:=nil; + libvlc_video_get_logo_int:=nil; + libvlc_video_set_logo_int:=nil; + libvlc_video_set_logo_string:=nil; + libvlc_video_get_adjust_int:=nil; + libvlc_video_set_adjust_int:=nil; + libvlc_video_get_adjust_float:=nil; + libvlc_video_set_adjust_float:=nil; + libvlc_audio_output_list_get:=nil; + libvlc_audio_output_list_release:=nil; + libvlc_audio_output_set:=nil; + libvlc_audio_output_device_count:=nil; + libvlc_audio_output_device_longname:=nil; + libvlc_audio_output_device_id:=nil; + libvlc_audio_output_device_set:=nil; + libvlc_audio_output_get_device_type:=nil; + libvlc_audio_output_set_device_type:=nil; + libvlc_audio_toggle_mute:=nil; + libvlc_audio_get_mute:=nil; + libvlc_audio_set_mute:=nil; + libvlc_audio_get_volume:=nil; + libvlc_audio_set_volume:=nil; + libvlc_audio_get_track_count:=nil; + libvlc_audio_get_track_description:=nil; + libvlc_audio_get_track:=nil; + libvlc_audio_set_track:=nil; + libvlc_audio_get_channel:=nil; + libvlc_audio_set_channel:=nil; + libvlc_audio_get_delay:=nil; + libvlc_audio_set_delay:=nil; + libvlc_media_list_new:=nil; + libvlc_media_list_release:=nil; + libvlc_media_list_retain:=nil; + libvlc_media_list_add_file_content:=nil; + libvlc_media_list_set_media:=nil; + libvlc_media_list_media:=nil; + libvlc_media_list_add_media:=nil; + libvlc_media_list_insert_media:=nil; + libvlc_media_list_remove_index:=nil; + libvlc_media_list_count:=nil; + libvlc_media_list_item_at_index:=nil; + libvlc_media_list_index_of_item:=nil; + libvlc_media_list_is_readonly:=nil; + libvlc_media_list_lock:=nil; + libvlc_media_list_unlock:=nil; + libvlc_media_list_event_manager:=nil; + libvlc_media_list_player_new:=nil; + libvlc_media_list_player_release:=nil; + libvlc_media_list_player_retain:=nil; + libvlc_media_list_player_event_manager:=nil; + libvlc_media_list_player_set_media_player:=nil; + libvlc_media_list_player_set_media_list:=nil; + libvlc_media_list_player_play:=nil; + libvlc_media_list_player_pause:=nil; + libvlc_media_list_player_is_playing:=nil; + libvlc_media_list_player_get_state:=nil; + libvlc_media_list_player_play_item_at_index:=nil; + libvlc_media_list_player_play_item:=nil; + libvlc_media_list_player_stop:=nil; + libvlc_media_list_player_next:=nil; + libvlc_media_list_player_previous:=nil; + libvlc_media_list_player_set_playback_mode:=nil; + libvlc_media_library_new:=nil; + libvlc_media_library_release:=nil; + libvlc_media_library_retain:=nil; + libvlc_media_library_load:=nil; + libvlc_media_library_media_list:=nil; + libvlc_media_discoverer_new_from_name:=nil; + libvlc_media_discoverer_release:=nil; + libvlc_media_discoverer_localized_name:=nil; + libvlc_media_discoverer_media_list:=nil; + libvlc_media_discoverer_event_manager:=nil; + libvlc_media_discoverer_is_running:=nil; + libvlc_vlm_release:=nil; + libvlc_vlm_add_broadcast:=nil; + libvlc_vlm_add_vod:=nil; + libvlc_vlm_del_media:=nil; + libvlc_vlm_set_enabled:=nil; + libvlc_vlm_set_output:=nil; + libvlc_vlm_set_input:=nil; + libvlc_vlm_add_input:=nil; + libvlc_vlm_set_loop:=nil; + libvlc_vlm_set_mux:=nil; + libvlc_vlm_change_media:=nil; + libvlc_vlm_play_media:=nil; + libvlc_vlm_stop_media:=nil; + libvlc_vlm_pause_media:=nil; + libvlc_vlm_seek_media:=nil; + libvlc_vlm_show_media:=nil; + libvlc_vlm_get_media_instance_position:=nil; + libvlc_vlm_get_media_instance_time:=nil; + libvlc_vlm_get_media_instance_length:=nil; + libvlc_vlm_get_media_instance_rate:=nil; + libvlc_vlm_get_event_manager:=nil; + libvlc_playlist_play:=nil; +end; + + +Procedure Loadlibvlc(lib : AnsiString; CheckProcNames : Boolean = False); + + Function GetProcAddress(h : TLibHandle; Name : AnsiString) : Pointer; + + begin + Result:=dynlibs.GetProcAddress(h,Name); + If (Result=Nil) and CheckProcNames then + raise Exception.CreateFmt('Could not find procedure address: %s ',[Name]); + end; + + Procedure EM(FN : String); + + begin + {$ifndef VER2_6} + Raise Exception.CreateFmt('Could not load library "%s": %s',[FN,GetLoadErrorStr]); + {$else} + raise Exception.CreateFmt('Could not load library "%s"',[FN]); + {$endif} + end; + + + +Var + D : String; + +begin + if (hLib<>NilHandle) then + begin + Inc(LibRefCount); + Exit; + end; + D:=ExtractFilePath(lib); + {$ifdef windows} + if (LoadLibrary(d+corelibname)=NilHandle) then + if (d='') and (LoadLibrary(DefaultlibPath+corelibname)=NilHandle) then + EM(DefaultlibPath+corelibname); + {$endif} + hlib:=LoadLibrary(lib); + if (hlib=NilHandle) then +{$ifndef windows} + EM(Lib); +{$else} + if (d='') then + begin + hlib:=LoadLibrary(DefaultlibPath+ExtractFileName(Lib)); + if (hlib=NilHandle) then + EM(Lib); + end; +{$endif} + Inc(LibRefCount); + pointer(libvlc_errmsg):=GetProcAddress(hlib,'libvlc_errmsg'); + pointer(libvlc_clearerr):=GetProcAddress(hlib,'libvlc_clearerr'); + pointer(libvlc_printerr):=GetProcAddress(hlib,'libvlc_printerr'); + pointer(libvlc_new):=GetProcAddress(hlib,'libvlc_new'); + pointer(libvlc_release):=GetProcAddress(hlib,'libvlc_release'); + pointer(libvlc_retain):=GetProcAddress(hlib,'libvlc_retain'); + pointer(libvlc_add_intf):=GetProcAddress(hlib,'libvlc_add_intf'); + pointer(libvlc_set_exit_handler):=GetProcAddress(hlib,'libvlc_set_exit_handler'); + pointer(libvlc_wait):=GetProcAddress(hlib,'libvlc_wait'); + pointer(libvlc_set_user_agent):=GetProcAddress(hlib,'libvlc_set_user_agent'); + pointer(libvlc_get_version):=GetProcAddress(hlib,'libvlc_get_version'); + pointer(libvlc_get_compiler):=GetProcAddress(hlib,'libvlc_get_compiler'); + pointer(libvlc_get_changeset):=GetProcAddress(hlib,'libvlc_get_changeset'); + pointer(libvlc_free):=GetProcAddress(hlib,'libvlc_free'); + pointer(libvlc_event_attach):=GetProcAddress(hlib,'libvlc_event_attach'); + pointer(libvlc_event_detach):=GetProcAddress(hlib,'libvlc_event_detach'); + pointer(libvlc_event_type_name):=GetProcAddress(hlib,'libvlc_event_type_name'); + pointer(libvlc_get_log_verbosity):=GetProcAddress(hlib,'libvlc_get_log_verbosity'); + pointer(libvlc_set_log_verbosity):=GetProcAddress(hlib,'libvlc_set_log_verbosity'); + pointer(libvlc_log_open):=GetProcAddress(hlib,'libvlc_log_open'); + pointer(libvlc_log_close):=GetProcAddress(hlib,'libvlc_log_close'); + pointer(libvlc_log_count):=GetProcAddress(hlib,'libvlc_log_count'); + pointer(libvlc_log_clear):=GetProcAddress(hlib,'libvlc_log_clear'); + pointer(libvlc_log_get_iterator):=GetProcAddress(hlib,'libvlc_log_get_iterator'); + pointer(libvlc_log_iterator_free):=GetProcAddress(hlib,'libvlc_log_iterator_free'); + pointer(libvlc_log_iterator_has_next):=GetProcAddress(hlib,'libvlc_log_iterator_has_next'); + pointer(libvlc_log_iterator_next):=GetProcAddress(hlib,'libvlc_log_iterator_next'); + pointer(libvlc_module_description_list_release):=GetProcAddress(hlib,'libvlc_module_description_list_release'); + pointer(libvlc_audio_filter_list_get):=GetProcAddress(hlib,'libvlc_audio_filter_list_get'); + pointer(libvlc_video_filter_list_get):=GetProcAddress(hlib,'libvlc_video_filter_list_get'); + pointer(libvlc_clock):=GetProcAddress(hlib,'libvlc_clock'); + pointer(libvlc_media_new_location):=GetProcAddress(hlib,'libvlc_media_new_location'); + pointer(libvlc_media_new_path):=GetProcAddress(hlib,'libvlc_media_new_path'); + pointer(libvlc_media_new_fd):=GetProcAddress(hlib,'libvlc_media_new_fd'); + pointer(libvlc_media_new_as_node):=GetProcAddress(hlib,'libvlc_media_new_as_node'); + pointer(libvlc_media_add_option):=GetProcAddress(hlib,'libvlc_media_add_option'); + pointer(libvlc_media_add_option_flag):=GetProcAddress(hlib,'libvlc_media_add_option_flag'); + pointer(libvlc_media_retain):=GetProcAddress(hlib,'libvlc_media_retain'); + pointer(libvlc_media_release):=GetProcAddress(hlib,'libvlc_media_release'); + pointer(libvlc_media_get_mrl):=GetProcAddress(hlib,'libvlc_media_get_mrl'); + pointer(libvlc_media_duplicate):=GetProcAddress(hlib,'libvlc_media_duplicate'); + pointer(libvlc_media_get_meta):=GetProcAddress(hlib,'libvlc_media_get_meta'); + pointer(libvlc_media_set_meta):=GetProcAddress(hlib,'libvlc_media_set_meta'); + pointer(libvlc_media_save_meta):=GetProcAddress(hlib,'libvlc_media_save_meta'); + pointer(libvlc_media_get_state):=GetProcAddress(hlib,'libvlc_media_get_state'); + pointer(libvlc_media_get_stats):=GetProcAddress(hlib,'libvlc_media_get_stats'); + pointer(libvlc_media_subitems):=GetProcAddress(hlib,'libvlc_media_subitems'); + pointer(libvlc_media_event_manager):=GetProcAddress(hlib,'libvlc_media_event_manager'); + pointer(libvlc_media_get_duration):=GetProcAddress(hlib,'libvlc_media_get_duration'); + pointer(libvlc_media_parse):=GetProcAddress(hlib,'libvlc_media_parse'); + pointer(libvlc_media_parse_async):=GetProcAddress(hlib,'libvlc_media_parse_async'); + pointer(libvlc_media_is_parsed):=GetProcAddress(hlib,'libvlc_media_is_parsed'); + pointer(libvlc_media_set_user_data):=GetProcAddress(hlib,'libvlc_media_set_user_data'); + pointer(libvlc_media_get_user_data):=GetProcAddress(hlib,'libvlc_media_get_user_data'); + pointer(libvlc_media_get_tracks_info):=GetProcAddress(hlib,'libvlc_media_get_tracks_info'); + pointer(libvlc_media_player_new):=GetProcAddress(hlib,'libvlc_media_player_new'); + pointer(libvlc_media_player_new_from_media):=GetProcAddress(hlib,'libvlc_media_player_new_from_media'); + pointer(libvlc_media_player_release):=GetProcAddress(hlib,'libvlc_media_player_release'); + pointer(libvlc_media_player_retain):=GetProcAddress(hlib,'libvlc_media_player_retain'); + pointer(libvlc_media_player_set_media):=GetProcAddress(hlib,'libvlc_media_player_set_media'); + pointer(libvlc_media_player_get_media):=GetProcAddress(hlib,'libvlc_media_player_get_media'); + pointer(libvlc_media_player_event_manager):=GetProcAddress(hlib,'libvlc_media_player_event_manager'); + pointer(libvlc_media_player_is_playing):=GetProcAddress(hlib,'libvlc_media_player_is_playing'); + pointer(libvlc_media_player_play):=GetProcAddress(hlib,'libvlc_media_player_play'); + pointer(libvlc_media_player_set_pause):=GetProcAddress(hlib,'libvlc_media_player_set_pause'); + pointer(libvlc_media_player_pause):=GetProcAddress(hlib,'libvlc_media_player_pause'); + pointer(libvlc_media_player_stop):=GetProcAddress(hlib,'libvlc_media_player_stop'); + pointer(libvlc_video_set_callbacks):=GetProcAddress(hlib,'libvlc_video_set_callbacks'); + pointer(libvlc_video_set_format):=GetProcAddress(hlib,'libvlc_video_set_format'); + pointer(libvlc_video_set_format_callbacks):=GetProcAddress(hlib,'libvlc_video_set_format_callbacks'); + pointer(libvlc_media_player_set_nsobject):=GetProcAddress(hlib,'libvlc_media_player_set_nsobject'); + pointer(libvlc_media_player_get_nsobject):=GetProcAddress(hlib,'libvlc_media_player_get_nsobject'); + pointer(libvlc_media_player_set_agl):=GetProcAddress(hlib,'libvlc_media_player_set_agl'); + pointer(libvlc_media_player_get_agl):=GetProcAddress(hlib,'libvlc_media_player_get_agl'); + pointer(libvlc_media_player_set_xwindow):=GetProcAddress(hlib,'libvlc_media_player_set_xwindow'); + pointer(libvlc_media_player_get_xwindow):=GetProcAddress(hlib,'libvlc_media_player_get_xwindow'); + pointer(libvlc_media_player_set_hwnd):=GetProcAddress(hlib,'libvlc_media_player_set_hwnd'); + pointer(libvlc_media_player_get_hwnd):=GetProcAddress(hlib,'libvlc_media_player_get_hwnd'); + pointer(libvlc_audio_set_callbacks):=GetProcAddress(hlib,'libvlc_audio_set_callbacks'); + pointer(libvlc_audio_set_volume_callback):=GetProcAddress(hlib,'libvlc_audio_set_volume_callback'); + pointer(libvlc_audio_set_format_callbacks):=GetProcAddress(hlib,'libvlc_audio_set_format_callbacks'); + pointer(libvlc_audio_set_format):=GetProcAddress(hlib,'libvlc_audio_set_format'); + pointer(libvlc_media_player_get_length):=GetProcAddress(hlib,'libvlc_media_player_get_length'); + pointer(libvlc_media_player_get_time):=GetProcAddress(hlib,'libvlc_media_player_get_time'); + pointer(libvlc_media_player_set_time):=GetProcAddress(hlib,'libvlc_media_player_set_time'); + pointer(libvlc_media_player_get_position):=GetProcAddress(hlib,'libvlc_media_player_get_position'); + pointer(libvlc_media_player_set_position):=GetProcAddress(hlib,'libvlc_media_player_set_position'); + pointer(libvlc_media_player_set_chapter):=GetProcAddress(hlib,'libvlc_media_player_set_chapter'); + pointer(libvlc_media_player_get_chapter):=GetProcAddress(hlib,'libvlc_media_player_get_chapter'); + pointer(libvlc_media_player_get_chapter_count):=GetProcAddress(hlib,'libvlc_media_player_get_chapter_count'); + pointer(libvlc_media_player_will_play):=GetProcAddress(hlib,'libvlc_media_player_will_play'); + pointer(libvlc_media_player_get_chapter_count_for_title):=GetProcAddress(hlib,'libvlc_media_player_get_chapter_count_for_title'); + pointer(libvlc_media_player_set_title):=GetProcAddress(hlib,'libvlc_media_player_set_title'); + pointer(libvlc_media_player_get_title):=GetProcAddress(hlib,'libvlc_media_player_get_title'); + pointer(libvlc_media_player_get_title_count):=GetProcAddress(hlib,'libvlc_media_player_get_title_count'); + pointer(libvlc_media_player_previous_chapter):=GetProcAddress(hlib,'libvlc_media_player_previous_chapter'); + pointer(libvlc_media_player_next_chapter):=GetProcAddress(hlib,'libvlc_media_player_next_chapter'); + pointer(libvlc_media_player_get_rate):=GetProcAddress(hlib,'libvlc_media_player_get_rate'); + pointer(libvlc_media_player_set_rate):=GetProcAddress(hlib,'libvlc_media_player_set_rate'); + pointer(libvlc_media_player_get_state):=GetProcAddress(hlib,'libvlc_media_player_get_state'); + pointer(libvlc_media_player_get_fps):=GetProcAddress(hlib,'libvlc_media_player_get_fps'); + pointer(libvlc_media_player_has_vout):=GetProcAddress(hlib,'libvlc_media_player_has_vout'); + pointer(libvlc_media_player_is_seekable):=GetProcAddress(hlib,'libvlc_media_player_is_seekable'); + pointer(libvlc_media_player_can_pause):=GetProcAddress(hlib,'libvlc_media_player_can_pause'); + pointer(libvlc_media_player_next_frame):=GetProcAddress(hlib,'libvlc_media_player_next_frame'); + pointer(libvlc_media_player_navigate):=GetProcAddress(hlib,'libvlc_media_player_navigate'); + pointer(libvlc_track_description_list_release):=GetProcAddress(hlib,'libvlc_track_description_list_release'); + pointer(libvlc_track_description_release):=GetProcAddress(hlib,'libvlc_track_description_release'); + pointer(libvlc_toggle_fullscreen):=GetProcAddress(hlib,'libvlc_toggle_fullscreen'); + pointer(libvlc_set_fullscreen):=GetProcAddress(hlib,'libvlc_set_fullscreen'); + pointer(libvlc_get_fullscreen):=GetProcAddress(hlib,'libvlc_get_fullscreen'); + pointer(libvlc_video_set_key_input):=GetProcAddress(hlib,'libvlc_video_set_key_input'); + pointer(libvlc_video_set_mouse_input):=GetProcAddress(hlib,'libvlc_video_set_mouse_input'); + pointer(libvlc_video_get_size):=GetProcAddress(hlib,'libvlc_video_get_size'); + pointer(libvlc_video_get_height):=GetProcAddress(hlib,'libvlc_video_get_height'); + pointer(libvlc_video_get_width):=GetProcAddress(hlib,'libvlc_video_get_width'); + pointer(libvlc_video_get_cursor):=GetProcAddress(hlib,'libvlc_video_get_cursor'); + pointer(libvlc_video_get_scale):=GetProcAddress(hlib,'libvlc_video_get_scale'); + pointer(libvlc_video_set_scale):=GetProcAddress(hlib,'libvlc_video_set_scale'); + pointer(libvlc_video_get_aspect_ratio):=GetProcAddress(hlib,'libvlc_video_get_aspect_ratio'); + pointer(libvlc_video_set_aspect_ratio):=GetProcAddress(hlib,'libvlc_video_set_aspect_ratio'); + pointer(libvlc_video_get_spu):=GetProcAddress(hlib,'libvlc_video_get_spu'); + pointer(libvlc_video_get_spu_count):=GetProcAddress(hlib,'libvlc_video_get_spu_count'); + pointer(libvlc_video_get_spu_description):=GetProcAddress(hlib,'libvlc_video_get_spu_description'); + pointer(libvlc_video_set_spu):=GetProcAddress(hlib,'libvlc_video_set_spu'); + pointer(libvlc_video_set_subtitle_file):=GetProcAddress(hlib,'libvlc_video_set_subtitle_file'); + pointer(libvlc_video_get_spu_delay):=GetProcAddress(hlib,'libvlc_video_get_spu_delay'); + pointer(libvlc_video_set_spu_delay):=GetProcAddress(hlib,'libvlc_video_set_spu_delay'); + pointer(libvlc_video_get_title_description):=GetProcAddress(hlib,'libvlc_video_get_title_description'); + pointer(libvlc_video_get_chapter_description):=GetProcAddress(hlib,'libvlc_video_get_chapter_description'); + pointer(libvlc_video_get_crop_geometry):=GetProcAddress(hlib,'libvlc_video_get_crop_geometry'); + pointer(libvlc_video_set_crop_geometry):=GetProcAddress(hlib,'libvlc_video_set_crop_geometry'); + pointer(libvlc_video_get_teletext):=GetProcAddress(hlib,'libvlc_video_get_teletext'); + pointer(libvlc_video_set_teletext):=GetProcAddress(hlib,'libvlc_video_set_teletext'); + pointer(libvlc_toggle_teletext):=GetProcAddress(hlib,'libvlc_toggle_teletext'); + pointer(libvlc_video_get_track_count):=GetProcAddress(hlib,'libvlc_video_get_track_count'); + pointer(libvlc_video_get_track_description):=GetProcAddress(hlib,'libvlc_video_get_track_description'); + pointer(libvlc_video_get_track):=GetProcAddress(hlib,'libvlc_video_get_track'); + pointer(libvlc_video_set_track):=GetProcAddress(hlib,'libvlc_video_set_track'); + pointer(libvlc_video_take_snapshot):=GetProcAddress(hlib,'libvlc_video_take_snapshot'); + pointer(libvlc_video_set_deinterlace):=GetProcAddress(hlib,'libvlc_video_set_deinterlace'); + pointer(libvlc_video_get_marquee_int):=GetProcAddress(hlib,'libvlc_video_get_marquee_int'); + pointer(libvlc_video_get_marquee_string):=GetProcAddress(hlib,'libvlc_video_get_marquee_string'); + pointer(libvlc_video_set_marquee_int):=GetProcAddress(hlib,'libvlc_video_set_marquee_int'); + pointer(libvlc_video_set_marquee_string):=GetProcAddress(hlib,'libvlc_video_set_marquee_string'); + pointer(libvlc_video_get_logo_int):=GetProcAddress(hlib,'libvlc_video_get_logo_int'); + pointer(libvlc_video_set_logo_int):=GetProcAddress(hlib,'libvlc_video_set_logo_int'); + pointer(libvlc_video_set_logo_string):=GetProcAddress(hlib,'libvlc_video_set_logo_string'); + pointer(libvlc_video_get_adjust_int):=GetProcAddress(hlib,'libvlc_video_get_adjust_int'); + pointer(libvlc_video_set_adjust_int):=GetProcAddress(hlib,'libvlc_video_set_adjust_int'); + pointer(libvlc_video_get_adjust_float):=GetProcAddress(hlib,'libvlc_video_get_adjust_float'); + pointer(libvlc_video_set_adjust_float):=GetProcAddress(hlib,'libvlc_video_set_adjust_float'); + pointer(libvlc_audio_output_list_get):=GetProcAddress(hlib,'libvlc_audio_output_list_get'); + pointer(libvlc_audio_output_list_release):=GetProcAddress(hlib,'libvlc_audio_output_list_release'); + pointer(libvlc_audio_output_set):=GetProcAddress(hlib,'libvlc_audio_output_set'); + pointer(libvlc_audio_output_device_count):=GetProcAddress(hlib,'libvlc_audio_output_device_count'); + pointer(libvlc_audio_output_device_longname):=GetProcAddress(hlib,'libvlc_audio_output_device_longname'); + pointer(libvlc_audio_output_device_id):=GetProcAddress(hlib,'libvlc_audio_output_device_id'); + pointer(libvlc_audio_output_device_set):=GetProcAddress(hlib,'libvlc_audio_output_device_set'); + pointer(libvlc_audio_output_get_device_type):=GetProcAddress(hlib,'libvlc_audio_output_get_device_type'); + pointer(libvlc_audio_output_set_device_type):=GetProcAddress(hlib,'libvlc_audio_output_set_device_type'); + pointer(libvlc_audio_toggle_mute):=GetProcAddress(hlib,'libvlc_audio_toggle_mute'); + pointer(libvlc_audio_get_mute):=GetProcAddress(hlib,'libvlc_audio_get_mute'); + pointer(libvlc_audio_set_mute):=GetProcAddress(hlib,'libvlc_audio_set_mute'); + pointer(libvlc_audio_get_volume):=GetProcAddress(hlib,'libvlc_audio_get_volume'); + pointer(libvlc_audio_set_volume):=GetProcAddress(hlib,'libvlc_audio_set_volume'); + pointer(libvlc_audio_get_track_count):=GetProcAddress(hlib,'libvlc_audio_get_track_count'); + pointer(libvlc_audio_get_track_description):=GetProcAddress(hlib,'libvlc_audio_get_track_description'); + pointer(libvlc_audio_get_track):=GetProcAddress(hlib,'libvlc_audio_get_track'); + pointer(libvlc_audio_set_track):=GetProcAddress(hlib,'libvlc_audio_set_track'); + pointer(libvlc_audio_get_channel):=GetProcAddress(hlib,'libvlc_audio_get_channel'); + pointer(libvlc_audio_set_channel):=GetProcAddress(hlib,'libvlc_audio_set_channel'); + pointer(libvlc_audio_get_delay):=GetProcAddress(hlib,'libvlc_audio_get_delay'); + pointer(libvlc_audio_set_delay):=GetProcAddress(hlib,'libvlc_audio_set_delay'); + pointer(libvlc_media_list_new):=GetProcAddress(hlib,'libvlc_media_list_new'); + pointer(libvlc_media_list_release):=GetProcAddress(hlib,'libvlc_media_list_release'); + pointer(libvlc_media_list_retain):=GetProcAddress(hlib,'libvlc_media_list_retain'); + pointer(libvlc_media_list_add_file_content):=GetProcAddress(hlib,'libvlc_media_list_add_file_content'); + pointer(libvlc_media_list_set_media):=GetProcAddress(hlib,'libvlc_media_list_set_media'); + pointer(libvlc_media_list_media):=GetProcAddress(hlib,'libvlc_media_list_media'); + pointer(libvlc_media_list_add_media):=GetProcAddress(hlib,'libvlc_media_list_add_media'); + pointer(libvlc_media_list_insert_media):=GetProcAddress(hlib,'libvlc_media_list_insert_media'); + pointer(libvlc_media_list_remove_index):=GetProcAddress(hlib,'libvlc_media_list_remove_index'); + pointer(libvlc_media_list_count):=GetProcAddress(hlib,'libvlc_media_list_count'); + pointer(libvlc_media_list_item_at_index):=GetProcAddress(hlib,'libvlc_media_list_item_at_index'); + pointer(libvlc_media_list_index_of_item):=GetProcAddress(hlib,'libvlc_media_list_index_of_item'); + pointer(libvlc_media_list_is_readonly):=GetProcAddress(hlib,'libvlc_media_list_is_readonly'); + pointer(libvlc_media_list_lock):=GetProcAddress(hlib,'libvlc_media_list_lock'); + pointer(libvlc_media_list_unlock):=GetProcAddress(hlib,'libvlc_media_list_unlock'); + pointer(libvlc_media_list_event_manager):=GetProcAddress(hlib,'libvlc_media_list_event_manager'); + pointer(libvlc_media_list_player_new):=GetProcAddress(hlib,'libvlc_media_list_player_new'); + pointer(libvlc_media_list_player_release):=GetProcAddress(hlib,'libvlc_media_list_player_release'); + pointer(libvlc_media_list_player_retain):=GetProcAddress(hlib,'libvlc_media_list_player_retain'); + pointer(libvlc_media_list_player_event_manager):=GetProcAddress(hlib,'libvlc_media_list_player_event_manager'); + pointer(libvlc_media_list_player_set_media_player):=GetProcAddress(hlib,'libvlc_media_list_player_set_media_player'); + pointer(libvlc_media_list_player_set_media_list):=GetProcAddress(hlib,'libvlc_media_list_player_set_media_list'); + pointer(libvlc_media_list_player_play):=GetProcAddress(hlib,'libvlc_media_list_player_play'); + pointer(libvlc_media_list_player_pause):=GetProcAddress(hlib,'libvlc_media_list_player_pause'); + pointer(libvlc_media_list_player_is_playing):=GetProcAddress(hlib,'libvlc_media_list_player_is_playing'); + pointer(libvlc_media_list_player_get_state):=GetProcAddress(hlib,'libvlc_media_list_player_get_state'); + pointer(libvlc_media_list_player_play_item_at_index):=GetProcAddress(hlib,'libvlc_media_list_player_play_item_at_index'); + pointer(libvlc_media_list_player_play_item):=GetProcAddress(hlib,'libvlc_media_list_player_play_item'); + pointer(libvlc_media_list_player_stop):=GetProcAddress(hlib,'libvlc_media_list_player_stop'); + pointer(libvlc_media_list_player_next):=GetProcAddress(hlib,'libvlc_media_list_player_next'); + pointer(libvlc_media_list_player_previous):=GetProcAddress(hlib,'libvlc_media_list_player_previous'); + pointer(libvlc_media_list_player_set_playback_mode):=GetProcAddress(hlib,'libvlc_media_list_player_set_playback_mode'); + pointer(libvlc_media_library_new):=GetProcAddress(hlib,'libvlc_media_library_new'); + pointer(libvlc_media_library_release):=GetProcAddress(hlib,'libvlc_media_library_release'); + pointer(libvlc_media_library_retain):=GetProcAddress(hlib,'libvlc_media_library_retain'); + pointer(libvlc_media_library_load):=GetProcAddress(hlib,'libvlc_media_library_load'); + pointer(libvlc_media_library_media_list):=GetProcAddress(hlib,'libvlc_media_library_media_list'); + pointer(libvlc_media_discoverer_new_from_name):=GetProcAddress(hlib,'libvlc_media_discoverer_new_from_name'); + pointer(libvlc_media_discoverer_release):=GetProcAddress(hlib,'libvlc_media_discoverer_release'); + pointer(libvlc_media_discoverer_localized_name):=GetProcAddress(hlib,'libvlc_media_discoverer_localized_name'); + pointer(libvlc_media_discoverer_media_list):=GetProcAddress(hlib,'libvlc_media_discoverer_media_list'); + pointer(libvlc_media_discoverer_event_manager):=GetProcAddress(hlib,'libvlc_media_discoverer_event_manager'); + pointer(libvlc_media_discoverer_is_running):=GetProcAddress(hlib,'libvlc_media_discoverer_is_running'); + pointer(libvlc_vlm_release):=GetProcAddress(hlib,'libvlc_vlm_release'); + pointer(libvlc_vlm_add_broadcast):=GetProcAddress(hlib,'libvlc_vlm_add_broadcast'); + pointer(libvlc_vlm_add_vod):=GetProcAddress(hlib,'libvlc_vlm_add_vod'); + pointer(libvlc_vlm_del_media):=GetProcAddress(hlib,'libvlc_vlm_del_media'); + pointer(libvlc_vlm_set_enabled):=GetProcAddress(hlib,'libvlc_vlm_set_enabled'); + pointer(libvlc_vlm_set_output):=GetProcAddress(hlib,'libvlc_vlm_set_output'); + pointer(libvlc_vlm_set_input):=GetProcAddress(hlib,'libvlc_vlm_set_input'); + pointer(libvlc_vlm_add_input):=GetProcAddress(hlib,'libvlc_vlm_add_input'); + pointer(libvlc_vlm_set_loop):=GetProcAddress(hlib,'libvlc_vlm_set_loop'); + pointer(libvlc_vlm_set_mux):=GetProcAddress(hlib,'libvlc_vlm_set_mux'); + pointer(libvlc_vlm_change_media):=GetProcAddress(hlib,'libvlc_vlm_change_media'); + pointer(libvlc_vlm_play_media):=GetProcAddress(hlib,'libvlc_vlm_play_media'); + pointer(libvlc_vlm_stop_media):=GetProcAddress(hlib,'libvlc_vlm_stop_media'); + pointer(libvlc_vlm_pause_media):=GetProcAddress(hlib,'libvlc_vlm_pause_media'); + pointer(libvlc_vlm_seek_media):=GetProcAddress(hlib,'libvlc_vlm_seek_media'); + pointer(libvlc_vlm_show_media):=GetProcAddress(hlib,'libvlc_vlm_show_media'); + pointer(libvlc_vlm_get_media_instance_position):=GetProcAddress(hlib,'libvlc_vlm_get_media_instance_position'); + pointer(libvlc_vlm_get_media_instance_time):=GetProcAddress(hlib,'libvlc_vlm_get_media_instance_time'); + pointer(libvlc_vlm_get_media_instance_length):=GetProcAddress(hlib,'libvlc_vlm_get_media_instance_length'); + pointer(libvlc_vlm_get_media_instance_rate):=GetProcAddress(hlib,'libvlc_vlm_get_media_instance_rate'); + pointer(libvlc_vlm_get_event_manager):=GetProcAddress(hlib,'libvlc_vlm_get_event_manager'); + pointer(libvlc_playlist_play):=GetProcAddress(hlib,'libvlc_playlist_play'); +end; + + +end. diff --git a/src/3rdparty/libvlc/vlc.pas b/src/3rdparty/libvlc/vlc.pas new file mode 100644 index 00000000..0f82b9c0 --- /dev/null +++ b/src/3rdparty/libvlc/vlc.pas @@ -0,0 +1,1746 @@ +unit vlc; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, ctypes, libvlc, syncobjs; + +Type + + { TVLCLibrary } + + TVLCLibrary = class(TComponent) + private + FInstance : plibvlc_instance_t; + FLibraryArgs: TStrings; + FLibraryPath : String; + function GetI: Boolean; + function GetLastError: String; + Function GetVersion : String; + Function GetCompiler : String; + Function GetChangeSet : String; + Procedure SetLibraryPath(Const AValue : String); + Protected + Function GetInstance : plibvlc_instance_t; virtual; + property Instance : plibvlc_instance_t read GetInstance; + public + constructor Create (AOwner : TComponent); override; + destructor Destroy; override; + Procedure Initialize; + Procedure Release; + property LastError : String read GetLastError; + property Version : String read GetVersion; + property Compiler : String read GetCompiler; + property ChangeSer : String read GetChangeSet; + property LibraryPath : String read FLibraryPath write SetLibraryPath; + Property LibraryArgs : TStrings read FLibraryArgs Write FLibraryArgs; + Property Initialized : Boolean Read GetI; + end; + + TVLCLibraryClass = Class of TVLCLibrary; + + TCustomVLCMediaPlayer = Class; + TVLCMediaItems = Class; + + { TVLCMediaItem } + TSnapShotFormat = (ssfPNG,ssfJPG); + TDeinterlaceMode = (dmBlend, dmDiscard, dmBob, dmLinear, dmMean, dmX, dmYadif, dmYadif2x); + + TVLCMediaItem = Class(TCollectionItem) + private + FDIM: TDeinterlaceMode; + FInstance : plibvlc_media_t; + FOpts : Array [0..3] of Boolean; // Keep in sync with property indexes + FPath: String; + FSS: TSNapshotFormat; + FFD: Integer; + function GetInstance: plibvlc_media_t; + function GetM(AIndex: Integer): Boolean; + function GetMD(AMeta : libvlc_meta_t): String; + function GetMRL: String; + function GetParsed: Boolean; + function GetUD: Pointer; + procedure SetDIM(AValue: TDeinterlaceMode); + procedure SetFSS(AValue: TSNapshotFormat); + procedure SetM(AIndex: Integer; AValue: Boolean); + Function GetBoolOpt(AIndex : Integer; AValue : Boolean) : String; + procedure SetMD(AMeta : libvlc_meta_t; AValue: String); + procedure SetUD(AValue: Pointer); + function GetState : libvlc_state_t; + function GetDuration : TDateTime; + Protected + Procedure RegisterInstance; + Procedure UnRegisterInstance; + procedure SetMRL(AValue: String); virtual; + procedure SetPath(AValue: String); virtual; + procedure SetFD(AValue: Integer); virtual; + Function GetVLC : TVLCLibrary; virtual; + function GetEventManager : plibvlc_event_manager_t; + Procedure SetInstance( Avalue : plibvlc_media_t); + Property Instance : plibvlc_media_t Read GetInstance; + Public + Destructor Destroy; override; + Procedure AddOption(Const AValue : String); + procedure Parse; + procedure ParseAsync; + Procedure SaveMetaData; + Function GetStats(Var AStats : libvlc_media_stats_t) : Boolean; + Function Duplicate : TVLCMediaItem; + Property Parsed : Boolean Read GetParsed; + Property ShowTitle : Boolean Index 0 Read GetM Write SetM; + Property VideoOnTop : Boolean Index 1 Read GetM Write SetM; + Property UseOverlay : Boolean Index 2 Read GetM Write SetM; + Property FullScreen : Boolean Index 3 Read GetM Write SetM; + Property DeinterlaceFilter : Boolean Index 4 Read GetM Write SetM; + Property DeInterlaceMode : TDeinterlaceMode Read FDIM Write SetDIM; + Property SnapShotFormat : TSNapshotFormat Read FSS Write SetFSS; + Property UserData : Pointer Read GetUD Write SetUD; + Property State : libvlc_state_t Read GetState; + Property Duration : TDateTime Read GetDuration; + Property MetaData[AMeta : libvlc_meta_t] : String Read GetMD Write SetMD; + // These must be set prior to using any of the above. + Property MRL : String Read GetMRL Write SetMRL; + Property Path : String Read FPath Write SetPath; + property FileDescriptor : Integer Read FFD Write SetFD; + end; + + TVLCMediaItemClass = Class of TVLCMediaItem; + + { TVLCMediaItems } + TVLCPlayMode = (pmNormal,pmLoop,pmRepeat); + + TVLCMediaItems = Class(TCollection) + Private + FPlayer: TCustomVLCMediaPlayer; + FPlayMode: TVLCPlayMode; + FVLC : TVLCLibrary; + FInstance : Plibvlc_media_list_t; + function GetI(AIndex : Integer): TVLCMediaItem; + function GetInstance: Plibvlc_media_list_t; + function GetIsReadOnly: Boolean; + procedure SetI(AIndex : Integer; AValue: TVLCMediaItem); + Protected + Function GetVLC : TVLCLibrary; virtual; + Public + Constructor Create(ALibrary : TVLCLibrary;AItemClass: TVLCMediaItemClass = Nil); overload; + Constructor Create(AInstance : Plibvlc_media_list_t;AItemClass: TVLCMediaItemClass = Nil); overload; + Procedure Lock; + Procedure Unlock; + Property Instance : Plibvlc_media_list_t read GetInstance; + Property VLC : TVLCLibrary Read GetVLC Write FVLC; + Property MediaItems[AIndex : Integer] : TVLCMediaItem Read GetI Write SetI; default; + Property ReadOnly : Boolean Read GetIsReadOnly; + end; + + { TCustomVLCMediaPlayer } + TBooleanEvent = procedure(Sender : TObject; Const AValue : Boolean) of object; + TTitleEvent = procedure(Sender : TObject; Const ATitle : Integer) of object; + TSnapshotEvent = procedure(Sender : TObject; Const AfileName : string) of object; + TErrorEvent = procedure(Sender : TObject; Const AError : string) of object; + TTimeEvent = procedure(Sender : TObject; Const time : TDateTime) of object; + TPositionEvent = procedure(Sender : TObject; Const APos : Double) of object; + + TCustomVLCMediaPlayer = Class(TComponent) + private + FFitWindow: Boolean; + FOnBackward: TNotifyEvent; + FOnBuffering: TNotifyEvent; + FOnEOF: TNotifyEvent; + FOnError: TErrorEvent; + FOnForward: TNotifyEvent; + FOnLengthChanged: TTimeEvent; + FOnMediaChanged: TNotifyEvent; + FOnNothingSpecial: TNotifyEvent; + FOnOpening: TNotifyEvent; + FOnPausableChanged: TBooleanEvent; + FOnPause: TNotifyEvent; + FOnPlaying: TNotifyEvent; + FOnPositionChanged: TPositionEvent; + FOnSeekableChanged: TBooleanEvent; + FOnSnapShot: TSnapShotEvent; + FOnStop: TNotifyEvent; + FOnTimeChanged: TTimeEvent; + FOnTitleChanged: TTitleEvent; + FUseEvents: Boolean; + Finstance : Plibvlc_media_player_t; + FVLC: TVLCLibrary; + FECS : TCriticalSection; + function GetAspectRatio: String; + function GetAudioMuted: Boolean; + function GetAudioTrack: Integer; + function GetHaveInstance: Boolean; + function GetState: libvlc_state_t; + function GetVideoDuration: TDateTime; + function GetVideoFPS: Double; + function GetVideoFractional: Double; + function GetVideoHeight: Cardinal; + function GetVideoLength: Int64; + function GetVideoPos: Int64; + function GetVideoScale: Double; + function GetVideoWidth: Cardinal; + function GetVLC: TVLCLibrary; + procedure SetAspectRatio(AValue: String); + procedure SetAudioMuted(AValue: Boolean); + procedure SetFitWindow(AValue: Boolean); + procedure SetUseEVents(AValue: Boolean); + function GetAudioTrackCount : Integer; + procedure SetAudioTrack(AValue: Integer); + function GetAudioTrackDescriptions(AIndex : Integer) : String; + function GetChannel: Integer; + procedure SetChannel(AValue : Integer); + function GetAudioDelay : Int64; + procedure SetAudioDelay (AValue: Int64); + function GetPlaying : Boolean; + function GetChapter : Integer; + procedure SetChapter(AValue : Integer); + function GetChapterCount: Integer; + Function GetPlayable : Boolean; + Function GetPausable : Boolean; + Function GetSeekable : Boolean; + function GetAudioVolume : Integer; + function GetPlayRate: Integer; + procedure SetAudioVolume(AValue : Integer); + procedure SetPlayRate(AValue: Integer); + procedure SetFullScreenMode(AValue: Boolean); + function GetFullScreenMode: Boolean; + procedure SetVideoFractional(AValue: Double); + procedure SetVideoPos(AValue: Int64); + procedure SetVideoScale(AValue: Double); + Protected + function GetInstance: Plibvlc_media_player_t; virtual; + // Called to set parent window. Descendents must override this. + Procedure SetParentWindow; virtual; + // Called when FitWindow is true. + Procedure SetParentWindowSize(AWidth,AHeight : Cardinal); Virtual; + procedure DoMediaChanged; virtual; + procedure DoNothingSpecial; virtual; + procedure DoOnBackward; virtual; + procedure DoOnBuffering;virtual; + procedure DoOnEOF;virtual; + procedure DoOnError;virtual; + procedure DoOnForward;virtual; + procedure DoOnOpening;virtual; + procedure DoOnPause;virtual; + procedure DoOnPlaying;virtual; + procedure DoOnStop;virtual; + procedure DoOnLengthChanged(const ATime: libvlc_time_t); virtual; + procedure DoOnPausableChanged(const APausable: Boolean); virtual; + procedure DoOnPositionChanged(const Aposition: Double); virtual; + procedure DoOnSeekableChanged(const ASeekable: Boolean); virtual; + procedure DoOnTimeChanged(const ATime: libvlc_time_t); virtual; + procedure DoOnTitleChanged(const ATitle: cint); virtual; + procedure DoOnSnapshot(const AFileName: PCChar); virtual; + procedure HookupEvents; virtual; + procedure UnHookEvents; virtual; + procedure HandleVLCEvent(e: Plibvlc_event_t); virtual; + Property VLC : TVLCLibrary Read GetVLC Write FVLC; + Property Instance : Plibvlc_media_player_t Read GetInstance; + Property HaveInstance : Boolean Read GetHaveInstance; + Public + Destructor Destroy; override; + procedure Play; + procedure SetMedia(M: TVLCMediaItem); + Procedure Play(M : TVLCMediaItem); + Procedure PlayFile(Const AFileName : String); + Procedure Stop; + procedure Pause; + procedure Resume; + procedure NextFrame; + function Snapshot(Const AFileName: String): Boolean; + function Snapshot(Const AFileName: String; AWidth, AHeight: Cardinal): Boolean; + function GetVideoSize(Var AWidth, AHeight: Cardinal): Boolean; + // These can be made public/published in descendents + Protected + Property Playable : Boolean Read GetPlayable; + Property Pausable : Boolean Read GetPausable; + Property Seekable : Boolean Read GetSeekable; + Property Playing : Boolean Read GetPlaying; + Property State : libvlc_state_t Read GetState; + Property AudioTrackDescriptions [AIndex : Integer] : String Read GetAudioTrackDescriptions; + Property ChapterCount : Integer Read GetChapterCount; + Property AudioTrackCount : Integer Read GetAudioTrackCount; + Property AudioTrack : Integer Read GetAudioTrack Write SetAudioTrack; + Property AudioDelay : Int64 Read GetAudioDelay Write SetAudioDelay; + Property AudioVolume : Integer Read GetAudioVolume Write SetAudioVolume; + Property AudioMuted : Boolean Read GetAudioMuted Write SetAudioMuted; + Property FitWindow : Boolean Read FFitWindow Write SetFitWindow; + Property VideoWidth : Cardinal Read GetVideoWidth; + Property VideoHeight : Cardinal Read GetVideoHeight; + // In MS. + Property VideoLength : Int64 Read GetVideoLength; + Property VideoDuration : TDateTime Read GetVideoDuration; + // In MS + Property VideoPosition : Int64 Read GetVideoPos Write SetVideoPos; + Property VideoFractionalPosition : Double Read GetVideoFractional Write SetVideoFractional; + Property VideoFramesPerSecond : Double Read GetVideoFPS; + Property VideoScale : Double Read GetVideoScale Write SetVideoScale; + Property AspectRatio : String Read GetAspectRatio Write SetAspectRatio; + Property Channel : Integer Read GetChannel Write SetChannel; + Property Chapter : Integer Read GetChapter Write SetChapter; + Property FullScreenMode : Boolean Read GetFullScreenMode Write SetFullScreenMode; + Property UseEvents : Boolean Read FUseEvents Write SetUseEVents; + // Events from VLC player + Property OnMediaChanged : TNotifyEvent Read FOnMediaChanged Write FOnMediaChanged; + Property OnNothingSpecial : TNotifyEvent Read FOnNothingSpecial Write FOnNothingSpecial; + Property OnBackward : TNotifyEvent Read FOnBackward Write FOnBackward; + Property OnBuffering : TNotifyEvent Read FOnBuffering Write FOnBuffering; + Property OnEOF : TNotifyEvent Read FOnEOF Write FOnEOF; + Property OnError : TErrorEvent Read FOnError Write FOnError; + Property OnForward : TNotifyEvent Read FOnForward Write FOnForward; + Property OnOpening : TNotifyEvent Read FOnOpening Write FOnOpening; + Property OnPause : TNotifyEvent Read FOnPause Write FOnPause; + Property OnPlaying : TNotifyEvent Read FOnPlaying Write FOnPlaying; + Property OnStop : TNotifyEvent Read FOnStop Write FOnStop; + Property OnLengthChanged : TTimeEvent Read FOnLengthChanged Write FOnLengthChanged; + Property OnTimeChanged : TTimeEvent Read FOnTimeChanged Write FOnTimeChanged; + Property OnPausableChanged : TBooleanEvent Read FOnPausableChanged Write FOnPausableChanged; + Property OnPositionChanged : TPositionEvent Read FOnPositionChanged Write FOnPositionChanged; + Property OnSeekableChanged : TBooleanEvent Read FOnSeekableChanged Write FOnSeekableChanged; + Property OnTitleChanged : TTitleEvent Read FOnTitleChanged Write FOnTitleChanged; + Property OnSnapshot : TSnapShotEvent Read FOnSnapShot Write FOnSnapShot; + end; + + EVLC = Class(Exception); + + TVLCMediaPlayer = Class(TCustomVLCMediaPlayer) + Public + Property Playable ; + Property Pausable ; + Property Seekable ; + Property PLaying ; + Property State ; + Property AudioTrackDescriptions; + Property ChapterCount ; + Property AudioTrackCount ; + Property AudioTrack ; + Property VideoWidth ; + Property VideoHeight; + Property VideoLength; + Property VideoDuration ; + Property VideoPosition ; + Property VideoFractionalPosition ; + Property VideoFramesPerSecond; + Property VideoScale : Double; + Property AspectRatio : String; + Published + Property AudioDelay ; + Property AudioVolume ; + Property AudioMuted ; + Property Channel ; + Property Chapter ; + Property FitWindow; + Property FullScreenMode ; + Property UseEvents ; + Property OnMediaChanged ; + Property OnNothingSpecial ; + Property OnBackward ; + Property OnBuffering ; + Property OnEOF ; + Property OnError ; + Property OnForward ; + Property OnOpening ; + Property OnPause ; + Property OnPlaying ; + Property OnStop ; + Property OnLengthChanged ; + Property OnTimeChanged ; + Property OnPausableChanged ; + Property OnPositionChanged ; + Property OnSeekableChanged ; + Property OnTitleChanged ; + Property OnSnapshot ; + end; + + { TCustomVLCMediaListPlayer } + + TCustomVLCMediaListPlayer = Class(TComponent) + Private + FMediaItems: TVLCMediaItems; + FPlayer: TCustomVLCMediaPlayer; + FPlayMode: TVLCPlayMode; + FInstance : plibvlc_media_list_player_t; + FVLC: TVLCLibrary; + function GetInstance: plibvlc_media_list_player_t; + function GetPlaying : Boolean; + function GetState: libvlc_state_t; + function GetVLC: TVLCLibrary; + procedure SetMediaItems(AValue: TVLCMediaItems); + procedure SetPlayer(AValue: TCustomVLCMediaPlayer); virtual; + procedure SetPlayMode(AValue: TVLCPlayMode); + Protected + Function CreateMediaItems : TVLCMediaItems; virtual; + Property Instance : plibvlc_media_list_player_t Read GetInstance; + Property Player : TCustomVLCMediaPlayer Read FPlayer write SetPlayer; + Property PlayMode : TVLCPlayMode read FPlayMode write SetPlayMode; + Property Playing : Boolean Read GetPLaying; + Property State : libvlc_state_t Read GetState; + Property MediaItems : TVLCMediaItems Read FMediaItems Write SetMediaItems; + Property VLC : TVLCLibrary Read GetVLC Write FVLC; + Public + Constructor Create(AOwner : TComponent); override; + Destructor Destroy; override; + procedure Play(Item : TVLCMediaItem); + procedure Play; + procedure Pause; + procedure Stop; + procedure Next; + procedure Prev; + end; + + TVLCMediaListPlayer = Class(TCustomVLCMediaListPlayer) + Public + Property VLC : TVLCLibrary; + Published + Property Player; + Property PlayMode; + Property Playing; + Property State; + Property MediaItems; + end; + +Function VLCLibrary : TVLCLibrary; + +Var + VLCLibraryClass : TVLCLibraryClass = TVLCLibrary; + +Function VLCTimeToDateTime (T : libvlc_time_t) : TDateTime; + +implementation + +{ TVLCLibrary } +Var + LVLC : TVLCLibrary; + +Function VLCLibrary : TVLCLibrary; + +begin + If LVLC=Nil then + LVLC:=VLCLibraryClass.Create(Nil); + Result:=LVLC; +end; + +Procedure DoneVLC; + +begin + If Assigned(LVLC) then + FreeAndNil(LVLC); +end; + +Function VLCTimeToDateTime (T : libvlc_time_t) : TDateTime; + + Function MD(Var MS : libvlc_time_t; D : Integer) : Word; inline; + + begin + Result:=MS Mod D; + MS:=MS div D; + end; + +var + d,h,m,s,ms: word; + +begin + ms:=MD(T,1000); + s:=MD(T,60); + m:=MD(T,60); + h:=MD(T,24); + d:=T; + Result:=D+EncodeTime(h,m,s,ms); +end; + +procedure PlayerEventHelper(event: Plibvlc_event_t; data: Pointer); cdecl; + +begin + if Not Assigned(data) then + exit; + TCustomVLCMediaPlayer(data).HandleVLCEvent(event); +end; + +{ TCustomVLCMediaListPlayer } + +function TCustomVLCMediaListPlayer.GetPlaying: Boolean; +begin + Result:=libvlc_media_list_player_is_playing(Instance)<>0; +end; + +function TCustomVLCMediaListPlayer.GetInstance: plibvlc_media_list_player_t; +begin + if (FInstance=Nil) then + begin + Finstance:=libvlc_media_list_player_new(VLC.Instance); + if Assigned(MediaItems) then + begin + libvlc_media_list_player_set_media_list(FInstance,MediaItems.Instance); + end; + If Assigned(FPlayer) then + begin + libvlc_media_list_player_set_media_player(FInstance, FPlayer.Instance); + end; + end; + Result:=FInstance; +end; + +function TCustomVLCMediaListPlayer.GetState: libvlc_state_t; +begin + Result:=libvlc_media_list_player_get_state(Instance) +end; + +function TCustomVLCMediaListPlayer.GetVLC: TVLCLibrary; +begin + Result:=FVLC; + If Result=Nil then + Result:=VLCLibrary; +end; + +procedure TCustomVLCMediaListPlayer.Play(Item: TVLCMediaItem); +begin + libvlc_media_list_player_play_item(Instance, item.Instance); +end; + +procedure TCustomVLCMediaListPlayer.SetMediaItems(AValue: TVLCMediaItems); +begin + if FMediaItems=AValue then Exit; + FMediaItems.Assign(AValue); +end; + +procedure TCustomVLCMediaListPlayer.SetPlayer(AValue: TCustomVLCMediaPlayer); +begin + if FPlayer=AValue then Exit; + FPlayer:=AValue; + If Assigned(FInstance) then + begin + libvlc_media_list_player_set_media_player(FInstance, FPlayer.Instance); + end; +end; + +procedure TCustomVLCMediaListPlayer.SetPlayMode(AValue: TVLCPlayMode); +Const + M : Array [TVLCPlayMode] of libvlc_playback_mode_t + = (libvlc_playback_mode_default, + libvlc_playback_mode_loop, + libvlc_playback_mode_repeat); + +begin + if FPlayMode=AValue then Exit; + FPlayMode:=AValue; + libvlc_media_list_player_set_playback_mode(FInstance, M[AValue]); +end; + +function TCustomVLCMediaListPlayer.CreateMediaItems: TVLCMediaItems; +begin + Result:=TVLCMediaItems.Create(TVLCMediaItem); +end; + +constructor TCustomVLCMediaListPlayer.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FMediaItems:=CreateMediaItems; +end; + +destructor TCustomVLCMediaListPlayer.Destroy; +begin + If Assigned(Finstance) then + libvlc_media_list_player_release(FInstance); + FreeAndNil(FMediaItems); + inherited Destroy; +end; + +procedure TCustomVLCMediaListPlayer.Play; +begin + libvlc_media_list_player_play(Instance); +end; + +procedure TCustomVLCMediaListPlayer.Pause; +begin + libvlc_media_list_player_pause(Instance); +end; + +procedure TCustomVLCMediaListPlayer.Stop; +begin + libvlc_media_list_player_stop(Instance); +end; + +procedure TCustomVLCMediaListPlayer.Next; +begin + libvlc_media_list_player_next(Instance); +end; + +procedure TCustomVLCMediaListPlayer.Prev; +begin + libvlc_media_list_player_previous(Instance); +end; + + +{ TCustomVLCMediaPlayer } + +function TCustomVLCMediaPlayer.GetVLC: TVLCLibrary; +begin + Result:=FVLC; + if Result=Nil then + Result:=VLCLibrary; +end; + +procedure TCustomVLCMediaPlayer.SetAspectRatio(AValue: String); + +begin + libvlc_video_set_aspect_ratio(Instance,Pcchar(PChar(AValue))); +end; + +function TCustomVLCMediaPlayer.GetAudioMuted: Boolean; +begin + if Assigned(Finstance) then + Result:=libvlc_audio_get_mute(instance)<>0 + else + Result:=False; +end; + +function TCustomVLCMediaPlayer.GetAspectRatio: String; + +Var + P : Pcchar; + +begin + P:=libvlc_video_get_aspect_ratio(Instance); + if (P<>Nil) then + Result:=StrPas(PChar(P)) + else + Result:=''; +end; + +function TCustomVLCMediaPlayer.GetAudioTrack: Integer; +begin + if Assigned(FInstance) then + Result := libvlc_audio_get_track(FINstance) + else + Result:=-1; +end; + +function TCustomVLCMediaPlayer.GetHaveInstance: Boolean; +begin + Result:=(FInstance<>Nil); +end; + +function TCustomVLCMediaPlayer.GetState: libvlc_state_t; +begin + If Assigned(FInstance) then + Result:=libvlc_media_player_get_state(FInstance) + else + Result:=libvlc_NothingSpecial; +end; + +function TCustomVLCMediaPlayer.GetVideoDuration: TDateTime; +begin + Result:=VLCTimeToDateTime(GetVideoLength); +end; + +function TCustomVLCMediaPlayer.GetVideoFPS: Double; +begin + Result:=libvlc_media_player_get_fps(FInstance); +end; + +function TCustomVLCMediaPlayer.GetVideoFractional: Double; +begin + Result:=libvlc_media_player_get_Position(FInstance); +end; + +function TCustomVLCMediaPlayer.GetVideoHeight: Cardinal; +begin + Result:=libvlc_video_get_height(FInstance); +end; + +function TCustomVLCMediaPlayer.GetVideoLength: Int64; +begin + Result:=libvlc_media_player_get_length(Finstance); +end; + +function TCustomVLCMediaPlayer.GetVideoPos: Int64; +begin + Result:=libvlc_media_player_get_time(FInstance); +end; + +function TCustomVLCMediaPlayer.GetVideoScale: Double; +begin + Result:=libvlc_video_get_scale(Finstance); +end; + +function TCustomVLCMediaPlayer.GetVideoWidth: Cardinal; +begin + Result:=libvlc_video_get_width(FInstance); +end; + + +procedure TCustomVLCMediaPlayer.SetAudioMuted(AValue: Boolean); +begin + libvlc_audio_set_mute(instance, ord(AValue)); +end; + +procedure TCustomVLCMediaPlayer.SetFitWindow(AValue: Boolean); + +Var + W,H : Cardinal; + +begin + if FFitWindow=AValue then Exit; + FFitWindow:=AValue; + If FFitWindow and Playing then + begin + if GetVideoSize(W,H) then + SetParentWindowSize(W,H); + end; +end; + +procedure TCustomVLCMediaPlayer.SetUseEVents(AValue: Boolean); +begin + if FUseEvents=AValue then Exit; + FUseEvents:=AValue; + If Assigned(Finstance) then + If AValue then + HookupEvents + else + UnhookEvents; +end; + +function TCustomVLCMediaPlayer.GetAudioTrackCount: Integer; +begin + if Assigned(FInstance) then + Result := libvlc_audio_get_track_count(FINstance) + else + Result:=-1; +end; + + +procedure TCustomVLCMediaPlayer.SetAudioTrack(AValue: Integer); +begin + if Assigned(FInstance) then + begin + if (AValue<0) then + AValue:=0; + libvlc_audio_set_track(FInstance,AValue); + end; +end; + +function TCustomVLCMediaPlayer.GetAudioTrackDescriptions(AIndex: Integer): String; + +var + t : plibvlc_track_description_t; + +begin + Result := ''; + If (AIndex>=0) And Assigned(FInstance) then + begin + T:=libvlc_audio_get_track_description(Finstance); + while (AIndex>0) and Assigned(t) do + begin + Dec(Aindex); + t:=t^.p_next; + end; + If Assigned(t) and Assigned(t^.psz_name) then + Result:=StrPas(PChar(t^.psz_name)); + end; +end; + +function TCustomVLCMediaPlayer.GetChannel: Integer; +begin + If Assigned(Finstance) then + Result:=libvlc_audio_get_channel(FInstance) + else + Result:=-1; +end; + +procedure TCustomVLCMediaPlayer.SetChannel(AValue: Integer); +begin + If Assigned(Finstance) then + libvlc_audio_set_channel(Finstance,AValue) +end; + +function TCustomVLCMediaPlayer.GetAudioDelay: Int64; +begin + if Assigned(FInstance) then + Result:=libvlc_audio_get_delay(FInstance) + else + Result:=-1; +end; + +procedure TCustomVLCMediaPlayer.SetAudioDelay(AValue: Int64); +begin + if Assigned(FInstance) then + libvlc_audio_set_delay(FInstance,AValue) +end; + +function TCustomVLCMediaPlayer.GetPlaying: Boolean; +begin + Result:=(State=libvlc_Playing); +end; + +function TCustomVLCMediaPlayer.GetChapter: Integer; +begin + if Assigned(FInstance) then + Result:=libvlc_media_player_get_chapter(FInstance) + else + Result:=-1; +end; + +procedure TCustomVLCMediaPlayer.SetChapter(AValue: Integer); +begin + if Assigned(FInstance) then + libvlc_media_player_set_chapter(FInstance,AValue); +end; + +function TCustomVLCMediaPlayer.GetChapterCount: Integer; +begin + if Assigned(FInstance) then + Result:=libvlc_media_player_get_chapter_count(FInstance) + else + Result:=-1; +end; + +function TCustomVLCMediaPlayer.GetPlayable: Boolean; +begin + if Assigned(FInstance) then + Result:=(libvlc_media_player_will_play(FInstance)<>0) + else + Result:=False +end; + +function TCustomVLCMediaPlayer.GetPausable: Boolean; +begin + if Assigned(FInstance) then + Result:=(libvlc_media_player_can_pause(FInstance)<>0) + else + Result:=False +end; + +function TCustomVLCMediaPlayer.GetSeekable: Boolean; +begin + if Assigned(FInstance) then + Result:=(libvlc_media_player_is_seekable(FInstance)<>0) + else + Result:=False +end; + +function TCustomVLCMediaPlayer.GetAudioVolume: Integer; +begin + if Assigned(FInstance) then + Result:=libvlc_audio_get_volume(FInstance) + else + Result:=-1 +end; + +procedure TCustomVLCMediaPlayer.SetAudioVolume(AValue: Integer); +begin + if Assigned(FInstance) then + begin + if (AValue<0) then + AValue:=0 + else if (AValue>200) then + AValue:=200; + libvlc_audio_set_volume(Finstance,AValue); + end; +end; + +procedure TCustomVLCMediaPlayer.SetPlayRate(Avalue : Integer); +begin + if Assigned(FInstance) then + begin + if (Avalue< 1) then + AValue:=1 + else if (AValue>1000) then + AValue:=1000; + libvlc_media_player_set_rate(FInstance,AValue/100); + end; +end; + +function TCustomVLCMediaPlayer.GetPlayRate: Integer; +begin + if Assigned(FInstance) then + Result:=Round(libvlc_media_player_get_rate(FInstance)*100) + else + Result:=-1; +end; + +procedure TCustomVLCMediaPlayer.SetFullScreenMode(AValue: Boolean); +begin + if Assigned(FInstance) then + libvlc_set_fullscreen(Finstance,Ord(AValue)); +end; + +function TCustomVLCMediaPlayer.GetFullScreenMode: Boolean; +begin + If Assigned(FInstance) then + Result:=libvlc_get_fullscreen(Finstance)<>0 + else + Result:=False; +end; + +procedure TCustomVLCMediaPlayer.SetVideoFractional(AValue: Double); +begin + libvlc_media_player_set_position(FInstance,AValue); +end; + +procedure TCustomVLCMediaPlayer.SetVideoPos(AValue: Int64); +begin + libvlc_media_player_set_time(FInstance,AVAlue); +end; + +procedure TCustomVLCMediaPlayer.SetVideoScale(AValue: Double); +begin + libvlc_video_set_scale(Finstance,AVAlue); +end; + +function TCustomVLCMediaPlayer.GetInstance: Plibvlc_media_player_t; +begin + Result:=FInstance; + if (FInstance=Nil) then + begin + FInstance:=libvlc_media_player_new(VLC.Instance); + libvlc_video_set_mouse_input(FInstance,1); + libvlc_video_set_key_input(FInstance,1); + if FUseEvents then + HookupEvents; + end; + Result:=FInstance; +end; + +procedure TCustomVLCMediaPlayer.SetParentWindow; +begin + // Do nothing +end; + +procedure TCustomVLCMediaPlayer.SetParentWindowSize(AWidth, AHeight: Cardinal); +begin + // Do nothing +end; + +Procedure TCustomVLCMediaPlayer.UnHookEvents; + + + Procedure ClearEvent(M : plibvlc_event_manager_t;t : libvlc_event_e); + + begin + libvlc_event_detach(M,ord(t),@PlayerEventHelper,Self); + end; + +Var + M : plibvlc_event_manager_t; + +begin + M:=libvlc_media_player_event_manager(Instance); + if (M<>Nil) then + begin + ClearEvent(M,libvlc_MediaPlayerMediaChanged); + ClearEvent(M,libvlc_MediaPlayerNothingSpecial); + ClearEvent(M,libvlc_MediaPlayerOpening); + ClearEvent(M,libvlc_MediaPlayerBuffering); + ClearEvent(M,libvlc_MediaPlayerPlaying); + ClearEvent(M,libvlc_MediaPlayerPaused); + ClearEvent(M,libvlc_MediaPlayerStopped); + ClearEvent(M,libvlc_MediaPlayerForward); + ClearEvent(M,libvlc_MediaPlayerBackward); + ClearEvent(M,libvlc_MediaPlayerEndReached); + ClearEvent(M,libvlc_MediaPlayerEncounteredError); + ClearEvent(M,libvlc_MediaPlayerTimeChanged); + ClearEvent(M,libvlc_MediaPlayerPositionChanged); + ClearEvent(M,libvlc_MediaPlayerSeekableChanged); + ClearEvent(M,libvlc_MediaPlayerPausableChanged); + ClearEvent(M,libvlc_MediaPlayerTitleChanged); + ClearEvent(M,libvlc_MediaPlayerSnapshotTaken); + ClearEvent(M,libvlc_MediaPlayerLengthChanged); + FreeAndNil(FECS); + end; +end; + +Procedure TCustomVLCMediaPlayer.HookupEvents; + + Procedure AttachEvent( M : plibvlc_event_manager_t;t : libvlc_event_e); + + begin + libvlc_event_attach(M,ord(t),@PlayerEventHelper,Self); + end; + +Var + M : plibvlc_event_manager_t; + +begin + M:=libvlc_media_player_event_manager(Instance); + if (M<>Nil) then + begin + FECS:=TCriticalSection.Create; + AttachEvent(M,libvlc_MediaPlayerMediaChanged); + AttachEvent(M,libvlc_MediaPlayerNothingSpecial); + AttachEvent(M,libvlc_MediaPlayerOpening); + AttachEvent(M,libvlc_MediaPlayerBuffering); + AttachEvent(M,libvlc_MediaPlayerPlaying); + AttachEvent(M,libvlc_MediaPlayerPaused); + AttachEvent(M,libvlc_MediaPlayerStopped); + AttachEvent(M,libvlc_MediaPlayerForward); + AttachEvent(M,libvlc_MediaPlayerBackward); + AttachEvent(M,libvlc_MediaPlayerEndReached); + AttachEvent(M,libvlc_MediaPlayerEncounteredError); + AttachEvent(M,libvlc_MediaPlayerTimeChanged); + AttachEvent(M,libvlc_MediaPlayerPositionChanged); + AttachEvent(M,libvlc_MediaPlayerSeekableChanged); + AttachEvent(M,libvlc_MediaPlayerPausableChanged); + AttachEvent(M,libvlc_MediaPlayerTitleChanged); + AttachEvent(M,libvlc_MediaPlayerSnapshotTaken); + AttachEvent(M,libvlc_MediaPlayerLengthChanged); + end; +end; + +procedure TCustomVLCMediaPlayer.DoMediaChanged; + +begin + If Assigned(FOnMediaChanged) then + FOnMediaChanged(Self); +end; + +procedure TCustomVLCMediaPlayer.DoNothingSpecial; + +begin + If Assigned(FOnNothingSpecial) then + FOnNothingSpecial(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnOpening; + +begin + If Assigned(FOnOpening) then + FOnOpening(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnPlaying; + +begin + If Assigned(FOnPlaying) then + FOnPlaying(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnPause; + +begin + If Assigned(FOnPause) then + FOnPause(Self); +end; + + +procedure TCustomVLCMediaPlayer.DoOnStop; + +begin + If Assigned(FOnStop) then + FOnStop(Self); +end; + + +procedure TCustomVLCMediaPlayer.DoOnForward; + +begin + If Assigned(FOnForward) then + FOnForward(Self); +end; + + +procedure TCustomVLCMediaPlayer.DoOnBackward; + +begin + If Assigned(FOnBackward) then + FOnBackward(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnEOF; + +begin + If Assigned(FOnEOF) then + FOnEOF(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnBuffering; + +begin + If Assigned(FOnBuffering) then + FOnBuffering(Self); +end; + +procedure TCustomVLCMediaPlayer.DoOnError; + +Var + P : pcchar; + E : String; +begin + p:=libvlc_errmsg(); + if p<>Nil then + E:=StrPas(PChar(P)) + else + E:=''; + If Assigned(FOnError) then + FOnError(Self,E); +end; + +procedure TCustomVLCMediaPlayer.DoOnTimeChanged(Const ATime: libvlc_time_t); + +begin + If Assigned(FOnTimeChanged) then + FOnTimeChanged(Self,VLCTimeToDateTime(ATime)); +end; + +procedure TCustomVLCMediaPlayer.DoOnPositionChanged(Const Aposition: Double); + +begin + If Assigned(FOnPositionChanged) then + FOnPositionChanged(Self,APosition); +end; + + +procedure TCustomVLCMediaPlayer.DoOnSeekableChanged(Const ASeekable : Boolean); + +begin + If Assigned(FOnSeekableChanged) then + FOnSeekableChanged(Self,ASeekable); +end; + +procedure TCustomVLCMediaPlayer.DoOnPausableChanged(Const APausable : Boolean); + +begin + If Assigned(FOnPausableChanged) then + FOnPausableChanged(Self,APausable); +end; + +procedure TCustomVLCMediaPlayer.DoOnTitleChanged(Const ATitle: cint); + +begin + If Assigned(FOnTitleChanged) then + FOnTitleChanged(Self,ATitle); +end; + +procedure TCustomVLCMediaPlayer.DoOnSnapshot(Const AFileName : PCChar); + +Var + S :String; + +begin + If Assigned(FOnSnapshot) then + begin + if Assigned(AFileName) then + S:=StrPas(PChar(AFileName)) + else + S:=''; + FOnSnapShot(Self,S); + end; +end; + +procedure TCustomVLCMediaPlayer.DoOnLengthChanged(Const ATime: libvlc_time_t); + +begin + If Assigned(FOnLengtHChanged) then + FOnLengtHChanged(Self,VLCTimeToDateTime(ATime)); +end; + + + +procedure TCustomVLCMediaPlayer.HandleVLCEvent(e: Plibvlc_event_t); + +begin + FECS.Enter; + try + case libvlc_event_e(e^._type) of + libvlc_MediaPlayerMediaChanged : DoMediaChanged; + libvlc_MediaPlayerNothingSpecial : DoNothingSpecial; + libvlc_MediaPlayerOpening : DoOnOpening; + libvlc_MediaPlayerBuffering : DoOnBuffering; + libvlc_MediaPlayerPlaying : DoOnPlaying; + libvlc_MediaPlayerPaused : DoOnPause; + libvlc_MediaPlayerStopped : DoOnStop; + libvlc_MediaPlayerForward : DoOnForward; + libvlc_MediaPlayerBackward : DoOnBackward; + libvlc_MediaPlayerEndReached : DoOnEOF; + libvlc_MediaPlayerEncounteredError : DoOnError; + libvlc_MediaPlayerTimeChanged : begin + DoOnTimeChanged(e^.media_player_time_changed.new_time); + end; + libvlc_MediaPlayerPositionChanged : begin + DoOnPositionChanged(e^.media_player_position_changed.new_position); + end; + libvlc_MediaPlayerSeekableChanged : begin + DoOnSeekableChanged(e^.media_player_seekable_changed.new_seekable<>0); + end; + libvlc_MediaPlayerPausableChanged : begin + DoOnPausableChanged(e^.media_player_pausable_changed.new_pausable<>0) ; + end; + libvlc_MediaPlayerTitleChanged : begin + DoOnTitleChanged(e^.media_player_title_changed.new_title); + end; + libvlc_MediaPlayerSnapshotTaken : begin + DoOnSnapShot(e^.media_player_snapshot_taken.psz_filename); + end; + libvlc_MediaPlayerLengthChanged : begin + DoOnLengthChanged(e^.media_player_length_changed.new_length); + end; + else + // Writeln('Unknown event type ',e^._type); + end; + finally + FECS.Leave; + end; +end; + +destructor TCustomVLCMediaPlayer.Destroy; +begin + If Assigned(FInstance) then + begin + libvlc_media_player_release(FInstance); + FInstance:=Nil; + end; + FreeAndNil(FECS); + inherited Destroy; +end; + +procedure TCustomVLCMediaPlayer.SetMedia(M: TVLCMediaItem); + +begin + libvlc_media_player_set_media(Instance,M.Instance); +end; + +procedure TCustomVLCMediaPlayer.Play; + +Var + W,H : Cardinal; + +begin + SetParentWindow; + libvlc_media_player_play(Instance); + If FitWindow then + begin + VideoScale:=1.0; + if GetVideoSize(W,H) then + SetParentWindowSize(W,H); + end; +end; + +procedure TCustomVLCMediaPlayer.Play(M: TVLCMediaItem); + +begin + if Playing then + begin + Stop; + While Playing do + Sleep(100); + end; + SetMedia(M); + Play; +end; + +procedure TCustomVLCMediaPlayer.PlayFile(const AFileName: String); + +Var + M : TVLCMediaItem; +begin + M:=TVLCMediaItem.Create(Nil); + try + M.Path:=AFileName; + Play(M); + finally + M.Free; + end; +end; + +procedure TCustomVLCMediaPlayer.Stop; +begin + if Assigned(FInstance) then + libvlc_media_player_stop(FInstance); +end; + +procedure TCustomVLCMediaPlayer.Pause; +begin + if Assigned(FInstance) then + libvlc_media_player_pause(FInstance); +end; + +procedure TCustomVLCMediaPlayer.Resume; +begin + if (GetState()=libvlc_Paused) then + if Assigned(FInstance) then + libvlc_media_player_play(FInstance); +end; + +procedure TCustomVLCMediaPlayer.NextFrame; +begin + if Assigned(FInstance) then + libvlc_media_player_next_frame(Finstance); +end; + +function TCustomVLCMediaPlayer.Snapshot(const AFileName: String): Boolean; + +var + w,h : Cardinal; +begin + Result:=Assigned(FInstance); + if Result then + begin + w:=0; + h:=0; + Result:=libvlc_video_get_size(FInstance,0,@W,@H)=0; + if Result then + Result:=SnapShot(AFileName,W,H); + end; +end; + +function TCustomVLCMediaPlayer.Snapshot(const AFileName: String; AWidth, + AHeight: Cardinal): Boolean; +begin + Result:=Assigned(FInstance); + If Result then + Result:=libvlc_video_take_snapshot(FInstance,0,PCChar(PChar(AFileName)),AWidth,AHeight)=0; +end; + +function TCustomVLCMediaPlayer.GetVideoSize(var AWidth, AHeight: Cardinal + ): Boolean; +begin + Result:=libvlc_video_get_size(FInstance,0,@AWidth,@AHeight)=0; +end; + +{ TVLCMediaItems } + +constructor TVLCMediaItems.Create(ALibrary: TVLCLibrary;AItemClass: TVLCMediaItemClass = Nil); +begin + Inherited Create(AItemClass); + FVLC:=ALibrary; +end; + +constructor TVLCMediaItems.Create(AInstance: Plibvlc_media_list_t; + AItemClass: TVLCMediaItemClass); + + +Var + I : Integer; + P : plibvlc_media_t; + +begin + Inherited Create(AItemClass); + FInstance:=AInstance; + For I:=0 to libvlc_media_list_count(FInstance)-1 do + begin + P:=libvlc_media_list_item_at_index(FInstance,I); + (Add as TVLCMediaItem).SetInstance(P); + end; +end; + +procedure TVLCMediaItems.Lock; +begin + libvlc_media_list_lock(FInstance); +end; + +procedure TVLCMediaItems.Unlock; +begin + libvlc_media_list_lock(FInstance); +end; + +function TVLCMediaItems.GetInstance: Plibvlc_media_list_t; +Var + I :integer; +begin + if FInstance=Nil then + begin + FInstance:=libvlc_media_list_new(VLC.Instance); + For I:=0 to Count-1 do + GetI(I).RegisterInstance; + end; + Result:=Finstance; +end; + +function TVLCMediaItems.GetIsReadOnly: Boolean; +begin + Result:=libvlc_media_list_is_readonly(FInstance)<>0; +end; + +function TVLCMediaItems.GetI(AIndex : Integer): TVLCMediaItem; +begin + Result:=Items[AIndex] as TVLCMediaItem; +end; + +procedure TVLCMediaItems.SetI(AIndex : Integer; AValue: TVLCMediaItem); +begin + Items[AIndex]:=AValue; +end; + + +function TVLCMediaItems.GetVLC: TVLCLibrary; +begin + Result:=VLCLibrary; +end; + +{ TVLCMediaItem } + +function TVLCMediaItem.GetInstance: plibvlc_media_t; +begin + Result:=Finstance; + If (Result=Nil) then + Raise EVLC.Create('No instance available at this time. Set MRL, Path or FileDescriptor first'); +end; + +function TVLCMediaItem.GetM(AIndex: Integer): Boolean; +begin + Result:=FOpts[AIndex]; +end; + +function TVLCMediaItem.GetMD(AMeta : libvlc_meta_t): String; + +Var + P : PCChar; + +begin + P:=libvlc_media_get_meta(Instance,AMeta); + if (P<>Nil) then + Result:=StrPas(PChar(p)) + else + Result:=''; +end; + +function TVLCMediaItem.GetMRL: String; +Var + P : PCChar; + +begin + P:=libvlc_media_get_mrl(Instance); + if (P<>Nil) then + Result:=StrPas(PChar(p)) + else + Result:=''; +end; + +function TVLCMediaItem.GetParsed: Boolean; +begin + Result:=libvlc_media_is_parsed(Instance)<>0; +end; + +function TVLCMediaItem.GetUD: Pointer; +begin + Result:=libvlc_media_get_user_data(Instance); +end; + +procedure TVLCMediaItem.SetDIM(AValue: TDeinterlaceMode); + +Const + DMS : Array[TDeinterlaceMode] of string + = ('blend', 'discard', 'bob', 'linear', 'mean', 'x', 'yadif', 'yadif2x'); +begin + if (FDIM=AValue) then Exit; + FDIM:=AValue; + libvlc_media_add_option(Instance, PCChar(PChar('deinterlace-mode='+DMS[AValue]))); +end; + +procedure TVLCMediaItem.SetFD(AValue: Integer); +begin + FFD:=AValue; + Finstance:=libvlc_media_new_fd(GetVLC.Instance,AValue); + If (FInstance=Nil) then + Raise EVLC.CreateFmt('Failed to create media item from file descriptor "%d"',[AValue]); + RegisterInstance; +end; + +procedure TVLCMediaItem.SetFSS(AValue: TSNapshotFormat); + +Const + ssfs : Array[TSnapShotFormat] of string = ('png','jpg'); + +begin + if FSS=AValue then Exit; + FSS:=AValue; + libvlc_media_add_option(Instance, PCChar(PChar('no-snapshot-preview'))); + libvlc_media_add_option(instance, PCChar(PChar('snapshot-format=' + SSFS[aValue]))); +end; + +procedure TVLCMediaItem.SetM(AIndex: Integer; AValue: Boolean); + +begin + FOpts[AIndex]:=AValue; + libvlc_media_add_option(FInstance,PcChar(PChar(GetBoolOpt(AIndex,AValue)))); +end; + +function TVLCMediaItem.GetBoolOpt(AIndex: Integer; AValue: Boolean): String; +begin + Case AINdex of + 0 : Result:='video-title-show'; + 1 : Result:='video-on-top'; + 2 : Result:='overlay'; + 3 : Result:='fullscreen'; + 4 : Result:='deinterlace='+IntToStr(Ord(AValue)); + end; + if (AIndex < 4) and Not AValue then + Result:='no-'+Result; +end; + +procedure TVLCMediaItem.SetMD(AMeta : libvlc_meta_t; AValue: String); +begin + libvlc_media_set_meta(Instance,AMeta,Pcchar(PChar(AValue))); +end; + +procedure TVLCMediaItem.SetMRL(AValue: String); +begin + Finstance:=libvlc_media_new_location(GetVLC.Instance,PCChar(AValue)); + If (FInstance=Nil) then + Raise EVLC.CreateFmt('Failed to create media item from MRL : "%s"',[AValue]); + RegisterInstance; +end; + +procedure TVLCMediaItem.SetPath(AValue: String); +begin + if FPath=AValue then Exit; + FPath:=AValue; + FInstance:=libvlc_media_new_path(GetVLC.Instance,PCChar(AValue)); + if (FInstance=Nil) then + Raise EVLC.CreateFmt('Failed to create media item from path : "%s"',[AValue]); + RegisterInstance; +end; + +procedure TVLCMediaItem.SetUD(AValue: Pointer); +begin + libvlc_media_set_user_data(Instance,AValue); +end; + +function TVLCMediaItem.GetState: libvlc_state_t; +begin + Result:=libvlc_media_get_state(instance); +end; + +function TVLCMediaItem.GetDuration: TDateTime; + +Var + d : libvlc_time_t; + +begin + d:=libvlc_media_get_duration(Instance); + Result:=D +end; + +procedure TVLCMediaItem.RegisterInstance; + +Var + L : Plibvlc_media_list_t; + +begin + If Assigned(Collection) and (Collection is TVLCMediaItems) then + begin + L:=TVLCMediaItems(Collection).FInstance; + if (L<>Nil) then + begin + libvlc_media_list_lock(L); + libvlc_media_list_add_media(L, FInstance); + libvlc_media_list_unlock(L); + end; + end; +end; + +procedure TVLCMediaItem.UnRegisterInstance; +Var + L : Plibvlc_media_list_t; + i : integer; + +begin + If Assigned(Collection) and (Collection is TVLCMediaItems) then + begin + L:=TVLCMediaItems(Collection).FInstance; + if L<>Nil then + begin + libvlc_media_list_lock(L); + I:=libvlc_media_list_index_of_item(L,Finstance); + if (i>=0) then + libvlc_media_list_remove_index(L,i); + libvlc_media_list_unlock(L); + end; + end; +end; + +function TVLCMediaItem.GetVLC: TVLCLibrary; +begin + If Assigned(Collection) and (Collection is TVLCMediaItems) then + Result:=TVLCMediaItems(Collection).GetVLC + else + Result:=VLCLibrary; + if not Result.Initialized then + Result.Initialize; +end; + +function TVLCMediaItem.GetEventManager: plibvlc_event_manager_t; +begin + Result:=libvlc_media_event_manager(Instance); +end; + +procedure TVLCMediaItem.SetInstance(Avalue: plibvlc_media_t); +begin + FInstance:=AValue; +end; + +destructor TVLCMediaItem.Destroy; +begin + inherited Destroy; + if Assigned(FInstance) then + begin + UnregisterInstance; + libvlc_media_release(FInstance); + FInstance:=Nil; + end; +end; + +procedure TVLCMediaItem.AddOption(const AValue: String); +begin + libvlc_media_add_option(Instance,PCChar(PChar(AValue))); +end; + +procedure TVLCMediaItem.Parse; +begin + libvlc_media_parse(Instance); +end; + +procedure TVLCMediaItem.ParseAsync; +begin + libvlc_media_parse_async(Instance); +end; + +procedure TVLCMediaItem.SaveMetaData; +begin + libvlc_media_save_meta(Instance); +end; + +function TVLCMediaItem.GetStats(var AStats: libvlc_media_stats_t): Boolean; +begin + Result:=libvlc_media_get_stats(Instance,@AStats)<>0; +end; + +function TVLCMediaItem.Duplicate: TVLCMediaItem; +begin + If Assigned(Collection) and (Collection is TVLCMediaItems) then + Result:=TVLCMediaItems(Collection).Add as TVLCMediaItem + else + Result:=TVLCMediaItem.Create(Nil); + Result.SetInstance(libvlc_media_duplicate(Instance)); +end; + + +function TVLCLibrary.GetLastError: String; + +Var + P : PCChar; + +begin + P:=libvlc_errmsg(); + if Assigned(P) then + Result := StrPas(PChar(P)) + else + Result:=''; +end; + +function TVLCLibrary.GetI: Boolean; +begin + Result:=FInstance<>Nil; +end; + +function TVLCLibrary.GetVersion: String; +Var + P : PCChar; + +begin + P:=libvlc_get_version(); + if Assigned(P) then + Result := StrPas(PChar(P)) + else + Result:=''; +end; + +function TVLCLibrary.GetCompiler: String; +Var + P : PCChar; + +begin + P:=libvlc_get_compiler(); + if Assigned(P) then + Result := StrPas(PChar(P)) + else + Result:=''; +end; + +function TVLCLibrary.GetChangeSet: String; + +Var + P : PCChar; + +begin + P:=libvlc_get_changeset(); + if Assigned(P) then + Result := StrPas(PChar(P)) + else + Result:=''; +end; + +procedure TVLCLibrary.SetLibraryPath(const AValue: String); +begin + If AValue=FLibraryPath then exit; + If Assigned(FInstance) then + Raise EVLC.Create('VLC already initialized, cannot set librarypath'); + FLibraryPath:=AVAlue; +end; + +function TVLCLibrary.GetInstance: plibvlc_instance_t; + +var + args: Array of AnsiString; + cargs : array of PAnsiChar; + argc, + I : integer; + +begin + If (FInstance=Nil) then + begin + LibraryArgs.add('--no-video-title-show'); + SetLength(cArgs,LibraryArgs.Count+2); + SetLength(Args,LibraryArgs.Count+1); + cargs[0] := PChar(FLibraryPath); + For I:=0 to LibraryArgs.Count-1 do + begin + Args[i]:=LibraryArgs[i]; + CArgs[i+1]:=PChar(Args[i]); + end; + argc:=Length(CArgs); + cargs[argc-1] := NIL; + FInstance := libvlc_new(argc-1, PPcchar(cargs)); + if (FInstance=Nil) then + Raise EVLC.Create('Could not create instance of libvlc'); + end; + Result:=FInstance; +end; + +constructor TVLCLibrary.Create(AOwner: TComponent); +begin + Inherited; + FInstance:=Nil; + FLibraryPath:=LibName; + FLibraryArgs:=TStringList.Create; +end; + +destructor TVLCLibrary.Destroy; +begin + FreeAndNil(FLibraryArgs); + Release; + inherited Destroy; +end; + +procedure TVLCLibrary.Initialize; +begin + LoadLibVLC(LibraryPath,False); + GetInstance; +end; + +procedure TVLCLibrary.Release; +begin + If (FInstance<>Nil) then + begin + libvlc_release(FInstance); + FreeLibVLC; + end; + FInstance:=Nil; +end; + +Initialization + +Finalization + DoneVLC; +end. + |