SurfaceTexture.java revision 6714efc5e0c52953b65e774de0003e22377e7d39
16714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis/* 26714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Copyright (C) 2010 The Android Open Source Project 36714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 46714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 56714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * you may not use this file except in compliance with the License. 66714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * You may obtain a copy of the License at 76714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 86714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 96714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 106714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Unless required by applicable law or agreed to in writing, software 116714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 126714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * See the License for the specific language governing permissions and 146714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * limitations under the License. 156714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 166714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 176714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennispackage android.graphics; 186714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 196714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis/** 206714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Captures frames from an image stream as an OpenGL ES texture. 216714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 226714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * <p>The image stream may come from either video playback or camera preview. A SurfaceTexture may 236714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * be used in place of a SurfaceHolder when specifying the output destination of a MediaPlayer or 246714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Camera object. This will cause all the frames from that image stream to be sent to the 256714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * SurfaceTexture object rather than to the device's display. When {@link #updateTexImage} is 266714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * called, the contents of the texture object specified when the SurfaceTexture was created is 276714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * updated to contain the most recent image from the image stream. This may cause some frames of 286714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * the stream to be skipped. 296714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 306714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * <p>The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which is defined by the 316714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * OES_EGL_image_external OpenGL ES extension. This limits how the texture may be used. 326714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 336714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennispublic class SurfaceTexture { 346714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 356714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis @SuppressWarnings("unused") 366714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis private int mSurfaceTexture; 376714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 386714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /** 396714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Callback interface for being notified that a new stream frame is available. 406714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 416714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public interface OnFrameAvailableListener { 426714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis void onFrameAvailable(SurfaceTexture surfaceTexture); 436714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 446714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 456714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /** 466714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Exception thrown when a surface couldn't be created or resized 476714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 486714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public static class OutOfResourcesException extends Exception { 496714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public OutOfResourcesException() { 506714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 516714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public OutOfResourcesException(String name) { 526714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis super(name); 536714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 546714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 556714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 566714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /** 576714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Construct a new SurfaceTexture to stream images to a given OpenGL texture. 586714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 596714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * @param texName the OpenGL texture object name (e.g. generated via glGenTextures) 606714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 616714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public SurfaceTexture(int texName) { 626714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis init(texName); 636714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 646714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 656714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /** 666714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Register a callback to be invoked when a new image frame becomes available to the 676714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * SurfaceTexture. Note that this callback may be called on an arbitrary thread, so it is not 686714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * safe to call {@link #updateTexImage} without first binding the OpenGL ES context to the 696714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * thread invoking the callback. 706714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 716714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public void setOnFrameAvailableListener(OnFrameAvailableListener l) { 726714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis // TODO: Implement this! 736714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 746714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 756714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /** 766714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Update the texture image to the most recent frame from the image stream. This may only be 776714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * called while the OpenGL ES context that owns the texture is bound to the thread. It will 786714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * implicitly bind its texture to the GL_TEXTURE_EXTERNAL_OES texture target. 796714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 806714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis public native void updateTexImage(); 816714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 826714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis private native void init(int texName); 836714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 846714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis /* 856714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * We use a class initializer to allow the native code to cache some 866714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * field offsets. 876714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 886714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis private static native void nativeClassInit(); 896714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis static { nativeClassInit(); } 906714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 91