Fix Vine crash.
Legacy YUV path was not computing the uv row coordinates correctly.
bug 9272491
Change-Id: I3af68fb8be191373205870573027ed38f059203e
diff --git a/cpu_ref/rsCpuIntrinsicYuvToRGB.cpp b/cpu_ref/rsCpuIntrinsicYuvToRGB.cpp
index 939fbd5..94fce1c 100644
--- a/cpu_ref/rsCpuIntrinsicYuvToRGB.cpp
+++ b/cpu_ref/rsCpuIntrinsicYuvToRGB.cpp
@@ -114,9 +114,19 @@
return;
}
const uchar *pinY = (const uchar *)cp->alloc->mHal.drvState.lod[0].mallocPtr;
- const size_t strideY = cp->alloc->mHal.drvState.lod[0].stride;
+
+ size_t strideY = cp->alloc->mHal.drvState.lod[0].stride;
+
+ // calculate correct stride in legacy case
+ if (cp->alloc->mHal.drvState.lod[0].dimY == 0) {
+ strideY = p->dimX;
+ }
const uchar *Y = pinY + (p->y * strideY);
+ // ALOGE("pinY, %p, Y, %p, p->y, %d, strideY, %d", pinY, Y, p->y, strideY);
+ // ALOGE("dimX, %d, dimY, %d", cp->alloc->mHal.drvState.lod[0].dimX, cp->alloc->mHal.drvState.lod[0].dimY);
+ // ALOGE("p->dimX, %d, p->dimY, %d", p->dimX, p->dimY);
+
uchar4 *out = (uchar4 *)p->out;
uint32_t x1 = xstart;
uint32_t x2 = xend;
@@ -129,20 +139,22 @@
#endif
{
const uchar *pinUV = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
- const size_t strideUV = cp->alloc->mHal.drvState.lod[1].stride;
+ size_t strideUV = cp->alloc->mHal.drvState.lod[1].stride;
const uchar *uv = pinUV + ((p->y >> 1) * strideUV);
if (pinUV == NULL) {
// Legacy yuv support didn't fill in uv
+ strideUV = strideY;
uv = ((uint8_t *)cp->alloc->mHal.drvState.lod[0].mallocPtr) +
- (cp->alloc->mHal.drvState.lod[0].stride *
- cp->alloc->mHal.drvState.lod[0].dimY);
+ (strideY * p->dimY) +
+ ((p->y >> 1) * strideUV);
}
if(x2 > x1) {
#if defined(ARCH_ARM_HAVE_NEON)
int32_t len = (x2 - x1 - 1) >> 3;
if(len > 0) {
+ // ALOGE("%p, %p, %p, %d, %p", out, Y, uv, len, YuvCoeff);
rsdIntrinsicYuv_K(out, Y, uv, len, YuvCoeff);
x1 += len << 3;
out += len << 3;