SurfaceTextureClient.cpp revision bae774eb20bebd409441b93386b51bccda75f546
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),
291b20cde313b5ef8acdace742328df867956d24cbJamie Gennis        mReqHeight(1), mReqFormat(DEFAULT_FORMAT), mReqUsage(0), mMutex() {
308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // Initialize the ANativeWindow function pointers.
318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::setSwapInterval  = setSwapInterval;
328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::dequeueBuffer    = dequeueBuffer;
338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::cancelBuffer     = cancelBuffer;
348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::lockBuffer       = lockBuffer;
358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::queueBuffer      = queueBuffer;
368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::query            = query;
378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    ANativeWindow::perform          = perform;
381b20cde313b5ef8acdace742328df867956d24cbJamie Gennis
391b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    // Get a reference to the allocator.
401b20cde313b5ef8acdace742328df867956d24cbJamie Gennis    mAllocator = mSurfaceTexture->getAllocator();
418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
43bae774eb20bebd409441b93386b51bccda75f546Jamie Gennissp<ISurfaceTexture> SurfaceTextureClient::getISurfaceTexture() const {
44bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis    return mSurfaceTexture;
45bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis}
46bae774eb20bebd409441b93386b51bccda75f546Jamie Gennis
478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) {
488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->setSwapInterval(interval);
508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(ANativeWindow* window,
538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t** buffer) {
548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->dequeueBuffer(buffer);
568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(ANativeWindow* window,
598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->cancelBuffer(buffer);
628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(ANativeWindow* window,
658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->lockBuffer(buffer);
688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(ANativeWindow* window,
718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->queueBuffer(buffer);
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(ANativeWindow* window, int what, int* value) {
778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->query(what, value);
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(ANativeWindow* window, int operation, ...) {
828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_list args;
838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_start(args, operation);
848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->perform(operation, args);
868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(int interval) {
898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
93e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::dequeueBuffer");
948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int buf = -1;
968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->dequeueBuffer(&buf);
978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err < 0) {
98749172269ac6b6f7a430e64f604e7f040524e0a1Jamie Gennis        LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer failed: %d", err);
998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return err;
1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    sp<GraphicBuffer>& gbuf(mSlots[buf]);
1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (gbuf == 0 || gbuf->getWidth() != mReqWidth ||
1038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf->getHeight() != mReqHeight ||
1048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        uint32_t(gbuf->getPixelFormat()) != mReqFormat ||
1058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        (gbuf->getUsage() & mReqUsage) != mReqUsage) {
1068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf = mSurfaceTexture->requestBuffer(buf, mReqWidth, mReqHeight,
1078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis                mReqFormat, mReqUsage);
1088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        if (gbuf == 0) {
109e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis            LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed");
1108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_MEMORY;
1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    *buffer = gbuf.get();
1148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) {
118e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::cancelBuffer");
1198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
12173e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            mSurfaceTexture->cancelBuffer(i);
1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return OK;
1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
130e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::lockBuffer");
1318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
136e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::queueBuffer");
1378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
13973e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return mSurfaceTexture->queueBuffer(i);
1418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE("queueBuffer: unknown buffer queued");
1448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(int what, int* value) {
148e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::query");
1498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1509d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    switch (what) {
1519d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_WIDTH:
1529d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_HEIGHT:
1539d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // XXX: How should SurfaceTexture behave if setBuffersGeometry didn't
1549d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // override the size?
1559d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = 0;
1569d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1579d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_FORMAT:
1589d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = DEFAULT_FORMAT;
1599d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1609d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
1619d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = MIN_UNDEQUEUED_BUFFERS;
1629d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        // SurfaceTextureClient currently never queues frames to SurfaceFlinger.
165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        *value = 0;
166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return NO_ERROR;
167391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    case NATIVE_WINDOW_CONCRETE_TYPE:
168391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT;
169391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        return NO_ERROR;
1709d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    }
1719d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    return BAD_VALUE;
1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(int operation, va_list args)
1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int res = NO_ERROR;
1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    switch (operation) {
1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_CONNECT:
1798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchConnect(args);
1808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_DISCONNECT:
1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchDisconnect(args);
1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_USAGE:
1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetUsage(args);
1868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_CROP:
1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetCrop(args);
1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFER_COUNT:
1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBufferCount(args);
1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersGeometry(args);
1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersTransform(args);
1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    default:
2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = NAME_NOT_FOUND;
2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return res;
2048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchConnect(va_list args) {
2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return connect(api);
2098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchDisconnect(va_list args) {
2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return disconnect(api);
2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetUsage(va_list args) {
2178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int usage = va_arg(args, int);
2188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setUsage(usage);
2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetCrop(va_list args) {
2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setCrop(reinterpret_cast<Rect const*>(rect));
2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    size_t bufferCount = va_arg(args, size_t);
2288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBufferCount(bufferCount);
2298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) {
2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int w = va_arg(args, int);
2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int h = va_arg(args, int);
2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int f = va_arg(args, int);
2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersGeometry(w, h, f);
2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) {
2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int transform = va_arg(args, int);
2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersTransform(transform);
2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::connect(int api) {
244e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::connect");
2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::disconnect(int api) {
250e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::disconnect");
2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setUsage(uint32_t reqUsage)
2568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
257e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setUsage");
2588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqUsage = reqUsage;
2608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
2618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setCrop(Rect const* rect)
2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
265e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setCrop");
2668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
26868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    Rect realRect;
26968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    if (rect == NULL || rect->isEmpty()) {
27068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = Rect(0, 0);
27168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    } else {
27268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = *rect;
27368f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    }
2748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setCrop(*rect);
27668f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
2798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBufferCount(int bufferCount)
2828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
283e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBufferCount");
2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setBufferCount(bufferCount);
2878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
2888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            bufferCount, strerror(-err));
2898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err == NO_ERROR) {
2918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        freeAllBuffers();
2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
2958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
299e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersGeometry");
3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (w<0 || h<0 || format<0)
3038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if ((w && !h) || (!w && h))
3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqWidth = w;
3098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqHeight = h;
3108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqFormat = format;
3118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
31268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
31368f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
31468f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis
31568f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    return err;
3168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersTransform(int transform)
3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
320e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersTransform");
3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setTransform(transform);
3238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisvoid SurfaceTextureClient::freeAllBuffers() {
3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        mSlots[i] = 0;
3298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
3308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
333