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" 19e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#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 25e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define CC_LOGV(x, ...) ALOGV("[%s] "x, mName.string(), ##__VA_ARGS__) 26e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define CC_LOGD(x, ...) ALOGD("[%s] "x, mName.string(), ##__VA_ARGS__) 27e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define CC_LOGI(x, ...) ALOGI("[%s] "x, mName.string(), ##__VA_ARGS__) 28e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#define CC_LOGW(x, ...) ALOGW("[%s] "x, mName.string(), ##__VA_ARGS__) 29e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala#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, 34595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian uint32_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); 43db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setMaxAcquiredBufferCount(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 64b4b63704c02319765625de360a140ef8a59ab43bZhijun Hestatus_t CpuConsumer::setDefaultBufferFormat(uint32_t defaultFormat) 65b4b63704c02319765625de360a140ef8a59ab43bZhijun He{ 66b4b63704c02319765625de360a140ef8a59ab43bZhijun He Mutex::Autolock _l(mMutex); 67db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian return mConsumer->setDefaultBufferFormat(defaultFormat); 68b4b63704c02319765625de360a140ef8a59ab43bZhijun He} 69b4b63704c02319765625de360a140ef8a59ab43bZhijun He 706a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnarstatic bool isPossiblyYUV(PixelFormat format) { 716a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar switch ((int)format) { 726a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBA_8888: 736a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGBX_8888: 746a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_888: 756a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RGB_565: 766a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BGRA_8888: 776a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_sRGB_A_8888: 786a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_sRGB_X_8888: 796a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y8: 806a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_Y16: 816a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW16: // same as HAL_PIXEL_FORMAT_RAW_SENSOR 826a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW10: 836a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_RAW_OPAQUE: 846a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_BLOB: 856a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 866a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return false; 876a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 886a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 896a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_420_888: 906a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_SP: 916a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCrCb_420_SP: 926a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar case HAL_PIXEL_FORMAT_YCbCr_422_I: 936a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar default: 946a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return true; 956a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 966a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar} 976a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 98e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { 99e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t err; 100e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 101e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (!nativeBuffer) return BAD_VALUE; 102e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (mCurrentLockedBuffers == mMaxLockedBuffers) { 103a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin CC_LOGW("Max buffers have been locked (%d), cannot lock anymore.", 104a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin mMaxLockedBuffers); 105a5b7513711555c8681eb9391cfafe30fb7d6dd3dIgor Murashkin return NOT_ENOUGH_DATA; 106e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 107e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 108e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala BufferQueue::BufferItem b; 109e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 110e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 111e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 1121585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden err = acquireBufferLocked(&b, 0); 113e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 114e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 115e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 116e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } else { 117e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("Error acquiring buffer: %s (%d)", strerror(err), err); 118e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 119e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 120e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 121e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 122e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala int buf = b.mBuf; 123e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 12464d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala void *bufferPointer = NULL; 125c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala android_ycbcr ycbcr = android_ycbcr(); 126c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 1276a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat format = mSlots[buf].mGraphicBuffer->getPixelFormat(); 1286a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar PixelFormat flexFormat = format; 1296a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (isPossiblyYUV(format)) { 1306a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 131d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mSlots[buf].mGraphicBuffer->lockAsyncYCbCr( 132d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 133d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 134d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &ycbcr, 135d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mFence->dup()); 136d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 1376a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar err = mSlots[buf].mGraphicBuffer->lockYCbCr( 138d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 139d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1406a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &ycbcr); 1416a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1426a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err == OK) { 1436a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar bufferPointer = ycbcr.y; 1446a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar flexFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; 1456a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (format != HAL_PIXEL_FORMAT_YCbCr_420_888) { 1466a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGV("locking buffer of format %#x as flex YUV", format); 147d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 1486a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 1496a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)", 1506a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1516a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 152c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 1536a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1546a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar 1556a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (bufferPointer == NULL) { // not flexible YUV 1566a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (b.mFence.get()) { 1576a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar err = mSlots[buf].mGraphicBuffer->lockAsync( 158d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 159d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 1606a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar &bufferPointer, 1616a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar b.mFence->dup()); 162d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } else { 163d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mSlots[buf].mGraphicBuffer->lock( 164d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews GraphicBuffer::USAGE_SW_READ_OFTEN, 165d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews b.mCrop, 166d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews &bufferPointer); 1676a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar } 1686a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar if (err != OK) { 1696a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)", 1706a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar strerror(-err), err); 1716a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar return err; 172c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala } 173e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 174c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 175042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 176042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) { 177042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (mAcquiredBuffers[lockedIdx].mSlot == 178042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala BufferQueue::INVALID_BUFFER_SLOT) { 179042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala break; 180042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 181042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 182042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala assert(lockedIdx < mMaxLockedBuffers); 183042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 184042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 185042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mSlot = buf; 186042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = bufferPointer; 187042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mGraphicBuffer = mSlots[buf].mGraphicBuffer; 188e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 18964d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala nativeBuffer->data = 19064d8b1903e4b5f2838818eedcf4fef748b38709cEino-Ville Talvala reinterpret_cast<uint8_t*>(bufferPointer); 191f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala nativeBuffer->width = mSlots[buf].mGraphicBuffer->getWidth(); 192f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala nativeBuffer->height = mSlots[buf].mGraphicBuffer->getHeight(); 1936a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->format = format; 1946a26be7c2b1e5a84b5d2105780148016889285e6Lajos Molnar nativeBuffer->flexFormat = flexFormat; 195c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->stride = (ycbcr.y != NULL) ? 196c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala ycbcr.ystride : 197c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala mSlots[buf].mGraphicBuffer->getStride(); 198e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 199e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->crop = b.mCrop; 200e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->transform = b.mTransform; 201e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->scalingMode = b.mScalingMode; 202e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->timestamp = b.mTimestamp; 203e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala nativeBuffer->frameNumber = b.mFrameNumber; 204e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 205c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCb = reinterpret_cast<uint8_t*>(ycbcr.cb); 206c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->dataCr = reinterpret_cast<uint8_t*>(ycbcr.cr); 207c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->chromaStride = ycbcr.cstride; 208c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala nativeBuffer->chromaStep = ycbcr.chroma_step; 209c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala 210e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala mCurrentLockedBuffers++; 211e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 212e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 213e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 214e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 215e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvalastatus_t CpuConsumer::unlockBuffer(const LockedBuffer &nativeBuffer) { 216e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala Mutex::Autolock _l(mMutex); 217042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala size_t lockedIdx = 0; 218e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala status_t err; 219e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 220e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala void *bufPtr = reinterpret_cast<void *>(nativeBuffer.data); 221042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) { 222042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (bufPtr == mAcquiredBuffers[lockedIdx].mBufferPointer) break; 223e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 224042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (lockedIdx == mMaxLockedBuffers) { 225e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala CC_LOGE("%s: Can't find buffer to free", __FUNCTION__); 226e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return BAD_VALUE; 227e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 228e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 229042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala return releaseAcquiredBufferLocked(lockedIdx); 230042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala} 231042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 232042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvalastatus_t CpuConsumer::releaseAcquiredBufferLocked(int lockedIdx) { 233042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala status_t err; 234d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews int fd = -1; 235042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 236d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews err = mAcquiredBuffers[lockedIdx].mGraphicBuffer->unlockAsync(&fd); 237e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala if (err != OK) { 238042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala CC_LOGE("%s: Unable to unlock graphic buffer %d", __FUNCTION__, 239042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala lockedIdx); 240e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return err; 241e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala } 242042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala int buf = mAcquiredBuffers[lockedIdx].mSlot; 243d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews if (CC_LIKELY(fd != -1)) { 244d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews sp<Fence> fence(new Fence(fd)); 245d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews addReleaseFenceLocked( 246d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mAcquiredBuffers[lockedIdx].mSlot, 247d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews mSlots[buf].mGraphicBuffer, 248d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews fence); 249d53e052322c658ce7c67b046caaeee4babc0a657Riley Andrews } 250042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala 251042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // release the buffer if it hasn't already been freed by the BufferQueue. 252042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // This can happen, for example, when the producer of this buffer 253042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala // disconnected after this buffer was acquired. 254042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala if (CC_LIKELY(mAcquiredBuffers[lockedIdx].mGraphicBuffer == 255042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mSlots[buf].mGraphicBuffer)) { 256c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar releaseBufferLocked( 257c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar buf, mAcquiredBuffers[lockedIdx].mGraphicBuffer, 258c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); 259042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala } 260e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 261042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala AcquiredBuffer &ab = mAcquiredBuffers.editItemAt(lockedIdx); 262042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mSlot = BufferQueue::INVALID_BUFFER_SLOT; 263042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mBufferPointer = NULL; 264042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala ab.mGraphicBuffer.clear(); 265e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 266042ecee2abf8584585f1f22f661ac6be9689edf4Eino-Ville Talvala mCurrentLockedBuffers--; 267e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala return OK; 268e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 269e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 270f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvalavoid CpuConsumer::freeBufferLocked(int slotIndex) { 271f57e7540d4cf799f18fe87d3536c55f1e0064931Eino-Ville Talvala ConsumerBase::freeBufferLocked(slotIndex); 272e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} 273e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala 274e41b318bc4708e1dee9364e73215ff0d51fb76a1Eino-Ville Talvala} // namespace android 275