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