Commit 85d419a3 authored by Filippo Carone's avatar Filippo Carone

Java bindings update: various enhancements; paint system changed; reparenting works again.

parent a10792f2
......@@ -33,7 +33,7 @@ EXTRA_DIST+= \
if BUILD_JAVA
OBJECTS = org/videolan/jvlc/VLM.class org/videolan/jvlc/VLCException.class org/videolan/jvlc/Playlist.class org/videolan/jvlc/AudioIntf.class org/videolan/jvlc/Audio.class org/videolan/jvlc/InputIntf.class org/videolan/jvlc/Input.class org/videolan/jvlc/PlaylistIntf.class org/videolan/jvlc/VideoIntf.class org/videolan/jvlc/Video.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/GenericVideoWidget.class
OBJECTS = org/videolan/jvlc/VLM.class org/videolan/jvlc/VLCException.class org/videolan/jvlc/Playlist.class org/videolan/jvlc/AudioIntf.class org/videolan/jvlc/Audio.class org/videolan/jvlc/InputIntf.class org/videolan/jvlc/Input.class org/videolan/jvlc/PlaylistIntf.class org/videolan/jvlc/VideoIntf.class org/videolan/jvlc/JVLCCanvas.class org/videolan/jvlc/Video.class org/videolan/jvlc/JLibVLC.class org/videolan/jvlc/JVLC.class org/videolan/jvlc/JVLCPanel.class org/videolan/jvlc/VLMIntf.class org/videolan/jvlc/GenericVideoWidget.class
PROCESSOR_FAMILY = `uname -m | sed -e 's/^i.86/i386/' | sed -e 's/^x86_64/amd64/'`
......
......@@ -14,7 +14,7 @@ public class Input implements InputIntf {
private native void _setTime(long value);
private native void _setPosition(float value);
private native boolean _isPlaying();
private native boolean _hasVout();
private native boolean _hasVout() throws VLCException;
public Input( long instance ) {
......
......@@ -30,7 +30,6 @@
package org.videolan.jvlc;
public class JVLC implements Runnable {
static {
......@@ -92,8 +91,11 @@ public class JVLC implements Runnable {
*/
public void destroy() {
beingDestroyed = true;
if (!beingDestroyed)
{
_destroy();
}
}
/*
......@@ -138,37 +140,33 @@ public class JVLC implements Runnable {
* In this thread we check the playlist and input status.
*/
public void run() {
while (! beingDestroyed) {
try {
while (playlist.isRunning()) {
if (input.isPlaying()) {
inputPlaying = true;
}
else {
inputPlaying = false;
}
if (input.hasVout()) {
inputVout = true;
}
else {
inputVout = false;
}
while (!beingDestroyed) {
try {
while (playlist.isRunning()) {
inputPlaying = input.isPlaying();
inputVout = input.hasVout();
Thread.sleep(resolution);
} catch (InterruptedException e) {
} // while playlist running
} catch (VLCException e) {
e.printStackTrace();
}
}
} catch (VLCException e1) { } // while playlist running
inputPlaying = false;
inputVout = false;
try {
Thread.sleep(resolution);
} // while ! being destroyed
} catch (InterruptedException e) {
e.printStackTrace();
} // try
} // while ! being destroyed
} // run
}
}
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
protected void finalize() throws Throwable {
destroy();
super.finalize();
}
}
......@@ -33,7 +33,9 @@ import java.awt.Graphics;
public class JVLCCanvas extends Canvas {
public native void paint(Graphics g);
public void paint(Graphics g) {
jvlc.video.paint(g);
}
private final JVLC jvlc;
......@@ -41,12 +43,16 @@ public class JVLCCanvas extends Canvas {
* Default constructor. The canvas is set a dimension of 200x200
*/
public JVLCCanvas() {
super();
jvlc = new JVLC();
jvlc.video.setActualCanvas(this);
setSize(200, 200);
}
public JVLCCanvas(String[] args) {
super();
jvlc = new JVLC(args);
jvlc.video.setActualCanvas(this);
setSize(200, 200);
}
......@@ -55,17 +61,23 @@ public class JVLCCanvas extends Canvas {
* @param height The initial canvas height
*/
public JVLCCanvas(int width, int height) {
super();
jvlc = new JVLC();
jvlc.video.setActualCanvas(this);
setSize(width, height);
}
public JVLCCanvas(String[] args, int width, int height) {
super();
jvlc = new JVLC(args);
jvlc.video.setActualCanvas(this);
setSize(width, height);
}
public JVLCCanvas(JVLC jvlc) {
super();
this.jvlc = jvlc;
jvlc.video.setActualCanvas(this);
}
public JVLC getJVLC() {
......
......@@ -3,16 +3,17 @@
*/
package org.videolan.jvlc;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
public final class Video implements VideoIntf {
private long libvlcInstance;
private JVLCCanvas actualCanvas;
public Video( long libvlcInstance) {
this.libvlcInstance = libvlcInstance;
}
/*
......@@ -25,8 +26,9 @@ public final class Video implements VideoIntf {
private native int _getWidth();
private native void _getSnapshot(String filename);
private native void _destroyVideo();
private native void _reparent(Component component);
private native void _reparent(JVLCCanvas component);
private native void _setSize(int width, int height);
private native void _paint(JVLCCanvas canvas, Graphics g);
/* (non-Javadoc)
* @see org.videolan.jvlc.VideoIntf#destroyVideo()
......@@ -66,8 +68,9 @@ public final class Video implements VideoIntf {
/* (non-Javadoc)
* @see org.videolan.jvlc.VideoIntf#reparentVideo(java.awt.Component)
*/
public void reparent(Component c) throws VLCException {
public void reparent(JVLCCanvas c) throws VLCException {
_reparent(c);
setActualCanvas(c);
}
/* (non-Javadoc)
......@@ -75,7 +78,6 @@ public final class Video implements VideoIntf {
*/
public void setSize(int width, int height) throws VLCException {
_setSize( width, height );
}
/* (non-Javadoc)
......@@ -106,6 +108,14 @@ public final class Video implements VideoIntf {
setSize(d.width, d.height);
}
public void paint(Graphics g) {
_paint(actualCanvas, g);
}
public void setActualCanvas(JVLCCanvas canvas) {
actualCanvas = canvas;
}
public long getInstance() {
return libvlcInstance;
}
......
......@@ -29,7 +29,6 @@
package org.videolan.jvlc;
import java.awt.Component;
import java.awt.Dimension;
......@@ -91,7 +90,7 @@ public interface VideoIntf {
* @param c
* @throws VLCException
*/
void reparent(Component c) throws VLCException;
void reparent(JVLCCanvas c) throws VLCException;
/**
* Resizes video output to width and height. This operation could be necessary
......
......@@ -82,6 +82,9 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1destroy (JNIEnv *env, jobje
}
//JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1paint (JNIEnv *env, jobject _this, jobject canvas, jobject graphics)
/*
* Utility functions
*/
......
......@@ -39,91 +39,91 @@
jlong getJVLCInstance (JNIEnv *env, jobject _this);
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLCCanvas_paint (JNIEnv *env, jobject canvas, jobject graphics) {
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
#ifdef WIN32
JAWT_Win32DrawingSurfaceInfo* dsi_win;
#else
JAWT_X11DrawingSurfaceInfo* dsi_x11;
GC gc;
#endif
jint lock;
libvlc_drawable_t drawable;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
/* Get the AWT */
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf("AWT Not found\n");
return;
}
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf("NULL drawing surface\n");
return;
}
/* Lock the drawing surface */
lock = ds->Lock(ds);
if((lock & JAWT_LOCK_ERROR) != 0) {
printf("Error locking surface\n");
awt.FreeDrawingSurface(ds);
return;
}
/* Get the drawing surface info */
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf("Error getting surface info\n");
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
return;
}
#ifdef WIN32
/* Get the platform-specific drawing info */
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
/* Now paint */
drawable = reinterpret_cast<int>(dsi_win->hwnd);
long vlcInstance = getJVLCInstance( env, canvas );
libvlc_video_set_parent( (libvlc_instance_t *) vlcInstance, drawable, exception );
#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);
XSetBackground(dsi_x11->display, gc, 0);
drawable = dsi_x11->drawable;
long vlcInstance = getJVLCInstance( env, canvas );
libvlc_video_set_parent( (libvlc_instance_t *)vlcInstance, drawable, exception );
XFreeGC(dsi_x11->display, gc);
#endif
/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);
/* Unlock the drawing surface */
ds->Unlock(ds);
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
}
// JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLCCanvas_paint (JNIEnv *env, jobject canvas, jobject graphics) {
// JAWT awt;
// JAWT_DrawingSurface* ds;
// JAWT_DrawingSurfaceInfo* dsi;
// #ifdef WIN32
// JAWT_Win32DrawingSurfaceInfo* dsi_win;
// #else
// JAWT_X11DrawingSurfaceInfo* dsi_x11;
// GC gc;
// #endif
// jint lock;
// libvlc_drawable_t drawable;
// libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
// libvlc_exception_init( exception );
// /* Get the AWT */
// awt.version = JAWT_VERSION_1_3;
// if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
// printf("AWT Not found\n");
// return;
// }
// /* Get the drawing surface */
// ds = awt.GetDrawingSurface(env, canvas);
// if (ds == NULL) {
// printf("NULL drawing surface\n");
// return;
// }
// /* Lock the drawing surface */
// lock = ds->Lock(ds);
// if((lock & JAWT_LOCK_ERROR) != 0) {
// printf("Error locking surface\n");
// awt.FreeDrawingSurface(ds);
// return;
// }
// /* Get the drawing surface info */
// dsi = ds->GetDrawingSurfaceInfo(ds);
// if (dsi == NULL) {
// printf("Error getting surface info\n");
// ds->Unlock(ds);
// awt.FreeDrawingSurface(ds);
// return;
// }
// #ifdef WIN32
// /* Get the platform-specific drawing info */
// dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
// /* Now paint */
// drawable = reinterpret_cast<int>(dsi_win->hwnd);
// long vlcInstance = getJVLCInstance( env, canvas );
// libvlc_video_set_parent( (libvlc_instance_t *) vlcInstance, drawable, exception );
// #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);
// XSetBackground(dsi_x11->display, gc, 0);
// drawable = dsi_x11->drawable;
// long vlcInstance = getJVLCInstance( env, canvas );
// libvlc_video_set_parent( (libvlc_instance_t *)vlcInstance, drawable, exception );
// XFreeGC(dsi_x11->display, gc);
// #endif
// /* Free the drawing surface info */
// ds->FreeDrawingSurfaceInfo(dsi);
// /* Unlock the drawing surface */
// ds->Unlock(ds);
// /* Free the drawing surface */
// awt.FreeDrawingSurface(ds);
// }
/*
* Utility functions
......
......@@ -183,7 +183,7 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1reparent (JNIEnv *env, job
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
drawable = reinterpret_cast<int>(dsi_win->hwnd);
libvlc_video_reparent( input, drawable, exception );
libvlc_video_set_parent( input, drawable, exception );
CHECK_EXCEPTION_FREE ;
......@@ -198,7 +198,7 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1reparent (JNIEnv *env, job
/* and reparent */
drawable = dsi_x11->drawable;
libvlc_video_reparent( input, drawable, exception );
libvlc_video_set_parent( (libvlc_instance_t *) instance, drawable, exception );
CHECK_EXCEPTION_FREE ;
......@@ -215,6 +215,93 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1reparent (JNIEnv *env, job
awt.FreeDrawingSurface(ds);
}
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1paint (JNIEnv *env, jobject _this, jobject canvas, jobject graphics)
{
INIT_FUNCTION ;
libvlc_drawable_t drawable;
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
#ifdef WIN32
JAWT_Win32DrawingSurfaceInfo* dsi_win;
#else
JAWT_X11DrawingSurfaceInfo* dsi_x11;
GC gc;
#endif
jint lock;
/* Get the AWT */
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf("AWT Not found\n");
return;
}
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf("NULL drawing surface\n");
return;
}
/* Lock the drawing surface */
lock = ds->Lock(ds);
if((lock & JAWT_LOCK_ERROR) != 0) {
printf("Error locking surface\n");
awt.FreeDrawingSurface(ds);
return;
}
/* Get the drawing surface info */
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf("Error getting surface info\n");
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
return;
}
#ifdef WIN32
/* Get the platform-specific drawing info */
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
drawable = reinterpret_cast<int>(dsi_win->hwnd);
libvlc_video_set_parent( input, drawable, exception );
CHECK_EXCEPTION_FREE ;
#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);
XSetBackground(dsi_x11->display, gc, 0);
/* and reparent */
drawable = dsi_x11->drawable;
libvlc_video_set_parent( (libvlc_instance_t *) instance, drawable, exception );
CHECK_EXCEPTION_FREE ;
XFreeGC(dsi_x11->display, gc);
#endif
/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);
/* Unlock the drawing surface */
ds->Unlock(ds);
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
}
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1setSize (JNIEnv *env, jobject _this, jint width, jint height)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment