SurfaceTextureClient.cpp revision 9d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6
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; 1599d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis } 1609d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis return BAD_VALUE; 1618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 1628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::perform(int operation, va_list args) 1648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 1658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int res = NO_ERROR; 1668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch (operation) { 1678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_CONNECT: 1688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchConnect(args); 1698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_DISCONNECT: 1718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchDisconnect(args); 1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_SET_USAGE: 1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchSetUsage(args); 1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_SET_CROP: 1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchSetCrop(args); 1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_SET_BUFFER_COUNT: 1808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchSetBufferCount(args); 1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchSetBuffersGeometry(args); 1848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 1868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = dispatchSetBuffersTransform(args); 1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis default: 1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis res = NAME_NOT_FOUND; 1908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis break; 1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return res; 1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchConnect(va_list args) { 1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int api = va_arg(args, int); 1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return connect(api); 1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchDisconnect(va_list args) { 2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int api = va_arg(args, int); 2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return disconnect(api); 2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetUsage(va_list args) { 2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int usage = va_arg(args, int); 2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return setUsage(usage); 2088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetCrop(va_list args) { 2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return setCrop(reinterpret_cast<Rect const*>(rect)); 2138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBufferCount(va_list args) { 2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis size_t bufferCount = va_arg(args, size_t); 2178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return setBufferCount(bufferCount); 2188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) { 2218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int w = va_arg(args, int); 2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int h = va_arg(args, int); 2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int f = va_arg(args, int); 2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return setBuffersGeometry(w, h, f); 2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) { 2288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int transform = va_arg(args, int); 2298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return setBuffersTransform(transform); 2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::connect(int api) { 233e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::connect"); 2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // XXX: Implement this! 2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return INVALID_OPERATION; 2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::disconnect(int api) { 239e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::disconnect"); 2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // XXX: Implement this! 2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return INVALID_OPERATION; 2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setUsage(uint32_t reqUsage) 2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 246e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::setUsage"); 2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex::Autolock lock(mMutex); 2488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis mReqUsage = reqUsage; 2498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return OK; 2508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setCrop(Rect const* rect) 2538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 254e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::setCrop"); 2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex::Autolock lock(mMutex); 2568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 25768f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis Rect realRect; 25868f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis if (rect == NULL || rect->isEmpty()) { 25968f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis realRect = Rect(0, 0); 26068f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis } else { 26168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis realRect = *rect; 26268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis } 2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t err = mSurfaceTexture->setCrop(*rect); 26568f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err)); 2668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return err; 2688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBufferCount(int bufferCount) 2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 272e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::setBufferCount"); 2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex::Autolock lock(mMutex); 2748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t err = mSurfaceTexture->setBufferCount(bufferCount); 2768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis LOGE_IF(err, "ISurfaceTexture::setBufferCount(%d) returned %s", 2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bufferCount, strerror(-err)); 2788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (err == NO_ERROR) { 2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis freeAllBuffers(); 2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return err; 2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersGeometry(int w, int h, int format) 2878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 288e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::setBuffersGeometry"); 2898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex::Autolock lock(mMutex); 2908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (w<0 || h<0 || format<0) 2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BAD_VALUE; 2938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if ((w && !h) || (!w && h)) 2958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BAD_VALUE; 2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis mReqWidth = w; 2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis mReqHeight = h; 2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis mReqFormat = format; 3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 30168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis status_t err = mSurfaceTexture->setCrop(Rect(0, 0)); 30268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err)); 30368f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis 30468f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis return err; 3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisint SurfaceTextureClient::setBuffersTransform(int transform) 3088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 309e5366c567a49e587879929ed4e5c98425ea17740Jamie Gennis LOGV("SurfaceTextureClient::setBuffersTransform"); 3108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Mutex::Autolock lock(mMutex); 3118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t err = mSurfaceTexture->setTransform(transform); 3128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return err; 3138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 3148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisvoid SurfaceTextureClient::freeAllBuffers() { 3168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 3178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis mSlots[i] = 0; 3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 3208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 322