diff options
Diffstat (limited to 'sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c')
-rw-r--r-- | sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c b/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c index 48705c1..841ed70 100644 --- a/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c +++ b/sec_mm/sec_omx/sec_omx_component/video/dec/SEC_OMX_Vdec.c @@ -34,15 +34,13 @@ #include "SEC_OMX_Vdec.h" #include "SEC_OMX_Basecomponent.h" #include "SEC_OSAL_Thread.h" +#include "color_space_convertor.h" #undef SEC_LOG_TAG #define SEC_LOG_TAG "SEC_VIDEO_DEC" #define SEC_LOG_OFF #include "SEC_OSAL_Log.h" -#define ONE_FRAME_OUTPUT /* only one frame output for Android */ -#define S5PC110_DECODE_OUT_DATA_BUFFER /* for Android s5pc110 0copy*/ - inline void SEC_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent) { @@ -161,6 +159,8 @@ OMX_ERRORTYPE SEC_OMX_UseBuffer( goto EXIT; } } + + SEC_OSAL_Free(temp_bufferHeader); ret = OMX_ErrorInsufficientResources; EXIT: @@ -257,6 +257,9 @@ OMX_ERRORTYPE SEC_OMX_AllocateBuffer( goto EXIT; } } + + SEC_OSAL_Free(temp_bufferHeader); + SEC_OSAL_Free(temp_buffer); ret = OMX_ErrorInsufficientResources; EXIT: @@ -607,10 +610,9 @@ OMX_ERRORTYPE SEC_OutputBufferGetQueue(SEC_OMX_BASECOMPONENT *pSECComponent) dataBuffer->dataValid =OMX_TRUE; /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */ /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */ -#ifdef S5PC110_DECODE_OUT_DATA_BUFFER pSECComponent->processData[OUTPUT_PORT_INDEX].dataBuffer = dataBuffer->bufferHeader->pBuffer; pSECComponent->processData[OUTPUT_PORT_INDEX].allocSize = dataBuffer->bufferHeader->nAllocLen; -#endif + SEC_OSAL_Free(message); } SEC_OSAL_MutexUnlock(outputUseBuffer->bufferMutex); @@ -816,13 +818,6 @@ OMX_BOOL SEC_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent) if (outputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) { copySize = outputData->remainDataLen; -#ifndef S5PC110_DECODE_OUT_DATA_BUFFER - if (copySize > 0) - SEC_OSAL_Memcpy((outputUseBuffer->bufferHeader->pBuffer + outputUseBuffer->dataLen), - (outputData->dataBuffer + outputData->usedDataLen), - copySize); -#endif - outputUseBuffer->dataLen += copySize; outputUseBuffer->remainDataLen += copySize; outputUseBuffer->nFlags = outputData->nFlags; @@ -833,28 +828,13 @@ OMX_BOOL SEC_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent) /* reset outputData */ SEC_DataReset(pOMXComponent, OUTPUT_PORT_INDEX); -#ifdef ONE_FRAME_OUTPUT /* only one frame output for Android */ if ((outputUseBuffer->remainDataLen > 0) || (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)) SEC_OutputBufferReturn(pOMXComponent); -#else - if ((outputUseBuffer->remainDataLen > 0) || - ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - SEC_OutputBufferReturn(pOMXComponent); - } else { - outputUseBuffer->dataValid = OMX_TRUE; - } -#endif } else { SEC_OSAL_Log(SEC_LOG_ERROR, "output buffer is smaller than decoded data size Out Length"); copySize = outputUseBuffer->allocSize - outputUseBuffer->dataLen; - -#ifndef S5PC110_DECODE_OUT_DATA_BUFFER - SEC_OSAL_Memcpy((outputUseBuffer->bufferHeader->pBuffer + outputUseBuffer->dataLen), - (outputData->dataBuffer + outputData->usedDataLen), - copySize); -#endif outputUseBuffer->dataLen += copySize; outputUseBuffer->remainDataLen += copySize; outputUseBuffer->nFlags = 0; @@ -1063,19 +1043,19 @@ OMX_ERRORTYPE SEC_OMX_VideoDecodeGetParameter( portDefinition = &pSECPort->portDefinition; switch (index) { - case supportFormat_1: + case supportFormat_0: portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; - portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar; + portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; portFormat->xFramerate = portDefinition->format.video.xFramerate; break; - case supportFormat_2: + case supportFormat_1: portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; - portFormat->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; + portFormat->eColorFormat = OMX_COLOR_FormatYUV420Planar; portFormat->xFramerate = portDefinition->format.video.xFramerate; break; - case supportFormat_3: + case supportFormat_2: portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused; - portFormat->eColorFormat = SEC_OMX_COLOR_FormatNV12PhysicalAddress; + portFormat->eColorFormat = OMX_SEC_COLOR_FormatNV12TPhysicalAddress; portFormat->xFramerate = portDefinition->format.video.xFramerate; break; } @@ -1103,6 +1083,20 @@ OMX_ERRORTYPE SEC_OMX_VideoDecodeGetParameter( ret = OMX_ErrorNone; } break; +#ifdef USE_ANDROID_EXTENSION + case OMX_IndexParamGetAndroidNativeBuffer: + { + if (OMX_ErrorNone != checkVersionANB(ComponentParameterStructure)) + goto EXIT; + + if (OUTPUT_PORT_INDEX != checkPortIndexANB(ComponentParameterStructure)) { + ret = OMX_ErrorBadPortIndex; + goto EXIT; + } + ret = getAndroidNativeBuffer(hComponent, ComponentParameterStructure); + } + break; +#endif default: { ret = SEC_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure); @@ -1201,6 +1195,34 @@ OMX_ERRORTYPE SEC_OMX_VideoDecodeSetParameter( ret = OMX_ErrorNone; } break; +#ifdef USE_ANDROID_EXTENSION + case OMX_IndexParamEnableAndroidBuffers: + { + if (OMX_ErrorNone != checkVersionANB(ComponentParameterStructure)) + goto EXIT; + + if (OUTPUT_PORT_INDEX != checkPortIndexANB(ComponentParameterStructure)) { + ret = OMX_ErrorBadPortIndex; + goto EXIT; + } + + ret = enableAndroidNativeBuffer(hComponent, ComponentParameterStructure); + } + break; + case OMX_IndexParamUseAndroidNativeBuffer: + { + if (OMX_ErrorNone != checkVersionANB(ComponentParameterStructure)) + goto EXIT; + + if (OUTPUT_PORT_INDEX != checkPortIndexANB(ComponentParameterStructure)) { + ret = OMX_ErrorBadPortIndex; + goto EXIT; + } + + ret = useAndroidNativeBuffer(hComponent, ComponentParameterStructure); + } + break; +#endif default: { ret = SEC_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure); |