diff options
-rw-r--r-- | omx/videodecode/omx_videodec_common/src/omx_video_decoder.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/omx/videodecode/omx_videodec_common/src/omx_video_decoder.c b/omx/videodecode/omx_videodec_common/src/omx_video_decoder.c index 19d228e..a452c05 100644 --- a/omx/videodecode/omx_videodec_common/src/omx_video_decoder.c +++ b/omx/videodecode/omx_videodec_common/src/omx_video_decoder.c @@ -872,6 +872,9 @@ OMX_ERRORTYPE OMXVidDec_CommandNotify(OMX_HANDLETYPE hComponent, } pVidDecComp->pDecStaticParams->maxHeight = nFrameHeight; pVidDecComp->pDecStaticParams->maxWidth = nFrameWidth; + if( pVidDecComp->tVideoParams[OMX_VIDDEC_INPUT_PORT].eCompressionFormat == OMX_VIDEO_CodingMPEG2 ) { + pVidDecComp->pDecStaticParams->maxWidth = pVidDecComp->t2DBufferAllocParams[OMX_VIDDEC_OUTPUT_PORT].nWidth; + } // And Call the Codec Create pVidDecComp->pDecHandle = VIDDEC3_create(pVidDecComp->ce, @@ -983,6 +986,7 @@ OMX_ERRORTYPE OMXVidDec_DataNotify(OMX_HANDLETYPE hComponent) OMX_BOOL went_thru_loop = OMX_FALSE; OMX_BOOL duped_IPbuffer = OMX_TRUE; IMG_native_handle_t* grallocHandle; + MemHeader *pTempBuffer[2]; OMX_CHECK(hComponent != NULL, OMX_ErrorBadParameter); @@ -1145,7 +1149,28 @@ OMX_ERRORTYPE OMXVidDec_DataNotify(OMX_HANDLETYPE hComponent) pInBufDescPtr->descs[0].buf = (XDAS_Int8*)(pVidDecComp->sCodecConfig.sBuffer); pInBufDescPtr->descs[0].memType = XDM_MEMTYPE_TILEDPAGE; pInBufDescPtr->descs[0].bufSize.bytes = pVidDecComp->sCodecConfig.sBuffer->size; - pOutBufDescPtr->numBufs = 0; + pTempBuffer[0] = NULL; + pTempBuffer[1] = NULL; + if( pVidDecComp->tVideoParams[OMX_VIDDEC_INPUT_PORT].eCompressionFormat == OMX_VIDEO_CodingMPEG2 ) { + // allocate a dummy buffer for mpeg2 in this case + pTempBuffer[0] = OSAL_Malloc(sizeof(MemHeader)); + pTempBuffer[0]->ptr = memplugin_alloc_noheader(pTempBuffer[0], + pVidDecComp->t2DBufferAllocParams[OMX_VIDDEC_OUTPUT_PORT].nWidth, + 1, MEM_CARVEOUT, 0, 0); + OMX_CHECK(pTempBuffer[0]->ptr != NULL, OMX_ErrorInsufficientResources); + pTempBuffer[1] = OSAL_Malloc(sizeof(MemHeader)); + memcpy(pTempBuffer[1], pTempBuffer[0], sizeof(MemHeader)); + pOutBufDescPtr->numBufs = 2; + pOutBufDescPtr->descs[0].bufSize.bytes = pVidDecComp->t2DBufferAllocParams[OMX_VIDDEC_OUTPUT_PORT].nWidth; + pOutBufDescPtr->descs[0].bufSize.tileMem.height = 1; + pOutBufDescPtr->descs[0].buf = (XDAS_Int8 *)pTempBuffer[0]; + pOutBufDescPtr->descs[0].memType = XDM_MEMTYPE_TILEDPAGE; + + pOutBufDescPtr->descs[1].bufSize.bytes = pVidDecComp->t2DBufferAllocParams[OMX_VIDDEC_OUTPUT_PORT].nWidth; + pOutBufDescPtr->descs[1].bufSize.tileMem.height = 1; + pOutBufDescPtr->descs[1].buf = (XDAS_Int8 *)pTempBuffer[1]; + pOutBufDescPtr->descs[1].memType = XDM_MEMTYPE_TILEDPAGE; + } } else if( pInBufHeader != NULL && pVidDecComp->pDecDynParams->decodeHeader == XDM_DECODE_AU ) { // In case EOS and Number of Input bytes=0. Flush Decoder and exit if( pInBufHeader->nFlags & OMX_BUFFERFLAG_EOS ) { @@ -1236,6 +1261,15 @@ OMX_ERRORTYPE OMXVidDec_DataNotify(OMX_HANDLETYPE hComponent) status = VIDDEC3_process(pVidDecComp->pDecHandle, pInBufDescPtr, pOutBufDescPtr, (VIDDEC3_InArgs *)pVidDecComp->pDecInArgs, (VIDDEC3_OutArgs *)pVidDecComp->pDecOutArgs); + if (pTempBuffer[0]) { + memplugin_free_noheader(pTempBuffer[0]); + OSAL_Free(pTempBuffer[0]); + pTempBuffer[0] = NULL; + } + if (pTempBuffer[1]) { + OSAL_Free(pTempBuffer[1]); + pTempBuffer[1] = NULL; + } pDecOutArgs = pVidDecComp->pDecOutArgs; /*! In case Process returns error */ |