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