/*Decode routine */ OMX_BOOL Mpeg4Decoder_OMX::Mp4DecodeVideo(OMX_U8* aOutBuffer, OMX_U32* aOutputLength, OMX_U8** aInputBuf, OMX_U32* aInBufSize, OMX_PARAM_PORTDEFINITIONTYPE* aPortParam, OMX_S32* aFrameCount, OMX_BOOL aMarkerFlag, OMX_BOOL *aResizeFlag) { OMX_BOOL Status = OMX_TRUE; OMX_S32 OldWidth, OldHeight, OldFrameSize; OldWidth = aPortParam->format.video.nFrameWidth; OldHeight = aPortParam->format.video.nFrameHeight; *aResizeFlag = OMX_FALSE; #ifdef _DEBUG static OMX_U32 FrameCount = 0; #endif uint32 UseExtTimestamp = 0; uint32 TimeStamp; //OMX_S32 MaxSize = BIT_BUFF_SIZE; OMX_S32 FrameSize, InputSize, InitSize; OMX_U8* pTempFrame, *pSrc[3]; if (Mpeg4InitCompleteFlag == OMX_FALSE) { if (!aMarkerFlag) { InitSize = GetVideoHeader(0, *aInputBuf, *aInBufSize); } else { InitSize = *aInBufSize; } if (PV_TRUE != InitializeVideoDecode(&iDisplay_Width, &iDisplay_Height, aInputBuf, (OMX_S32*)aInBufSize, MPEG4_MODE)) return OMX_FALSE; Mpeg4InitCompleteFlag = OMX_TRUE; aPortParam->format.video.nFrameWidth = iDisplay_Width; aPortParam->format.video.nFrameHeight = iDisplay_Height; OMX_U32 min_stride = ((aPortParam->format.video.nFrameWidth + 15) & (~15)); OMX_U32 min_sliceheight = ((aPortParam->format.video.nFrameHeight + 15) & (~15)); aPortParam->format.video.nStride = min_stride; aPortParam->format.video.nSliceHeight = min_sliceheight; // finally, compute the new minimum buffer size. // Decoder components always output YUV420 format aPortParam->nBufferSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride * 3) >> 1; if ((iDisplay_Width != OldWidth) || (iDisplay_Height != OldHeight)) *aResizeFlag = OMX_TRUE; *aFrameCount = 1; *aInBufSize -= InitSize; return OMX_TRUE; } //MaxSize = *aInBufSize; if ((*(OMX_S32*)aInBufSize) <= 0) { return OMX_FALSE; } TimeStamp = 0xFFFFFFFF; InputSize = *aInBufSize; // in case of H263, read the 1st frame to find out the sizes (use the m4v_config) if ((0 == *aFrameCount) && (H263_MODE == CodecMode)) { int32 aligned_width, aligned_height; int32 display_width, display_height; if (iGetM4VConfigInfo(*aInputBuf, *aInBufSize, &aligned_width, &aligned_height, &display_width, &display_height)) { return OMX_FALSE; } iDisplay_Width = display_width; iDisplay_Height = display_height; aPortParam->format.video.nFrameWidth = iDisplay_Width; // use non 16byte aligned values (display_width) for H263 aPortParam->format.video.nFrameHeight = iDisplay_Height; // like in the case of M4V (PVGetVideoDimensions also returns display_width/height) OMX_U32 min_stride = ((aPortParam->format.video.nFrameWidth + 15) & (~15)); OMX_U32 min_sliceheight = ((aPortParam->format.video.nFrameHeight + 15) & (~15)); aPortParam->format.video.nStride = min_stride; aPortParam->format.video.nSliceHeight = min_sliceheight; // finally, compute the new minimum buffer size. // Decoder components always output YUV420 format aPortParam->nBufferSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride * 3) >> 1; if ((iDisplay_Width != OldWidth) || (iDisplay_Height != OldHeight)) *aResizeFlag = OMX_TRUE; *aFrameCount = 1; return OMX_TRUE; }
/*Decode routine */ OMX_BOOL Mpeg4Decoder_OMX::Mp4DecodeVideo(OMX_BUFFERHEADERTYPE* aOutBuffer, OMX_U32* aOutputLength, OMX_U8** aInputBuf, OMX_U32* aInBufSize, OMX_PARAM_PORTDEFINITIONTYPE* aPortParam, OMX_BOOL aDeBlocking, OMX_S32* aFrameCount, OMX_BOOL aMarkerFlag, OMX_BOOL *aResizeFlag) { OMX_BOOL Status = OMX_TRUE; OMX_S32 OldWidth, OldHeight; OldWidth = aPortParam->format.video.nFrameWidth; OldHeight = aPortParam->format.video.nFrameHeight; *aResizeFlag = OMX_FALSE; #ifdef _DEBUG static OMX_U32 FrameCount = 0; #endif uint UseExtTimestamp = 0; uint32 TimeStamp; OMX_S32 InputSize, InitSize; if ((Mpeg4InitCompleteFlag == OMX_FALSE) && (MPEG4_MODE == CodecMode)) { if (!aMarkerFlag) { InitSize = GetVideoHeader(0, *aInputBuf, *aInBufSize); } else { InitSize = *aInBufSize; } if (PV_TRUE != InitializeVideoDecode(&iDisplay_Width, &iDisplay_Height, aInputBuf, (OMX_S32*)aInBufSize, MPEG4_MODE, aDeBlocking)) return OMX_FALSE; Mpeg4InitCompleteFlag = OMX_TRUE; if (CodecMode == H263_MODE) { /* SVH mode is activated inside the decoder. ** Reset The init flag to get the width/height next frame. */ Mpeg4InitCompleteFlag = OMX_FALSE; *aInBufSize -= InitSize; return OMX_TRUE; } aPortParam->format.video.nFrameWidth = iDisplay_Width; aPortParam->format.video.nFrameHeight = iDisplay_Height; OMX_U32 min_stride = ((aPortParam->format.video.nFrameWidth + 15) & (~15)); OMX_U32 min_sliceheight = ((aPortParam->format.video.nFrameHeight + 15) & (~15)); aPortParam->format.video.nStride = min_stride; aPortParam->format.video.nSliceHeight = min_sliceheight; // finally, compute the new minimum buffer size. // Decoder components always output YUV420 format aPortParam->nBufferSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride * 3) >> 1; iFrameSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride); // normally - in case of mp4 - the config parser will read the vol header ahead of time // and set the port values - so there'll be no port reconfig - but just in case ... CheckPortReConfig(aOutBuffer, OldWidth, OldHeight, aResizeFlag, aFrameCount); *aInBufSize -= InitSize; return OMX_TRUE; } if ((*(OMX_S32*)aInBufSize) <= 0) { return OMX_FALSE; } TimeStamp = 0xFFFFFFFF; InputSize = *aInBufSize; // in case of H263, read the 1st frame to find out the sizes (use the m4v_config) if ((OMX_FALSE == Mpeg4InitCompleteFlag) && (H263_MODE == CodecMode)) { int32 aligned_width, aligned_height; int32 display_width, display_height; if (iGetM4VConfigInfo(*aInputBuf, *aInBufSize, &aligned_width, &aligned_height, &display_width, &display_height)) { return OMX_FALSE; } Mpeg4InitCompleteFlag = OMX_TRUE; iDisplay_Width = display_width; iDisplay_Height = display_height; aPortParam->format.video.nFrameWidth = iDisplay_Width; // use non 16byte aligned values (display_width) for H263 aPortParam->format.video.nFrameHeight = iDisplay_Height; // like in the case of M4V (PVGetVideoDimensions also returns display_width/height) OMX_U32 min_stride = ((aPortParam->format.video.nFrameWidth + 15) & (~15)); OMX_U32 min_sliceheight = ((aPortParam->format.video.nFrameHeight + 15) & (~15)); aPortParam->format.video.nStride = min_stride; aPortParam->format.video.nSliceHeight = min_sliceheight; // finally, compute the new minimum buffer size. // Decoder components always output YUV420 format aPortParam->nBufferSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride * 3) >> 1; iFrameSize = (aPortParam->format.video.nSliceHeight * aPortParam->format.video.nStride); // in case of h263 - port reconfig is pretty common - we'll alos have to do SetReferenceYUV later CheckPortReConfig(aOutBuffer, OldWidth, OldHeight, aResizeFlag, aFrameCount); return OMX_TRUE; }