Hello.
I'd like to request some clarification regarding the h264 codec's rate control. It's running on the DM8107 processor.
None of the rate control presets seem to have any effect on the output bitrate. We are generating a high-complexity test video stream with another equipment, it should be encoded at around 5 Mbps, although the actual numbers don't really matter as far as I can tell. There's two points we are interested in, having constant bitrate and/or a hard maximum bitrate.
For the first case I tried setting the rateControlPreset to LOWDELAY (also tried STORAGE) and the rcAlgo to 1 (CBR), however, they both behaved exactly the same as with rcALgo 0 (VBR). I would adjust the targetBitrate and the output bitrate would follow up to about 5~6 Mbps, which is somewhat of a sweet-spot for the signal and then they'd just stay there, no matter if I raised the targetBitrate to 10 Mbps or more.
For the second case (although they both go together), I adjusted the maxBitrate parameter. This didn't change anything in the output bitrate, no matter if I set it lower than, equal to or higher than the targetBitrate, even -1 as is the default. When trying a higher maxBitrate, for instance 6 Mbps agains a target of 2 Mbps, the output remained at around 2.4 Mbps even if it was clearly crippling the quality, I'd expect it to use more than 2 if the scene is that complex, is that right? Trying different combinations here didn't change anything, the output bitrate would ignore whatever value was assigned to the maxBitrate.
On another note, when using, for example, a targetBitrate of 2 Mbps we'd get an output of 2.4 Mbps. A targetBitrate of 6 Mbps would give us an output of 6.9 Mbps. There seems to be a 15~20% offset there, is this to be expected? We need to be able to deterministically configure a maximum bitrate for our output stream.
Just in case I'm misunderstanding something or just plain configuring it wrong, here's a dump of the encoder's parameters in one of the runs (it's at the bottom of the question). What I believe are the important parameters would be:
encodingPreset 3 # User Defined
rateControlPreset 2 # Storage
videnc2Params.maxBitRate 6000000
rateControlParams.rateControlParamsPreset 1
rateControlParams.rcAlgo 1
videnc2DynamicParams.targetBitRate 2000000
I'd appreciate any help in this matter.
Thank you.
H.264 Static params
=============================
videnc2Params.size 316
encodingPreset 3 # User Defined
rateControlPreset 2 # Storage
videnc2Params.maxHeight 1088
videnc2Params.maxWidth 1920
videnc2Params.dataEndianness 1
videnc2Params.maxInterFrameInterval 1
videnc2Params.maxBitRate 6000000
videnc2Params.minBitRate 0
videnc2Params.inputChromaFormat 9
videnc2Params.inputContentType 0
videnc2Params.operatingMode 1
videnc2Params.profile 100
videnc2Params.level 40
videnc2Params.inputDataMode 3
videnc2Params.outputDataMode 3
videnc2Params.numInputDataUnits 1
videnc2Params.numOutputDataUnits 1
=============================
rateControlParams.rateControlParamsPreset 1
rateControlParams.scalingMatrixPreset 1
rateControlParams.rcAlgo 1
rateControlParams.qpI 4294967295
rateControlParams.qpMaxI 36
rateControlParams.qpMinI 10
rateControlParams.qpP 4294967295
rateControlParams.qpMaxP 40
rateControlParams.qpMinP 10
rateControlParams.qpOffsetB 4
rateControlParams.qpMaxB 44
rateControlParams.qpMinB 10
rateControlParams.allowFrameSkip 0
rateControlParams.removeExpensiveCoeff 0
rateControlParams.chromaQPIndexOffset 0
rateControlParams.IPQualityFactor 0
rateControlParams.initialBufferLevel 4000000
rateControlParams.HRDBufferSize 4000000
rateControlParams.minPicSizeRatioI 0
rateControlParams.maxPicSizeRatioI 640
rateControlParams.minPicSizeRatioP 0
rateControlParams.maxPicSizeRatioP 0
rateControlParams.minPicSizeRatioB 0
rateControlParams.maxPicSizeRatioB 0
rateControlParams.enablePRC 1
rateControlParams.enablePartialFrameSkip 0
rateControlParams.discardSavedBits 1
rateControlParams.VBRDuration 8
rateControlParams.VBRsensitivity 0
rateControlParams.skipDistributionWindowLength 5
rateControlParams.numSkipInDistributionWindow 1
rateControlParams.enableHRDComplianceMode 1
rateControlParams.frameSkipThMulQ5 0
rateControlParams.vbvUseLevelThQ5 0
=============================
interCodingParams.interCodingPreset 1
interCodingParams.searchRangeHorP 144
interCodingParams.searchRangeVerP 32
interCodingParams.searchRangeHorB 144
interCodingParams.searchRangeVerB 16
interCodingParams.interCodingBias 1
interCodingParams.skipMVCodingBias 1
interCodingParams.minBlockSizeP 1
interCodingParams.minBlockSizeB 1
interCodingParams.meAlgoMode 0
=============================
intraCodingParams.intraCodingPreset 0
intraCodingParams.lumaIntra4x4Enable 0
intraCodingParams.lumaIntra8x8Enable 255
intraCodingParams.lumaIntra16x16Enable 15
intraCodingParams.chromaIntra8x8Enable 15
intraCodingParams.chromaComponentEnable 1
intraCodingParams.intraRefreshMethod 0
intraCodingParams.intraRefreshRate 0
intraCodingParams.gdrOverlapRowsBtwFrames 0
intraCodingParams.constrainedIntraPredEnable 0
=============================
nalUnitControlParams.naluControlPreset 1
nalUnitControlParams.naluPresentMaskStartOfSequence 9120
nalUnitControlParams.naluPresentMaskIDRPicture 9120
nalUnitControlParams.naluPresentMaskIntraPicture 8962
nalUnitControlParams.naluPresentMaskNonIntraPicture 514
nalUnitControlParams.naluPresentMaskEndOfSequence 3072
=============================
sliceCodingParams.sliceCodingPreset 0
sliceCodingParams.sliceMode 0
sliceCodingParams.sliceUnitSize 0
sliceCodingParams.sliceStartOffset[0] 0
sliceCodingParams.sliceStartOffset[1] 0
sliceCodingParams.streamFormat 0
=============================
loopFilterParams.loopfilterPreset 0
loopFilterParams.loopfilterDisableIDC 0
loopFilterParams.filterOffsetA 0
loopFilterParams.filterOffsetB 0
=============================
fmoCodingParams.fmoCodingPreset 0
fmoCodingParams.numSliceGroups 1
fmoCodingParams.sliceGroupMapType 4
fmoCodingParams.sliceGroupChangeDirectionFlag 0
fmoCodingParams.sliceGroupChangeRate 0
fmoCodingParams.sliceGroupChangeCycle 0
fmoCodingParams.sliceGroupParams[0] 0
fmoCodingParams.sliceGroupParams[1] 0
=============================
vuiCodingParams.vuiCodingPreset 1
vuiCodingParams.aspectRatioInfoPresentFlag 1
vuiCodingParams.aspectRatioIdc 0
vuiCodingParams.videoSignalTypePresentFlag 0
vuiCodingParams.videoFormat 2
vuiCodingParams.videoFullRangeFlag 0
vuiCodingParams.timingInfoPresentFlag 1
vuiCodingParams.hrdParamsPresentFlag 1
vuiCodingParams.numUnitsInTicks 1000
=============================
stereoInfoParams.stereoInfoPreset 0
stereoInfoParams.topFieldIsLeftViewFlag 1
stereoInfoParams.viewSelfContainedFlag 0
=============================
framePackingSEIParams.framePackingPreset 0
framePackingSEIParams.framePackingType 3
framePackingSEIParams.frame0PositionX 0
framePackingSEIParams.frame0PositionY 0
framePackingSEIParams.frame1PositionX 0
framePackingSEIParams.frame1PositionY 0
framePackingSEIParams.reservedByte 0
=============================
svcCodingParams.svcExtensionFlag 0
svcCodingParams.dependencyID 0
svcCodingParams.qualityID 0
svcCodingParams.enhancementProfileID 0
svcCodingParams.layerIndex 0
svcCodingParams.refLayerDQId 0
=============================
interlaceCodingType 4
bottomFieldIntra 0
gopStructure 0
entropyCodingMode 1
transformBlockSize 2
log2MaxFNumMinus4 10
picOrderCountType 0
enableWatermark 0
IDRFrameInterval 1
pConstantMemory 0
maxIntraFrameInterval 2147483640
debugTraceLevel 0
lastNFramesToLog 0
enableAnalyticinfo 0
enableGMVSei 0
constraintSetFlags 0
enableRCDO 0
enableLongTermRefFrame 0
LTRPPeriod 0
numTemporalLayer 1
referencePicMarking 1
=============================
=============================
videnc2DynamicParams.size 240
videnc2DynamicParams.inputHeight 720
videnc2DynamicParams.inputWidth 1280
videnc2DynamicParams.refFrameRate 30000
videnc2DynamicParams.targetFrameRate 60000
videnc2DynamicParams.targetBitRate 2000000
videnc2DynamicParams.intraFrameInterval 10
videnc2DynamicParams.generateHeader 0
videnc2DynamicParams.captureWidth 16384
videnc2DynamicParams.forceFrame 4294967295
videnc2DynamicParams.interFrameInterval 1
videnc2DynamicParams.mvAccuracy 2
videnc2DynamicParams.sampleAspectRatioHeight 1
videnc2DynamicParams.sampleAspectRatioWidth 1
videnc2DynamicParams.ignoreOutbufSizeFlag 1
videnc2DynamicParams.putDataFxn 0
videnc2DynamicParams.putDataHandle 0
videnc2DynamicParams.getDataFxn 0
videnc2DynamicParams.getDataHandle 0
videnc2DynamicParams.getBufferFxn 2638810325
videnc2DynamicParams.getBufferHandle 0
videnc2DynamicParams.lateAcquireArg 4294967295
=============================
rateControlParams.rateControlParamsPreset 1
rateControlParams.scalingMatrixPreset 1
rateControlParams.rcAlgo 1
rateControlParams.qpI 26
rateControlParams.qpMaxI 51
rateControlParams.qpMinI 5
rateControlParams.qpP 26
rateControlParams.qpMaxP 51
rateControlParams.qpMinP 5
rateControlParams.qpOffsetB 4
rateControlParams.qpMaxB 44
rateControlParams.qpMinB 10
rateControlParams.allowFrameSkip 0
rateControlParams.removeExpensiveCoeff 0
rateControlParams.chromaQPIndexOffset 0
rateControlParams.IPQualityFactor 0
rateControlParams.initialBufferLevel 4000000
rateControlParams.HRDBufferSize 4000000
rateControlParams.minPicSizeRatioI 0
rateControlParams.maxPicSizeRatioI 320
rateControlParams.minPicSizeRatioP 0
rateControlParams.maxPicSizeRatioP 0
rateControlParams.minPicSizeRatioB 0
rateControlParams.maxPicSizeRatioB 0
rateControlParams.enablePRC 1
rateControlParams.enablePartialFrameSkip 0
rateControlParams.discardSavedBits 1
rateControlParams.VBRDuration 8
rateControlParams.VBRsensitivity 0
rateControlParams.skipDistributionWindowLength 5
rateControlParams.numSkipInDistributionWindow 2
rateControlParams.enableHRDComplianceMode 1
rateControlParams.frameSkipThMulQ5 0
rateControlParams.vbvUseLevelThQ5 0
=============================
interCodingParams.interCodingPreset 1
interCodingParams.searchRangeHorP 144
interCodingParams.searchRangeVerP 32
interCodingParams.searchRangeHorB 144
interCodingParams.searchRangeVerB 16
interCodingParams.interCodingBias 1
interCodingParams.skipMVCodingBias 1
interCodingParams.minBlockSizeP 1
interCodingParams.minBlockSizeB 1
interCodingParams.meAlgoMode 0
=============================
intraCodingParams.intraCodingPreset 0
intraCodingParams.lumaIntra4x4Enable 0
intraCodingParams.lumaIntra8x8Enable 255
intraCodingParams.lumaIntra16x16Enable 15
intraCodingParams.chromaIntra8x8Enable 15
intraCodingParams.chromaComponentEnable 1
intraCodingParams.intraRefreshMethod 0
intraCodingParams.intraRefreshRate 0
intraCodingParams.gdrOverlapRowsBtwFrames 0
intraCodingParams.constrainedIntraPredEnable 0
=============================
sliceCodingParams.sliceCodingPreset 0
sliceCodingParams.sliceMode 0
sliceCodingParams.sliceUnitSize 0
sliceCodingParams.sliceStartOffset[0] 0
sliceCodingParams.sliceStartOffset[1] 0
sliceCodingParams.streamFormat 0
=============================
sliceGroupChangeCycle 0
searchCenter.x 32767
searchCenter.y 32767
enableStaticMBCount 0
enableROI 0
=============================