diff --git a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c index 3ba1217..4ce645f 100755 --- a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c +++ b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg.c @@ -203,9 +203,11 @@ static Int enclink_jpeg_set_static_params(IJPEGVENC_Params * staticParams, /* Initialize default values for static params */ *staticParams = JPEGVENC_TI_PARAMS; - staticParams->videnc2Params.maxHeight = algCreateParams->maxHeight; + staticParams->videnc2Params.maxHeight = + VpsUtils_align(algCreateParams->maxHeight, 2); - staticParams->videnc2Params.maxWidth = algCreateParams->maxWidth; + staticParams->videnc2Params.maxWidth = + VpsUtils_align(algCreateParams->maxWidth, 16); staticParams->videnc2Params.maxInterFrameInterval = NULL; staticParams->videnc2Params.inputContentType = IVIDEO_PROGRESSIVE; @@ -219,6 +221,10 @@ static Int enclink_jpeg_set_static_params(IJPEGVENC_Params * staticParams, staticParams->videnc2Params.numInputDataUnits = 1; staticParams->videnc2Params.numOutputDataUnits = 1; + + staticParams->videnc2Params.rateControlPreset = IVIDEO_USER_DEFINED; + staticParams->rateControlParams.rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_DEFAULT; + return 0; } @@ -457,6 +463,33 @@ static Int enclink_jpeg_set_dynamic_params(IJPEGVENC_DynamicParams * algDynamicParams->refFrameRate; dynamicParams->videnc2DynamicParams.ignoreOutbufSizeFlag = XDAS_FALSE; + dynamicParams->qualityFactor = (algDynamicParams->qpInitI==-1)? + JPEG_QUALITYFACTOR_DEFAULT:algDynamicParams->qpInitI; + + /* Rate control params */ + if (algDynamicParams->qpInitI != -1) + { + dynamicParams->rateControlParams.rateControlParamsPreset + = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED; + dynamicParams->rateControlParams.qpMinI = algDynamicParams->qpMinI; + dynamicParams->rateControlParams.qpMaxI = algDynamicParams->qpMaxI; + dynamicParams->rateControlParams.qpI = algDynamicParams->qpInitI; + } + dynamicParams->rateControlParams.rcAlgo = algDynamicParams->rcAlg; + if(algDynamicParams->rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY) + { + dynamicParams->rateControlParams.HRDBufferSize = + algDynamicParams->targetBitRate / 2; + dynamicParams->rateControlParams.initialBufferLevel = + algDynamicParams->targetBitRate / 2; + } + else { + dynamicParams->rateControlParams.HRDBufferSize = + algDynamicParams->targetBitRate * 2; + dynamicParams->rateControlParams.initialBufferLevel = + algDynamicParams->targetBitRate * 2; + } + return 0; } @@ -629,9 +662,26 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj) /* Set the modified encoder bitRate value */ if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_BITRATE) & 0x1) { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED; algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams. targetBitRate = algObj->algDynamicParams.targetBitRate; + + if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY) { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + HRDBufferSize = algObj->algDynamicParams.targetBitRate / 2; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + initialBufferLevel = algObj->algDynamicParams.targetBitRate / 2; + } + else + { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + HRDBufferSize = algObj->algDynamicParams.targetBitRate * 2; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + initialBufferLevel = algObj->algDynamicParams.targetBitRate * 2; + } + #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf("\n ENCLINK: new targetbitrate to set:%d \n", algObj->algDynamicParams.targetBitRate); @@ -648,6 +698,8 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj) algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams. targetFrameRate = algObj->algDynamicParams.targetFrameRate; algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams. + refFrameRate = algObj->algDynamicParams.refFrameRate; + algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams. targetBitRate = algObj->algDynamicParams.targetBitRate; #ifdef SYSTEM_VERBOSE_PRINTS Vps_printf("\n ENCLINK: new targetbitrate to set:%d \n", @@ -660,6 +712,25 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj) setConfigFlag = TRUE; } + /* Set the modified Qualityfactor value for a jpeg Frame */ + if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_QPI) & 0x1) + { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED; + + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpMinI = algObj->algDynamicParams.qpMinI; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpMaxI = algObj->algDynamicParams.qpMaxI; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.qpI = algObj->algDynamicParams.qpInitI; + + #ifdef SYSTEM_VERBOSE_PRINTS + Vps_printf("\n ENCLINK: new qualityFactor Param to set:%d\n", + algObj->algDynamicParams.qpInitI); + #endif + algObj->setConfigBitMask &= (ENC_LINK_SETCONFIG_BITMASK_RESET_VALUE ^ + (1 << ENC_LINK_SETCONFIG_BITMASK_QPI)); + setConfigFlag = TRUE; + } + /* Set the modified encoder Intra Frame Interval(GOP) value */ if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_INTRAI) & 0x1) { @@ -686,16 +757,50 @@ Int32 EncLinkJPEG_algSetConfig(EncLink_algObj * algObj) setConfigFlag = TRUE; } - /* Set the modified Qualityfactor value for a jpeg Frame */ - if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_QPI) & 0x1) + /* Set the modified encoder rateControl value */ + if ((bitMask >> ENC_LINK_SETCONFIG_BITMASK_RCALGO) & 0x1) { - algObj->u.jpegAlgIfObj.dynamicParams.qualityFactor = algObj->algDynamicParams.qpInitI; - #ifdef SYSTEM_VERBOSE_PRINTS - Vps_printf("\n ENCLINK: new qualityFactor Param to set:%d\n", - algObj->algDynamicParams.qpInitI); - #endif + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + rateControlParamsPreset = IJPEGVENC_RATECONTROLPARAMS_USERDEFINED; + + algObj->u.jpegAlgIfObj.dynamicParams.videnc2DynamicParams. + targetBitRate = algObj->algDynamicParams.targetBitRate; + + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.rcAlgo = + algObj->algDynamicParams.rcAlg; + + /* 0=> VBR, 1=> CBR, 2=> OFF */ + if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_VBR_STORAGE) + { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + HRDBufferSize = algObj->algDynamicParams.targetBitRate * 2; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + initialBufferLevel = algObj->algDynamicParams.targetBitRate * 2; + } + else if (algObj->algDynamicParams.rcAlg == IJPEGVENC_RATECONTROL_CBR_LOW_DELAY) + { + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + HRDBufferSize = algObj->algDynamicParams.targetBitRate / 2; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams. + initialBufferLevel = algObj->algDynamicParams.targetBitRate / 2; + } + else + { /* TURN OFF RC */ + algObj->algDynamicParams.rcAlg = IJPEGVENC_RATECONTROL_DISABLE; + algObj->u.jpegAlgIfObj.dynamicParams.rateControlParams.rcAlgo = + IJPEGVENC_RATECONTROL_DISABLE; + + algObj->u.jpegAlgIfObj.dynamicParams.qualityFactor = algObj->algDynamicParams.qpInitI; + + Vps_printf("\n JPGLINK: new qualityFactor Param to set:%d\n", + algObj->algDynamicParams.qpInitI); + } + + Vps_printf("\n JPGLINK: new rate control algorithm to set:%d for bitrate: %d\n", + algObj->algDynamicParams.rcAlg, algObj->algDynamicParams.targetBitRate); + algObj->setConfigBitMask &= (ENC_LINK_SETCONFIG_BITMASK_RESET_VALUE ^ - (1 << ENC_LINK_SETCONFIG_BITMASK_QPI)); + (1 << ENC_LINK_SETCONFIG_BITMASK_RCALGO)); setConfigFlag = TRUE; } @@ -751,6 +856,16 @@ Int32 EncLinkJPEG_algGetConfig(EncLink_algObj * algObj) status.videnc2Status.encDynamicParams.inputWidth; algObj->algDynamicParams.inputHeight = status.videnc2Status.encDynamicParams.inputHeight; + algObj->algDynamicParams.targetBitRate = + status.videnc2Status.encDynamicParams.targetBitRate; + algObj->algDynamicParams.targetFrameRate = + status.videnc2Status.encDynamicParams.targetFrameRate; + algObj->algDynamicParams.intraFrameInterval = + status.videnc2Status.encDynamicParams.intraFrameInterval; + algObj->algDynamicParams.forceFrame = + status.videnc2Status.encDynamicParams.forceFrame; + algObj->algDynamicParams.refFrameRate = + status.videnc2Status.encDynamicParams.refFrameRate; } return (retVal); } diff --git a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h index b1786b4..caad6ca 100755 --- a/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h +++ b/mcfw/src_bios6/links_m3video/iva_enc/encLink_jpeg_priv.h @@ -13,6 +13,7 @@ #include "encLink_algIf.h" +#define JPEG_QUALITYFACTOR_DEFAULT (80) /** * Analytic info output buffer size, this buffer is used to place MV & SAD of * encoded frame, should be big enough to hold the size of typical HD sequence