summaryrefslogtreecommitdiffstats
path: root/sec_mm
diff options
context:
space:
mode:
authorSeungBeom Kim <sbcrux.kim@samsung.com>2011-08-09 15:21:31 +0900
committerJames Dong <jdong@google.com>2011-08-11 00:29:04 -0700
commit2ae5bc245fcfb4597673f5aa3df905f64088b099 (patch)
tree3f78deca7e15c00e569b7e3e5228b0cb546e4f2c /sec_mm
parent1f8759158359e057919051fc24cf0b396c4059bb (diff)
downloaddevice_samsung_crespo-2ae5bc245fcfb4597673f5aa3df905f64088b099.zip
device_samsung_crespo-2ae5bc245fcfb4597673f5aa3df905f64088b099.tar.gz
device_samsung_crespo-2ae5bc245fcfb4597673f5aa3df905f64088b099.tar.bz2
Fix for decode output align.
Change-Id: Ibe50472061f344aaf54876ec445936eb6fe15886 Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
Diffstat (limited to 'sec_mm')
-rw-r--r--sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.h6
-rw-r--r--sec_mm/sec_omx/sec_omx_component/video/dec/h264dec/SEC_OMX_H264dec.c44
-rw-r--r--sec_mm/sec_omx/sec_omx_component/video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c43
-rw-r--r--sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp10
4 files changed, 64 insertions, 39 deletions
diff --git a/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.h b/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.h
index d9e9d9e..d9e265b 100644
--- a/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.h
+++ b/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.h
@@ -40,10 +40,10 @@
#define DEFAULT_FRAME_WIDTH 176
#define DEFAULT_FRAME_HEIGHT 144
-#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
-#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT * 3) / 2
+#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE ((DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2)
+#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE ((DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT * 3) / 2)
-#define DEFAULT_MFC_INPUT_BUFFER_SIZE 1024 * 1024 /*DEFAULT_VIDEO_INPUT_BUFFER_SIZE*/
+#define DEFAULT_MFC_INPUT_BUFFER_SIZE ((1280 * 720 * 3) / 2)
#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX 1
#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX 3
diff --git a/sec_mm/sec_omx/sec_omx_component/video/dec/h264dec/SEC_OMX_H264dec.c b/sec_mm/sec_omx/sec_omx_component/video/dec/h264dec/SEC_OMX_H264dec.c
index 3a71f03..f16cefd 100644
--- a/sec_mm/sec_omx/sec_omx_component/video/dec/h264dec/SEC_OMX_H264dec.c
+++ b/sec_mm/sec_omx/sec_omx_component/video/dec/h264dec/SEC_OMX_H264dec.c
@@ -882,9 +882,9 @@ OMX_ERRORTYPE SEC_MFC_H264_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA
secOutputPort->cropRectangle.nWidth = imgResol.width - cropInfo.crop_left_offset - cropInfo.crop_right_offset;
secOutputPort->cropRectangle.nHeight = imgResol.height - cropInfo.crop_top_offset - cropInfo.crop_bottom_offset;
- /** Update Frame Size **/
-
pH264Dec->hMFCH264Handle.bConfiguredMFC = OMX_TRUE;
+
+ /** Update Frame Size **/
if ((cropInfo.crop_left_offset != 0) || (cropInfo.crop_right_offset != 0) ||
(cropInfo.crop_top_offset != 0) || (cropInfo.crop_bottom_offset != 0)) {
/* change width and height information */
@@ -987,20 +987,32 @@ OMX_ERRORTYPE SEC_MFC_H264_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA
SEC_OMX_BASEPORT *pSECOutputPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX];
void *pOutputBuf[3];
+ int actualWidth = outputInfo.img_width;
+ int actualHeight = outputInfo.img_height;
+ int actualImageSize = imageSize;
+
pOutputBuf[0] = (void *)pOutputData->dataBuffer;
- pOutputBuf[1] = (void *)pOutputData->dataBuffer + imageSize;
- pOutputBuf[2] = (void *)pOutputData->dataBuffer + ((imageSize * 5) / 4);
+ pOutputBuf[1] = (void *)pOutputData->dataBuffer + actualImageSize;
+ pOutputBuf[2] = (void *)pOutputData->dataBuffer + ((actualImageSize * 5) / 4);
#ifdef USE_ANDROID_EXTENSION
if (pSECOutputPort->bUseAndroidNativeBuffer == OMX_TRUE) {
+ OMX_U32 retANB = 0;
void *pVirAddrs[2];
- getVADDRfromANB (pOutputData->dataBuffer,
+ actualWidth = (outputInfo.img_width + 15) & (~15);
+ actualImageSize = actualWidth * actualHeight;
+
+ retANB = getVADDRfromANB (pOutputData->dataBuffer,
(OMX_U32)pSECInputPort->portDefinition.format.video.nFrameWidth,
(OMX_U32)pSECInputPort->portDefinition.format.video.nFrameHeight,
pVirAddrs);
+ if (retANB != 0) {
+ SEC_OSAL_Log(SEC_LOG_ERROR, "Error getVADDRfromANB, Error code:%d", retANB);
+ ret = OMX_ErrorOverflow;
+ goto EXIT;
+ }
pOutputBuf[0] = pVirAddrs[0];
pOutputBuf[1] = pVirAddrs[1];
- pOutputBuf[2] = pVirAddrs[1] + (imageSize / 4);
}
#endif
if ((pH264Dec->hMFCH264Handle.bThumbnailMode == OMX_FALSE) &&
@@ -1021,15 +1033,15 @@ OMX_ERRORTYPE SEC_MFC_H264_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[0],
(unsigned char *)outputInfo.YVirAddr,
- outputInfo.img_width,
- outputInfo.img_height);
+ actualWidth,
+ actualHeight);
csc_tiled_to_linear_deinterleave(
(unsigned char *)pOutputBuf[1],
(unsigned char *)pOutputBuf[2],
(unsigned char *)outputInfo.CVirAddr,
- outputInfo.img_width,
- outputInfo.img_height >> 1);
- pOutputData->dataLen = (outputInfo.img_width * outputInfo.img_height) * 3 / 2;
+ actualWidth,
+ actualHeight >> 1);
+ pOutputData->dataLen = actualImageSize * 3 / 2;
}
break;
case OMX_COLOR_FormatYUV420SemiPlanar:
@@ -1040,14 +1052,14 @@ OMX_ERRORTYPE SEC_MFC_H264_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DATA
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[0],
(unsigned char *)outputInfo.YVirAddr,
- outputInfo.img_width,
- outputInfo.img_height);
+ actualWidth,
+ actualHeight);
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[1],
(unsigned char *)outputInfo.CVirAddr,
- outputInfo.img_width,
- outputInfo.img_height >> 1);
- pOutputData->dataLen = (outputInfo.img_width * outputInfo.img_height) * 3 / 2;
+ actualWidth,
+ actualHeight >> 1);
+ pOutputData->dataLen = actualImageSize * 3 / 2;
}
break;
}
diff --git a/sec_mm/sec_omx/sec_omx_component/video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c b/sec_mm/sec_omx/sec_omx_component/video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c
index 477983c..febb453 100644
--- a/sec_mm/sec_omx/sec_omx_component/video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c
+++ b/sec_mm/sec_omx/sec_omx_component/video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c
@@ -1038,7 +1038,7 @@ OMX_ERRORTYPE SEC_MFC_Mpeg4_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DAT
/** Update Frame Size **/
if ((pInputPort->portDefinition.format.video.nFrameWidth != imgResol.width) ||
- (pInputPort->portDefinition.format.video.nFrameHeight != imgResol.height)) {
+ (pInputPort->portDefinition.format.video.nFrameHeight != imgResol.height)) {
/* change width and height information */
pInputPort->portDefinition.format.video.nFrameWidth = imgResol.width;
pInputPort->portDefinition.format.video.nFrameHeight = imgResol.height;
@@ -1126,21 +1126,32 @@ OMX_ERRORTYPE SEC_MFC_Mpeg4_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DAT
SEC_OMX_BASEPORT *pSECOutputPort = &pSECComponent->pSECPort[OUTPUT_PORT_INDEX];
void *pOutputBuf[3];
+ int actualWidth = outputInfo.img_width;
+ int actualHeight = outputInfo.img_height;
+ int actualImageSize = imageSize;
+
pOutputBuf[0] = (void *)pOutputData->dataBuffer;
- pOutputBuf[1] = (void *)pOutputData->dataBuffer + imageSize;
- pOutputBuf[2] = (void *)pOutputData->dataBuffer + ((imageSize * 5) / 4);
+ pOutputBuf[1] = (void *)pOutputData->dataBuffer + actualImageSize;
+ pOutputBuf[2] = (void *)pOutputData->dataBuffer + ((actualImageSize * 5) / 4);
#ifdef USE_ANDROID_EXTENSION
if (pSECOutputPort->bUseAndroidNativeBuffer == OMX_TRUE) {
+ OMX_U32 retANB = 0;
void *pVirAddrs[2];
- getVADDRfromANB(pOutputData->dataBuffer,
+ actualWidth = (outputInfo.img_width + 15) & (~15);
+ actualImageSize = actualWidth * actualHeight;
+
+ retANB = getVADDRfromANB(pOutputData->dataBuffer,
(OMX_U32)pSECInputPort->portDefinition.format.video.nFrameWidth,
(OMX_U32)pSECInputPort->portDefinition.format.video.nFrameHeight,
pVirAddrs);
+ if (retANB != 0) {
+ SEC_OSAL_Log(SEC_LOG_ERROR, "Error getVADDRfromANB, Error code:%d", retANB);
+ ret = OMX_ErrorOverflow;
+ goto EXIT;
+ }
pOutputBuf[0] = pVirAddrs[0];
pOutputBuf[1] = pVirAddrs[1];
- pOutputBuf[2] = pVirAddrs[1] + (imageSize / 4);
-
}
#endif
if ((pMpeg4Dec->hMFCMpeg4Handle.bThumbnailMode == OMX_FALSE) &&
@@ -1161,15 +1172,15 @@ OMX_ERRORTYPE SEC_MFC_Mpeg4_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DAT
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[0],
(unsigned char *)outputInfo.YVirAddr,
- outputInfo.img_width,
- outputInfo.img_height);
+ actualWidth,
+ actualHeight);
csc_tiled_to_linear_deinterleave(
(unsigned char *)pOutputBuf[1],
(unsigned char *)pOutputBuf[2],
(unsigned char *)outputInfo.CVirAddr,
- outputInfo.img_width,
- outputInfo.img_height >> 1);
- pOutputData->dataLen = (outputInfo.img_width * outputInfo.img_height) * 3 / 2;
+ actualWidth,
+ actualHeight >> 1);
+ pOutputData->dataLen = actualImageSize * 3 / 2;
}
break;
case OMX_COLOR_FormatYUV420SemiPlanar:
@@ -1180,14 +1191,14 @@ OMX_ERRORTYPE SEC_MFC_Mpeg4_Decode(OMX_COMPONENTTYPE *pOMXComponent, SEC_OMX_DAT
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[0],
(unsigned char *)outputInfo.YVirAddr,
- outputInfo.img_width,
- outputInfo.img_height);
+ actualWidth,
+ actualHeight);
csc_tiled_to_linear(
(unsigned char *)pOutputBuf[1],
(unsigned char *)outputInfo.CVirAddr,
- outputInfo.img_width,
- outputInfo.img_height >> 1);
- pOutputData->dataLen = (outputInfo.img_width * outputInfo.img_height) * 3 / 2;
+ actualWidth,
+ actualHeight >> 1);
+ pOutputData->dataLen = actualImageSize * 3 / 2;
}
break;
}
diff --git a/sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp b/sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp
index 6fca837..21476df 100644
--- a/sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp
+++ b/sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp
@@ -106,6 +106,7 @@ OMX_U32 getMetadataBufferType(const uint8_t *ptr)
OMX_U32 getVADDRfromANB(OMX_PTR pUnreadableBuffer, OMX_U32 Width, OMX_U32 Height, void *pVirAddrs[])
{
+ OMX_U32 ret = 0;
android_native_buffer_t *buf;
void *readableBuffer;
GraphicBufferMapper &mapper = GraphicBufferMapper::get();
@@ -117,12 +118,13 @@ OMX_U32 getVADDRfromANB(OMX_PTR pUnreadableBuffer, OMX_U32 Width, OMX_U32 Height
SEC_OSAL_Log(SEC_LOG_TRACE, "pUnreadableBuffer:0x%x, buf:0x%x, buf->handle:0x%x",
pUnreadableBuffer, buf, buf->handle);
- if (0 != mapper.lock(buf->handle, GRALLOC_USAGE_SW_WRITE_OFTEN, bounds, pVirAddrs))
- return -1;
-
+ ret = mapper.lock(buf->handle, GRALLOC_USAGE_SW_WRITE_OFTEN, bounds, pVirAddrs);
+ if (ret != 0) {
+ SEC_OSAL_Log(SEC_LOG_ERROR, "mapper.lock Error, Error code:%d", ret);
+ }
FunctionOut();
- return 0;
+ return ret;
}
OMX_U32 putVADDRtoANB(OMX_PTR pUnreadableBuffer)