[vlc-devel] Re: Mozilla Plugin

Michael Pron michael.pron at noos.fr
Thu Apr 29 14:10:56 CEST 2004


Hi,

Here i send you the patches of the work I've done on the mozilla plugin.
I hope it can help.
I add some functions in libvlc.c, and in vlcpeer.cpp. Now, you can call via javascript some functions like:

 get_length()
 get_position()
 Mute()
 Is_Mute()
 Playlist_status()
 Get_index_of_actual_item_in_playlist()
 Get_Number_of_item_in_playlist()
 Access_item_in_playlist(in PRInt64 item_number)
 prev_in_playlist()
 next_in_playlist()
 add_item_to_playlist(in string item_name)
 slower_video()
 faster_video()
 goto_from_begin(in PRInt64 sec)
 goto_from_current_position(in PRInt64 sec)


patch_libvlc : cvs diff -u ./src/libvlc.c
patch_mozilla : cvs diff -u ./mozilla
patch_include_vlc : cvs diff -u ./include/vlc

mkl
-------------- next part --------------
? ./mozilla/.deps
? ./mozilla/Makefile
? ./mozilla/Makefile.in
? ./mozilla/stamp-pic
? ./mozilla/vlcintf.h
? ./mozilla/vlcintf.xpt
Index: ./mozilla/vlcintf.idl
===================================================================
RCS file: /var/cvs/videolan/vlc/mozilla/vlcintf.idl,v
retrieving revision 1.2
diff -u -r1.2 vlcintf.idl
--- ./mozilla/vlcintf.idl	30 Sep 2002 11:05:41 -0000	1.2
+++ ./mozilla/vlcintf.idl	29 Apr 2004 11:52:49 -0000
@@ -10,5 +10,30 @@
     void stop();
 
     void fullscreen();
+
+    
+    
+    void goto_from_current_position(in PRInt64 sec);
+    void goto_from_begin(in PRInt64 sec);
+    void faster_video();
+    void slower_video();
+    PRInt64 get_rate();
+    void add_item_to_playlist(in string item_name);
+    void next_in_playlist();
+    void prev_in_playlist();
+    void Access_item_in_playlist(in PRInt64 item_number);
+    PRInt64 Get_Number_of_item_in_playlist();
+    PRInt64 Get_index_of_actual_item_in_playlist();
+    PRInt64 Playlist_status();
+    void Mute();
+    PRInt64 Is_Mute();
+    
+    void Stop_video();
+    
+    PRInt64 get_position();
+    PRInt64 get_length();
+    
+    
+
 };
 
Index: ./mozilla/vlcpeer.cpp
===================================================================
RCS file: /var/cvs/videolan/vlc/mozilla/vlcpeer.cpp,v
retrieving revision 1.9
diff -u -r1.9 vlcpeer.cpp
--- ./mozilla/vlcpeer.cpp	23 Oct 2003 17:04:39 -0000	1.9
+++ ./mozilla/vlcpeer.cpp	29 Apr 2004 11:52:49 -0000
@@ -49,6 +49,17 @@
 #include "vlcpeer.h"
 #include "vlcplugin.h"
 
+
+#include "vlc_common.h"
+#include <vlc/intf.h>
+
+
+#include <input_ext-plugins.h>
+
+
+
+
+
 NS_IMPL_ISUPPORTS2( VlcPeer, VlcIntf, nsIClassInfo )
 
 /*****************************************************************************
@@ -128,3 +139,186 @@
     return NS_OK;
 }
 
+NS_IMETHODIMP VlcPeer::Stop_video()
+{
+	if( p_plugin )
+	{
+		VLC_Stop_video( p_plugin->i_vlc );
+		p_plugin->b_stream = 0;
+	}
+	return NS_OK;
+}
+
+
+
+NS_IMETHODIMP VlcPeer::Get_rate( PRInt64 *rate )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		*rate = VLC_Get_rate( p_plugin->i_vlc );
+		
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Goto_from_current_position( PRInt64 seconde )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Goto_from_current_position( p_plugin->i_vlc, seconde );
+	}
+	return NS_OK;
+}
+
+NS_IMETHODIMP VlcPeer::Goto_from_begin( PRInt64 seconde )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Goto_from_begin( p_plugin->i_vlc, seconde );
+	}
+	return NS_OK;
+}
+
+
+
+NS_IMETHODIMP VlcPeer::Faster_video()
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Faster_video( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+
+NS_IMETHODIMP VlcPeer::Slower_video()
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Slower_video( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Add_item_to_playlist( const char *item_name )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Add_item_to_playlist( p_plugin->i_vlc, (char *)item_name );
+	}
+	return NS_OK;
+}
+
+
+
+
+NS_IMETHODIMP VlcPeer::Next_in_playlist()
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Playlist_Next( p_plugin->i_vlc ) ;
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Prev_in_playlist()
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Playlist_Prev( p_plugin->i_vlc ) ;
+	}
+	return NS_OK;
+}
+
+NS_IMETHODIMP VlcPeer::Access_item_in_playlist( PRInt64 item_number )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		VLC_Playlist_Access_to( p_plugin->i_vlc, item_number ) ;
+	}
+	return NS_OK;
+}
+
+NS_IMETHODIMP VlcPeer::Get_Number_of_item_in_playlist( PRInt64 *item_number )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		*item_number = VLC_Playlist_Number_of_item( p_plugin->i_vlc ) ;
+	}
+	return NS_OK;
+}
+
+NS_IMETHODIMP VlcPeer::Get_index_of_actual_item_in_playlist( PRInt64 *item_number )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		*item_number = VLC_Playlist_index_of_actual_item( p_plugin->i_vlc ) ;
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Playlist_status( PRInt64 *status )
+{
+	if( p_plugin->i_vlc )
+	{
+		*status = VLC_Playlist_status( p_plugin->i_vlc ) ;
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Mute()
+{
+
+	if( p_plugin )
+	{
+		VLC_Mute( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Is_Mute( PRInt64 *mute )
+{
+
+	if( p_plugin )
+	{
+		*mute = VLC_Is_Mute( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+
+
+NS_IMETHODIMP VlcPeer::Get_position( PRInt64 *pos )
+{
+	if( p_plugin->i_vlc )
+	{
+		*pos = VLC_Get_position( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+NS_IMETHODIMP VlcPeer::Get_length( PRInt64 *length )
+{
+
+	if( p_plugin->i_vlc )
+	{
+		*length = VLC_Get_length( p_plugin->i_vlc );
+	}
+	return NS_OK;
+}
+
+
-------------- next part --------------
Index: ./src/libvlc.c
===================================================================
RCS file: /var/cvs/videolan/vlc/src/libvlc.c,v
retrieving revision 1.121
diff -u -r1.121 libvlc.c
--- ./src/libvlc.c	20 Apr 2004 17:58:04 -0000	1.121
+++ ./src/libvlc.c	29 Apr 2004 11:52:25 -0000
@@ -1164,6 +1164,432 @@
     return VLC_SUCCESS;
 }
 
+
+void VLC_Goto_from_current_position( int i_object, int i_second )
+{
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+        if ( p_vlc )
+        {
+
+                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+
+
+                if ( p_input )
+                {
+                        input_Seek( p_input, i_second, INPUT_SEEK_SECONDS|INPUT_SEEK_CUR );
+                        vlc_object_release( p_input );
+                }
+
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+
+void VLC_Goto_from_begin( int i_object, int i_second )
+{
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+	vlc_value_t value;
+
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+                if ( p_input )
+                {
+                        input_Seek( p_input, i_second, INPUT_SEEK_SECONDS|INPUT_SEEK_SET );
+                        vlc_cond_signal( &p_input->stream.stream_wait );
+                        vlc_object_release( p_input );
+
+                }
+                vlc_object_release( p_vlc );
+        }
+
+}
+
+
+void VLC_Faster_video( int i_object )
+{
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+                if ( p_input )
+                {
+                        input_SetStatus( p_input, INPUT_STATUS_FASTER );
+                        vlc_object_release( p_input );
+                }
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+
+void VLC_Slower_video( int i_object )
+{
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+                if ( p_input )
+                {
+                        input_SetStatus( p_input, INPUT_STATUS_SLOWER );
+                        vlc_object_release( p_input );
+                }
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+int VLC_Get_rate( int i_object )
+{
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+        stream_position_t p_position;
+        int i_rate=0;
+
+	vlc_value_t valeur;
+
+
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+        if (p_vlc)
+        {
+                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+                if ( p_input )
+                {
+                        input_Tell( p_input, &p_position );
+                        i_rate=p_position.i_mux_rate;
+                        vlc_object_release( p_input );
+                }
+                vlc_object_release( p_vlc );
+        }
+	
+	return i_rate;
+}
+
+void VLC_Add_item_to_playlist( int i_object, char *item_name )
+{
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); 
+                if( !p_playlist )
+                {
+                        p_playlist = playlist_Create( p_vlc );
+                        if( !p_playlist )
+                        {
+                                msg_Err( p_vlc, "playlist initialization failed" );
+                                if( p_vlc->p_memcpy_module != NULL )
+                                {
+                                        module_Unneed( p_vlc, p_vlc->p_memcpy_module );
+                                }
+                                if( i_object ) vlc_object_release( p_vlc );
+                        }
+                }
+                else
+                {
+                        playlist_Add( p_playlist, item_name, 0, PLAYLIST_APPEND, PLAYLIST_END );
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+void VLC_Playlist_Next( int i_object )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if (p_playlist)
+                {
+                        playlist_Next( p_playlist );
+                        vlc_object_release( p_playlist );
+                }
+
+
+                vlc_object_release( p_vlc );
+        }
+
+}
+
+void VLC_Playlist_Prev( int i_object )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if ( p_playlist )
+                {
+                        playlist_Prev( p_playlist );
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+void VLC_Playlist_Access_to( int i_object, int i_item_number )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if ( p_playlist )
+                {
+                        playlist_Command( p_playlist, PLAYLIST_GOTO, i_item_number );
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+}
+
+
+int VLC_Playlist_Number_of_item( int i_object )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+        int i_size=0;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if ( p_playlist )
+                {
+                        i_size=p_playlist->i_size;
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+        return ( i_size );
+}
+
+
+
+int VLC_Playlist_index_of_actual_item( int i_object )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+        int i_index=0;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+                if ( p_playlist )
+                {
+                        i_index=p_playlist->i_index;
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+        return ( i_index );
+}
+
+
+int VLC_Playlist_status( int i_object )
+{
+
+        playlist_t *p_playlist;
+        vlc_t *p_vlc;
+        input_thread_t *p_input;
+        int i_status=-2;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+
+
+
+        if ( p_vlc )
+        {
+                p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
+
+                if ( p_playlist )
+                {
+                        /*if the status is equal to 1 we've had to get the right status : Play or Pause*/
+                        if ( p_playlist->i_status==1 )
+                        {
+                                p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+                                if ( p_input )
+                                {
+                                        if ( p_input->stream.i_new_status == PAUSE_S )
+                                                i_status=2;
+                                        else
+                                                i_status=1;
+                                        vlc_object_release( p_input );
+                                }
+                        }
+                        else
+                        {
+                                i_status=0;
+                        }
+
+                        vlc_object_release( p_playlist );
+                }
+                vlc_object_release( p_vlc );
+        }
+        return ( i_status );
+}
+
+
+void VLC_Mute ( int i_object )
+{
+        vlc_t *p_vlc;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+        if( p_vlc )
+        {
+                aout_VolumeMute( p_vlc, NULL );
+                vlc_object_release( p_vlc );
+        }
+}
+
+int VLC_Is_Mute ( int i_object )
+{
+        vlc_t *p_vlc;
+        audio_volume_t i_volume;
+        int i_mute=0;
+
+        p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+        if ( p_vlc )
+        {
+                i_volume = ( audio_volume_t )config_GetInt( p_vlc, "volume" );
+                if ( i_volume==0 )
+                        i_mute=1;
+                vlc_object_release( p_vlc );
+        }
+        return ( i_mute );
+}
+
+int VLC_Stop_video( int i_object )
+{
+	playlist_t    *   p_playlist;
+	vlc_t *p_vlc = vlc_current_object( i_object );
+
+	/* Check that the handle is valid */
+	if( !p_vlc )
+	{
+		return VLC_ENOOBJ;
+	}
+
+	p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST,
+			FIND_CHILD );
+
+	/* Send the command STOP to the playlist */
+	if ( p_playlist )
+	{
+		playlist_Command( p_playlist, PLAYLIST_STOP ,0 );
+		vlc_object_release( p_playlist );
+	}
+
+
+	if( i_object ) vlc_object_release( p_vlc );
+	return VLC_SUCCESS;
+}
+
+int VLC_Get_position( int i_object )
+{
+	vlc_t *p_vlc;
+
+	vlc_value_t value;
+	int i_position=0;
+
+
+	input_thread_t *p_input;
+
+
+	p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+	if ( p_vlc )
+	{
+		p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+		if ( p_input )
+		{
+			var_Get( p_input, "time", &value );
+			i_position = value.i_int;
+
+			vlc_object_release( p_input );
+		}
+
+		vlc_object_release( p_vlc );
+	}
+	return( i_position );
+
+}
+
+int VLC_Get_length( int i_object )
+{
+	vlc_t *p_vlc;
+	input_thread_t *p_input;
+	int i_length=0;
+	vlc_value_t value;
+
+	p_vlc = i_object ? vlc_object_get( p_libvlc, i_object ) : p_static_vlc;
+	if ( p_vlc )
+	{
+		p_input = vlc_object_find( p_vlc, VLC_OBJECT_INPUT, FIND_CHILD );
+		if ( p_input )
+		{
+			var_Get( p_input, "length", &value );
+			i_length = value.i_int;
+
+			vlc_object_release( p_input );
+		}
+		vlc_object_release( p_vlc );
+	}
+	return ( i_length );
+
+}
+
+
+
+
+
+
 /* following functions are local */
 
 /*****************************************************************************
-------------- next part --------------
Index: ./include/vlc/vlc.h
===================================================================
RCS file: /var/cvs/videolan/vlc/include/vlc/vlc.h,v
retrieving revision 1.32
diff -u -r1.32 vlc.h
--- ./include/vlc/vlc.h	20 Apr 2004 15:05:34 -0000	1.32
+++ ./include/vlc/vlc.h	29 Apr 2004 11:53:16 -0000
@@ -236,6 +236,29 @@
 int     VLC_ClearPlaylist( int );
 vlc_bool_t VLC_IsPlaying ( int );
 
+
+void    VLC_Goto_from_current_position( int, int );
+void    VLC_Goto_from_begin( int, int );
+void    VLC_Faster_video( int );
+void    VLC_Slower_video( int );
+int     VLC_Get_rate( int );
+void    VLC_Add_item_to_playlist( int, char* );
+void    VLC_Playlist_Next( int );
+void    VLC_Playlist_Prev( int );
+void    VLC_Playlist_Access_to( int, int );
+int     VLC_Playlist_Number_of_item( int );
+int     VLC_Playlist_index_of_actual_item( int );
+int     VLC_Playlist_status( int );
+void    VLC_Mute ( int );
+int     VLC_Is_Mute (int );
+int     VLC_Stop_video( int );
+int     VLC_Get_position( int );
+int     VLC_Get_length( int );
+
+
+
+
+
 # ifdef __cplusplus
 }
 # endif


More information about the vlc-devel mailing list