jogamp.opengl.util.av.impl.OMXGLMediaPlayer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jogl-all Show documentation
Show all versions of jogl-all Show documentation
Java™ Binding for the OpenGL® API
/**
* Copyright 2012 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of JogAmp Community.
*/
package jogamp.opengl.util.av.impl;
import java.io.IOException;
import java.net.URL;
import javax.media.opengl.GL;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
import com.jogamp.opengl.util.texture.TextureSequence;
import jogamp.opengl.egl.EGL;
import jogamp.opengl.util.av.EGLMediaPlayerImpl;
/**
* OpenMAX IL implementation. This implementation is currently not tested
* due to lack of an available device or working software implementation.
* It is kept alive through all changes in the hope of a later availability though.
*/
public class OMXGLMediaPlayer extends EGLMediaPlayerImpl {
static final boolean available;
static {
// OMX binding is included in jogl_desktop and jogl_mobile
GLProfile.initSingleton();
available = initIDs0();
}
public static final boolean isAvailable() { return available; }
protected long moviePtr = 0;
protected TextureSequence.TextureFrame lastTex = null;
public OMXGLMediaPlayer() {
super(TextureType.KHRImage, true);
if(!available) {
throw new RuntimeException("OMXGLMediaPlayer not available");
}
initOMX();
}
protected void initOMX() {
moviePtr = _createInstance();
if(0==moviePtr) {
throw new GLException("Couldn't create OMXInstance");
}
}
@Override
protected TextureSequence.TextureFrame createTexImage(GL gl, int idx, int[] tex) {
final EGLTextureFrame eglTex = (EGLTextureFrame) super.createTexImage(gl, idx, tex);
_setStreamEGLImageTexture2D(moviePtr, idx, tex[idx], eglTex.getImage(), eglTex.getSync());
lastTex = eglTex;
return eglTex;
}
@Override
protected void destroyTexImage(GL gl, TextureSequence.TextureFrame imgTex) {
lastTex = null;
super.destroyTexImage(gl, imgTex);
}
@Override
protected void destroyImpl(GL gl) {
_detachVideoRenderer(moviePtr);
if (moviePtr != 0) {
_destroyInstance(moviePtr);
moviePtr = 0;
}
}
@Override
protected void initGLStreamImpl(GL gl, int[] texNames) throws IOException {
if(0==moviePtr) {
throw new GLException("OMX native instance null");
}
final URL url = urlConn.getURL();
if(!url.getProtocol().equals("file")) {
throw new IOException("Only file URLs are allowed: "+url);
}
final String path=url.getPath();
System.out.println("setURL: clean path "+path);
System.out.println("setURL: p1 "+this);
_setStream(moviePtr, textureCount, path);
System.out.println("setURL: p2 "+this);
}
@Override
protected int getCurrentPositionImpl() {
return 0!=moviePtr ? _getCurrentPosition(moviePtr) : 0;
}
@Override
protected boolean setPlaySpeedImpl(float rate) {
if(0==moviePtr) {
throw new GLException("OMX native instance null");
}
_setPlaySpeed(moviePtr, rate);
return true;
}
@Override
public synchronized boolean startImpl() {
if(0==moviePtr) {
return false;
}
_play(moviePtr);
return true;
}
/** @return time position after issuing the command */
@Override
public synchronized boolean pauseImpl() {
if(0==moviePtr) {
return false;
}
_pause(moviePtr);
return true;
}
/** @return time position after issuing the command */
@Override
public synchronized boolean stopImpl() {
if(0==moviePtr) {
return false;
}
_stop(moviePtr);
return true;
}
/** @return time position after issuing the command */
@Override
protected int seekImpl(int msec) {
if(0==moviePtr) {
throw new GLException("OMX native instance null");
}
return _seek(moviePtr, msec);
}
@Override
protected TextureSequence.TextureFrame getLastTextureImpl() {
return lastTex;
}
@Override
protected TextureSequence.TextureFrame getNextTextureImpl(GL gl, boolean blocking) {
if(0==moviePtr) {
throw new GLException("OMX native instance null");
}
final int nextTex = _getNextTextureID(moviePtr, blocking);
if(0 < nextTex) {
final TextureSequence.TextureFrame eglImgTex = texFrameMap.get(new Integer(_getNextTextureID(moviePtr, blocking)));
if(null!=eglImgTex) {
lastTex = eglImgTex;
}
}
return lastTex;
}
private String replaceAll(String orig, String search, String repl) {
String dest=null;
// In case replaceAll / java.util.regex.* is not supported (-> CVM)
int i=0,j;
dest = new String();
while((j=orig.indexOf(search, i))>=0) {
dest=dest.concat(orig.substring(i, j));
dest=dest.concat(repl);
i=j+1;
}
return dest.concat(orig.substring(i, orig.length()));
}
private void errorCheckEGL(String s) {
int e;
if( (e=EGL.eglGetError()) != EGL.EGL_SUCCESS ) {
System.out.println("EGL Error: ("+s+"): 0x"+Integer.toHexString(e));
}
}
private static native boolean initIDs0();
private native long _createInstance();
private native void _destroyInstance(long moviePtr);
private native void _detachVideoRenderer(long moviePtr); // stop before
private native void _attachVideoRenderer(long moviePtr); // detach before
private native void _setStream(long moviePtr, int textureNum, String path);
private native void _activateStream(long moviePtr);
private native void _setStreamEGLImageTexture2D(long moviePtr, int i, int tex, long image, long sync);
private native int _seek(long moviePtr, int position);
private native void _setPlaySpeed(long moviePtr, float rate);
private native void _play(long moviePtr);
private native void _pause(long moviePtr);
private native void _stop(long moviePtr);
private native int _getNextTextureID(long moviePtr, boolean blocking);
private native int _getCurrentPosition(long moviePtr);
}