IT. Expert System.

Android Reference

SurfaceTexture


android.graphics

Class SurfaceTexture



  • public class SurfaceTexture
    extends Object
    Captures frames from an image stream as an OpenGL ES texture.

    The image stream may come from either camera preview or video decode. A SurfaceTexture may be used in place of a SurfaceHolder when specifying the output destination of a Camera or MediaPlayer object. Doing so will cause all the frames from the image stream to be sent to the SurfaceTexture object rather than to the device's display. When updateTexImage() is called, the contents of the texture object specified when the SurfaceTexture was created are updated to contain the most recent image from the image stream. This may cause some frames of the stream to be skipped.

    When sampling from the texture one should first transform the texture coordinates using the matrix queried via getTransformMatrix(float[]). The transform matrix may change each time updateTexImage() is called, so it should be re-queried each time the texture image is updated. This matrix transforms traditional 2D OpenGL ES texture coordinate column vectors of the form (s, t, 0, 1) where s and t are on the inclusive interval [0, 1] to the proper sampling location in the streamed texture. This transform compensates for any properties of the image stream source that cause it to appear different from a traditional OpenGL ES texture. For example, sampling from the bottom left corner of the image can be accomplished by transforming the column vector (0, 0, 0, 1) using the queried matrix, while sampling from the top right corner of the image can be done by transforming (1, 1, 0, 1).

    The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which is defined by the GL_OES_EGL_image_external OpenGL ES extension. This limits how the texture may be used. Each time the texture is bound it must be bound to the GL_TEXTURE_EXTERNAL_OES target rather than the GL_TEXTURE_2D target. Additionally, any OpenGL ES 2.0 shader that samples from the texture must declare its use of this extension using, for example, an "#extension GL_OES_EGL_image_external : require" directive. Such shaders must also access the texture using the samplerExternalOES GLSL sampler type.

    SurfaceTexture objects may be created on any thread. updateTexImage() may only be called on the thread with the OpenGL ES context that contains the texture object. The frame-available callback is called on an arbitrary thread, so unless special care is taken updateTexImage() should not be called directly from the callback.

    • Constructor Summary

      Constructors
      Constructor and Description
      SurfaceTexture(int texName)
      Construct a new SurfaceTexture to stream images to a given OpenGL texture.
      SurfaceTexture(int texName, boolean allowSynchronousMode)
      Construct a new SurfaceTexture to stream images to a given OpenGL texture.
    • Method Summary

      Methods
      Modifier and Type Method and Description
      void attachToGLContext(int texName)
      Attach the SurfaceTexture to the OpenGL ES context that is current on the calling thread.
      void detachFromGLContext()
      Detach the SurfaceTexture from the OpenGL ES context that owns the OpenGL ES texture object.
      protected void finalize()
      Invoked when the garbage collector has detected that this instance is no longer reachable.
      long getTimestamp()
      Retrieve the timestamp associated with the texture image set by the most recent call to updateTexImage.
      void getTransformMatrix(float[] mtx)
      Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by the most recent call to updateTexImage.
      void release()
      release() frees all the buffers and puts the SurfaceTexture into the 'abandoned' state.
      void setDefaultBufferSize(int width, int height)
      Set the default size of the image buffers.
      void setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l)
      Register a callback to be invoked when a new image frame becomes available to the SurfaceTexture.
      void updateTexImage()
      Update the texture image to the most recent frame from the image stream.
    • Constructor Detail

      • SurfaceTexture

        public SurfaceTexture(int texName)
        Construct a new SurfaceTexture to stream images to a given OpenGL texture.
        Parameters:
        texName - the OpenGL texture object name (e.g. generated via glGenTextures)
      • SurfaceTexture

        public SurfaceTexture(int texName,
                      boolean allowSynchronousMode)
        Construct a new SurfaceTexture to stream images to a given OpenGL texture.
        Parameters:
        texName - the OpenGL texture object name (e.g. generated via glGenTextures)
        allowSynchronousMode - whether the SurfaceTexture can run in the synchronous mode. When the image stream comes from OpenGL, SurfaceTexture may run in the synchronous mode where the producer side may be blocked to avoid skipping frames. To avoid the thread block, set allowSynchronousMode to false.
    • Method Detail

      • setOnFrameAvailableListener

        public void setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l)
        Register a callback to be invoked when a new image frame becomes available to the SurfaceTexture. Note that this callback may be called on an arbitrary thread, so it is not safe to call updateTexImage() without first binding the OpenGL ES context to the thread invoking the callback.
      • setDefaultBufferSize

        public void setDefaultBufferSize(int width,
                                int height)
        Set the default size of the image buffers. The image producer may override the buffer size, in which case the producer-set buffer size will be used, not the default size set by this method. Both video and camera based image producers do override the size. This method may be used to set the image size when producing images with Canvas (via Surface.lockCanvas(android.graphics.Rect)), or OpenGL ES (via an EGLSurface). The new default buffer size will take effect the next time the image producer requests a buffer to fill. For Canvas this will be the next time Surface.lockCanvas(android.graphics.Rect) is called. For OpenGL ES, the EGLSurface should be destroyed (via eglDestroySurface), made not-current (via eglMakeCurrent), and then recreated (via eglCreateWindowSurface) to ensure that the new default size has taken effect. The width and height parameters must be no greater than the minimum of GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see glGetIntegerv). An error due to invalid dimensions might not be reported until updateTexImage() is called.
      • updateTexImage

        public void updateTexImage()
        Update the texture image to the most recent frame from the image stream. This may only be called while the OpenGL ES context that owns the texture is current on the calling thread. It will implicitly bind its texture to the GL_TEXTURE_EXTERNAL_OES texture target.
      • detachFromGLContext

        public void detachFromGLContext()
        Detach the SurfaceTexture from the OpenGL ES context that owns the OpenGL ES texture object. This call must be made with the OpenGL ES context current on the calling thread. The OpenGL ES texture object will be deleted as a result of this call. After calling this method all calls to updateTexImage() will throw an IllegalStateException until a successful call to attachToGLContext(int) is made. This can be used to access the SurfaceTexture image contents from multiple OpenGL ES contexts. Note, however, that the image contents are only accessible from one OpenGL ES context at a time.
      • attachToGLContext

        public void attachToGLContext(int texName)
        Attach the SurfaceTexture to the OpenGL ES context that is current on the calling thread. A new OpenGL ES texture object is created and populated with the SurfaceTexture image frame that was current at the time of the last call to detachFromGLContext(). This new texture is bound to the GL_TEXTURE_EXTERNAL_OES texture target. This can be used to access the SurfaceTexture image contents from multiple OpenGL ES contexts. Note, however, that the image contents are only accessible from one OpenGL ES context at a time.
        Parameters:
        texName - The name of the OpenGL ES texture that will be created. This texture name must be unusued in the OpenGL ES context that is current on the calling thread.
      • getTransformMatrix

        public void getTransformMatrix(float[] mtx)
        Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by the most recent call to updateTexImage. This transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1) with s and t in the inclusive range [0, 1] to the texture coordinate that should be used to sample that location from the texture. Sampling the texture outside of the range of this transform is undefined. The matrix is stored in column-major order so that it may be passed directly to OpenGL ES via the glLoadMatrixf or glUniformMatrix4fv functions.
        Parameters:
        mtx - the array into which the 4x4 matrix will be stored. The array must have exactly 16 elements.
      • getTimestamp

        public long getTimestamp()
        Retrieve the timestamp associated with the texture image set by the most recent call to updateTexImage. This timestamp is in nanoseconds, and is normally monotonically increasing. The timestamp should be unaffected by time-of-day adjustments, and for a camera should be strictly monotonic but for a MediaPlayer may be reset when the position is set. The specific meaning and zero point of the timestamp depends on the source providing images to the SurfaceTexture. Unless otherwise specified by the image source, timestamps cannot generally be compared across SurfaceTexture instances, or across multiple program invocations. It is mostly useful for determining time offsets between subsequent frames.
      • release

        public void release()
        release() frees all the buffers and puts the SurfaceTexture into the 'abandoned' state. Once put in this state the SurfaceTexture can never leave it. When in the 'abandoned' state, all methods of the ISurfaceTexture interface will fail with the NO_INIT error. Note that while calling this method causes all the buffers to be freed from the perspective of the the SurfaceTexture, if there are additional references on the buffers (e.g. if a buffer is referenced by a client or by OpenGL ES as a texture) then those buffer will remain allocated. Always call this method when you are done with SurfaceTexture. Failing to do so may delay resource deallocation for a significant amount of time.
      • finalize

        protected void finalize()
                         throws Throwable
        Description copied from class: Object
        Invoked when the garbage collector has detected that this instance is no longer reachable. The default implementation does nothing, but this method can be overridden to free resources.

        Note that objects that override finalize are significantly more expensive than objects that don't. Finalizers may be run a long time after the object is no longer reachable, depending on memory pressure, so it's a bad idea to rely on them for cleanup. Note also that finalizers are run on a single VM-wide finalizer thread, so doing blocking work in a finalizer is a bad idea. A finalizer is usually only necessary for a class that has a native peer and needs to call a native method to destroy that peer. Even then, it's better to provide an explicit close method (and implement Closeable), and insist that callers manually dispose of instances. This works well for something like files, but less well for something like a BigInteger where typical calling code would have to deal with lots of temporaries. Unfortunately, code that creates lots of temporaries is the worst kind of code from the point of view of the single finalizer thread.

        If you must use finalizers, consider at least providing your own ReferenceQueue and having your own thread process that queue.

        Unlike constructors, finalizers are not automatically chained. You are responsible for calling super.finalize() yourself.

        Uncaught exceptions thrown by finalizers are ignored and do not terminate the finalizer thread. See Effective Java Item 7, "Avoid finalizers" for more.

        Overrides:
        finalize in class Object
        Throws:
        Throwable


Content

Android Reference

Java basics

Java Enterprise Edition (EE)

Java Standard Edition (SE)

SQL

HTML

PHP

CSS

Java Script

MYSQL

JQUERY

VBS

REGEX

C

C++

C#

Design patterns

RFC (standard status)

RFC (proposed standard status)

RFC (draft standard status)

RFC (informational status)

RFC (experimental status)

RFC (best current practice status)

RFC (historic status)

RFC (unknown status)

IT dictionary

License.
All information of this service is derived from the free sources and is provided solely in the form of quotations. This service provides information and interfaces solely for the familiarization (not ownership) and under the "as is" condition.
Copyright 2016 © ELTASK.COM. All rights reserved.
Site is optimized for mobile devices.
Downloads: 27 / 158778663. Delta: 0.04241 с