diff --git a/mcfw/src_bios6/links_m3video/iva_enc/encLink_h264.c b/mcfw/src_bios6/links_m3video/iva_enc/encLink_h264.c index 7e95d38..5f9a160 100755 --- a/mcfw/src_bios6/links_m3video/iva_enc/encLink_h264.c +++ b/mcfw/src_bios6/links_m3video/iva_enc/encLink_h264.c @@ -26,6 +26,22 @@ #define ENCLINK_H264_PREFIX_NAL_UNIT_TYPE1 (14) #define ENCLINK_H264_PREFIX_NAL_UNIT_TYPE2 (20) +/* Max value of maxPicSizeRatioI is 960 */ +#define ENC_H264_MAX_PIC_RATIO_I (960) + +/* There is a dependency of maxPicSizeRatioI on intraFrameInterval + * Max possible value for maxPicSizeRatioI = (intraFrameInterval << 5) + * maxPicSizeRatioI determines ratio for max pic size of intra pics + * As an optimum value, we are using 2/3rd of intraFrameInterval + */ +#define ENC_H264_CALCULATE_PIC_RATIO_I(ratio, fr) \ + ratio = ((fr * 2) / 3) << 5; \ + if (ratio > ENC_H264_MAX_PIC_RATIO_I) \ + { \ + ratio = ENC_H264_MAX_PIC_RATIO_I; \ + } + + static IH264ENC_Handle enc_link_h264_create(const IH264ENC_Fxns * fxns, const IH264ENC_Params * prms); static Void enc_link_h264_delete(IH264ENC_Handle handle); @@ -1436,7 +1452,9 @@ static Int enclink_h264_set_dynamic_params( dynamicParams->rateControlParams.frameSkipThMulQ5 = 0; dynamicParams->rateControlParams.vbvUseLevelThQ5 = 0; - dynamicParams->rateControlParams.maxPicSizeRatioI = 640; + ENC_H264_CALCULATE_PIC_RATIO_I(dynamicParams->rateControlParams.maxPicSizeRatioI, + dynamicParams->videnc2DynamicParams.intraFrameInterval); + dynamicParams->rateControlParams.skipDistributionWindowLength = 5; dynamicParams->rateControlParams.numSkipInDistributionWindow = 2; @@ -1779,9 +1797,14 @@ Int32 EncLinkH264_algSetConfig(EncLink_Obj * pObj, EncLink_ChObj *pChObj) { algObj->u.h264AlgIfObj.dynamicParams.videnc2DynamicParams. intraFrameInterval = algObj->algDynamicParams.intraFrameInterval; + + ENC_H264_CALCULATE_PIC_RATIO_I( + algObj->u.h264AlgIfObj.dynamicParams.rateControlParams.maxPicSizeRatioI, + algObj->u.h264AlgIfObj.dynamicParams.videnc2DynamicParams.intraFrameInterval); #ifdef SYSTEM_VERBOSE_PRINTS - Vps_printf("\n ENCLINK: new intraFrameInterval to set:%d \n", - algObj->algDynamicParams.intraFrameInterval); + Vps_printf("\n ENCLINK: new intraFrameInterval to set:%d, maxPicSizeRatioI %d \n", + algObj->algDynamicParams.intraFrameInterval, + algObj->u.h264AlgIfObj.dynamicParams.rateControlParams.maxPicSizeRatioI); #endif algObj->setConfigBitMask &= (ENC_LINK_SETCONFIG_BITMASK_RESET_VALUE ^ (1 << ENC_LINK_SETCONFIG_BITMASK_INTRAI));