SurfaceTextureClient.cpp revision 391bbe2246a7547dbf3460c231b3c5ba691d4eb1
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
438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) {
448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->setSwapInterval(interval);
468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(ANativeWindow* window,
498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t** buffer) {
508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->dequeueBuffer(buffer);
528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(ANativeWindow* window,
558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->cancelBuffer(buffer);
588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(ANativeWindow* window,
618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->lockBuffer(buffer);
648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(ANativeWindow* window,
678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        android_native_buffer_t* buffer) {
688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->queueBuffer(buffer);
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(ANativeWindow* window, int what, int* value) {
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->query(what, value);
758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(ANativeWindow* window, int operation, ...) {
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_list args;
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    va_start(args, operation);
808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTextureClient* c = getSelf(window);
818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return c->perform(operation, args);
828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setSwapInterval(int interval) {
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
89e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::dequeueBuffer");
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int buf = -1;
928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->dequeueBuffer(&buf);
938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err < 0) {
94749172269ac6b6f7a430e64f604e7f040524e0a1Jamie Gennis        LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer failed: %d", err);
958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return err;
968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    sp<GraphicBuffer>& gbuf(mSlots[buf]);
988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (gbuf == 0 || gbuf->getWidth() != mReqWidth ||
998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf->getHeight() != mReqHeight ||
1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        uint32_t(gbuf->getPixelFormat()) != mReqFormat ||
1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        (gbuf->getUsage() & mReqUsage) != mReqUsage) {
1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        gbuf = mSurfaceTexture->requestBuffer(buf, mReqWidth, mReqHeight,
1038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis                mReqFormat, mReqUsage);
1048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        if (gbuf == 0) {
105e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis            LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed");
1068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_MEMORY;
1078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    *buffer = gbuf.get();
1108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) {
114e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::cancelBuffer");
1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
11773e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            mSurfaceTexture->cancelBuffer(i);
1198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return OK;
1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
126e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::lockBuffer");
1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
1298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
132e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::queueBuffer");
1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
13573e8b9e52411785189a35640e3ccb18574e38263Jamie Gennis        if (mSlots[i]->handle == buffer->handle) {
1368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return mSurfaceTexture->queueBuffer(i);
1378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE("queueBuffer: unknown buffer queued");
1408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BAD_VALUE;
1418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::query(int what, int* value) {
144e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::query");
1458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
1469d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    switch (what) {
1479d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_WIDTH:
1489d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_HEIGHT:
1499d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // XXX: How should SurfaceTexture behave if setBuffersGeometry didn't
1509d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        // override the size?
1519d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = 0;
1529d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1539d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_FORMAT:
1549d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = DEFAULT_FORMAT;
1559d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
1569d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
1579d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        *value = MIN_UNDEQUEUED_BUFFERS;
1589d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis        return NO_ERROR;
159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
160134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        // SurfaceTextureClient currently never queues frames to SurfaceFlinger.
161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        *value = 0;
162134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return NO_ERROR;
163391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    case NATIVE_WINDOW_CONCRETE_TYPE:
164391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        *value = NATIVE_WINDOW_SURFACE_TEXTURE_CLIENT;
165391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        return NO_ERROR;
1669d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    }
1679d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis    return BAD_VALUE;
1688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
1698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(int operation, va_list args)
1718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int res = NO_ERROR;
1738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    switch (operation) {
1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_CONNECT:
1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchConnect(args);
1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_DISCONNECT:
1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchDisconnect(args);
1798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_USAGE:
1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetUsage(args);
1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_CROP:
1848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetCrop(args);
1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFER_COUNT:
1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBufferCount(args);
1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY:
1908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersGeometry(args);
1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM:
1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = dispatchSetBuffersTransform(args);
1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    default:
1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        res = NAME_NOT_FOUND;
1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        break;
1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return res;
2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchConnect(va_list args) {
2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return connect(api);
2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchDisconnect(va_list args) {
2088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int api = va_arg(args, int);
2098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return disconnect(api);
2108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetUsage(va_list args) {
2138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int usage = va_arg(args, int);
2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setUsage(usage);
2158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetCrop(va_list args) {
2188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setCrop(reinterpret_cast<Rect const*>(rect));
2208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    size_t bufferCount = va_arg(args, size_t);
2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBufferCount(bufferCount);
2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) {
2288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int w = va_arg(args, int);
2298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int h = va_arg(args, int);
2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int f = va_arg(args, int);
2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersGeometry(w, h, f);
2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) {
2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int transform = va_arg(args, int);
2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return setBuffersTransform(transform);
2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::connect(int api) {
240e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::connect");
2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::disconnect(int api) {
246e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::disconnect");
2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // XXX: Implement this!
2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return INVALID_OPERATION;
2498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setUsage(uint32_t reqUsage)
2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
253e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setUsage");
2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqUsage = reqUsage;
2568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return OK;
2578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setCrop(Rect const* rect)
2608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
261e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setCrop");
2628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
26468f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    Rect realRect;
26568f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    if (rect == NULL || rect->isEmpty()) {
26668f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = Rect(0, 0);
26768f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    } else {
26868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis        realRect = *rect;
26968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    }
2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setCrop(*rect);
27268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBufferCount(int bufferCount)
2788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
279e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBufferCount");
2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setBufferCount(bufferCount);
2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s",
2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            bufferCount, strerror(-err));
2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (err == NO_ERROR) {
2878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        freeAllBuffers();
2888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
2918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
2948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
295e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersGeometry");
2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if (w<0 || h<0 || format<0)
2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    if ((w && !h) || (!w && h))
3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return BAD_VALUE;
3038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqWidth = w;
3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqHeight = h;
3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    mReqFormat = format;
3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
30868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
30968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
31068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis
31168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis    return err;
3128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersTransform(int transform)
3158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
316e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis    LOGV("SurfaceTextureClient::setBuffersTransform");
3178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex::Autolock lock(mMutex);
3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t err = mSurfaceTexture->setTransform(transform);
3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return err;
3208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisvoid SurfaceTextureClient::freeAllBuffers() {
3238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
3248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        mSlots[i] = 0;
3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
3268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
329