]> git.sesse.net Git - vlc/commitdiff
Java bindings update:
authorFilippo Carone <littlejohn@videolan.org>
Tue, 6 Jun 2006 11:31:55 +0000 (11:31 +0000)
committerFilippo Carone <littlejohn@videolan.org>
Tue, 6 Jun 2006 11:31:55 +0000 (11:31 +0000)
* more synchronization with playlist and input threads
* new libvlc functions binded

bindings/java/FAQ
bindings/java/Makefile.am
bindings/java/README
bindings/java/org/videolan/jvlc/InputIntf.java
bindings/java/org/videolan/jvlc/JVLC.java
bindings/java/org/videolan/jvlc/Playlist.java
bindings/java/org/videolan/jvlc/PlaylistIntf.java
bindings/java/org/videolan/jvlc/VideoIntf.java
bindings/java/vlc-graphics-jni.cc
bindings/java/vlc-libvlc-jni.cc

index cc3cb63c3ad89c379ae628b1f566e6df8c3979d3..0cabbb766ea587c1758cd8357c99e27f94729694 100644 (file)
@@ -33,4 +33,4 @@ is really straightforward and simple to use.
 
 Try the software and report any errors or bugs you find to me. This application
 needs porting to MS/Windows and MacOS, if you are able to implement the JNI for
-these platform you may contribute the code.
\ No newline at end of file
+these platforms you may contribute the code.
\ No newline at end of file
index 1f351f5b40fef11edc836bae276b546d2585c696..9c942ab872aec301a31e56f9e04eb710f80f00d7 100644 (file)
@@ -4,7 +4,7 @@
 
 if BUILD_JAVA
 
-OBJECTS = org/videolan/jvlc/AudioIntf.class org/videolan/jvlc/InputIntf.class org/videolan/jvlc/PlaylistIntf.class org/videolan/jvlc/VideoIntf.class org/videolan/jvlc/JLibVLC.class org/videolan/jvlc/JVLC.class org/videolan/jvlc/JVLCCanvas.class org/videolan/jvlc/JVLCPanel.class org/videolan/jvlc/VLMIntf.class org/videolan/jvlc/Playlist.class 
+OBJECTS = org/videolan/jvlc/AudioIntf.class org/videolan/jvlc/InputIntf.class org/videolan/jvlc/PlaylistIntf.class org/videolan/jvlc/VideoIntf.class org/videolan/jvlc/JLibVLC.class org/videolan/jvlc/JVLC.class org/videolan/jvlc/JVLCCanvas.class org/videolan/jvlc/JVLCPanel.class org/videolan/jvlc/VLMIntf.class org/videolan/jvlc/Playlist.class org/videolan/jvlc/Status.class
 
 JNIHEADERS = org_videolan_jvlc_JVLC.h org_videolan_jvlc_JVLCCanvas.h org_videolan_jvlc_JVLCPanel.h
 
@@ -21,7 +21,7 @@ JCH = gcjh -jni
 
 # Compile flags
 JAVACXXFLAGS = `top_builddir=../.. ../../vlc-config --cflags pic` -I../../ -I ../../include $(JINCLUDES)
-JAVALDFLAGS = -L../../lib -lvlc_pic `top_builddir=../.. ../../vlc-config --libs builtin vlc pic`
+JAVALDFLAGS = -L../../src -lvlc `top_builddir=../.. ../../vlc-config --libs builtin vlc pic`
 
 # Build targets
 all: libjvlc.so VlcClient
index 76732ce5065936f363c10ccfc6116632c4d8fdf7..6f2d0f8d45c31fa3fdad8c5a7be5990ac3e2f990 100644 (file)
@@ -1,4 +1,4 @@
-$Id$
+
             First of all, this is a *developers* only version
 
 
@@ -7,17 +7,17 @@ Usage
 
  In order to use these bindings you have to compile vlc from source. I
 recommend you to take the latest version from videolan svn repository
-by doing:
+(or use at least revison 15823) by doing:
 
 svn co svn://svn.videolan.org/vlc/trunk vlc-trunk
 
- bootstrap and configure. At the configure give the command:
+ bootstrap, clean and configure:
 
-./configure --enable-mozilla && make && make install
+./bootstrap && make distclean
+./configure --enable-java-bindings && make && make install
 
- to enable compilation of _pic version of libraries. If you give a
-prefix be sure to change the PREFIX variable in the Makefile from
- /usr/local to your prefix.
+ If you give a prefix be sure to change the PREFIX variable in the Makefile
+from /usr/local to your prefix.
 
  Once you've done with vlc you can run make in jvlc directory. Be sure
 you have gcj, gcjh and if you want to use the SUN Java compiler,
@@ -28,18 +28,11 @@ LIBJINCLUDES
 
  In the next releases I will automate this process.
 
- To run JVLC issue:
+ To run a Java VLC example issue:
 
 java -Djava.library.path=. VlcClient
 
  Be sure your ldconfig can find libjawt.so and libmawt.so or you will
 get linking errors when you run the program.
 
- To try the SWT version of the player, issue:
-
-javac -cp /usr/share/java/swt-gtk.jar:. SWTUglyPlayer.java
-java -cp /usr/share/java/swt-gtk.jar:. -Djava.library.path=.:/usr/lib/jni SWTUglyPlayer
-
- using the appropriate paths.
-
  Happy playing.
index 3d73d6cf6bbc2390219b63b0088f9dbb28d454ed..ee8a587845d527f93820ba1dac37f7eb5a773cc8 100644 (file)
@@ -30,6 +30,7 @@
 package org.videolan.jvlc;
 
 public interface InputIntf {
+    
     /**
      * This function returns the total length of the current file playing
      * in millis.
@@ -41,7 +42,8 @@ public interface InputIntf {
      * currently playing playlist item.
      */
     long getInputTime();
-    void getInputPosition();
+    long getInputPosition();
     void setInputTime();
     double getInputFPS();
+    
 }
index 66632f69a402dcdd2b818164f86b6bcfeffcec2a..99bfe14d20f0db08150d03a92d166a18f85ae9eb 100644 (file)
@@ -38,15 +38,18 @@ public class JVLC implements JLibVLC {
 
     private long _instance;
     public Playlist playlist;
+    public Status status;      
     
     public JVLC() {
         _instance = createInstance();
         playlist = new Playlist( _instance );
+        status = new Status(this);
     }
     
     public JVLC(String[] args) {
         _instance = createInstance( args );
         playlist = new Playlist( _instance );
+        status = new Status(this);
     }
     
     /*
@@ -68,15 +71,19 @@ public class JVLC implements JLibVLC {
      *  Input native methods
      */
     private native long     _getInputLength();
+    private native long     _getInputPosition();
     private native long     _getInputTime();
 
     
     /*
      * Video native methods
      */
-    private native void _toggleFullscreen();
-    private native void _setFullscreen( boolean value);
-    private native boolean _getFullscreen();
+    private native void     _toggleFullscreen();
+    private native void     _setFullscreen( boolean value);
+    private native boolean  _getFullscreen();
+    private native int      _getVideoHeight();
+    private native int      _getVideoWidth();
+    private native void _getSnapshot(String filename);
  
     
     public boolean getMute() {
@@ -115,6 +122,16 @@ public class JVLC implements JLibVLC {
        return _getFullscreen();        
     }
 
+    public int getVideoHeight() {
+        return _getVideoHeight();
+    }
+    
+
+    public int getVideoWidth() {
+        return _getVideoWidth();        
+    }
+
+    
     public long getInputLength() {
         return _getInputLength();        
     }
@@ -123,8 +140,8 @@ public class JVLC implements JLibVLC {
         return _getInputTime();
     }
 
-    public void getInputPosition() {
-        // TODO Auto-generated method stub
+    public long getInputPosition() {
+        return _getInputPosition();
         
     }
 
@@ -137,7 +154,7 @@ public class JVLC implements JLibVLC {
         // TODO Auto-generated method stub
         return 0;
     }
-
+    
     public long getInstance() {
         return _instance;
     }
@@ -148,5 +165,10 @@ public class JVLC implements JLibVLC {
        public Playlist getPlaylist() {
                return playlist;
        }
+    
+
+       public void getSnapshot(String filename) {
+               _getSnapshot(filename);
+       }
 
 }
index b19fe74dba811af713be9a6126d2880e173061aa..26120d49a07cc8ab40727cb9b5d0aeeb19dde7f9 100644 (file)
@@ -1,4 +1,4 @@
-/*****************************************************************************
+ /*****************************************************************************
  * PlaylistIntf.java: The playlist interface
  *****************************************************************************
  *
@@ -48,70 +48,83 @@ public class Playlist implements PlaylistIntf {
     native private void _deleteItem(int itemID);
     
     native private int _itemsCount();
-    native private int _isPlaying();
+    native private int _isRunning();
     
+    native private boolean _inputIsPlaying();
+       native private boolean _inputHasVout();
 
 
-    public void play(int id, String[] options) {
+    public synchronized void play(int id, String[] options) {
         _play(id, options);
+        while (! _inputIsPlaying()) ;
     }
 
-    public void play() {
+    public synchronized void play() {
         play(-1, null);
     }
 
-    public void pause() {
+    public synchronized void pause() {
         _pause();
     }
 
-    public void stop() {
+    public synchronized void stop() {
         _stop();
 
     }
 
-    public boolean isPlaying() {
-         return (_isPlaying() == 0)? false : true ;
+    public boolean isRunning() {
+         return (_isRunning() == 0)? false : true ;
     }
 
-    public int itemsCount() {
+    public synchronized int itemsCount() {
         return _itemsCount();
     }
 
-    public void next() {
-        if (! isPlaying())
+    public synchronized void next() {
+        if (! isRunning())
             play();
         _next();
     }
 
-    public void prev() {
+    public synchronized void prev() {
+        if (! isRunning())
+            play();
         _prev();
     }
 
-    public void clear() {
-        if (! isPlaying())
-            play();
-        _clear();
+    public synchronized void clear() {
+       /*
+        * This method has been commented out until
+        * playlist_Clear has been fixed in vlc.
+        */
+        //_clear();
     }
 
-    public int add(String uri, String name, String[] options) {
+    public synchronized int add(String uri, String name, String[] options) {
         return _playlist_add(uri, name, options);
     }
     
-    public int add(String uri, String name) {
+    public synchronized int add(String uri, String name) {
         return add(uri, name, null);
     }
 
-    public void addExtended() {
+    public synchronized void addExtended() {
     }
 
-    public void deleteItem(int itemID) {
+    public synchronized void deleteItem(int itemID) {
         _deleteItem(itemID);
     }
     
     public long getInstance() {
         return libvlcInstance;
     }
-
     
+    public synchronized boolean inputIsPlaying() {
+        return _inputIsPlaying();
+    }
+
+    public synchronized boolean inputHasVout() {
+        return _inputHasVout();
+    }
     
 }
index a6d430b1eb5feb0075dbdbff55a44f52efe69c65..3219f90f786c1cec7b45c5222dadbbafd195dcac 100644 (file)
@@ -33,12 +33,15 @@ public interface PlaylistIntf {
     void play(int id, String[] options);
     void pause();
     void stop();
-    boolean isPlaying();
+    boolean isRunning();
     int itemsCount();
+    boolean inputIsPlaying();
     void next();
     void prev();
     void clear();
     int add(String uri, String name);
     void addExtended();
+    boolean inputHasVout();
+
 
 }
index 7f6dd69338b73740013ebf21df059f2590a6f4e1..10396185c5e9c5c6e602096831bad8e3f18f6b83 100644 (file)
@@ -33,5 +33,8 @@ public interface VideoIntf {
     void toggleFullscreen();
     void setFullscreen( boolean value );
     boolean getFullscreen();
+    void getSnapshot(String filepath);
+    int getVideoHeight();
+    int getVideoWidth();
     
 }
index 1bf26f9085aa907438717e5fa123d00ccc59ef7c..0e843f7f9c69001b6245da0f99498767e8ca27c0 100644 (file)
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
 
 /* These are a must*/
@@ -27,6 +27,7 @@
 #include <jawt_md.h>
 
 #include <X11/Xlib.h> // for Xlibs graphics functions
+#include <stdio.h>    // for printf
 
 /* JVLC internal imports, generated by gcjh */
 #include "org_videolan_jvlc_JVLCCanvas.h"
@@ -41,12 +42,11 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLCCanvas_paint (JNIEnv *env, job
   JAWT_DrawingSurface* ds;
   JAWT_DrawingSurfaceInfo* dsi;
   JAWT_X11DrawingSurfaceInfo* dsi_x11;
-  jboolean result;
+
   jint lock;
   GC gc;
     
   vlc_value_t value;
-  short i;
 
   /* Get the AWT */
   awt.version = JAWT_VERSION_1_3;
@@ -79,9 +79,18 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLCCanvas_paint (JNIEnv *env, job
     return;
   }
 
+
+#ifdef WIN32
   /* Get the platform-specific drawing info */
-  dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
+  dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
 
+  /* Now paint */
+  value.i_int = reinterpret_cast<int>(dsi_win->hwnd); 
+  VLC_VariableSet( 1, "drawable", value );
+
+#else // UNIX
+  /* Get the platform-specific drawing info */
+  dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
 
   /* Now paint */
   gc = XCreateGC(dsi_x11->display, dsi_x11->drawable, 0, 0);
@@ -89,9 +98,10 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLCCanvas_paint (JNIEnv *env, job
 
   value.i_int = dsi_x11->drawable;
   VLC_VariableSet( 0, "drawable", value );
-
   XFreeGC(dsi_x11->display, gc);
 
+#endif
+
   /* Free the drawing surface info */
   ds->FreeDrawingSurfaceInfo(dsi);
 
index 9dbab05276534eb8b8c6349a9a0a7c5a211536b0..630794df8b33ec92e8b6232348b009825bdacdf8 100644 (file)
@@ -29,7 +29,7 @@
 #include <stdio.h>  // for printf
 #include <stdlib.h> // for calloc
 #include <string.h> // for strcmp
-
+#include <unistd.h> // for usleep
 
 /* JVLC internal imports, generated by gcjh */
 #include "org_videolan_jvlc_JVLC.h"
@@ -43,9 +43,11 @@ JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance__ (JNIEnv *en
     // res is the pointer to libvlc_instance_t
     long res;
     libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
+    char temp_argv[1][5] = {""};
 
     libvlc_exception_init( exception );
-    res = ( long ) libvlc_new( 0, NULL, exception );
+
+    res = ( long ) libvlc_new( 0, (char **)temp_argv, exception );
 
     if ( libvlc_exception_raised( exception )) 
     {
@@ -55,6 +57,8 @@ JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance__ (JNIEnv *en
 
     free( exception );
 
+    //libvlc_playlist_lock( ( libvlc_instance_t * ) res, NULL);
+
     return res;
 }
 
@@ -312,8 +316,91 @@ JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_JVLC__1getFullscreen (JNIEnv *
     return res;
 }
 
+JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1getSnapshot (JNIEnv *env, jobject _this, jstring filepath) 
+{
+    const char* psz_filepath  = env->GetStringUTFChars( filepath, 0 );
+    libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
+    long instance = 0;
+    libvlc_input_t *input;
+
+    libvlc_exception_init( exception );
+
+    instance = getPlaylistInstance( env, _this );
+
+    input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
+
+    if ( libvlc_exception_raised( exception )) 
+    {
+        ///\TODO: raise java exception
+        printf("%s\n", libvlc_exception_get_message( exception ));
+    }
+
+    libvlc_video_take_snapshot( input, (char *) psz_filepath, exception );
+
+    if ( libvlc_exception_raised( exception )) 
+    {
+        ///\TODO: raise java exception
+        printf("%s\n", libvlc_exception_get_message( exception ));
+    }
+
+    
+    if (psz_filepath != NULL) {
+        env->ReleaseStringUTFChars( filepath, psz_filepath );
+    }
+
+}
+
+JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC__1getVideoHeight (JNIEnv *env, jobject _this)
+{
+    int res = 0;
+    libvlc_input_t *input;
+    long instance = 0;
+    
+    libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
 
+    libvlc_exception_init( exception );
 
+    instance = getPlaylistInstance( env, _this );
+    input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
+
+    res = libvlc_video_get_height( input, exception );
+    
+    if ( libvlc_exception_raised( exception )) 
+    {
+        ///\TODO: raise java exception
+        printf("%s\n", libvlc_exception_get_message( exception ));
+    }
+
+    free( exception );
+
+    return res;
+}
+
+JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC__1getVideoWidth (JNIEnv *env, jobject _this)
+{
+    int res = 0;
+    libvlc_input_t *input;
+    long instance = 0;
+    
+    libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
+
+    libvlc_exception_init( exception );
+
+    instance = getPlaylistInstance( env, _this );
+    input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
+
+    res = libvlc_video_get_width( input, exception );
+    
+    if ( libvlc_exception_raised( exception )) 
+    {
+        ///\TODO: raise java exception
+        printf("%s\n", libvlc_exception_get_message( exception ));
+    }
+
+    free( exception );
+
+    return res;
+}
 
 /*
  * Playlist native functions
@@ -364,10 +451,11 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1playlist_1add (JNIEnv *
 
 JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1play (JNIEnv *env, jobject _this, jint id, jobjectArray options) {
 
-    long instance = 0;
     int i_options = 0;
     const char** ppsz_options = NULL;
-    instance = getPlaylistInstance( env, _this );
+
+    libvlc_instance_t *p_instance = ( libvlc_instance_t * ) getPlaylistInstance( env, _this );
+    
     libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
 
     libvlc_exception_init( exception );
@@ -383,7 +471,7 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1play (JNIEnv *env, jobj
        }
     }
 
-    libvlc_playlist_play( ( libvlc_instance_t * ) instance, id, i_options, ( char **  ) ppsz_options, exception );
+    libvlc_playlist_play( p_instance, id, i_options, ( char **  ) ppsz_options, exception );
 
     free( exception );
     return;
@@ -481,7 +569,7 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1itemsCount (JNIEnv *env
 
 }
 
-JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env, jobject _this) {
+JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isRunning (JNIEnv *env, jobject _this) {
     long instance = 0;
     int res = 0;
     libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
@@ -495,6 +583,46 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env,
 
 }
 
+JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_Playlist__1inputIsPlaying (JNIEnv *env, jobject _this) 
+{
+    vlc_bool_t res = 0;
+    long instance = 0;
+    libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
+    libvlc_input_t *input;
+    
+    libvlc_exception_init( exception );
+    instance = getPlaylistInstance( env, _this );
+    
+    input = libvlc_playlist_get_input( ( libvlc_instance_t* ) instance, exception );
+    /// \todo check exceptions
+    
+    res = libvlc_input_will_play( input, exception );
+    /// \todo check exceptions
+
+    free( exception );
+    return res;    
+}
+
+JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_Playlist__1inputHasVout (JNIEnv *env, jobject _this) 
+{
+    vlc_bool_t res = 0;
+    long instance = 0;
+    libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
+    libvlc_input_t *input;
+    
+    libvlc_exception_init( exception );
+    instance = getPlaylistInstance( env, _this );
+    
+    input = libvlc_playlist_get_input( ( libvlc_instance_t* ) instance, exception );
+    /// \todo check exceptions
+    
+    res = libvlc_input_has_vout( input, exception );
+    /// \todo check exceptions
+
+    free( exception );
+    return res;    
+}
+
 /*
  * Input handling functions
  */