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