SurfaceTextureClient.cpp 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#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):
281b20cde313b5ef8acdace742328df867956d24cbJamie Gennis        mSurfaceTexture(surfaceTexture), mAllocator(0), mReqWidth(1),
291d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        mReqHeight(1), mReqFormat(DEFAULT_FORMAT), mReqUsage(0),
301d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        mTimestamp(NATIVE_WINDOW_TIMESTAMP_AUTO), mMutex() {
318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // Initialize the ANativeWindow function pointers.
328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::setSwapInterval  = setSwapInterval;
338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::dequeueBuffer    = dequeueBuffer;
348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::cancelBuffer     = cancelBuffer;
358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::lockBuffer       = lockBuffer;
368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::queueBuffer      = queueBuffer;
378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::query            = query;
388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::perform          = perform;
391b20cde313b5ef8acdace742328df867956d24cbJamie Gennis
401b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    // Get a reference to the allocator.
411b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    mAllocator = mSurfaceTexture->getAllocator();
428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
44bae774eb20bebd409441b93386b51bccda75f546Jamie Gennissp<ISurfaceTexture> SurfaceTextureClient::getISurfaceTexture() const {
45bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    return mSurfaceTexture;
46bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
47bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) {
498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->setSwapInterval(interval);
518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(ANativeWindow* window,
548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t** buffer) {
558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->dequeueBuffer(buffer);
578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(ANativeWindow* window,
608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->cancelBuffer(buffer);
638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(ANativeWindow* window,
668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->lockBuffer(buffer);
698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(ANativeWindow* window,
728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->queueBuffer(buffer);
758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(ANativeWindow* window, int what, int* value) {
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->query(what, value);
808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(ANativeWindow* window, int operation, ...) {
838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_list args;
848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_start(args, operation);
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->perform(operation, args);
878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(int interval) {
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
94e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::dequeueBuffer");
958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int buf = -1;
978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->dequeueBuffer(&buf);
988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err < 0) {
99749172269ac6b6f7a430e64f604e7f040524e0a1Jamie Gennis        LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer failed: %d", err);
1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return err;
1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    sp<GraphicBuffer>& gbuf(mSlots[buf]);
1038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (gbuf == 0 || gbuf->getWidth() != mReqWidth ||
1048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf->getHeight() != mReqHeight ||
1058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        uint32_t(gbuf->getPixelFormat()) != mReqFormat ||
1068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        (gbuf->getUsage() & mReqUsage) != mReqUsage) {
1078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf = mSurfaceTexture->requestBuffer(buf, mReqWidth, mReqHeight,
1088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis                mReqFormat, mReqUsage);
1098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        if (gbuf == 0) {
110e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis            LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed");
1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_MEMORY;
1128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    *buffer = gbuf.get();
1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) {
119e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::cancelBuffer");
1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
12273e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            mSurfaceTexture->cancelBuffer(i);
1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return OK;
1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
131e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::lockBuffer");
1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
137e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::queueBuffer");
1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1391d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    int64_t timestamp;
1401d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
1411d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1421d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        LOGV("SurfaceTextureClient::queueBuffer making up timestamp: %.2f ms",
1431d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala             timestamp / 1000000.f);
1441d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    } else {
1451d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        timestamp = mTimestamp;
1461d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    }
1478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
14873e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1491d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala            return mSurfaceTexture->queueBuffer(i, timestamp);
1508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE("queueBuffer: unknown buffer queued");
1538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(int what, int* value) {
157e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::query");
1588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1599d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    switch (what) {
1609d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_WIDTH:
1619d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_HEIGHT:
1629d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // XXX: How should SurfaceTexture behave if setBuffersGeometry didn't
1639d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // override the size?
1649d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = 0;
1659d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1669d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_FORMAT:
1679d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = DEFAULT_FORMAT;
1689d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1699d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
1709d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = MIN_UNDEQUEUED_BUFFERS;
1719d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
172134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
173134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        // SurfaceTextureClient currently never queues frames to SurfaceFlinger.
174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        *value = 0;
175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return NO_ERROR;
176391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    case NATIVE_WINDOW_CONCRETE_TYPE:
177391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT;
178391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        return NO_ERROR;
1799d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    }
1809d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    return BAD_VALUE;
1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(int operation, va_list args)
1848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int res = NO_ERROR;
1868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    switch (operation) {
1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_CONNECT:
1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchConnect(args);
1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_DISCONNECT:
1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchDisconnect(args);
1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_USAGE:
1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetUsage(args);
1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_CROP:
1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetCrop(args);
1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFER_COUNT:
2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBufferCount(args);
2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersGeometry(args);
2048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersTransform(args);
2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2081d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
2091d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        res = dispatchSetBuffersTimestamp(args);
2101d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala        break;
2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    default:
2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = NAME_NOT_FOUND;
2138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return res;
2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchConnect(va_list args) {
2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return connect(api);
2218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchDisconnect(va_list args) {
2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return disconnect(api);
2268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetUsage(va_list args) {
2298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int usage = va_arg(args, int);
2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setUsage(usage);
2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetCrop(va_list args) {
2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setCrop(reinterpret_cast<Rect const*>(rect));
2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    size_t bufferCount = va_arg(args, size_t);
2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBufferCount(bufferCount);
2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) {
2448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int w = va_arg(args, int);
2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int h = va_arg(args, int);
2468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int f = va_arg(args, int);
2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersGeometry(w, h, f);
2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) {
2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int transform = va_arg(args, int);
2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersTransform(transform);
2538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2551d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvalaint SurfaceTextureClient::dispatchSetBuffersTimestamp(va_list args) {
2561d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    int64_t timestamp = va_arg(args, int64_t);
2571d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    return setBuffersTimestamp(timestamp);
2581d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala}
2591d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala
2608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::connect(int api) {
261e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::connect");
2628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::disconnect(int api) {
267e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::disconnect");
2688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setUsage(uint32_t reqUsage)
2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
274e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setUsage");
2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqUsage = reqUsage;
2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
2788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setCrop(Rect const* rect)
2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
282e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setCrop");
2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
28568f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    Rect realRect;
28668f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    if (rect == NULL || rect->isEmpty()) {
28768f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = Rect(0, 0);
28868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    } else {
28968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = *rect;
29068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    }
2918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setCrop(*rect);
29368f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
2948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBufferCount(int bufferCount)
2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
300e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBufferCount");
3018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setBufferCount(bufferCount);
3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            bufferCount, strerror(-err));
3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err == NO_ERROR) {
3088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        freeAllBuffers();
3098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
3108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
3158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
316e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersGeometry");
3178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (w<0 || h<0 || format<0)
3208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if ((w && !h) || (!w && h))
3238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqWidth = w;
3268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqHeight = h;
3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqFormat = format;
3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
32968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
33068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
33168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis
33268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    return err;
3338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersTransform(int transform)
3368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
337e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersTransform");
3388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setTransform(transform);
3408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3431d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvalaint SurfaceTextureClient::setBuffersTimestamp(int64_t timestamp)
3441d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala{
3451d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    LOGV("SurfaceTextureClient::setBuffersTimestamp");
3461d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    Mutex::Autolock lock(mMutex);
3471d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    mTimestamp = timestamp;
3481d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala    return NO_ERROR;
3491d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala}
3501d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala
3518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisvoid SurfaceTextureClient::freeAllBuffers() {
3528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
3538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        mSlots[i] = 0;
3548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
3558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
358