From 2ae5bc245fcfb4597673f5aa3df905f64088b099 Mon Sep 17 00:00:00 2001 From: SeungBeom Kim Date: Tue, 9 Aug 2011 15:21:31 +0900 Subject: Fix for decode output align. Change-Id: Ibe50472061f344aaf54876ec445936eb6fe15886 Signed-off-by: SeungBeom Kim --- .../sec_omx_component/video/dec/SEC_OMX_Vdec.h | 6 +-- .../video/dec/h264dec/SEC_OMX_H264dec.c | 44 ++++++++++++++-------- .../video/dec/mpeg4dec/SEC_OMX_Mpeg4dec.c | 43 +++++++++++++-------- sec_mm/sec_omx/sec_osal/SEC_OSAL_Buffer.cpp | 10 +++-- 4 files changed, 64 insertions(+), 39 deletions(-) (limited to 'sec_mm') 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) -- cgit v1.1