SurfaceTexture.h revision 8ba32fade11abb73f3fd47ea0953c9528eb5b91f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_GUI_SURFACETEXTURE_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_GUI_SURFACETEXTURE_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/eglext.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES2/gl2.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <gui/ISurfaceTexture.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root#include <ui/GraphicBuffer.h>
27ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root
28ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root#include <utils/threads.h>
29ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root
30ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SurfaceTexture : public BnSurfaceTexture {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum { MIN_BUFFER_SLOTS = 3 };
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum { NUM_BUFFER_SLOTS = 32 };
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // tex indicates the name OpenGL texture to which images are to be streamed.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This texture name cannot be changed once the SurfaceTexture is created.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceTexture(GLuint tex);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~SurfaceTexture();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // setBufferCount updates the number of available buffer slots.  After
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // calling this all buffer slots are both unallocated and owned by the
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // SurfaceTexture object (i.e. they are not owned by the client).
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setBufferCount(int bufferCount);
5082e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<GraphicBuffer> requestBuffer(int buf, uint32_t w, uint32_t h,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t format, uint32_t usage);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // dequeueBuffer gets the next buffer slot index for the client to use. If a
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // buffer slot is available then that slot index is written to the location
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // pointed to by the buf argument and a status of OK is returned.  If no
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // slot is available then a status of -EBUSY is returned and buf is
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // unmodified.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t dequeueBuffer(int *buf);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t queueBuffer(int buf);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void cancelBuffer(int buf);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setCrop(const Rect& reg);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setTransform(uint32_t transform);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // updateTexImage sets the image contents of the target texture to that of
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the most recently queued buffer.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This call may only be made while the OpenGL ES context to which the
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // target texture belongs is bound to the calling thread.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t updateTexImage();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
74ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // all slots.
77ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    void freeAllBuffers();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // createImage creates a new EGLImage from a GraphicBuffer.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLImageKHR createImage(EGLDisplay dpy,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<GraphicBuffer>& graphicBuffer);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum { INVALID_BUFFER_SLOT = -1 };
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct BufferSlot {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // mGraphicBuffer points to the buffer allocated for this slot or is NULL
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if no buffer has been allocated.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<GraphicBuffer> mGraphicBuffer;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // mEglImage is the EGLImage created from mGraphicBuffer.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLImageKHR mEglImage;
92ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // mEglDisplay is the EGLDisplay used to create mEglImage.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay mEglDisplay;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // mOwnedByClient indicates whether the slot is currently accessible to a
97ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root        // client and should not be used by the SurfaceTexture object. It gets
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // set to true when dequeueBuffer returns the slot and is reset to false
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // when the client calls either queueBuffer or cancelBuffer on the slot.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mOwnedByClient;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mSlots is the array of buffer slots that must be mirrored on the client
104ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    // side. This allows buffer ownership to be transferred between the client
105ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    // and server without sending a GraphicBuffer over binder. The entire array
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is initialized to NULL at construction time, and buffers are allocated
10782e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    // for a slot when requestBuffer is called with that slot's index.
10882e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    BufferSlot mSlots[NUM_BUFFER_SLOTS];
10982e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn
11082e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    // mBufferCount is the number of buffer slots that the client and server
111ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    // must maintain. It defaults to MIN_BUFFER_SLOTS and can be changed by
11282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    // calling setBufferCount.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mBufferCount;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mCurrentTexture is the buffer slot index of the buffer that is currently
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bound to the OpenGL texture. A value of INVALID_BUFFER_SLOT, indicating
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that no buffer is currently bound to the texture.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mCurrentTexture;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mLastQueued is the buffer slot index of the most recently enqueued buffer.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // At construction time it is initialized to INVALID_BUFFER_SLOT, and is
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // updated each time queueBuffer is called.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mLastQueued;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
125ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    // mTexName is the name of the OpenGL texture to which streamed images will
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // be bound when updateTexImage is called. It is set at construction time
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changed with a call to setTexName.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLuint mTexName;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mMutex is the mutex used to prevent concurrent access to the member
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // variables of SurfaceTexture objects. It must be locked whenever the
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // member variables are accessed.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex mMutex;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_GUI_SURFACETEXTURE_H
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project