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 );