Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * @addtogroup SurfaceTexture
     19  * @{
     20  */
     21 
     22 /**
     23  * @file surface_texture.h
     24  */
     25 
     26 #ifndef ANDROID_NATIVE_SURFACE_TEXTURE_H
     27 #define ANDROID_NATIVE_SURFACE_TEXTURE_H
     28 
     29 /******************************************************************
     30  *
     31  * IMPORTANT NOTICE:
     32  *
     33  *   This file is part of Android's set of stable system headers
     34  *   exposed by the Android NDK (Native Development Kit).
     35  *
     36  *   Third-party source AND binary code relies on the definitions
     37  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
     38  *
     39  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
     40  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
     41  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
     42  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
     43  */
     44 
     45 #include <stdint.h>
     46 #include <sys/cdefs.h>
     47 
     48 #include <android/native_window.h>
     49 
     50 __BEGIN_DECLS
     51 
     52 struct ASurfaceTexture;
     53 
     54 /**
     55  * {@link ASurfaceTexture} is an opaque type to manage SurfaceTexture from native code
     56  *
     57  * {@link ASurfaceTexture} can be obtained from an android.graphics.SurfaceTexture object using
     58  * ASurfaceTexture_fromSurfaceTexture().
     59  */
     60 typedef struct ASurfaceTexture ASurfaceTexture;
     61 
     62 #if __ANDROID_API__ >= 28
     63 
     64 /**
     65  * Release the reference to the native ASurfaceTexture acquired with
     66  * ASurfaceTexture_fromSurfaceTexture().
     67  * Failing to do so will result in leaked memory and graphic resources.
     68  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
     69  */
     70 void ASurfaceTexture_release(ASurfaceTexture* st) __INTRODUCED_IN(28);
     71 
     72 /**
     73  * Returns a reference to an ANativeWindow (i.e. the Producer) for this SurfaceTexture.
     74  * This is equivalent to Java's: Surface sur = new Surface(surfaceTexture);
     75  *
     76  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
     77  * @return A reference to an ANativeWindow. This reference MUST BE released when no longer needed
     78  * using ANativeWindow_release(). Failing to do so will result in leaked resources. nullptr is
     79  * returned if \p st is null or if it's not an instance of android.graphics.SurfaceTexture
     80  */
     81 ANativeWindow* ASurfaceTexture_acquireANativeWindow(ASurfaceTexture* st) __INTRODUCED_IN(28);
     82 
     83 /**
     84  * Attach the SurfaceTexture to the OpenGL ES context that is current on the calling thread.  A
     85  * new OpenGL ES texture object is created and populated with the SurfaceTexture image frame
     86  * that was current at the time of the last call to {@link #detachFromGLContext}.  This new
     87  * texture is bound to the GL_TEXTURE_EXTERNAL_OES texture target.
     88  *
     89  * This can be used to access the SurfaceTexture image contents from multiple OpenGL ES
     90  * contexts.  Note, however, that the image contents are only accessible from one OpenGL ES
     91  * context at a time.
     92  *
     93  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
     94  * \param texName The name of the OpenGL ES texture that will be created.  This texture name
     95  * must be unusued in the OpenGL ES context that is current on the calling thread.
     96  * \return 0 on success, negative posix error code otherwise (see <errno.h>)
     97  */
     98 int ASurfaceTexture_attachToGLContext(ASurfaceTexture* st, uint32_t texName) __INTRODUCED_IN(28);
     99 
    100 /**
    101  * Detach the SurfaceTexture from the OpenGL ES context that owns the OpenGL ES texture object.
    102  * This call must be made with the OpenGL ES context current on the calling thread.  The OpenGL
    103  * ES texture object will be deleted as a result of this call.  After calling this method all
    104  * calls to {@link #updateTexImage} will fail until a successful call to {@link #attachToGLContext}
    105  * is made.
    106  *
    107  * This can be used to access the SurfaceTexture image contents from multiple OpenGL ES
    108  * contexts.  Note, however, that the image contents are only accessible from one OpenGL ES
    109  * context at a time.
    110  *
    111  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
    112  * \return 0 on success, negative posix error code otherwise (see <errno.h>)
    113  */
    114 int ASurfaceTexture_detachFromGLContext(ASurfaceTexture* st) __INTRODUCED_IN(28);
    115 
    116 /**
    117  * Update the texture image to the most recent frame from the image stream.  This may only be
    118  * called while the OpenGL ES context that owns the texture is current on the calling thread.
    119  * It will implicitly bind its texture to the GL_TEXTURE_EXTERNAL_OES texture target.
    120  *
    121  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
    122  * \return 0 on success, negative posix error code otherwise (see <errno.h>)
    123  */
    124 int ASurfaceTexture_updateTexImage(ASurfaceTexture* st) __INTRODUCED_IN(28);
    125 
    126 /**
    127  * Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by
    128  * the most recent call to updateTexImage.
    129  *
    130  * This transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1) with s
    131  * and t in the inclusive range [0, 1] to the texture coordinate that should be used to sample
    132  * that location from the texture.  Sampling the texture outside of the range of this transform
    133  * is undefined.
    134  *
    135  * The matrix is stored in column-major order so that it may be passed directly to OpenGL ES via
    136  * the glLoadMatrixf or glUniformMatrix4fv functions.
    137  *
    138  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
    139  * \param mtx the array into which the 4x4 matrix will be stored.  The array must have exactly
    140  *     16 elements.
    141  */
    142 void ASurfaceTexture_getTransformMatrix(ASurfaceTexture* st, float mtx[16]) __INTRODUCED_IN(28);
    143 
    144 /**
    145  * Retrieve the timestamp associated with the texture image set by the most recent call to
    146  * updateTexImage.
    147  *
    148  * This timestamp is in nanoseconds, and is normally monotonically increasing. The timestamp
    149  * should be unaffected by time-of-day adjustments, and for a camera should be strictly
    150  * monotonic but for a MediaPlayer may be reset when the position is set.  The
    151  * specific meaning and zero point of the timestamp depends on the source providing images to
    152  * the SurfaceTexture. Unless otherwise specified by the image source, timestamps cannot
    153  * generally be compared across SurfaceTexture instances, or across multiple program
    154  * invocations. It is mostly useful for determining time offsets between subsequent frames.
    155  *
    156  * For EGL/Vulkan producers, this timestamp is the desired present time set with the
    157  * EGL_ANDROID_presentation_time or VK_GOOGLE_display_timing extensions
    158  *
    159  * \param st A ASurfaceTexture reference acquired with ASurfaceTexture_fromSurfaceTexture()
    160  */
    161 int64_t ASurfaceTexture_getTimestamp(ASurfaceTexture* st) __INTRODUCED_IN(28);
    162 
    163 #endif /* __ANDROID_API__ >= 28 */
    164 
    165 __END_DECLS
    166 
    167 #endif /* ANDROID_NATIVE_SURFACE_TEXTURE_H */
    168