diff options
author | Sven Gothel <[email protected]> | 2013-08-30 17:31:34 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-08-30 17:31:34 +0200 |
commit | 4cb3763415bb5f82520fd02f56412076f80a84e6 (patch) | |
tree | 33f864d513f9c94a3514cb9fab38fd1130ce9d32 /src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java | |
parent | ad4797e6875d8fc635971ed6d8dd68326c083540 (diff) |
GLMediaPlayer enhancements: State, Camera options, detect and act on orientation change (flipped), API-doc,
- State
- Fix state transition (initGL() error)
- Camera options
- options uses ';' as query separator
- don't use 'default' options, driver should know
- Detect and act on orientation change (flipped)
- ffmpeg impl detects if flipped changes and triggers a SIZE update event.
This allows application to react, i.e. re-init GL and use new TextureCoord's.
Test: Works well on Windows w/ rawvideo dshow camera driver/codec.
- API-doc
- TexSeqEventListener/GLMediaEventListener usage / constraints (GL, ..)
- State transition fix
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java')
-rw-r--r-- | src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java | 72 |
1 files changed, 47 insertions, 25 deletions
diff --git a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java b/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java index ab0e2eebd..205642eb0 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java +++ b/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java @@ -165,6 +165,10 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { protected Ringbuffer<TextureFrame> videoFramesFree = null; protected Ringbuffer<TextureFrame> videoFramesDecoded = null; protected volatile TextureFrame lastFrame = null; + /** + * @see #isGLOriented() + */ + protected boolean isInGLOrientation = false; private ArrayList<GLMediaEventListener> eventListeners = new ArrayList<GLMediaEventListener>(); @@ -203,12 +207,6 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { public final void setTextureWrapST(int[] wrapST) { texWrapST[0] = wrapST[0]; texWrapST[1] = wrapST[1];} public final int[] getTextureWrapST() { return texWrapST; } - private final void checkStreamInit() { - if(State.Uninitialized == state ) { - throw new IllegalStateException("Stream not initialized: "+this); - } - } - private final void checkGLInit() { if(State.Uninitialized == state || State.Initialized == state ) { throw new IllegalStateException("GL not initialized: "+this); @@ -339,6 +337,23 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { protected abstract boolean pauseImpl(); @Override + public final State destroy(GL gl) { + return destroyImpl(gl, 0); + } + private final State destroyImpl(GL gl, int event_mask) { + synchronized( stateLock ) { + streamWorker.doStop(); + streamWorker = null; + destroyImpl(gl); + removeAllTextureFrames(gl); + textureCount=0; + changeState(event_mask, State.Uninitialized); + return state; + } + } + protected abstract void destroyImpl(GL gl); + + @Override public final int seek(int msec) { synchronized( stateLock ) { final State preState = state; @@ -458,7 +473,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { public final void initStream(URI streamLoc, int vid, int aid, int reqTextureCount) throws IllegalStateException, IllegalArgumentException { synchronized( stateLock ) { if(State.Uninitialized != state) { - throw new IllegalStateException("Instance not unintialized: "+this); + throw new IllegalStateException("Instance not in state unintialized: "+this); } if(null == streamLoc) { throw new IllegalArgumentException("streamLock is null"); @@ -485,7 +500,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { if( null != rawPath && rawPath.length() > 0 ) { // cut-off root fwd-slash cameraPath = rawPath.substring(1); - final URIQueryProps props = URIQueryProps.create(streamLoc); + final URIQueryProps props = URIQueryProps.create(streamLoc, ';'); cameraProps = props.getProperties(); } else { throw new IllegalArgumentException("Camera path is empty: "+streamLoc.toString()); @@ -528,10 +543,12 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { @Override public final void initGL(GL gl) throws IllegalStateException, StreamException, GLException { synchronized( stateLock ) { - checkStreamInit(); + if(State.Initialized != state ) { + throw new IllegalStateException("Stream not in state initialized: "+this); + } final StreamException streamInitErr = streamWorker.getStreamErr(); if( null != streamInitErr ) { - streamWorker = null; + streamWorker = null; // already terminated! destroy(null); throw streamInitErr; } @@ -559,6 +576,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { } changeState(0, State.Paused); } catch (Throwable t) { + destroyImpl(gl, GLMediaEventListener.EVENT_CHANGE_ERR); // -> GLMediaPlayer.State.Uninitialized throw new GLException("Error initializing GL resources", t); } } @@ -602,7 +620,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { } protected abstract TextureFrame createTexImage(GL gl, int texName); - protected final Texture createTexImageImpl(GL gl, int texName, int tWidth, int tHeight, boolean mustFlipVertically) { + protected final Texture createTexImageImpl(GL gl, int texName, int tWidth, int tHeight) { if( 0 > texName ) { throw new RuntimeException("TextureName "+toHexString(texName)+" invalid."); } @@ -649,7 +667,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { texName, textureTarget, tWidth, tHeight, width, height, - mustFlipVertically); + !isInGLOrientation); } protected void destroyTexFrame(GL gl, TextureFrame frame) { @@ -1251,20 +1269,19 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { attributesUpdated(event_mask); } - @Override - public final State destroy(GL gl) { - synchronized( stateLock ) { - streamWorker.doStop(); - streamWorker = null; - destroyImpl(gl); - removeAllTextureFrames(gl); - textureCount=0; - changeState(0, State.Uninitialized); - return state; + protected void setIsGLOriented(boolean isGLOriented) { + if( isInGLOrientation != isGLOriented ) { + if( DEBUG ) { + System.err.println("XXX gl-orient "+isInGLOrientation+" -> "+isGLOriented); + } + isInGLOrientation = isGLOriented; + for(int i=0; i<videoFramesOrig.length; i++) { + videoFramesOrig[i].getTexture().setMustFlipVertically(!isGLOriented); + } + attributesUpdated(GLMediaEventListener.EVENT_CHANGE_SIZE); } } - protected abstract void destroyImpl(GL gl); - + @Override public final URI getURI() { return streamLoc; @@ -1322,6 +1339,11 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { } @Override + public final boolean isGLOriented() { + return isInGLOrientation; + } + + @Override public final int getWidth() { return width; } @@ -1342,7 +1364,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { return "GLMediaPlayer["+state+", vSCR "+video_scr+", frames[p "+presentedFrameCount+", d "+decodedFrameCount+", t "+videoFrames+" ("+tt+" s)], "+ "speed "+playSpeed+", "+bps_stream+" bps, "+ "Texture[count "+textureCount+", free "+freeVideoFrames+", dec "+decVideoFrames+", tagt "+toHexString(textureTarget)+", ifmt "+toHexString(textureInternalFormat)+", fmt "+toHexString(textureFormat)+", type "+toHexString(textureType)+"], "+ - "Video[id "+vid+", <"+vcodec+">, "+width+"x"+height+", "+fps+" fps, "+frame_duration+" fdur, "+bps_video+" bps], "+ + "Video[id "+vid+", <"+vcodec+">, "+width+"x"+height+", glOrient "+isInGLOrientation+", "+fps+" fps, "+frame_duration+" fdur, "+bps_video+" bps], "+ "Audio[id "+aid+", <"+acodec+">, "+bps_audio+" bps, "+audioFrames+" frames], uri "+loc+camPath+"]"; } |