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, ×tamp); 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