diff options
| author | Miao Wang <miaowang@google.com> | 2015-12-21 17:34:46 +0800 |
|---|---|---|
| committer | Miao Wang <miaowang@google.com> | 2016-02-18 12:03:51 -0800 |
| commit | 3e02db8681f8adb34c9ee54be28de8c68ed9a59b (patch) | |
| tree | 94a00e0234008225401b08730d2e0b805b0cd3fe /rsGrallocConsumer.cpp | |
| parent | 291330fbaf7486a1cea33de7dd26c18e57c71391 (diff) | |
Add YV12 YUV format support to GrallocConsumer.
Bug: 26219828
Change-Id: I92532b08e54920efbf04278c5a52650833f8d5b1
(cherry picked from commit 1aaf4fae02c1a75e19ffdc5a146475e42ba07c23)
Diffstat (limited to 'rsGrallocConsumer.cpp')
| -rw-r--r-- | rsGrallocConsumer.cpp | 75 |
1 files changed, 66 insertions, 9 deletions
diff --git a/rsGrallocConsumer.cpp b/rsGrallocConsumer.cpp index af62abf0..45d8a8fa 100644 --- a/rsGrallocConsumer.cpp +++ b/rsGrallocConsumer.cpp @@ -162,16 +162,73 @@ status_t GrallocConsumer::lockNextBuffer(uint32_t idx) { //mAlloc->scalingMode = b.mScalingMode; //mAlloc->frameNumber = b.mFrameNumber; + // For YUV Allocations, we need to populate the drvState with details of how + // the data is layed out. + // RenderScript requests a buffer in the YCbCr_420_888 format. + // The Camera HAL can return a buffer of YCbCr_420_888 or YV12, regardless + // of the requested format. + // mHal.state.yuv contains the requested format, + // mGraphicBuffer->getPixelFormat() is the returned format. if (mAlloc[idx]->mHal.state.yuv == HAL_PIXEL_FORMAT_YCbCr_420_888) { - mAlloc[idx]->mHal.drvState.lod[1].mallocPtr = ycbcr.cb; - mAlloc[idx]->mHal.drvState.lod[2].mallocPtr = ycbcr.cr; - - mAlloc[idx]->mHal.drvState.lod[0].stride = ycbcr.ystride; - mAlloc[idx]->mHal.drvState.lod[1].stride = ycbcr.cstride; - mAlloc[idx]->mHal.drvState.lod[2].stride = ycbcr.cstride; - - mAlloc[idx]->mHal.drvState.yuv.shift = 1; - mAlloc[idx]->mHal.drvState.yuv.step = ycbcr.chroma_step; + const int yWidth = mAlloc[idx]->mHal.drvState.lod[0].dimX; + const int yHeight = mAlloc[idx]->mHal.drvState.lod[0].dimY; + + if (mSlots[slot].mGraphicBuffer->getPixelFormat() == + HAL_PIXEL_FORMAT_YCbCr_420_888) { + const int cWidth = yWidth / 2; + const int cHeight = yHeight / 2; + + mAlloc[idx]->mHal.drvState.lod[1].dimX = cWidth; + mAlloc[idx]->mHal.drvState.lod[1].dimY = cHeight; + mAlloc[idx]->mHal.drvState.lod[2].dimX = cWidth; + mAlloc[idx]->mHal.drvState.lod[2].dimY = cHeight; + + mAlloc[idx]->mHal.drvState.lod[0].mallocPtr = ycbcr.y; + mAlloc[idx]->mHal.drvState.lod[1].mallocPtr = ycbcr.cb; + mAlloc[idx]->mHal.drvState.lod[2].mallocPtr = ycbcr.cr; + + mAlloc[idx]->mHal.drvState.lod[0].stride = ycbcr.ystride; + mAlloc[idx]->mHal.drvState.lod[1].stride = ycbcr.cstride; + mAlloc[idx]->mHal.drvState.lod[2].stride = ycbcr.cstride; + + mAlloc[idx]->mHal.drvState.yuv.shift = 1; + mAlloc[idx]->mHal.drvState.yuv.step = ycbcr.chroma_step; + mAlloc[idx]->mHal.drvState.lodCount = 3; + } else if (mSlots[slot].mGraphicBuffer->getPixelFormat() == + HAL_PIXEL_FORMAT_YV12) { + // For YV12, the data layout is Y, followed by Cr, followed by Cb; + // for YCbCr_420_888, it's Y, followed by Cb, followed by Cr. + // RenderScript assumes lod[0] is Y, lod[1] is Cb, and lod[2] is Cr. + const int cWidth = yWidth / 2; + const int cHeight = yHeight / 2; + + mAlloc[idx]->mHal.drvState.lod[1].dimX = cWidth; + mAlloc[idx]->mHal.drvState.lod[1].dimY = cHeight; + mAlloc[idx]->mHal.drvState.lod[2].dimX = cWidth; + mAlloc[idx]->mHal.drvState.lod[2].dimY = cHeight; + + size_t yStride = rsRound(yWidth * + mAlloc[idx]->mHal.state.type->getElementSizeBytes(), 16); + size_t cStride = rsRound(yStride >> 1, 16); + + uint8_t *yPtr = (uint8_t *)mAlloc[idx]->mHal.drvState.lod[0].mallocPtr; + uint8_t *crPtr = yPtr + yStride * yHeight; + uint8_t *cbPtr = crPtr + cStride * cHeight; + + mAlloc[idx]->mHal.drvState.lod[1].mallocPtr = cbPtr; + mAlloc[idx]->mHal.drvState.lod[2].mallocPtr = crPtr; + + mAlloc[idx]->mHal.drvState.lod[0].stride = yStride; + mAlloc[idx]->mHal.drvState.lod[1].stride = cStride; + mAlloc[idx]->mHal.drvState.lod[2].stride = cStride; + + mAlloc[idx]->mHal.drvState.yuv.shift = 1; + mAlloc[idx]->mHal.drvState.yuv.step = 1; + mAlloc[idx]->mHal.drvState.lodCount = 3; + } else { + ALOGD("Unrecognized format: %d", + mSlots[slot].mGraphicBuffer->getPixelFormat()); + } } return OK; |
