1e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala/* 2e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 4e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * you may not use this file except in compliance with the License. 6e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * You may obtain a copy of the License at 7e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 8e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * 10e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * See the License for the specific language governing permissions and 14e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala * limitations under the License. 15e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala */ 16e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 17e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala//#define LOG_NDEBUG 0 18e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define LOG_TAG "CpuConsumer" 19d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define ATRACE_TAG ATRACE_TAG_GRAPHICS 20e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 21042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala#include <cutils/compiler.h> 22042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala#include <utils/Log.h> 23dd26416fe135f93ef2c8570738f8e1ca5e2ca3a3Dan Stoza#include <gui/BufferItem.h> 24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <gui/CpuConsumer.h> 25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 26b3ca72ce1ea0d5e9ef1601dd35520f9fcf23cbcaLajos Molnar#define CC_LOGV(x, ...) ALOGV("[%s] " x, mName.string(), ##__VA_ARGS__) 27d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define CC_LOGD(x, ...) ALOGD("[%s] " x, mName.string(), ##__VA_ARGS__) 28d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define CC_LOGI(x, ...) ALOGI("[%s] " x, mName.string(), ##__VA_ARGS__) 298b49125f10e3fd991c631e12856ce1ebf5a56d7eDan Albert#define CC_LOGW(x, ...) ALOGW("[%s] " x, mName.string(), ##__VA_ARGS__) 308b49125f10e3fd991c631e12856ce1ebf5a56d7eDan Albert#define CC_LOGE(x, ...) ALOGE("[%s] " x, mName.string(), ##__VA_ARGS__) 31e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 32e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android { 33e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 34db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianCpuConsumer::CpuConsumer(const sp<IGraphicBufferConsumer>& bq, 35d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t maxLockedBuffers, bool controlledByApp) : 36595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian ConsumerBase(bq, controlledByApp), 37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mMaxLockedBuffers(maxLockedBuffers), 38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mCurrentLockedBuffers(0) 39e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala{ 40042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Create tracking entries for locked buffers 41042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mAcquiredBuffers.insertAt(0, maxLockedBuffers); 42e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 43db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_SW_READ_OFTEN); 44d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mConsumer->setMaxAcquiredBufferCount(static_cast<int32_t>(maxLockedBuffers)); 45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 46e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 47e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville TalvalaCpuConsumer::~CpuConsumer() { 48042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // ConsumerBase destructor does all the work. 49e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala} 50e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala 51042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 52042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid CpuConsumer::setName(const String8& name) { 54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 5565d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos if (mAbandoned) { 5665d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos CC_LOGE("setName: CpuConsumer is abandoned!"); 5765d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos return; 5865d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos } 59e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mName = name; 60db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(name); 61e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 62e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 636a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnarstatic bool isPossiblyYUV(PixelFormat format) { 64b3ca72ce1ea0d5e9ef1601dd35520f9fcf23cbcaLajos Molnar switch (static_cast<int>(format)) { 656a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBA_8888: 666a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBX_8888: 676a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_888: 686a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_565: 696a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BGRA_8888: 706a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y8: 716a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y16: 725b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 736a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW10: 746a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW_OPAQUE: 756a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BLOB: 766a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 776a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return false; 786a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 796a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 806a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_420_888: 816a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_SP: 826a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCrCb_420_SP: 836a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_I: 846a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar default: 856a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return true; 866a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 876a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar} 886a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 89e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { 90e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t err; 91e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 92e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (!nativeBuffer) return BAD_VALUE; 93e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (mCurrentLockedBuffers == mMaxLockedBuffers) { 94d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza CC_LOGW("Max buffers have been locked (%zd), cannot lock anymore.", 95a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin mMaxLockedBuffers); 96a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin return NOT_ENOUGH_DATA; 97e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 99dd26416fe135f93ef2c8570738f8e1ca5e2ca3a3Dan Stoza BufferItem b; 100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 1031585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden err = acquireBufferLocked(&b, 0); 104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } else { 108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("Error acquiring buffer: %s (%d)", strerror(err), err); 109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 11347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos int slot = b.mSlot; 114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 11564d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *bufferPointer = NULL; 116c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala android_ycbcr ycbcr = android_ycbcr(); 117c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 11847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos PixelFormat format = mSlots[slot].mGraphicBuffer->getPixelFormat(); 1196a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat flexFormat = format; 1206a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (isPossiblyYUV(format)) { 1216a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 12247650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos err = mSlots[slot].mGraphicBuffer->lockAsyncYCbCr( 123d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 124d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 125d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &ycbcr, 126d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mFence->dup()); 127d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 12847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos err = mSlots[slot].mGraphicBuffer->lockYCbCr( 129d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 130d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1316a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &ycbcr); 1326a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1336a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err == OK) { 1346a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar bufferPointer = ycbcr.y; 1356a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar flexFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; 1366a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (format != HAL_PIXEL_FORMAT_YCbCr_420_888) { 1376a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGV("locking buffer of format %#x as flex YUV", format); 138d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 1396a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 1406a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)", 1416a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1426a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 143c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 1446a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1456a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 1466a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (bufferPointer == NULL) { // not flexible YUV 1476a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 14847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos err = mSlots[slot].mGraphicBuffer->lockAsync( 149d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 150d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1516a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &bufferPointer, 1526a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar b.mFence->dup()); 153d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 15447650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos err = mSlots[slot].mGraphicBuffer->lock( 155d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 156d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 157d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &bufferPointer); 1586a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1596a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err != OK) { 1606a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)", 1616a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1626a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 163c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 164e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 165c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 166042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 167d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (; lockedIdx < static_cast<size_t>(mMaxLockedBuffers); lockedIdx++) { 168042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (mAcquiredBuffers[lockedIdx].mSlot == 169042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala BufferQueue::INVALID_BUFFER_SLOT) { 170042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala break; 171042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 172042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 173042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala assert(lockedIdx < mMaxLockedBuffers); 174042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 175042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 17647650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos ab.mSlot = slot; 177042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = bufferPointer; 17847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos ab.mGraphicBuffer = mSlots[slot].mGraphicBuffer; 179e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 18064d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala nativeBuffer->data = 18164d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala reinterpret_cast<uint8_t*>(bufferPointer); 18247650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos nativeBuffer->width = mSlots[slot].mGraphicBuffer->getWidth(); 18347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos nativeBuffer->height = mSlots[slot].mGraphicBuffer->getHeight(); 1846a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->format = format; 1856a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->flexFormat = flexFormat; 186c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->stride = (ycbcr.y != NULL) ? 187d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<uint32_t>(ycbcr.ystride) : 18847650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos mSlots[slot].mGraphicBuffer->getStride(); 189e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 190e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->crop = b.mCrop; 191e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->transform = b.mTransform; 192e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->scalingMode = b.mScalingMode; 193e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->timestamp = b.mTimestamp; 1945b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala nativeBuffer->dataSpace = b.mDataSpace; 195e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->frameNumber = b.mFrameNumber; 196e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 197c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCb = reinterpret_cast<uint8_t*>(ycbcr.cb); 198c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCr = reinterpret_cast<uint8_t*>(ycbcr.cr); 199d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza nativeBuffer->chromaStride = static_cast<uint32_t>(ycbcr.cstride); 200d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza nativeBuffer->chromaStep = static_cast<uint32_t>(ycbcr.chroma_step); 201c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 202e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mCurrentLockedBuffers++; 203e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 204e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 205e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 206e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 207e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::unlockBuffer(const LockedBuffer &nativeBuffer) { 208e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 209042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 210e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 211e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala void *bufPtr = reinterpret_cast<void *>(nativeBuffer.data); 212d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (; lockedIdx < static_cast<size_t>(mMaxLockedBuffers); lockedIdx++) { 213042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (bufPtr == mAcquiredBuffers[lockedIdx].mBufferPointer) break; 214e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 215042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (lockedIdx == mMaxLockedBuffers) { 216e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("%s: Can't find buffer to free", __FUNCTION__); 217e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 218e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 219e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 220042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala return releaseAcquiredBufferLocked(lockedIdx); 221042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala} 222042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 223d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t CpuConsumer::releaseAcquiredBufferLocked(size_t lockedIdx) { 224042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala status_t err; 225d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews int fd = -1; 226042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 227d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mAcquiredBuffers[lockedIdx].mGraphicBuffer->unlockAsync(&fd); 228e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 229d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza CC_LOGE("%s: Unable to unlock graphic buffer %zd", __FUNCTION__, 230042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala lockedIdx); 231e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 232e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 233042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala int buf = mAcquiredBuffers[lockedIdx].mSlot; 234d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews if (CC_LIKELY(fd != -1)) { 235d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews sp<Fence> fence(new Fence(fd)); 236d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews addReleaseFenceLocked( 237d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mAcquiredBuffers[lockedIdx].mSlot, 238d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mSlots[buf].mGraphicBuffer, 239d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews fence); 240d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 241042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 242042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // release the buffer if it hasn't already been freed by the BufferQueue. 243042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // This can happen, for example, when the producer of this buffer 244042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // disconnected after this buffer was acquired. 245042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (CC_LIKELY(mAcquiredBuffers[lockedIdx].mGraphicBuffer == 246042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mSlots[buf].mGraphicBuffer)) { 247c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar releaseBufferLocked( 248c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar buf, mAcquiredBuffers[lockedIdx].mGraphicBuffer, 249c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 250042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 251e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 252042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 253042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mSlot = BufferQueue::INVALID_BUFFER_SLOT; 254042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = NULL; 255042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mGraphicBuffer.clear(); 256e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 257042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mCurrentLockedBuffers--; 258e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 259e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 260e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 261f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvalavoid CpuConsumer::freeBufferLocked(int slotIndex) { 262f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala ConsumerBase::freeBufferLocked(slotIndex); 263e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 264e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 265e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 266