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