summaryrefslogtreecommitdiff
path: root/rsGrallocConsumer.cpp
diff options
context:
space:
mode:
authorMiao Wang <miaowang@google.com>2015-12-21 17:34:46 +0800
committerMiao Wang <miaowang@google.com>2016-02-18 12:03:51 -0800
commit3e02db8681f8adb34c9ee54be28de8c68ed9a59b (patch)
tree94a00e0234008225401b08730d2e0b805b0cd3fe /rsGrallocConsumer.cpp
parent291330fbaf7486a1cea33de7dd26c18e57c71391 (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.cpp75
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;