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