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