SurfaceTexture.h revision 1d01a12e7150be569557b64da9b8663c62c13594
18ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis/* 28ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Copyright (C) 2010 The Android Open Source Project 38ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 48ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 58ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * you may not use this file except in compliance with the License. 68ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * You may obtain a copy of the License at 78ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 88ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 98ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Unless required by applicable law or agreed to in writing, software 118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * See the License for the specific language governing permissions and 148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * limitations under the License. 158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis */ 168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#ifndef ANDROID_GUI_SURFACETEXTURE_H 188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#define ANDROID_GUI_SURFACETEXTURE_H 198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <EGL/egl.h> 218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <EGL/eglext.h> 228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <GLES2/gl2.h> 238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <gui/ISurfaceTexture.h> 258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <ui/GraphicBuffer.h> 278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/threads.h> 299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis#include <utils/Vector.h> 308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture" 328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 369a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisclass IGraphicBufferAlloc; 379a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisclass SurfaceTexture : public BnSurfaceTexture { 398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 409d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis enum { MIN_UNDEQUEUED_BUFFERS = 2 }; 419d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis enum { MIN_BUFFER_SLOTS = MIN_UNDEQUEUED_BUFFERS + 1 }; 428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis enum { NUM_BUFFER_SLOTS = 32 }; 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 44c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis struct FrameAvailableListener : public virtual RefBase { 45c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis virtual void onFrameAvailable() = 0; 46c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis }; 47c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // tex indicates the name OpenGL texture to which images are to be streamed. 498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This texture name cannot be changed once the SurfaceTexture is created. 508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis SurfaceTexture(GLuint tex); 518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual ~SurfaceTexture(); 538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // setBufferCount updates the number of available buffer slots. After 558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // calling this all buffer slots are both unallocated and owned by the 568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // SurfaceTexture object (i.e. they are not owned by the client). 578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount); 588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual sp<GraphicBuffer> requestBuffer(int buf, uint32_t w, uint32_t h, 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t format, uint32_t usage); 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // dequeueBuffer gets the next buffer slot index for the client to use. If a 638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // buffer slot is available then that slot index is written to the location 648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // pointed to by the buf argument and a status of OK is returned. If no 658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // slot is available then a status of -EBUSY is returned and buf is 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // unmodified. 678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t dequeueBuffer(int *buf); 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 691d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // queueBuffer returns a filled buffer to the SurfaceTexture. In addition, a 701d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // timestamp must be provided for the buffer. The timestamp is in 711d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // nanoseconds, and must be monotonically increasing. Its other semantics 721d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // (zero point, etc) are client-dependent and should be documented by the 731d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // client. 741d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala virtual status_t queueBuffer(int buf, int64_t timestamp); 758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual void cancelBuffer(int buf); 768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setCrop(const Rect& reg); 778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setTransform(uint32_t transform); 788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // updateTexImage sets the image contents of the target texture to that of 808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // the most recently queued buffer. 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // 828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This call may only be made while the OpenGL ES context to which the 838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // target texture belongs is bound to the calling thread. 848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t updateTexImage(); 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 86f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // getTransformMatrix retrieves the 4x4 texture coordinate transform matrix 87f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // associated with the texture image set by the most recent call to 88f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // updateTexImage. 89f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 90f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform matrix maps 2D homogeneous texture coordinates of the form 91f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // (s, t, 0, 1) with s and t in the inclusive range [0, 1] to the texture 92f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // coordinate that should be used to sample that location from the texture. 93f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // Sampling the texture outside of the range of this transform is undefined. 94f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 95f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform is necessary to compensate for transforms that the stream 96f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // content producer may implicitly apply to the content. By forcing users of 97f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // a SurfaceTexture to apply this transform we avoid performing an extra 98f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // copy of the data that would be needed to hide the transform from the 99f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // user. 100f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 101f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // The matrix is stored in column-major order so that it may be passed 102f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // directly to OpenGL ES via the glLoadMatrixf or glUniformMatrix4fv 103f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // functions. 104f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis void getTransformMatrix(float mtx[16]); 105f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 1061d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // getTimestamp retrieves the timestamp associated with the texture image 1071d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // set by the most recent call to updateTexImage. 1081d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // 1091d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // The timestamp is in nanoseconds, and is monotonically increasing. Its 1101d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // other semantics (zero point, etc) are source-dependent and should be 1111d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // documented by the source. 1121d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t getTimestamp(); 1131d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 114c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // setFrameAvailableListener sets the listener object that will be notified 115c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // when a new frame becomes available. 116c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis void setFrameAvailableListener(const sp<FrameAvailableListener>& l); 117c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 1181b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // getAllocator retrieves the binder object that must be referenced as long 1191b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // as the GraphicBuffers dequeued from this SurfaceTexture are referenced. 1201b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // Holding this binder reference prevents SurfaceFlinger from freeing the 1211b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // buffers before the client is done with them. 1221b20cde313b5ef8acdace742328df867956d24cbJamie Gennis sp<IBinder> getAllocator(); 1231b20cde313b5ef8acdace742328df867956d24cbJamie Gennis 1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisprivate: 1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for 1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // all slots. 1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis void freeAllBuffers(); 1298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // createImage creates a new EGLImage from a GraphicBuffer. 1318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR createImage(EGLDisplay dpy, 1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const sp<GraphicBuffer>& graphicBuffer); 1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis enum { INVALID_BUFFER_SLOT = -1 }; 1358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis struct BufferSlot { 1378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mGraphicBuffer points to the buffer allocated for this slot or is NULL 1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // if no buffer has been allocated. 1398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis sp<GraphicBuffer> mGraphicBuffer; 1408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglImage is the EGLImage created from mGraphicBuffer. 1428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR mEglImage; 1438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglDisplay is the EGLDisplay used to create mEglImage. 1458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLDisplay mEglDisplay; 1468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mOwnedByClient indicates whether the slot is currently accessible to a 1488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // client and should not be used by the SurfaceTexture object. It gets 1498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // set to true when dequeueBuffer returns the slot and is reset to false 1508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // when the client calls either queueBuffer or cancelBuffer on the slot. 1518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool mOwnedByClient; 1528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis }; 1538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mSlots is the array of buffer slots that must be mirrored on the client 1558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // side. This allows buffer ownership to be transferred between the client 1568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // and server without sending a GraphicBuffer over binder. The entire array 1578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // is initialized to NULL at construction time, and buffers are allocated 1588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // for a slot when requestBuffer is called with that slot's index. 1598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis BufferSlot mSlots[NUM_BUFFER_SLOTS]; 1608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mBufferCount is the number of buffer slots that the client and server 1628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // must maintain. It defaults to MIN_BUFFER_SLOTS and can be changed by 1638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // calling setBufferCount. 1648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mBufferCount; 1658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mCurrentTexture is the buffer slot index of the buffer that is currently 16767eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // bound to the OpenGL texture. It is initialized to INVALID_BUFFER_SLOT, 16867eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // indicating that no buffer slot is currently bound to the texture. Note, 16967eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // however, that a value of INVALID_BUFFER_SLOT does not necessarily mean 17067eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // that no buffer is bound to the texture. A call to setBufferCount will 17167eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // reset mCurrentTexture to INVALID_BUFFER_SLOT. 1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mCurrentTexture; 1738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1749a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mCurrentTextureBuf is the graphic buffer of the current texture. It's 1759a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // possible that this buffer is not associated with any buffer slot, so we 1769a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // must track it separately in order to properly use 1779a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // IGraphicBufferAlloc::freeAllGraphicBuffersExcept. 1789a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<GraphicBuffer> mCurrentTextureBuf; 1799a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 180f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentCrop is the crop rectangle that applies to the current texture. 181f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // It gets set to mLastQueuedCrop each time updateTexImage is called. 182f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mCurrentCrop; 183f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 184f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentTransform is the transform identifier for the current texture. It 185f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // gets set to mLastQueuedTransform each time updateTexImage is called. 186f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mCurrentTransform; 187f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 1881d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // mCurrentTimestamp is the timestamp for the current texture. It 1891d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // gets set to mLastQueuedTimestamp each time updateTexImage is called. 1901d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t mCurrentTimestamp; 1911d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mLastQueued is the buffer slot index of the most recently enqueued buffer. 1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // At construction time it is initialized to INVALID_BUFFER_SLOT, and is 1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // updated each time queueBuffer is called. 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mLastQueued; 1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 197f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mLastQueuedCrop is the crop rectangle for the buffer that was most 198f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // recently queued. This gets set to mNextCrop each time queueBuffer gets 199f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // called. 200f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mLastQueuedCrop; 201f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 202f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mLastQueuedTransform is the transform identifier for the buffer that was 203f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // most recently queued. This gets set to mNextTransform each time 204f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // queueBuffer gets called. 205f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mLastQueuedTransform; 206f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 2071d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // mLastQueuedTimestamp is the timestamp for the buffer that was most 2081d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // recently queued. This gets set by queueBuffer. 2091d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t mLastQueuedTimestamp; 2101d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 211f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextCrop is the crop rectangle that will be used for the next buffer 212f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // that gets queued. It is set by calling setCrop. 213f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mNextCrop; 214f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 215f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextTransform is the transform identifier that will be used for the next 216f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // buffer that gets queued. It is set by calling setTransform. 217f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mNextTransform; 218f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mTexName is the name of the OpenGL texture to which streamed images will 2208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // be bound when updateTexImage is called. It is set at construction time 2218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // changed with a call to setTexName. 2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const GLuint mTexName; 2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2249a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mGraphicBufferAlloc is the connection to SurfaceFlinger that is used to 2259a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // allocate new GraphicBuffer objects. 2269a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IGraphicBufferAlloc> mGraphicBufferAlloc; 2279a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 2289a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mAllocdBuffers is mirror of the list of buffers that SurfaceFlinger is 2299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // referencing. This is kept so that gralloc implementations do not need to 2309a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // properly handle the case where SurfaceFlinger no longer holds a reference 2319a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // to a buffer, but other processes do. 2329a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Vector<sp<GraphicBuffer> > mAllocdBuffers; 2339a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 234c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // mFrameAvailableListener is the listener object that will be called when a 235c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // new frame becomes available. If it is not NULL it will be called from 236c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // queueBuffer. 237c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis sp<FrameAvailableListener> mFrameAvailableListener; 238c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mMutex is the mutex used to prevent concurrent access to the member 2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // variables of SurfaceTexture objects. It must be locked whenever the 2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // member variables are accessed. 2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex mMutex; 2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 2448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 2468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#endif // ANDROID_GUI_SURFACETEXTURE_H 249