This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

H264 OMX encoder hang when enable B frame

HI, all

We currently use ezsdk_05_05_02_00 for our custom ti8168 board, and the omx version is omx_05_02_00_48, we are enable the OMX VENC based on the example capture_encode for our own application, we are using the parameter as below, so when we are trying to enable the B frame, and set the interFrameInterval = 2, which mean one B frame between two P frames in User Guide, but every time when we set this, the encoder is hang, and waiting for the semp_post to return, it works fine when we disable this, anyone know why cause this problem? thank you! 

OMX_ERRORTYPE omx_err = OMX_ErrorNone;
OMX_VIDEO_PARAM_PROFILELEVELTYPE tProfileLevel;
OMX_VIDEO_PARAM_ENCODER_PRESETTYPE tEncoderPreset;
OMX_VIDEO_PARAM_BITRATETYPE tVidEncBitRate;
OMX_VIDEO_PARAM_PORTFORMATTYPE tVideoParams;
OMX_PARAM_PORTDEFINITIONTYPE tPortDef;
OMX_VIDEO_CONFIG_DYNAMICPARAMS tDynParams;
OMX_VIDEO_PARAM_STATICPARAMS   tStaticParam;
OMX_VIDEO_CONFIG_AVCINTRAPERIOD tAVCIntraPeriod;
OMX_VIDEO_PARAM_AVCNALUCONTROLTYPE tNaluControlParam;

omx_err = OMX_GetHandle( &enc.handle, (OMX_STRING) "OMX.TI.DUCATI.VIDENC",
			     &enc, &enc.cb );

OMX_INIT_PARAM (&tPortDef);

tPortDef.nPortIndex = OMX_VIDENC_INPUT_PORT;
omx_err = OMX_GetParameter( enc.handle, OMX_IndexParamPortDefinition,
				&tPortDef );

tPortDef.nBufferCountActual = ENCODER_INPUT_BUFFER_COUNT;

tPortDef.format.video.nFrameWidth = enc.w;
tPortDef.format.video.nStride = enc.w;
tPortDef.format.video.nFrameHeight = enc.h;
tPortDef.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;/* settings for OMX_IndexParamVideoPortFormat */
tPortDef.nBufferSize = (enc.w/*640*//*w*/ * enc.h/*480*//*h*/ * 3) >> 1;
omx_err = OMX_SetParameter( enc.handle, OMX_IndexParamPortDefinition,
				&tPortDef );

OMX_INIT_PARAM (&tPortDef);

tPortDef.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
omx_err = OMX_GetParameter( enc.handle, OMX_IndexParamPortDefinition,
				&tPortDef );
/* settings for OMX_IndexParamPortDefinition */
/* set the actual number of buffers required */
tPortDef.nBufferCountActual = ENCODER_OUTPUT_BUFFER_COUNT;
tPortDef.format.video.nFrameWidth = enc.w;
tPortDef.format.video.nFrameHeight = enc.h;
tPortDef.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
tPortDef.format.video.xFramerate = (framerate << 16);
tVideoParams.xFramerate = (framerate << 16);
tPortDef.format.video.nBitrate = enc.bitrate;
/* settings for OMX_IndexParamVideoPortFormat */

omx_err = OMX_SetParameter( enc.handle, OMX_IndexParamPortDefinition,
				&tPortDef );


OMX_INIT_PARAM (&tVidEncBitRate);


tVidEncBitRate.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
omx_err = OMX_GetParameter (enc.handle, OMX_IndexParamVideoBitrate,
				&tVidEncBitRate);

tVidEncBitRate.eControlRate = OMX_Video_ControlRateVariable;
tVidEncBitRate.nTargetBitrate = enc.bitrate;

omx_err = OMX_SetParameter( enc.handle, OMX_IndexParamVideoBitrate,
				&tVidEncBitRate );

OMX_INIT_PARAM( &tProfileLevel );
tProfileLevel.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
omx_err = OMX_GetParameter( enc.handle,
				OMX_IndexParamVideoProfileLevelCurrent,
				&tProfileLevel );
tProfileLevel.eProfile = OMX_VIDEO_AVCProfileHigh;
tProfileLevel.eLevel = OMX_VIDEO_AVCLevel41; 
omx_err = OMX_SetParameter( enc.handle,
				OMX_IndexParamVideoProfileLevelCurrent,
				&tProfileLevel);

/* Encoder Preset settings */
OMX_INIT_PARAM (&tEncoderPreset);
tEncoderPreset.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
omx_err = OMX_GetParameter( enc.handle,
				OMX_TI_IndexParamVideoEncoderPreset,
				&tEncoderPreset);
tEncoderPreset.eEncodingModePreset = OMX_Video_Enc_User_Defined;
tEncoderPreset.eRateControlPreset = OMX_Video_RC_Storage;

omx_err = OMX_SetParameter( enc.handle,
				OMX_TI_IndexParamVideoEncoderPreset,
				&tEncoderPreset);

OMX_INIT_PARAM (&tDynParams);
tDynParams.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
  
omx_err = OMX_GetParameter( enc.handle,
				    OMX_TI_IndexParamVideoDynamicParams,
				    &tDynParams );
	/* setting I frame interval */
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.intraFrameInterval = 90;
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.interFrameInterval = 2;
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.targetFrameRate = framerate * 1000;
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.forceFrame = IVIDEO_IDR_FRAME;
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.generateHeader = XDM_GENERATE_HEADER;
tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.targetBitRate = enc.bitrate;
tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_DEFAULT;
tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.HRDBufferSize = enc.bitrate * 2;
omx_err = OMX_SetParameter( enc.handle,
				    OMX_TI_IndexParamVideoDynamicParams,
				    &tDynParams );

OMX_INIT_PARAM (&tStaticParam);
omx_err = OMX_GetParameter (enc.handle, OMX_TI_IndexParamVideoStaticParams,
				    &tStaticParam);
tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.rateControlPreset = IVIDEO_USER_DEFINED;
tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rcAlgo = 1;
tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.encodingPreset = XDM_USER_DEFINED;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.aspectRatioInfoPresentFlag = 0;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.aspectRatioIdc = 0;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoSignalTypePresentFlag = 0;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoFullRangeFlag = 0;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.timingInfoPresentFlag = 1;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.hrdParamsPresentFlag = 1;
tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.numUnitsInTicks = 1000;
omx_err = OMX_SetParameter (enc.handle, OMX_TI_IndexParamVideoStaticParams,&tStaticParam);

OMX_INIT_PARAM (&tNaluControlParam); 
tNaluControlParam.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
tNaluControlParam.nStartofSequence  = 0x3FC4;
tNaluControlParam.nEndofSequence    = 3072;
tNaluControlParam.nIDR              = 0x3FC4;
tNaluControlParam.nIntraPicture     = 0x42;
tNaluControlParam.nNonIntraPicture  = 0x42;

omx_err = OMX_SetParameter (enc.handle,OMX_TI_IndexParamVideoNALUsettings, &tNaluControlParam);

OMX_INIT_PARAM (&tAVCIntraPeriod);
tAVCIntraPeriod.nPortIndex = OMX_VIDENC_OUTPUT_PORT;
omx_err = OMX_GetConfig( enc.handle, OMX_IndexConfigVideoAVCIntraPeriod,
				 &tAVCIntraPeriod);

enc.state = ENCODER_STATE_GET_AVC_INTRA_PERIOD;	
tAVCIntraPeriod.nPFrames = 89;
tAVCIntraPeriod.nIDRPeriod = 1;

omx_err = OMX_SetConfig( enc.handle, OMX_IndexConfigVideoAVCIntraPeriod,
				 &tAVCIntraPeriod );