From 79a8d1a635b6f7ccee565cfccbe54b10754de6c2 Mon Sep 17 00:00:00 2001 From: Karthikeyan Periasamy Date: Fri, 23 Jun 2017 11:34:00 -0700 Subject: libc2dcolorconvert: Fix address in unmap call Unmap was being called with a modified address resulting in unmap failure. Call unmap with the exact address which we get from map call. Change-Id: I01148d89968865bb24c39733ed74b85931f3a5f1 CRs-Fixed: 2056867 --- libc2dcolorconvert/C2DColorConverter.cpp | 51 +++++++++++++++++--------------- libc2dcolorconvert/C2DColorConverter.h | 4 +-- 2 files changed, 29 insertions(+), 26 deletions(-) (limited to 'libc2dcolorconvert') diff --git a/libc2dcolorconvert/C2DColorConverter.cpp b/libc2dcolorconvert/C2DColorConverter.cpp index 7c64d08c..47c54a85 100644 --- a/libc2dcolorconvert/C2DColorConverter.cpp +++ b/libc2dcolorconvert/C2DColorConverter.cpp @@ -158,6 +158,8 @@ bool C2DColorConverter::convertC2D(int srcFd, void *srcBase, void * srcData, int dstFd, void *dstBase, void * dstData) { C2D_STATUS ret; + uint8_t *srcMappedGpuAddr = nullptr; + uint8_t *dstMappedGpuAddr = nullptr; bool status = false; if (enabled) { @@ -169,18 +171,28 @@ bool C2DColorConverter::convertC2D(int srcFd, void *srcBase, void * srcData, status = false; } else { + srcMappedGpuAddr = (uint8_t *)getMappedGPUAddr(srcFd, srcData, mSrcSize); + if (!srcMappedGpuAddr) + return false; + if (isYUVSurface(mSrcFormat)) { - ret = updateYUVSurfaceDef(srcFd, srcBase, srcData, true); + ret = updateYUVSurfaceDef(srcMappedGpuAddr, srcBase, srcData, true); } else { - ret = updateRGBSurfaceDef(srcFd, srcData, true); + ret = updateRGBSurfaceDef(srcMappedGpuAddr, srcData, true); } if (ret == C2D_STATUS_OK) { + dstMappedGpuAddr = (uint8_t *)getMappedGPUAddr(dstFd, dstData, mDstSize); + if (!dstMappedGpuAddr) { + unmapGPUAddr((unsigned long)srcMappedGpuAddr); + return false; + } + if (isYUVSurface(mDstFormat)) { - ret = updateYUVSurfaceDef(dstFd, dstBase, dstData, false); + ret = updateYUVSurfaceDef(dstMappedGpuAddr, dstBase, dstData, false); } else { - ret = updateRGBSurfaceDef(dstFd, dstData, false); + ret = updateRGBSurfaceDef(dstMappedGpuAddr, dstData, false); } if (ret == C2D_STATUS_OK) { @@ -191,22 +203,10 @@ bool C2DColorConverter::convertC2D(int srcFd, void *srcBase, void * srcData, if (ret == C2D_STATUS_OK) { bool unmappedSrcSuccess; - if (isYUVSurface(mSrcFormat)) { - unmappedSrcSuccess = unmapGPUAddr((unsigned long) \ - ((C2D_YUV_SURFACE_DEF *)mSrcSurfaceDef)->phys0); - } else { - unmappedSrcSuccess = unmapGPUAddr((unsigned long) \ - ((C2D_RGB_SURFACE_DEF *)mSrcSurfaceDef)->phys); - } + unmappedSrcSuccess = unmapGPUAddr((unsigned long)srcMappedGpuAddr); bool unmappedDstSuccess; - if (isYUVSurface(mDstFormat)) { - unmappedDstSuccess = unmapGPUAddr((unsigned long) \ - ((C2D_YUV_SURFACE_DEF *)mDstSurfaceDef)->phys0); - } else { - unmappedDstSuccess = unmapGPUAddr((unsigned long) \ - ((C2D_RGB_SURFACE_DEF *)mDstSurfaceDef)->phys); - } + unmappedDstSuccess = unmapGPUAddr((unsigned long)dstMappedGpuAddr); if (!unmappedSrcSuccess || !unmappedDstSuccess) { ALOGE("unmapping GPU address failed (%d:%d)\n", unmappedSrcSuccess, @@ -221,10 +221,13 @@ bool C2DColorConverter::convertC2D(int srcFd, void *srcBase, void * srcData, } } else { ALOGE("Update dst surface def failed (%d)\n", ret); + unmapGPUAddr((unsigned long)srcMappedGpuAddr); + unmapGPUAddr((unsigned long)dstMappedGpuAddr); status = false; } } else { ALOGE("Update src surface def failed )%d)\n", ret); + unmapGPUAddr((unsigned long)srcMappedGpuAddr); status = false; } } @@ -331,13 +334,13 @@ int32_t C2DColorConverter::getDummySurfaceDef(ColorConvertFormat format, return 0; } -C2D_STATUS C2DColorConverter::updateYUVSurfaceDef(int fd, void *base, +C2D_STATUS C2DColorConverter::updateYUVSurfaceDef(uint8_t *gpuAddr, void *base, void *data, bool isSource) { if (isSource) { C2D_YUV_SURFACE_DEF * srcSurfaceDef = (C2D_YUV_SURFACE_DEF *)mSrcSurfaceDef; srcSurfaceDef->plane0 = data; - srcSurfaceDef->phys0 = (uint8_t *)getMappedGPUAddr(fd, data, mSrcSize) + ((uint8_t *)data - (uint8_t *)base); + srcSurfaceDef->phys0 = gpuAddr + ((uint8_t *)data - (uint8_t *)base); srcSurfaceDef->plane1 = (uint8_t *)data + mSrcYSize; srcSurfaceDef->phys1 = (uint8_t *)srcSurfaceDef->phys0 + mSrcYSize; if (srcSurfaceDef->format & C2D_COLOR_FORMAT_420_I420 || @@ -351,7 +354,7 @@ C2D_STATUS C2DColorConverter::updateYUVSurfaceDef(int fd, void *base, } else { C2D_YUV_SURFACE_DEF * dstSurfaceDef = (C2D_YUV_SURFACE_DEF *)mDstSurfaceDef; dstSurfaceDef->plane0 = data; - dstSurfaceDef->phys0 = (uint8_t *)getMappedGPUAddr(fd, data, mDstSize) + ((uint8_t *)data - (uint8_t *)base); + dstSurfaceDef->phys0 = gpuAddr + ((uint8_t *)data - (uint8_t *)base); dstSurfaceDef->plane1 = (uint8_t *)data + mDstYSize; dstSurfaceDef->phys1 = (uint8_t *)dstSurfaceDef->phys0 + mDstYSize; if (dstSurfaceDef->format & C2D_COLOR_FORMAT_420_I420 || @@ -366,12 +369,12 @@ C2D_STATUS C2DColorConverter::updateYUVSurfaceDef(int fd, void *base, } } -C2D_STATUS C2DColorConverter::updateRGBSurfaceDef(int fd, void * data, bool isSource) +C2D_STATUS C2DColorConverter::updateRGBSurfaceDef(uint8_t *gpuAddr, void * data, bool isSource) { if (isSource) { C2D_RGB_SURFACE_DEF * srcSurfaceDef = (C2D_RGB_SURFACE_DEF *)mSrcSurfaceDef; srcSurfaceDef->buffer = data; - srcSurfaceDef->phys = getMappedGPUAddr(fd, data, mSrcSize); + srcSurfaceDef->phys = gpuAddr; return mC2DUpdateSurface(mSrcSurface, C2D_SOURCE, (C2D_SURFACE_TYPE)(C2D_SURFACE_RGB_HOST | C2D_SURFACE_WITH_PHYS), &(*srcSurfaceDef)); @@ -379,7 +382,7 @@ C2D_STATUS C2DColorConverter::updateRGBSurfaceDef(int fd, void * data, bool isSo C2D_RGB_SURFACE_DEF * dstSurfaceDef = (C2D_RGB_SURFACE_DEF *)mDstSurfaceDef; dstSurfaceDef->buffer = data; ALOGV("dstSurfaceDef->buffer = %p\n", data); - dstSurfaceDef->phys = getMappedGPUAddr(fd, data, mDstSize); + dstSurfaceDef->phys = gpuAddr; return mC2DUpdateSurface(mDstSurface, C2D_TARGET, (C2D_SURFACE_TYPE)(C2D_SURFACE_RGB_HOST | C2D_SURFACE_WITH_PHYS), &(*dstSurfaceDef)); diff --git a/libc2dcolorconvert/C2DColorConverter.h b/libc2dcolorconvert/C2DColorConverter.h index f9f00fa6..4b2bc7d3 100644 --- a/libc2dcolorconvert/C2DColorConverter.h +++ b/libc2dcolorconvert/C2DColorConverter.h @@ -187,8 +187,8 @@ class C2DColorConverter{ bool isYUVSurface(ColorConvertFormat format); int32_t getDummySurfaceDef(ColorConvertFormat format, size_t width, size_t height, bool isSource); - C2D_STATUS updateYUVSurfaceDef(int fd, void *base, void * data, bool isSource); - C2D_STATUS updateRGBSurfaceDef(int fd, void * data, bool isSource); + C2D_STATUS updateYUVSurfaceDef(uint8_t *addr, void *base, void * data, bool isSource); + C2D_STATUS updateRGBSurfaceDef(uint8_t *addr, void * data, bool isSource); uint32_t getC2DFormat(ColorConvertFormat format); size_t calcStride(ColorConvertFormat format, size_t width); size_t calcYSize(ColorConvertFormat format, size_t width, size_t height); -- cgit v1.2.3