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 encoder target bitrate para



Hello experts,

our team is working on a resolution expansion from 2560x1920 to 4096x3072. We have an encoder setting that provides an acceptable result for the 5Mpx case but now it seems to be a bottleneck for 12Mpx: compression ruins details. Setting target bitrate does not help. Even it is allowed up to level5.0's baseline limit (around 135Mbit/s) it is stuck at ~35Mb/s. See most of our encoder config below! How details could be quality encoded? We tried blocksize, qpI/qpP values, even region of interest. Any ideas?

Posted originally onto 814x forum: 

http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/p/308694/1075900.aspx#1075900

Regards
Krisztián

mParams.videnc2Params.encodingPreset = XDM_USER_DEFINED;
mParams.videnc2Params.rateControlPreset = IVIDEO_STORAGE;
// High speed mode
if ( (mWidth <= 2048) && (mHeight <= 2048) )
{
mParams.videnc2Params.maxWidth = 2048;
mParams.videnc2Params.maxHeight = 2048;
}
// general mode (slower, higher resource req
else
{
mParams.videnc2Params.maxWidth = 4096;
mParams.videnc2Params.maxHeight = 3072;
}
mParams.videnc2Params.dataEndianness = XDM_BYTE;
mParams.videnc2Params.maxInterFrameInterval = 1;
mParams.videnc2Params.maxBitRate = -1;
mParams.videnc2Params.minBitRate = 0;
mParams.videnc2Params.inputChromaFormat = XDM_YUV_420SP;
mParams.videnc2Params.inputContentType = IVIDEO_PROGRESSIVE;
mParams.videnc2Params.operatingMode = IVIDEO_ENCODE_ONLY;
mParams.videnc2Params.profile = IH264_HIGH_PROFILE;
mParams.videnc2Params.level = IH264_LEVEL_50;
mParams.videnc2Params.inputDataMode = IVIDEO_ENTIREFRAME;
mParams.videnc2Params.outputDataMode = IVIDEO_ENTIREFRAME;
mParams.videnc2Params.numInputDataUnits = 1;
// mParams.videnc2Params.numOutputDataUnits = 2; // ENITRE FRAME

/*--------------------------------------------------------------------------*/
/* Set rate controll params in extended XDM params structure */
/* Please refer User guide Table 4.7 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_DEFAULT;
mParams.rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_DEFAULT;
mParams.rateControlParams.rcAlgo = IH264_RATECONTROL_DEFAULT;
mParams.rateControlParams.minPicSizeRatioI = 0;
mParams.rateControlParams.maxPicSizeRatioI = 0;
mParams.rateControlParams.minPicSizeRatioP = 0;
mParams.rateControlParams.maxPicSizeRatioP = 0;
mParams.rateControlParams.minPicSizeRatioB = 0;
mParams.rateControlParams.maxPicSizeRatioB = 0;
mParams.rateControlParams.frameSkipThMulQ5 = 0;
mParams.rateControlParams.vbvUseLevelThQ5 = 0;

mParams.rateControlParams.qpI = 28; // [-1;51]
mParams.rateControlParams.qpMaxI = 36; // [ 0;51]
mParams.rateControlParams.qpMinI = 10; // [ 0;51]
mParams.rateControlParams.qpP = 28; // 28 [-1;51]
mParams.rateControlParams.qpMaxP = 40; // 40 [ 0;51]
mParams.rateControlParams.qpMinP = 10; // 10 [ 0;51]
mParams.rateControlParams.qpOffsetB = 4; // 4 [-1;51]
mParams.rateControlParams.qpMaxB = 44; // 44 [ 0;51]
mParams.rateControlParams.qpMinB = 10; // 10 [ 0;51]

mParams.rateControlParams.allowFrameSkip = 0;
mParams.rateControlParams.removeExpensiveCoeff = 0;
mParams.rateControlParams.chromaQPIndexOffset = 0; // [-12;12]
mParams.rateControlParams.IPQualityFactor = IH264_QUALITY_FACTOR_DEFAULT;
mParams.rateControlParams.initialBufferLevel = 24000000;
mParams.rateControlParams.HRDBufferSize = mParams.rateControlParams.initialBufferLevel * 2;

mParams.rateControlParams.enablePRC = 1;
mParams.rateControlParams.enablePartialFrameSkip = 0;
mParams.rateControlParams.discardSavedBits = 0;
mParams.rateControlParams.VBRDuration = 8;
mParams.rateControlParams.VBRsensitivity = 0;
mParams.rateControlParams.skipDistributionWindowLength = 0;
mParams.rateControlParams.numSkipInDistributionWindow = 0;
mParams.rateControlParams.enableHRDComplianceMode = 1;
/*--------------------------------------------------------------------------*/
/* Set Inter coding params in extended XDM params structure */
/* Please refer User guide Table 4.8 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.interCodingParams.interCodingPreset = IH264_INTERCODING_DEFAULT;
mParams.interCodingParams.searchRangeHorP = 144;
mParams.interCodingParams.searchRangeVerP = 32;
mParams.interCodingParams.searchRangeHorB = 144;
mParams.interCodingParams.searchRangeVerB = 16;
mParams.interCodingParams.interCodingBias = IH264_BIASFACTOR_DEFAULT;
mParams.interCodingParams.skipMVCodingBias = IH264_BIASFACTOR_DEFAULT;
//mParams.interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_DEFAULT; // IH264_BLOCKSIZE_16x16;
mParams.interCodingParams.minBlockSizeP = mSettings.h264Settings.minBlockSize;
//mParams.interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_DEFAULT; // IH264_BLOCKSIZE_16x16;
mParams.interCodingParams.minBlockSizeB = mSettings.h264Settings.minBlockSize;
mParams.interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT;

/*--------------------------------------------------------------------------*/
/* Set Intra coding params in extended XDM params structure */
/* Please refer User guide Table 4.9 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT;
mParams.intraCodingParams.lumaIntra4x4Enable = 0x0;
mParams.intraCodingParams.lumaIntra8x8Enable = 0x0FF;
mParams.intraCodingParams.lumaIntra16x16Enable = 0xF;
mParams.intraCodingParams.chromaIntra8x8Enable = 0xF;
mParams.intraCodingParams.chromaComponentEnable = IH264_CHROMA_COMPONENT_DEFAULT;
mParams.intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_DEFAULT;
mParams.intraCodingParams.intraRefreshRate = 0;
mParams.intraCodingParams.gdrOverlapRowsBtwFrames = 0;
mParams.intraCodingParams.constrainedIntraPredEnable = 0;
mParams.intraCodingParams.intraCodingBias = 0;
/*--------------------------------------------------------------------------*/
/* Set NAL unit coding params in extended XDM params structure */
/* Please refer User guide Table 4.10 for further details on values */
/*--------------------------------------------------------------------------*/

mParams.nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED;
mParams.nalUnitControlParams.naluPresentMaskStartOfSequence = 0x21A0;
mParams.nalUnitControlParams.naluPresentMaskIDRPicture = 0x21A0;
mParams.nalUnitControlParams.naluPresentMaskIntraPicture = 0x0002;
mParams.nalUnitControlParams.naluPresentMaskNonIntraPicture = 0x0002;
mParams.nalUnitControlParams.naluPresentMaskEndOfSequence = 0x0C00;

/*--------------------------------------------------------------------------*/
/* Set Slice coding params in extended XDM params structure */
/* Please refer User guide Table 4.11 for further details on values */
/*--------------------------------------------------------------------------*/

mParams.sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;
mParams.sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;
mParams.sliceCodingParams.sliceUnitSize = 0;
mParams.sliceCodingParams.sliceStartOffset[0] = 0;
mParams.sliceCodingParams.sliceStartOffset[1] = 0;
mParams.sliceCodingParams.sliceStartOffset[2] = 0;
mParams.sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;
/*--------------------------------------------------------------------------*/
/* Set Loop filter coding params in extended XDM params structure */
/* Please refer User guide Table 4.12 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.loopFilterParams.loopfilterPreset = IH264_LOOPFILTER_DEFAULT;
mParams.loopFilterParams.loopfilterDisableIDC =
IH264_DISABLE_FILTER_DEFAULT;
mParams.loopFilterParams.filterOffsetA = 0;
mParams.loopFilterParams.filterOffsetB = 0;

/*--------------------------------------------------------------------------*/
/* Set VUI coding params in extended XDM params structure */
/* Please refer User guide Table 4.14 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
mParams.vuiCodingParams.aspectRatioInfoPresentFlag = 0;
mParams.vuiCodingParams.aspectRatioIdc = 0;
mParams.vuiCodingParams.videoSignalTypePresentFlag = 0;
mParams.vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC;
mParams.vuiCodingParams.videoFullRangeFlag = 0; // 1;
mParams.vuiCodingParams.timingInfoPresentFlag = 1;
mParams.vuiCodingParams.numUnitsInTicks = 1000;
mParams.vuiCodingParams.hrdParamsPresentFlag = 0;

/*--------------------------------------------------------------------------*/
/* disable frame packing SEI encoding coding params by default */
/*--------------------------------------------------------------------------*/
mParams.framePackingSEIParams.framePackingPreset = 0;

/*--------------------------------------------------------------------------*/
/* Set StereoVideoinformation coding params in extended XDM params structure*/
/* Please refer User guide for further details on values */
/*--------------------------------------------------------------------------*/
mParams.stereoInfoParams.stereoInfoPreset = IH264_STEREOINFO_DISABLE;
mParams.stereoInfoParams.topFieldIsLeftViewFlag = 0;
mParams.stereoInfoParams.viewSelfContainedFlag = 0;

/*--------------------------------------------------------------------------*/
/* Set FMO coding params in extended XDM params structure */
/* Please refer User guide Table 4.13 for further details on values */
/*--------------------------------------------------------------------------*/

mParams.fmoCodingParams.fmoCodingPreset = IH264_FMOCODING_DEFAULT;
mParams.fmoCodingParams.numSliceGroups = 1;
mParams.fmoCodingParams.sliceGroupMapType = IH264_SLICE_GRP_MAP_DEFAULT;
mParams.fmoCodingParams.sliceGroupChangeDirectionFlag = IH264ENC_SLICEGROUP_CHANGE_DIRECTION_DEFAULT;
mParams.fmoCodingParams.sliceGroupChangeRate = 0;
mParams.fmoCodingParams.sliceGroupChangeCycle = 0;
mParams.fmoCodingParams.sliceGroupParams[0] = 0;
mParams.fmoCodingParams.sliceGroupParams[1] = 0;

/*--------------------------------------------------------------------------*/
/* Set Extended XDM Encode parameters in extended XDM params structure */
/* Please refer User guide Table 4.15 for further details on values */
/*--------------------------------------------------------------------------*/
mParams.interlaceCodingType = IH264_INTERLACE_FIELDONLY_ARF;
mParams.bottomFieldIntra = 0;
mParams.gopStructure = IH264ENC_GOPSTRUCTURE_NONUNIFORM;
mParams.entropyCodingMode = IH264_ENTROPYCODING_CABAC;
mParams.transformBlockSize = IH264_TRANSFORM_ADAPTIVE;
mParams.log2MaxFNumMinus4 = 10;
mParams.picOrderCountType = IH264_POC_TYPE_0;
mParams.enableRCDO = 0;

/*----------------------------------------------------------*/
/* Set meta data type to no meta data usage in the begining */
/*----------------------------------------------------------*/
for (int i = 0; i < IVIDEO_MAX_NUM_METADATA_PLANES; i++)
{ mParams.videnc2Params.metadataType[i] = IVIDEO_METADATAPLANE_NONE; }

mParams.IDRFrameInterval = 1; // 1: all I-frame as IDR
mParams.pConstantMemory = 0;
mParams.reservedParams[0] = 0;
mParams.reservedParams[1] = 0;
mParams.reservedParams[2] = 0;
mParams.enableGMVSei = 0;
mParams.constraintSetFlags = 0;
mParams.enableLongTermRefFrame = IH264ENC_LTRP_REFERTO_PERIODICLTRP;
mParams.LTRPPeriod = 8;
mParams.enableWatermark = 0;

mParams.numTemporalLayer = IH264_TEMPORAL_LAYERS_4;
mParams.referencePicMarking = IH264_LONG_TERM_PICTURE;
mParams.svcCodingParams.svcExtensionFlag = IH264_SVC_EXTENSION_FLAG_DISABLE;

mParams.debugTraceLevel = 0;
mParams.lastNFramesToLog = 0;

mParams.enableAnalyticinfo = 0;
/*--------------------------------------------------------------------------*/
/* Set dynamic parameters */
/* Most of the default parameters can be copied from Encdoer params */
/*--------------------------------------------------------------------------*/
memcpy(&mDynamicParams.rateControlParams, &mParams.rateControlParams, sizeof(IH264ENC_RateControlParams));
memcpy(&mDynamicParams.interCodingParams, &mParams.interCodingParams, sizeof(IH264ENC_InterCodingParams));
memcpy(&mDynamicParams.intraCodingParams, &mParams.intraCodingParams, sizeof(IH264ENC_IntraCodingParams));
memcpy(&mDynamicParams.sliceCodingParams, &mParams.sliceCodingParams, sizeof(IH264ENC_SliceCodingParams));
/*--------------------------------------------------------------------------*/
/* Set all the XDM dynamic values to default values */
/*--------------------------------------------------------------------------*/
mDynamicParams.videnc2DynamicParams.captureWidth = mWidth;
mDynamicParams.videnc2DynamicParams.forceFrame = IVIDEO_NA_FRAME;
mDynamicParams.videnc2DynamicParams.generateHeader = XDM_ENCODE_AU;
mDynamicParams.videnc2DynamicParams.ignoreOutbufSizeFlag = 0;
mDynamicParams.videnc2DynamicParams.inputHeight = mHeight;
mDynamicParams.videnc2DynamicParams.inputWidth = mWidth;
// mDynamicParams.videnc2DynamicParams.interFrameInterval = 1;
mDynamicParams.videnc2DynamicParams.intraFrameInterval = mSettings.h264Settings.iInterval;
mDynamicParams.videnc2DynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
mDynamicParams.videnc2DynamicParams.putDataFxn = NULL;
mDynamicParams.videnc2DynamicParams.putDataHandle = 0;
mDynamicParams.videnc2DynamicParams.refFrameRate = 30000;
mDynamicParams.videnc2DynamicParams.sampleAspectRatioHeight = 1;
mDynamicParams.videnc2DynamicParams.sampleAspectRatioWidth = 1;
mDynamicParams.videnc2DynamicParams.targetBitRate = mSettings.h264Settings.useAltBitrate ? mSettings.h264Settings.alternateBitrate : mSettings.h264Settings.targetBitrate;
mDynamicParams.videnc2DynamicParams.targetFrameRate = 30000;
mDynamicParams.videnc2DynamicParams.intraFrameInterval, mDynamicParams.videnc2DynamicParams.targetBitRate, settings);

mDynamicParams.searchCenter.x = 0x7FFF;
mDynamicParams.searchCenter.y = 0x7FFF;
mDynamicParams.enableStaticMBCount = 0;

// clear last 4 word of mDynamicParams and set RoI
// mDynamicParams.gdrOverlapRowsBtwFramesDynamic = 0;
// mDynamicParams.intraRefreshRateGDRDynamic = 0;
// mDynamicParams.reservedDynParams[0] = 0;
std::memset ( sizeof(mDynamicParams) - 16 + &mDynamicParams, 0, 16 );
mDynamicParams.enableROI = 640 < mWidth ? mSettings.h264Settings.encodRoI : 0;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
mDynamicParams.videnc2DynamicParams.size = sizeof(H264ENC_DynamicParams);

/* For tighter control of Rate Control Limit QPMax */
if (mParams.videnc2Params.maxBitRate != -1)
{
int intraFrameInterval = mDynamicParams.videnc2DynamicParams.intraFrameInterval;
if (intraFrameInterval == 0)
{ intraFrameInterval = 0x7FFFFFFF; }
}

/*--------------------------------------------------------------------------*/
/* Currently we are using intraFrameInterval and maxIntraFrameInterval same */
/*--------------------------------------------------------------------------*/
// mParams.maxIntraFrameInterval = mDynamicParams.videnc2DynamicParams.intraFrameInterval;

memcpy(&mDynamicParams.rateControlParams, &mParams.rateControlParams, sizeof(IH264ENC_RateControlParams));
memcpy(&mDynamicParams.interCodingParams, &mParams.interCodingParams, sizeof(IH264ENC_InterCodingParams));
memcpy(&mDynamicParams.intraCodingParams, &mParams.intraCodingParams, sizeof(IH264ENC_IntraCodingParams));
memcpy(&mDynamicParams.sliceCodingParams, &mParams.sliceCodingParams, sizeof(IH264ENC_SliceCodingParams));

/*--------------------------------------------------------------------------*/
/* Force fully make ignoreOutbufSizeFlag = TRUE for sub-frame level data */
/* synchronization */
/*--------------------------------------------------------------------------*/

mParams.videnc2Params.size = sizeof(H264ENC_Params);
mDynamicParams.videnc2DynamicParams.size = sizeof(H264ENC_DynamicParams);

  • Krisztián KAUTH,

    KAUTH : We tried blocksize, qpI/qpP values etc

    Santosh : These values are honoured only and only if your presets of corresponding master parameter(like rateControlPreset, rateControlParamsPreset, interCodingPreset etc) are user_defined. Please refer user guide for more details. If these are set to _default, then any values falling under their mastership is set to default and user forced settings are not considered.

    If possible please share the stream encoded for few frames.

    Thanks,

    Santoshkumar S K