summaryrefslogtreecommitdiff
path: root/libc2dcolorconvert
diff options
context:
space:
mode:
authorKarthikeyan Periasamy <kperiasa@codeaurora.org>2017-06-23 11:34:00 -0700
committerKarthikeyan Periasamy <kperiasa@codeaurora.org>2017-06-30 14:58:11 -0700
commit79a8d1a635b6f7ccee565cfccbe54b10754de6c2 (patch)
tree9e167595d0ce5ba4c23db0e70a1da924dba49798 /libc2dcolorconvert
parentaf2fe6ad921bac55e06c1379ad1d12a9b39549aa (diff)
downloadmedia-79a8d1a635b6f7ccee565cfccbe54b10754de6c2.tar.gz
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
Diffstat (limited to 'libc2dcolorconvert')
-rw-r--r--libc2dcolorconvert/C2DColorConverter.cpp51
-rw-r--r--libc2dcolorconvert/C2DColorConverter.h4
2 files changed, 29 insertions, 26 deletions
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);