Hi All,
We have developed our own DM8168 based H/W, and using EZSDK version 5.05.02.00.
In our board we are able to achieve the CBR in Progressive video input, but when we feed the
interlaced video input, the O/P bitrate is twice the given bitrate.
Can any one tell us why this is happening in the Interlaced input?
H264 settings 'c' file attached for reference.
we have tested with 1080i50 / 60 and 576i all the resolutions are behaves the same.
Please help us to resolve the issue.
Regards
R.Abdul Rahman
OMX_ERRORTYPE CTI_Apply_h264_params( OMX_HANDLETYPE hEncoder, CTI_VideoConfig EncoderConfig, CTI_Adv_AVC_Config AdvEncoderConfig) { OMX_ERRORTYPE eError = OMX_ErrorUndefined; OMX_VIDEO_PARAM_ENCODER_PRESETTYPE tEncoderPreset; int PocType = 0; OMX_VIDEO_CONFIG_DYNAMICPARAMS tDynParams; OMX_VIDEO_PARAM_STATICPARAMS tStaticParam; OMX_INIT_PARAM(&tStaticParam); tStaticParam.nPortIndex = OMX_VIDENC_OUTPUT_PORT; OMX_VIDEO_PARAM_AVCTYPE tAVCParams; OMX_INIT_PARAM(&tAVCParams); tAVCParams.nPortIndex = OMX_VIDENC_OUTPUT_PORT; eError = OMX_GetParameter(hEncoder, OMX_IndexParamVideoAvc, &tAVCParams); if (eError != OMX_ErrorNone) { ERROR("failed to Encoder OMX_SetParameter OMX_IndexParamVideoAvc \n"); } switch (AdvEncoderConfig.eAVC_Profile) { case CTI_AVCProfile_Main: tAVCParams.eProfile = OMX_VIDEO_AVCProfileMain; CTI_DEBUG_SAY("**** Main Profile Selected *** ID(%d)\n",AdvEncoderConfig.eAVC_ProfileLevel_ID); tAVCParams.bEnableASO = OMX_TRUE; tAVCParams.bEnableRS = OMX_TRUE; tAVCParams.bEnableFMO = OMX_FALSE; tAVCParams.bEnableUEP = OMX_TRUE; tAVCParams.bEntropyCodingCABAC = OMX_TRUE; if (AdvEncoderConfig.eBFrames == AVC_BFrame_ENABLE) tAVCParams.nBFrames = AdvEncoderConfig.nBFrameCount; else tAVCParams.nBFrames = 0; break; case CTI_AVCProfile_High: tAVCParams.eProfile = OMX_VIDEO_AVCProfileHigh; CTI_DEBUG_SAY("**** High Profile Selected *** ID(%d)\n",AdvEncoderConfig.eAVC_ProfileLevel_ID); tAVCParams.bEnableASO = OMX_TRUE; tAVCParams.bEnableRS = OMX_TRUE; tAVCParams.bEnableFMO = OMX_FALSE; tAVCParams.bEnableUEP = OMX_TRUE; tAVCParams.nBFrames = AdvEncoderConfig.nBFrameCount; tAVCParams.bEntropyCodingCABAC = OMX_TRUE; if (AdvEncoderConfig.eBFrames == AVC_BFrame_ENABLE) tAVCParams.nBFrames = AdvEncoderConfig.nBFrameCount; else tAVCParams.nBFrames = 0; break; case CTI_AVCProfile_Baseline: default: tAVCParams.eProfile = OMX_VIDEO_AVCProfileBaseline; CTI_DEBUG_SAY("**** BaseLine Profile Selected *** ID(%d) \n",AdvEncoderConfig.eAVC_ProfileLevel_ID); tAVCParams.bEnableASO = OMX_FALSE; tAVCParams.bEnableRS = OMX_FALSE; tAVCParams.bEnableFMO = OMX_FALSE; tAVCParams.bEnableUEP = OMX_FALSE; tAVCParams.nBFrames = 0; tAVCParams.bEntropyCodingCABAC = OMX_FALSE; break; } switch(AdvEncoderConfig.eAVC_ProfileLevel_ID) { case CTI_AVCLevel31: tAVCParams.eLevel = OMX_VIDEO_AVCLevel31;break; case CTI_AVCLevel32: tAVCParams.eLevel = OMX_VIDEO_AVCLevel32;break; case CTI_AVCLevel4: tAVCParams.eLevel = OMX_VIDEO_AVCLevel4;break; case CTI_AVCLevel41: tAVCParams.eLevel = OMX_VIDEO_AVCLevel41;break; case CTI_AVCLevel5: tAVCParams.eLevel = OMX_VIDEO_AVCLevel5;break; case CTI_AVCLevel51: tAVCParams.eLevel = OMX_VIDEO_AVCLevel51;break; case CTI_AVCLevel42: default: tAVCParams.eLevel = OMX_VIDEO_AVCLevel42;break; } tAVCParams.bEntropyCodingCABAC = OMX_FALSE; if ((AdvEncoderConfig.eAVC_Profile != CTI_AVCProfile_Baseline) && (AdvEncoderConfig.eEntropy == CTI_ENTROPY_CABAC)) { tAVCParams.bEntropyCodingCABAC = OMX_TRUE; } eError = OMX_SetParameter(hEncoder, OMX_IndexParamVideoAvc, &tAVCParams); if (eError != OMX_ErrorNone) { ERROR("failed to Encoder OMX_SetParameter OMX_IndexParamVideoAvc \n"); } /* Encoder Preset settings */ OMX_INIT_PARAM(&tEncoderPreset); tEncoderPreset.nPortIndex = OMX_VIDENC_OUTPUT_PORT; eError = OMX_GetParameter (hEncoder, OMX_TI_IndexParamVideoEncoderPreset,&tEncoderPreset); //tEncoderPreset.eEncodingModePreset = OMX_Video_Enc_High_Speed_Med_Quality; tEncoderPreset.eEncodingModePreset = OMX_Video_Enc_High_Quality;//OMX_Video_Enc_Med_Speed_High_Quality; tEncoderPreset.eRateControlPreset = OMX_Video_RC_User_Defined;//OMX_Video_RC_Low_Delay; eError = OMX_SetParameter (hEncoder, OMX_TI_IndexParamVideoEncoderPreset,&tEncoderPreset); ///////////////////////////////////////////////////////////////////////////////////// #if 1 OMX_INIT_PARAM (&tDynParams); tDynParams.nPortIndex = OMX_VIDENC_OUTPUT_PORT; eError = OMX_GetParameter (hEncoder, OMX_TI_IndexParamVideoDynamicParams,&tDynParams); /* setting I frame interval */ tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.targetFrameRate = EncoderConfig.fps * 1000; tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.targetBitRate = EncoderConfig.Bitrate*1000; #if ENABLE_GDR /*Parameter setting for GDR*/ tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; tDynParams.videoDynamicParams.h264EncDynamicParams.intraCodingParams.intraCodingPreset = IH264_INTRACODING_USERDEFINED; tDynParams.videoDynamicParams.h264EncDynamicParams.intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_GDR; tDynParams.videoDynamicParams.h264EncDynamicParams.intraCodingParams.intraRefreshRate = 4; tDynParams.videoDynamicParams.h264EncDynamicParams.intraCodingParams.gdrOverlapRowsBtwFrames = 0; /* updating rows to be intra refresh */ tDynParams.videoDynamicParams.h264EncDynamicParams.intraRefreshRateGDRDynamic = 4; /* updating overlap rows */ tDynParams.videoDynamicParams.h264EncDynamicParams.gdrOverlapRowsBtwFramesDynamic = 0; #else if((EncoderConfig.RateCtrl == ControlRate_Constant) || (EncoderConfig.RateCtrl == ControlRate_ConstantSkipFrames)) { tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC_LOW_DELAY; if (EncoderConfig.RateCtrl == ControlRate_ConstantSkipFrames) { tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.allowFrameSkip = 1; tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.enablePartialFrameSkip = 1; } else { tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.allowFrameSkip = 0; tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.enablePartialFrameSkip = 0; } tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.HRDBufferSize = (EncoderConfig.Bitrate*1000) * 0.4; tDynParams.videoDynamicParams.h264EncDynamicParams.rateControlParams.initialBufferLevel = (EncoderConfig.Bitrate*1000) * 0.25; } #endif tDynParams.videoDynamicParams.h264EncDynamicParams.videnc2DynamicParams.intraFrameInterval = EncoderConfig.i2p; eError = OMX_SetParameter (hEncoder, OMX_TI_IndexParamVideoDynamicParams,&tDynParams); ///////////////////////////////////////////////////////////////////////////////////////// #endif eError = OMX_GetParameter (hEncoder, OMX_TI_IndexParamVideoStaticParams,&tStaticParam); tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.encodingPreset = XDM_USER_DEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.numTemporalLayer = IH264_TEMPORAL_LAYERS_1; if( (EncoderConfig.VideoInputResolution == VID_RES_S_1080I50) || (EncoderConfig.VideoInputResolution == VID_RES_S_1080i) ) { //SetInterlaceEncodingType(hEncoder); //tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.inputContentType = IVIDEO_INTERLACED; tStaticParam.videoStaticParams.h264EncStaticParams.bottomFieldIntra = 1; tStaticParam.videoStaticParams.h264EncStaticParams.interlaceCodingType = IH264_INTERLACE_DEFAULT; } /* for base profile */ tStaticParam.videoStaticParams.h264EncStaticParams.transformBlockSize = IH264_TRANSFORM_DEFAULT; //IH264_TRANSFORM_4x4; if (AdvEncoderConfig.eAVC_Profile == CTI_AVCProfile_Baseline) tStaticParam.videoStaticParams.h264EncStaticParams.entropyCodingMode = IH264_ENTROPYCODING_CAVLC; else { if(AdvEncoderConfig.eEntropy == CTI_ENTROPY_CAVLC) tStaticParam.videoStaticParams.h264EncStaticParams.entropyCodingMode = IH264_ENTROPYCODING_CAVLC; else tStaticParam.videoStaticParams.h264EncStaticParams.entropyCodingMode = IH264_ENTROPYCODING_CABAC; } /* for base profile end */ /* for the mask bits, please refer to codec user guide */ tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.gopStructure = IH264ENC_GOPSTRUCTURE_NONUNIFORM; tStaticParam.videoStaticParams.h264EncStaticParams.transformBlockSize = IH264_TRANSFORM_ADAPTIVE; tStaticParam.videoStaticParams.h264EncStaticParams.log2MaxFNumMinus4 = 0; tStaticParam.videoStaticParams.h264EncStaticParams.referencePicMarking = IH264_SHORT_TERM_PICTURE; tStaticParam.videoStaticParams.h264EncStaticParams.enableLongTermRefFrame = 0; tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskStartOfSequence |= 0x03BE; tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskIDRPicture |= 0x03BE; tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskIntraPicture |= 0x03BE; tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskNonIntraPicture |= 0x0002; tStaticParam.videoStaticParams.h264EncStaticParams.nalUnitControlParams.naluPresentMaskEndOfSequence |= 0x0C00; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.aspectRatioInfoPresentFlag = 1; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.aspectRatioIdc = IH264ENC_ASPECTRATIO_EXTENDED; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoSignalTypePresentFlag = 1;//0; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.videoFullRangeFlag = 1; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.timingInfoPresentFlag = 1; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.hrdParamsPresentFlag = 1;//0; tStaticParam.videoStaticParams.h264EncStaticParams.vuiCodingParams.numUnitsInTicks = 1000; tStaticParam.videoStaticParams.h264EncStaticParams.IDRFrameInterval = 1;//I2P;//2; if(((PocType < 0)) || (PocType > 2)) PocType = 0; if (AdvEncoderConfig.eBFrames == AVC_BFrame_ENABLE) PocType = 0; //Added as per ES-264 Stream printf("########### Picture Order Count Type is %d ##################\n",PocType); tStaticParam.videoStaticParams.h264EncStaticParams.picOrderCountType = PocType;//IH264_POC_TYPE_2; tStaticParam.videoStaticParams.h264EncStaticParams.enableGMVSei = 0; tStaticParam.videoStaticParams.h264EncStaticParams.enableWatermark = 0; tStaticParam.videoStaticParams.h264EncStaticParams.framePackingSEIParams.framePackingPreset = 0; tStaticParam.videoStaticParams.h264EncStaticParams.stereoInfoParams.stereoInfoPreset = 0; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC_LOW_DELAY; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.removeExpensiveCoeff = OMX_TRUE; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enablePRC = OMX_TRUE; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enableHRDComplianceMode = OMX_TRUE; if(EncoderConfig.RateCtrl == ControlRate_Constant) { tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.allowFrameSkip = OMX_FALSE; //OMX_TRUE; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enablePartialFrameSkip = OMX_FALSE;//OMX_TRUE; } else if(EncoderConfig.RateCtrl == ControlRate_ConstantSkipFrames) { tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.allowFrameSkip = OMX_TRUE; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enablePartialFrameSkip = OMX_TRUE; } if((EncoderConfig.RateCtrl == ControlRate_Constant) || (EncoderConfig.RateCtrl == ControlRate_ConstantSkipFrames)) { tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.rateControlPreset = IVIDEO_LOW_DELAY; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC_LOW_DELAY; tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.maxBitRate = EncoderConfig.Bitrate*1000; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enablePartialFrameSkip = 1; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.allowFrameSkip = 1; } else { tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.rateControlPreset = IVIDEO_STORAGE; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.rcAlgo = IH264_RATECONTROL_PRC; tStaticParam.videoStaticParams.h264EncStaticParams.videnc2Params.maxBitRate = EncoderConfig.Bitrate*1000; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.enablePartialFrameSkip = 0; tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.allowFrameSkip = 0; } tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.HRDBufferSize = ((EncoderConfig.Bitrate*1000) * 0.4); tStaticParam.videoStaticParams.h264EncStaticParams.rateControlParams.initialBufferLevel = ((EncoderConfig.Bitrate*1000) * 0.25); eError = OMX_SetParameter (hEncoder, OMX_TI_IndexParamVideoStaticParams,&tStaticParam); if((AdvEncoderConfig.eEntropy == CTI_ENTROPY_CAVLC) && (AdvEncoderConfig.nEnableSlicing == 1)) CTI_IL_Client_EnableSlicing(hEncoder); printf("=========================================== h264 Params Applied ============================================\n"); return eError; }