CpuConsumer.cpp revision 5b75a513e431c097ae704cba2f7affa6bfaecec9
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> 23e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#include <gui/CpuConsumer.h> 24e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 25b3ca72ce1ea0d5e9ef1601dd35520f9fcf23cbcaLajos Molnar#define CC_LOGV(x, ...) ALOGV("[%s] " x, mName.string(), ##__VA_ARGS__) 26d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define CC_LOGD(x, ...) ALOGD("[%s] " x, mName.string(), ##__VA_ARGS__) 27d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define CC_LOGI(x, ...) ALOGI("[%s] " x, mName.string(), ##__VA_ARGS__) 288b49125f10e3fd991c631e12856ce1ebf5a56d7eDan Albert#define CC_LOGW(x, ...) ALOGW("[%s] " x, mName.string(), ##__VA_ARGS__) 298b49125f10e3fd991c631e12856ce1ebf5a56d7eDan Albert#define CC_LOGE(x, ...) ALOGE("[%s] " x, mName.string(), ##__VA_ARGS__) 30e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 31e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalanamespace android { 32e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 33db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianCpuConsumer::CpuConsumer(const sp<IGraphicBufferConsumer>& bq, 34d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t maxLockedBuffers, bool controlledByApp) : 35595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian ConsumerBase(bq, controlledByApp), 36e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mMaxLockedBuffers(maxLockedBuffers), 37e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mCurrentLockedBuffers(0) 38e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala{ 39042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // Create tracking entries for locked buffers 40042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mAcquiredBuffers.insertAt(0, maxLockedBuffers); 41e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 42db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerUsageBits(GRALLOC_USAGE_SW_READ_OFTEN); 43d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mConsumer->setMaxAcquiredBufferCount(static_cast<int32_t>(maxLockedBuffers)); 44e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 45e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 46e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville TalvalaCpuConsumer::~CpuConsumer() { 47042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // ConsumerBase destructor does all the work. 48e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala} 49e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala 50042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 51042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 52e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalavoid CpuConsumer::setName(const String8& name) { 53e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 54e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mName = name; 55db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(name); 56e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 57e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 58b4b63704c02319765625de360a140ef8a59ab43bZhijun Hestatus_t CpuConsumer::setDefaultBufferSize(uint32_t width, uint32_t height) 59b4b63704c02319765625de360a140ef8a59ab43bZhijun He{ 60b4b63704c02319765625de360a140ef8a59ab43bZhijun He Mutex::Autolock _l(mMutex); 61db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian return mConsumer->setDefaultBufferSize(width, height); 62b4b63704c02319765625de360a140ef8a59ab43bZhijun He} 63b4b63704c02319765625de360a140ef8a59ab43bZhijun He 64d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t CpuConsumer::setDefaultBufferFormat(PixelFormat defaultFormat) 65b4b63704c02319765625de360a140ef8a59ab43bZhijun He{ 66b4b63704c02319765625de360a140ef8a59ab43bZhijun He Mutex::Autolock _l(mMutex); 67db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian return mConsumer->setDefaultBufferFormat(defaultFormat); 68b4b63704c02319765625de360a140ef8a59ab43bZhijun He} 69b4b63704c02319765625de360a140ef8a59ab43bZhijun He 705b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvalastatus_t CpuConsumer::setDefaultBufferDataSpace( 715b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala android_dataspace defaultDataSpace) 725b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala{ 735b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala Mutex::Autolock _l(mMutex); 745b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala return mConsumer->setDefaultBufferDataSpace(defaultDataSpace); 755b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala} 765b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 776a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnarstatic bool isPossiblyYUV(PixelFormat format) { 78b3ca72ce1ea0d5e9ef1601dd35520f9fcf23cbcaLajos Molnar switch (static_cast<int>(format)) { 796a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBA_8888: 806a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBX_8888: 816a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_888: 826a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_565: 836a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BGRA_8888: 846a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y8: 856a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y16: 865b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 876a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW10: 886a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW_OPAQUE: 896a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BLOB: 906a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 916a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return false; 926a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 936a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 946a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_420_888: 956a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_SP: 966a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCrCb_420_SP: 976a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_I: 986a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar default: 996a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return true; 1006a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1016a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar} 1026a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 103e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { 104e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t err; 105e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (!nativeBuffer) return BAD_VALUE; 107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (mCurrentLockedBuffers == mMaxLockedBuffers) { 108d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza CC_LOGW("Max buffers have been locked (%zd), cannot lock anymore.", 109a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin mMaxLockedBuffers); 110a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin return NOT_ENOUGH_DATA; 111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 112e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala BufferQueue::BufferItem b; 114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 116e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 1171585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden err = acquireBufferLocked(&b, 0); 118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 119e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 120e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 121e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } else { 122e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("Error acquiring buffer: %s (%d)", strerror(err), err); 123e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 124e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 125e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 126e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 127e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala int buf = b.mBuf; 128e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 12964d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *bufferPointer = NULL; 130c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala android_ycbcr ycbcr = android_ycbcr(); 131c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 1326a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat format = mSlots[buf].mGraphicBuffer->getPixelFormat(); 1336a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat flexFormat = format; 1346a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (isPossiblyYUV(format)) { 1356a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 136d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mSlots[buf].mGraphicBuffer->lockAsyncYCbCr( 137d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 138d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 139d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &ycbcr, 140d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mFence->dup()); 141d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 1426a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar err = mSlots[buf].mGraphicBuffer->lockYCbCr( 143d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 144d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1456a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &ycbcr); 1466a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1476a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err == OK) { 1486a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar bufferPointer = ycbcr.y; 1496a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar flexFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; 1506a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (format != HAL_PIXEL_FORMAT_YCbCr_420_888) { 1516a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGV("locking buffer of format %#x as flex YUV", format); 152d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 1536a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 1546a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)", 1556a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1566a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 157c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 1586a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1596a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 1606a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (bufferPointer == NULL) { // not flexible YUV 1616a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 1626a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar err = mSlots[buf].mGraphicBuffer->lockAsync( 163d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 164d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1656a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &bufferPointer, 1666a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar b.mFence->dup()); 167d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 168d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mSlots[buf].mGraphicBuffer->lock( 169d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 170d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 171d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &bufferPointer); 1726a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1736a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err != OK) { 1746a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)", 1756a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1766a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 177c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 178e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 179c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 180042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 181d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (; lockedIdx < static_cast<size_t>(mMaxLockedBuffers); lockedIdx++) { 182042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (mAcquiredBuffers[lockedIdx].mSlot == 183042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala BufferQueue::INVALID_BUFFER_SLOT) { 184042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala break; 185042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 186042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 187042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala assert(lockedIdx < mMaxLockedBuffers); 188042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 189042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 190042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mSlot = buf; 191042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = bufferPointer; 192042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mGraphicBuffer = mSlots[buf].mGraphicBuffer; 193e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 19464d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala nativeBuffer->data = 19564d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala reinterpret_cast<uint8_t*>(bufferPointer); 196f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala nativeBuffer->width = mSlots[buf].mGraphicBuffer->getWidth(); 197f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala nativeBuffer->height = mSlots[buf].mGraphicBuffer->getHeight(); 1986a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->format = format; 1996a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->flexFormat = flexFormat; 200c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->stride = (ycbcr.y != NULL) ? 201d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<uint32_t>(ycbcr.ystride) : 202c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala mSlots[buf].mGraphicBuffer->getStride(); 203e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 204e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->crop = b.mCrop; 205e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->transform = b.mTransform; 206e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->scalingMode = b.mScalingMode; 207e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->timestamp = b.mTimestamp; 2085b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala nativeBuffer->dataSpace = b.mDataSpace; 209e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->frameNumber = b.mFrameNumber; 210e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 211c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCb = reinterpret_cast<uint8_t*>(ycbcr.cb); 212c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCr = reinterpret_cast<uint8_t*>(ycbcr.cr); 213d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza nativeBuffer->chromaStride = static_cast<uint32_t>(ycbcr.cstride); 214d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza nativeBuffer->chromaStep = static_cast<uint32_t>(ycbcr.chroma_step); 215c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 216e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mCurrentLockedBuffers++; 217e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 218e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 219e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 220e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 221e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::unlockBuffer(const LockedBuffer &nativeBuffer) { 222e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 223042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 224e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 225e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala void *bufPtr = reinterpret_cast<void *>(nativeBuffer.data); 226d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (; lockedIdx < static_cast<size_t>(mMaxLockedBuffers); lockedIdx++) { 227042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (bufPtr == mAcquiredBuffers[lockedIdx].mBufferPointer) break; 228e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 229042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (lockedIdx == mMaxLockedBuffers) { 230e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("%s: Can't find buffer to free", __FUNCTION__); 231e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 232e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 233e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 234042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala return releaseAcquiredBufferLocked(lockedIdx); 235042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala} 236042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 237d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t CpuConsumer::releaseAcquiredBufferLocked(size_t lockedIdx) { 238042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala status_t err; 239d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews int fd = -1; 240042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 241d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mAcquiredBuffers[lockedIdx].mGraphicBuffer->unlockAsync(&fd); 242e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 243d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza CC_LOGE("%s: Unable to unlock graphic buffer %zd", __FUNCTION__, 244042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala lockedIdx); 245e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 246e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 247042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala int buf = mAcquiredBuffers[lockedIdx].mSlot; 248d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews if (CC_LIKELY(fd != -1)) { 249d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews sp<Fence> fence(new Fence(fd)); 250d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews addReleaseFenceLocked( 251d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mAcquiredBuffers[lockedIdx].mSlot, 252d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mSlots[buf].mGraphicBuffer, 253d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews fence); 254d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 255042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 256042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // release the buffer if it hasn't already been freed by the BufferQueue. 257042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // This can happen, for example, when the producer of this buffer 258042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // disconnected after this buffer was acquired. 259042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (CC_LIKELY(mAcquiredBuffers[lockedIdx].mGraphicBuffer == 260042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mSlots[buf].mGraphicBuffer)) { 261c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar releaseBufferLocked( 262c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar buf, mAcquiredBuffers[lockedIdx].mGraphicBuffer, 263c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 264042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 265e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 266042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 267042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mSlot = BufferQueue::INVALID_BUFFER_SLOT; 268042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = NULL; 269042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mGraphicBuffer.clear(); 270e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 271042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mCurrentLockedBuffers--; 272e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 273e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 274e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 275f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvalavoid CpuConsumer::freeBufferLocked(int slotIndex) { 276f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala ConsumerBase::freeBufferLocked(slotIndex); 277e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 278e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 279e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 280