mirror of
https://github.com/videolan/vlc.git
synced 2024-12-15 12:43:34 +08:00
Java bindings update: various enhancements; paint system changed; reparenting works again.
This commit is contained in:
parent
a10792f2b6
commit
85d419a39e
@ -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 ) {
|
||||
@ -51,7 +51,7 @@ public class Input implements InputIntf {
|
||||
}
|
||||
|
||||
public boolean hasVout() throws VLCException {
|
||||
return _hasVout();
|
||||
return _hasVout();
|
||||
}
|
||||
|
||||
public long getInstance() {
|
||||
|
@ -30,13 +30,12 @@
|
||||
|
||||
package org.videolan.jvlc;
|
||||
|
||||
|
||||
public class JVLC implements Runnable {
|
||||
|
||||
static {
|
||||
System.loadLibrary("jvlc" );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* These are set as final since they live along the jvlc object
|
||||
*/
|
||||
@ -92,7 +91,10 @@ public class JVLC implements Runnable {
|
||||
*/
|
||||
public void destroy() {
|
||||
beingDestroyed = true;
|
||||
_destroy();
|
||||
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;
|
||||
}
|
||||
try {
|
||||
try {
|
||||
while (!beingDestroyed) {
|
||||
try {
|
||||
while (playlist.isRunning()) {
|
||||
inputPlaying = input.isPlaying();
|
||||
inputVout = input.hasVout();
|
||||
Thread.sleep(resolution);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} // while playlist running
|
||||
} catch (VLCException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (VLCException e1) { } // while playlist running
|
||||
inputPlaying = false;
|
||||
inputVout = false;
|
||||
try {
|
||||
inputPlaying = false;
|
||||
inputVout = false;
|
||||
Thread.sleep(resolution);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} // try
|
||||
} // while ! being destroyed
|
||||
} // run
|
||||
} // while ! being destroyed
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/* (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,9 +26,10 @@ 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)
|
||||
@ -105,7 +107,15 @@ public final class Video implements VideoIntf {
|
||||
public void setSize(Dimension d) throws VLCException {
|
||||
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) {
|
||||
// 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
|
||||
// JAWT awt;
|
||||
// JAWT_DrawingSurface* ds;
|
||||
// JAWT_DrawingSurfaceInfo* dsi;
|
||||
// #ifdef WIN32
|
||||
// JAWT_Win32DrawingSurfaceInfo* dsi_win;
|
||||
// #else
|
||||
// JAWT_X11DrawingSurfaceInfo* dsi_x11;
|
||||
// GC gc;
|
||||
// #endif
|
||||
|
||||
jint lock;
|
||||
// jint lock;
|
||||
|
||||
libvlc_drawable_t drawable;
|
||||
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
|
||||
libvlc_exception_init( exception );
|
||||
// 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 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;
|
||||
}
|
||||
// /* 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;
|
||||
}
|
||||
// /* 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;
|
||||
}
|
||||
// /* 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;
|
||||
// #ifdef WIN32
|
||||
// /* Get the platform-specific drawing info */
|
||||
// dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
|
||||
|
||||
/* Now paint */
|
||||
// /* Now paint */
|
||||
|
||||
drawable = reinterpret_cast<int>(dsi_win->hwnd);
|
||||
long vlcInstance = getJVLCInstance( env, canvas );
|
||||
libvlc_video_set_parent( (libvlc_instance_t *) vlcInstance, drawable, exception );
|
||||
// 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;
|
||||
// #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);
|
||||
// /* 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 );
|
||||
// drawable = dsi_x11->drawable;
|
||||
// long vlcInstance = getJVLCInstance( env, canvas );
|
||||
// libvlc_video_set_parent( (libvlc_instance_t *)vlcInstance, drawable, exception );
|
||||
|
||||
XFreeGC(dsi_x11->display, gc);
|
||||
// XFreeGC(dsi_x11->display, gc);
|
||||
|
||||
#endif
|
||||
// #endif
|
||||
|
||||
/* Free the drawing surface info */
|
||||
ds->FreeDrawingSurfaceInfo(dsi);
|
||||
// /* Free the drawing surface info */
|
||||
// ds->FreeDrawingSurfaceInfo(dsi);
|
||||
|
||||
/* Unlock the drawing surface */
|
||||
ds->Unlock(ds);
|
||||
// /* Unlock the drawing surface */
|
||||
// ds->Unlock(ds);
|
||||
|
||||
/* Free the drawing surface */
|
||||
awt.FreeDrawingSurface(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,93 @@ 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 ;
|
||||
|
||||
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__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 ;
|
||||
|
||||
@ -216,6 +302,7 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1reparent (JNIEnv *env, job
|
||||
}
|
||||
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1setSize (JNIEnv *env, jobject _this, jint width, jint height)
|
||||
{
|
||||
INIT_FUNCTION ;
|
||||
|
Loading…
Reference in New Issue
Block a user