SurfaceTextureClient.cpp revision 1c4414091cfb93206067fb64eba445653739d40f
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#define LOG_TAG "SurfaceTextureClient"
18e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis//#define LOG_NDEBUG 0
198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <gui/SurfaceTextureClient.h>
218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Log.h>
238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android {
258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie GennisSurfaceTextureClient::SurfaceTextureClient(
278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        const sp<ISurfaceTexture>& surfaceTexture):
28a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian        mSurfaceTexture(surfaceTexture), mAllocator(0), mReqWidth(0),
297a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mReqHeight(0), mReqFormat(0), mReqUsage(0),
307a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mTimestamp(NATIVE_WINDOW_TIMESTAMP_AUTO), mConnectedApi(0),
317a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mQueryWidth(0), mQueryHeight(0), mQueryFormat(0),
327a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mMutex() {
338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // Initialize the ANativeWindow function pointers.
348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::setSwapInterval  = setSwapInterval;
358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::dequeueBuffer    = dequeueBuffer;
368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::cancelBuffer     = cancelBuffer;
378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::lockBuffer       = lockBuffer;
388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::queueBuffer      = queueBuffer;
398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::query            = query;
408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::perform          = perform;
411b20cde313b5ef8acdace742328df867956d24cbJamie Gennis
428072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    const_cast<int&>(ANativeWindow::minSwapInterval) = 0;
438072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    const_cast<int&>(ANativeWindow::maxSwapInterval) = 1;
448072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
451b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    // Get a reference to the allocator.
461b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    mAllocator = mSurfaceTexture->getAllocator();
478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
49bae774eb20bebd409441b93386b51bccda75f546Jamie Gennissp<ISurfaceTexture> SurfaceTextureClient::getISurfaceTexture() const {
50bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    return mSurfaceTexture;
51bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
52bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) {
548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->setSwapInterval(interval);
568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(ANativeWindow* window,
59697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer** buffer) {
608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->dequeueBuffer(buffer);
628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(ANativeWindow* window,
65697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* buffer) {
668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->cancelBuffer(buffer);
688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(ANativeWindow* window,
71697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* buffer) {
728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->lockBuffer(buffer);
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(ANativeWindow* window,
77697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* buffer) {
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->queueBuffer(buffer);
808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
8241abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchevint SurfaceTextureClient::query(const ANativeWindow* window,
8341abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchev                                int what, int* value) {
8441abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchev    const SurfaceTextureClient* c = getSelf(window);
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->query(what, value);
868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(ANativeWindow* window, int operation, ...) {
898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_list args;
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_start(args, operation);
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->perform(operation, args);
938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(int interval) {
968072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    // EGL specification states:
978072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    //  interval is silently clamped to minimum and maximum implementation
988072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    //  dependent values before being stored.
998072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    // Although we don't have to, we apply the same logic here.
1008072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
1018072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    if (interval < minSwapInterval)
1028072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian        interval = minSwapInterval;
1038072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
1048072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    if (interval > maxSwapInterval)
1058072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian        interval = maxSwapInterval;
1068072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
1078072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    status_t res = mSurfaceTexture->setSynchronousMode(interval ? true : false);
1088072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
1098072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    return res;
1108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
113e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::dequeueBuffer");
1148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int buf = -1;
1168072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    status_t result = mSurfaceTexture->dequeueBuffer(&buf, mReqWidth, mReqHeight,
117c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian            mReqFormat, mReqUsage);
1188072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    if (result < 0) {
119c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian        LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)"
1208cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis             "failed: %d", mReqWidth, mReqHeight, mReqFormat, mReqUsage,
1218cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis             result);
1228072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian        return result;
1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    sp<GraphicBuffer>& gbuf(mSlots[buf]);
1258072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    if (result & ISurfaceTexture::RELEASE_ALL_BUFFERS) {
1268072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian        freeAllBuffers();
1278072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    }
1288072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
1298072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian    if ((result & ISurfaceTexture::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) {
130c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian        gbuf = mSurfaceTexture->requestBuffer(buf);
1318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        if (gbuf == 0) {
132e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis            LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed");
1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_MEMORY;
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1357a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mQueryWidth  = gbuf->width;
1367a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mQueryHeight = gbuf->height;
1377a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        mQueryFormat = gbuf->format;
1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    *buffer = gbuf.get();
1408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) {
144e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::cancelBuffer");
1458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1461c4414091cfb93206067fb64eba445653739d40fJamie Gennis    int i = getSlotFromBufferLocked(buffer);
1471c4414091cfb93206067fb64eba445653739d40fJamie Gennis    if (i < 0) {
1481c4414091cfb93206067fb64eba445653739d40fJamie Gennis        return i;
1491c4414091cfb93206067fb64eba445653739d40fJamie Gennis    }
1501c4414091cfb93206067fb64eba445653739d40fJamie Gennis    mSurfaceTexture->cancelBuffer(i);
1511c4414091cfb93206067fb64eba445653739d40fJamie Gennis    return OK;
1521c4414091cfb93206067fb64eba445653739d40fJamie Gennis}
1531c4414091cfb93206067fb64eba445653739d40fJamie Gennis
1541c4414091cfb93206067fb64eba445653739d40fJamie Gennisint SurfaceTextureClient::getSlotFromBufferLocked(
1551c4414091cfb93206067fb64eba445653739d40fJamie Gennis        android_native_buffer_t* buffer) const {
1561c4414091cfb93206067fb64eba445653739d40fJamie Gennis    bool dumpedState = false;
1578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
1581c4414091cfb93206067fb64eba445653739d40fJamie Gennis        // XXX: Dump the slots whenever we hit a NULL entry while searching for
1591c4414091cfb93206067fb64eba445653739d40fJamie Gennis        // a buffer.
1601c4414091cfb93206067fb64eba445653739d40fJamie Gennis        if (mSlots[i] == NULL) {
1611c4414091cfb93206067fb64eba445653739d40fJamie Gennis            if (!dumpedState) {
1621c4414091cfb93206067fb64eba445653739d40fJamie Gennis                LOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d "
1631c4414091cfb93206067fb64eba445653739d40fJamie Gennis                        "looking for buffer %p", i, buffer->handle);
1641c4414091cfb93206067fb64eba445653739d40fJamie Gennis                for (int j = 0; j < NUM_BUFFER_SLOTS; j++) {
1651c4414091cfb93206067fb64eba445653739d40fJamie Gennis                    if (mSlots[j] == NULL) {
1661c4414091cfb93206067fb64eba445653739d40fJamie Gennis                        LOGD("getSlotFromBufferLocked:   %02d: NULL", j);
1671c4414091cfb93206067fb64eba445653739d40fJamie Gennis                    } else {
1681c4414091cfb93206067fb64eba445653739d40fJamie Gennis                        LOGD("getSlotFromBufferLocked:   %02d: %p", j, mSlots[j]->handle);
1691c4414091cfb93206067fb64eba445653739d40fJamie Gennis                    }
1701c4414091cfb93206067fb64eba445653739d40fJamie Gennis                }
1711c4414091cfb93206067fb64eba445653739d40fJamie Gennis                dumpedState = true;
1721c4414091cfb93206067fb64eba445653739d40fJamie Gennis            }
1731c4414091cfb93206067fb64eba445653739d40fJamie Gennis        }
1741c4414091cfb93206067fb64eba445653739d40fJamie Gennis
1751c4414091cfb93206067fb64eba445653739d40fJamie Gennis        if (mSlots[i] != NULL && mSlots[i]->handle == buffer->handle) {
1761c4414091cfb93206067fb64eba445653739d40fJamie Gennis            return i;
1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1791c4414091cfb93206067fb64eba445653739d40fJamie Gennis    LOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
1808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
184e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::lockBuffer");
1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
190e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::queueBuffer");
1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1921d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    int64_t timestamp;
1931d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
1941d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1951d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        LOGV("SurfaceTextureClient::queueBuffer making up timestamp: %.2f ms",
1961d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala             timestamp / 1000000.f);
1971d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    } else {
1981d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        timestamp = mTimestamp;
1991d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    }
2001c4414091cfb93206067fb64eba445653739d40fJamie Gennis    int i = getSlotFromBufferLocked(buffer);
2011c4414091cfb93206067fb64eba445653739d40fJamie Gennis    if (i < 0) {
2021c4414091cfb93206067fb64eba445653739d40fJamie Gennis        return i;
2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2041c4414091cfb93206067fb64eba445653739d40fJamie Gennis    mSurfaceTexture->queueBuffer(i, timestamp);
2051c4414091cfb93206067fb64eba445653739d40fJamie Gennis    return OK;
2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
20841abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchevint SurfaceTextureClient::query(int what, int* value) const {
209e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::query");
2109d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    switch (what) {
211a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    case NATIVE_WINDOW_FORMAT:
212a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (mReqFormat) {
213a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            *value = mReqFormat;
214a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            return NO_ERROR;
215a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        }
216a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        break;
217134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
218eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        // TODO: this is not needed anymore
219134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        *value = 0;
220134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return NO_ERROR;
221391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    case NATIVE_WINDOW_CONCRETE_TYPE:
222eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        // TODO: this is not needed anymore
223391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT;
224391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        return NO_ERROR;
2259d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    }
226eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    return mSurfaceTexture->query(what, value);
2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(int operation, va_list args)
2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int res = NO_ERROR;
2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    switch (operation) {
2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_CONNECT:
2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchConnect(args);
2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_DISCONNECT:
2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchDisconnect(args);
2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_USAGE:
2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetUsage(args);
2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_CROP:
2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetCrop(args);
2448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFER_COUNT:
2468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBufferCount(args);
2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
2498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersGeometry(args);
2508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersTransform(args);
2538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2541d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
2551d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        res = dispatchSetBuffersTimestamp(args);
2561d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        break;
2578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    default:
2588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = NAME_NOT_FOUND;
2598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return res;
2628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchConnect(va_list args) {
2658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return connect(api);
2678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchDisconnect(va_list args) {
2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return disconnect(api);
2728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetUsage(va_list args) {
2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int usage = va_arg(args, int);
2768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setUsage(usage);
2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetCrop(va_list args) {
2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setCrop(reinterpret_cast<Rect const*>(rect));
2828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    size_t bufferCount = va_arg(args, size_t);
2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBufferCount(bufferCount);
2878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) {
2908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int w = va_arg(args, int);
2918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int h = va_arg(args, int);
2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int f = va_arg(args, int);
2938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersGeometry(w, h, f);
2948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) {
2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int transform = va_arg(args, int);
2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersTransform(transform);
2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3011d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvalaint SurfaceTextureClient::dispatchSetBuffersTimestamp(va_list args) {
3021d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    int64_t timestamp = va_arg(args, int64_t);
3031d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    return setBuffersTimestamp(timestamp);
3041d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala}
3051d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala
3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::connect(int api) {
307e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::connect");
3087a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    Mutex::Autolock lock(mMutex);
3097a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    int err = NO_ERROR;
3107a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    switch (api) {
3117a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        case NATIVE_WINDOW_API_EGL:
3127a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            if (mConnectedApi) {
3137a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian                err = -EINVAL;
3147a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            } else {
3157a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian                mConnectedApi = api;
3167a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            }
3177a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            break;
3187a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        default:
3197a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            err = -EINVAL;
3207a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            break;
3217a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    }
3227a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    return err;
3238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::disconnect(int api) {
326e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::disconnect");
3277a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    Mutex::Autolock lock(mMutex);
3287a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    int err = NO_ERROR;
3297a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    switch (api) {
3307a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        case NATIVE_WINDOW_API_EGL:
3317a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            if (mConnectedApi == api) {
3327a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian                mConnectedApi = 0;
3337a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            } else {
3347a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian                err = -EINVAL;
3357a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            }
3367a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            break;
3377a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian        default:
3387a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            err = -EINVAL;
3397a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian            break;
3407a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    }
3417a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    return err;
3427a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian}
3437a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian
3447a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopianint SurfaceTextureClient::getConnectedApi() const
3457a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian{
3467a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    Mutex::Autolock lock(mMutex);
3477a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian    return mConnectedApi;
3488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3507a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian
3518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setUsage(uint32_t reqUsage)
3528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
353e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setUsage");
3548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqUsage = reqUsage;
3568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
3578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setCrop(Rect const* rect)
3608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
361e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setCrop");
3628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
36468f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    Rect realRect;
36568f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    if (rect == NULL || rect->isEmpty()) {
36668f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = Rect(0, 0);
36768f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    } else {
36868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = *rect;
36968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    }
3708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setCrop(*rect);
37268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
3738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBufferCount(int bufferCount)
3788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
379e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBufferCount");
3808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setBufferCount(bufferCount);
3838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
3848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            bufferCount, strerror(-err));
3858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err == NO_ERROR) {
3878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        freeAllBuffers();
3888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
3898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
3948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
395e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersGeometry");
3968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (w<0 || h<0 || format<0)
3998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
4008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
4018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if ((w && !h) || (!w && h))
4028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
4038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
4048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqWidth = w;
4058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqHeight = h;
4068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqFormat = format;
4078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
40868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
40968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
41068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis
41168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    return err;
4128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
4138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
4148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersTransform(int transform)
4158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
416e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersTransform");
4178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
4188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setTransform(transform);
4198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
4208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
4218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
4221d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvalaint SurfaceTextureClient::setBuffersTimestamp(int64_t timestamp)
4231d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala{
4241d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    LOGV("SurfaceTextureClient::setBuffersTimestamp");
4251d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    Mutex::Autolock lock(mMutex);
4261d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    mTimestamp = timestamp;
4271d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    return NO_ERROR;
4281d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala}
4291d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala
4308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisvoid SurfaceTextureClient::freeAllBuffers() {
4318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
4328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        mSlots[i] = 0;
4338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
4348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
4358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
4368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
437