1ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams/*
2ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Copyright (C) 2013 The Android Open Source Project
3ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
4ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * you may not use this file except in compliance with the License.
6ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * You may obtain a copy of the License at
7ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
8ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams *
10ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * Unless required by applicable law or agreed to in writing, software
11ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * See the License for the specific language governing permissions and
14ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams * limitations under the License.
15ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams */
16ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
17ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rsAllocation.h"
18f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang#include "rsContext.h"
19ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams#include "rsGrallocConsumer.h"
20f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang#include "rs_hal.h"
21ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
22ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace android {
23ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsnamespace renderscript {
24ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
25f750c530392a2895cb4b7e5b5e5e5259925b2015Miao WangGrallocConsumer::GrallocConsumer (const Context *rsc, Allocation *a, uint32_t numAlloc)
26ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams{
27f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mCtx = rsc;
28754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc = new Allocation *[numAlloc];
29754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAcquiredBuffer = new AcquiredBuffer[numAlloc];
30754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed = new bool[numAlloc];
31754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
32754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[0] = a;
33754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed[0] = true;
34754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mNumAlloc = numAlloc;
35ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
36f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    uint32_t width  = a->mHal.drvState.lod[0].dimX;
37f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    uint32_t height = a->mHal.drvState.lod[0].dimY;
38f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (height < 1) height = 1;
39ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
40f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    int32_t format = AIMAGE_FORMAT_RGBA_8888;
4161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    if (a->mHal.state.yuv) {
42f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        format = AIMAGE_FORMAT_YUV_420_888;
43f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
44f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
45f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    media_status_t ret = AImageReader_new(
46f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            width, height, format,
47f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            mNumAlloc, &mImgReader);
48f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || mImgReader == nullptr) {
49f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("Error creating image reader. ret %d", ret);
5061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    }
51f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
52f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImageReader_getWindow(mImgReader, &mNativeWindow);
53f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || mNativeWindow == nullptr) {
54f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("Error creating native window. ret %d", ret);
55f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
56f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
57f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mReaderCb = {this, GrallocConsumer::onFrameAvailable};
58f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImageReader_setImageListener(mImgReader, &mReaderCb);
59f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
60754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    for (uint32_t i = 1; i < numAlloc; i++) {
61754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        isIdxUsed[i] = false;
62754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
63ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
64ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
65ddceab9a001f07a3395226c5e06e3b420720af0fJason SamsGrallocConsumer::~GrallocConsumer() {
66f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    AImageReader_delete(mImgReader);
67754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] mAlloc;
68754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] mAcquiredBuffer;
69754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    delete[] isIdxUsed;
70ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
71ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
72f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wangvoid GrallocConsumer::onFrameAvailable(void* obj, AImageReader* reader) {
73f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    GrallocConsumer* consumer = (GrallocConsumer *) obj;
74f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    for (uint32_t i = 0; i < consumer->mNumAlloc; i++) {
75f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (consumer->mAlloc[i] != nullptr) {
76f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            intptr_t ip = (intptr_t)(consumer->mAlloc[i]);
77f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            consumer->mCtx->sendMessageToClient(&ip,
78f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                RS_MESSAGE_TO_CLIENT_NEW_BUFFER, 0, sizeof(ip), true);
79f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
80f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
81f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang}
82ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
83f750c530392a2895cb4b7e5b5e5e5259925b2015Miao WangANativeWindow* GrallocConsumer::getNativeWindow() {
84f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    return mNativeWindow;
85f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang}
86ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
87f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wangmedia_status_t GrallocConsumer::lockNextBuffer(uint32_t idx) {
88f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    media_status_t ret;
89ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
90754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
91754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
92f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return AMEDIA_ERROR_INVALID_PARAMETER;
93754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
94754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
95f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (mAcquiredBuffer[idx].mImg != nullptr) {
96f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret = unlockBuffer(idx);
97f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK) {
98f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
99ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        }
100ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
101ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
102f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImageReader_acquireNextImage(mImgReader, &(mAcquiredBuffer[idx].mImg));
103f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || mAcquiredBuffer[idx].mImg == nullptr) {
104f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("%s: acquire image from reader %p failed! ret: %d, img %p",
105f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                __FUNCTION__, mImgReader, ret, mAcquiredBuffer[idx].mImg);
106f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return ret;
107ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
108ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
109f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    AImage *img = mAcquiredBuffer[idx].mImg;
110f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    int32_t format = -1;
111f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImage_getFormat(img, &format);
112f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || format == -1) {
113f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("%s: get format for image %p failed! ret: %d, format %d",
114f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                 __FUNCTION__, img, ret, format);
115f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return ret;
116f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
117ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
118f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (format != AIMAGE_FORMAT_YUV_420_888 && format != AIMAGE_FORMAT_RGBA_8888) {
119f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("Format %d not supported", format);
120f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return AMEDIA_ERROR_INVALID_OBJECT;
121ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
122ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
123f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    uint8_t *data = nullptr;
124f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    int dataLength = 0;
125f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret =  AImage_getPlaneData(img, 0, &data, &dataLength);
126f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || data == nullptr || dataLength <= 0) {
127f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("%s: get data for image %p failed! ret: %d, data %p, len %d",
128f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                __FUNCTION__, img, ret, data, dataLength);
129f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return ret;
130f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
131ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
132f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    int64_t timestamp = -1;
133f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImage_getTimestamp(img, &timestamp);
134f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || timestamp == -1) {
135f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("%s: get timestamp for image %p failed! ret: %d",
136f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                __FUNCTION__, img, ret);
137f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return ret;
138f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
139ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
140f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    int32_t rowstride = -1;
141f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = AImage_getPlaneRowStride(img, 0, &rowstride);
142f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != AMEDIA_OK || rowstride == -1) {
143f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ALOGE("%s: get row stride for image %p failed! ret: %d, rowstride %d",
144f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                __FUNCTION__, img, ret, rowstride);
145f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return ret;
146ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
147ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
148c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang    AHardwareBuffer *hardwareBuffer = nullptr;
149c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang    ret =  AImage_getHardwareBuffer(img, &hardwareBuffer);
150c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang    if (ret != AMEDIA_OK || hardwareBuffer == nullptr) {
151c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang        ALOGE("%s: get hardware buffer for image %p failed! ret: %d",
152c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang                __FUNCTION__, img, ret);
153c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang        return ret;
154c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang    }
155c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang
156f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mAcquiredBuffer[idx].mBufferPointer = data;
157f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
158f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mAlloc[idx]->mHal.drvState.lod[0].mallocPtr = data;
159f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mAlloc[idx]->mHal.drvState.lod[0].stride = rowstride;
160c3e57650b69a2c57152d70cbf76398cc1b2313dfMiao Wang    mAlloc[idx]->mHal.state.nativeBuffer = hardwareBuffer;
161f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mAlloc[idx]->mHal.state.timestamp = timestamp;
162f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
163f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (format == AIMAGE_FORMAT_YUV_420_888) {
1641aaf4fae02c1a75e19ffdc5a146475e42ba07c23Miao Wang        const int yWidth = mAlloc[idx]->mHal.drvState.lod[0].dimX;
1651aaf4fae02c1a75e19ffdc5a146475e42ba07c23Miao Wang        const int yHeight = mAlloc[idx]->mHal.drvState.lod[0].dimY;
1661aaf4fae02c1a75e19ffdc5a146475e42ba07c23Miao Wang
167f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        const int cWidth = yWidth / 2;
168f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        const int cHeight = yHeight / 2;
169f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
170f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        uint8_t *uData = nullptr;
171f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        int uDataLength = 0;
172f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret =  AImage_getPlaneData(img, 1, &uData, &uDataLength);
173f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK || uData == nullptr || uDataLength <= 0) {
174f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            ALOGE("%s: get U data for image %p failed! ret: %d, data %p, len %d",
175f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                    __FUNCTION__, img, ret, uData, uDataLength);
176f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
1771aaf4fae02c1a75e19ffdc5a146475e42ba07c23Miao Wang        }
178ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
179f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        uint8_t *vData = nullptr;
180f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        int vDataLength = 0;
181f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret =  AImage_getPlaneData(img, 2, &vData, &vDataLength);
182f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK || vData == nullptr || vDataLength <= 0) {
183f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            ALOGE("%s: get V data for image %p failed! ret: %d, data %p, len %d",
184f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                    __FUNCTION__, img, ret, vData, vDataLength);
185f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
186f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
187f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
188f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        int32_t uRowStride = -1;
189f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret = AImage_getPlaneRowStride(img, 1, &uRowStride);
190f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK || uRowStride == -1) {
191f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            ALOGE("%s: get U row stride for image %p failed! ret: %d, uRowStride %d",
192f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                    __FUNCTION__, img, ret, uRowStride);
193f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
194f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
195f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
196f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        int32_t vRowStride = -1;
197f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret = AImage_getPlaneRowStride(img, 2, &vRowStride);
198f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK || vRowStride == -1) {
199f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            ALOGE("%s: get V row stride for image %p failed! ret: %d, vRowStride %d",
200f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                    __FUNCTION__, img, ret, vRowStride);
201f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
202f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
203f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
204f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        int32_t uPixStride = -1;
205f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        ret = AImage_getPlanePixelStride(img, 1, &uPixStride);
206f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (ret != AMEDIA_OK || uPixStride == -1) {
207f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            ALOGE("%s: get U pixel stride for image %p failed! ret: %d, uPixStride %d",
208f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang                    __FUNCTION__, img, ret, uPixStride);
209f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return ret;
210f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
211f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
212f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[1].dimX = cWidth;
213f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[1].dimY = cHeight;
214f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[2].dimX = cWidth;
215f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[2].dimY = cHeight;
216ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
217f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[1].mallocPtr = uData;
218f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[2].mallocPtr = vData;
219f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
220f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[1].stride = uRowStride;
221f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lod[2].stride = vRowStride;
222f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
223f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.yuv.shift = 1;
224f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.yuv.step = uPixStride;
225f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        mAlloc[idx]->mHal.drvState.lodCount = 3;
226f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
227f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
228f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    return AMEDIA_OK;
229ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
230ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
231f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wangmedia_status_t GrallocConsumer::unlockBuffer(uint32_t idx) {
232f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    media_status_t ret;
233ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
234754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
235754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
236f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        return AMEDIA_ERROR_INVALID_PARAMETER;
237ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
238f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (mAcquiredBuffer[idx].mImg == nullptr) {
239f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang       return AMEDIA_OK;
240ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    }
241ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
242f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    AImage_delete(mAcquiredBuffer[idx].mImg);
243f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    mAcquiredBuffer[idx].mImg = nullptr;
244f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    return AMEDIA_OK;
245ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
246ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
247754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wanguint32_t GrallocConsumer::getNextAvailableIdx(Allocation *a) {
248754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    for (uint32_t i = 0; i < mNumAlloc; i++) {
249754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        if (isIdxUsed[i] == false) {
250754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            mAlloc[i] = a;
251754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            isIdxUsed[i] = true;
252754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang            return i;
253754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        }
254754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
255754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    return mNumAlloc;
256754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang}
257754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
258754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wangbool GrallocConsumer::releaseIdx(uint32_t idx) {
259754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (idx >= mNumAlloc) {
260754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Invalid buffer index: %d", idx);
261754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return false;
262754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
263754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    if (isIdxUsed[idx] == false) {
264754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGV("Buffer index already released: %d", idx);
265754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return true;
266754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
267f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    media_status_t ret;
268f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    ret = unlockBuffer(idx);
269f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    if (ret != OK) {
270754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        ALOGE("Unable to unlock graphic buffer");
271754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang        return false;
272754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    }
273754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    mAlloc[idx] = nullptr;
274754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    isIdxUsed[idx] = false;
275754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang    return true;
276754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang}
277754746883bd46ec2fbdd23572cb6c90ab589346cMiao Wang
278f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wangbool GrallocConsumer::isActive() {
279f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    for (uint32_t i = 0; i < mNumAlloc; i++) {
280f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        if (isIdxUsed[i]) {
281f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang            return true;
282f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang        }
283f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    }
284f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang    return false;
285f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang}
286f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang
287ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace renderscript
288ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams} // namespace android
289