summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--omx/videodecode/omx_videodec_common/src/omx_video_decoder.c36
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 */