Opened 3 years ago

Last modified 3 years ago

#1314 new defect

HM Rate Control Bug

Reported by: llzzyynjupt Owned by:
Priority: major Milestone:
Component: HM Version: HM-14.0
Keywords: Cc: fbossen, ksuehring, davidf, jct-vc@…

Description

Based on:
jctvc-hm-84d6b158ca1f92cd06840a798b4b11ba22d0586b.zip
HM 16.0
Visual C++ 10:

In the function "Void TEncGOP::compressGOP()", there are codes:

if ( m_pcCfg->getUseRateCtrl() )
{

Int frameLevel = m_pcRateCtrl->getRCSeq()->getGOPID2Level( iGOPid );
if ( pcPic->getSlice(0)->getSliceType() == I_SLICE )
{

frameLevel = 0;

}
m_pcRateCtrl->initRCPic( frameLevel );
estimatedBits = m_pcRateCtrl->getRCPic()->getTargetBits();

Int sliceQP = m_pcCfg->getInitialQP();

if ( ( pcSlice->getPOC() == 0 && m_pcCfg->getInitialQP() > 0 )
( frameLevel == 0 && m_pcCfg->getForceIntraQP() ) ) QP is specified

{

Int NumberBFrames = ( m_pcCfg->getGOPSize() - 1 );
Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)NumberBFrames );
Double dQPFactor = 0.57*dLambda_scale;
Int SHIFT_QP = 12;
Int bitdepth_luma_qp_scale = 0;
Double qp_temp = (Double) sliceQP + bitdepth_luma_qp_scale - SHIFT_QP;
lambda = dQPFactor*pow( 2.0, qp_temp/3.0 );

}
else if ( frameLevel == 0 ) intra case, but use the model
{

m_pcSliceEncoder->calCostSliceI(pcPic);

if ( m_pcCfg->getIntraPeriod() != 1 ) do not refine allocated bits for all intra case
{

Int bits = m_pcRateCtrl->getRCSeq()->getLeftAverageBits();
bits = m_pcRateCtrl->getRCPic()->getRefineBitsForIntra( bits );
if ( bits < 200 )
{

bits = 200;

}
m_pcRateCtrl->getRCPic()->setTargetBits( bits );

}

list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();
m_pcRateCtrl->getRCPic()->getLCUInitTargetBits();
lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());
sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture );

}
else normal case
{

list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();
lambda = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());
sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture );

}

sliceQP = Clip3( -pcSlice->getSPS()->getQpBDOffset(CHANNEL_TYPE_LUMA), MAX_QP, sliceQP );
m_pcRateCtrl->getRCPic()->setPicEstQP( sliceQP );

m_pcSliceEncoder->resetQP( pcPic, sliceQP, lambda );

}

The line "m_pcSliceEncoder->calCostSliceI(pcPic);" can calculate the total intra cost and make the member variable m_pcRateCtrl->m_encRCPic->m_totalCostIntra properly initialized.
But when rate control is turned on and the input parameter "initialQP" is not set to 0 (e.g. set to 32), the line "m_pcSliceEncoder->calCostSliceI(pcPic);" is not executed for the first I Frame.
At this time, for the first I frame, the member variable m_pcRateCtrl->m_encRCPic->m_totalCostIntra will not be properly initialized.

After encoding the first I frame, the following codes in the function "Void TEncGOP::compressGOP()" will be executed:

if ( m_pcCfg->getUseRateCtrl() )
{

Double avgQP = m_pcRateCtrl->getRCPic()->calAverageQP();
Double avgLambda = m_pcRateCtrl->getRCPic()->calAverageLambda();
if ( avgLambda < 0.0 )
{

avgLambda = lambda;

}

m_pcRateCtrl->getRCPic()->updateAfterPicture( actualHeadBits, actualTotalBits, avgQP, avgLambda, pcSlice->getSliceType());

m_pcRateCtrl->getRCPic()->addToPictureLsit( m_pcRateCtrl->getPicList() );

m_pcRateCtrl->getRCSeq()->updateAfterPic( actualTotalBits );
if ( pcSlice->getSliceType() != I_SLICE )
{

m_pcRateCtrl->getRCGOP()->updateAfterPicture( actualTotalBits );

}
else for intra picture, the estimated bits are used to update the current status in the GOP
{

m_pcRateCtrl->getRCGOP()->updateAfterPicture( estimatedBits );

}

The function "m_pcRateCtrl->getRCPic()->updateAfterPicture()" will call "updateAlphaBetaIntra(&alpha, &beta);" in turn.

The function "updateAlphaBetaIntra()" is defined as:
Void TEncRCPic::updateAlphaBetaIntra(Double *alpha, Double *beta)
{

Double lnbpp = log(pow(m_totalCostIntra / (Double)m_numberOfPixel, BETA1));
Double diffLambda = (*beta)*(log((Double)m_picActualBits)-log((Double)m_targetBits));

diffLambda = Clip3(-0.125, 0.125, 0.25*diffLambda);
*alpha = (*alpha) * exp(diffLambda);
*beta = (*beta) + diffLambda / lnbpp;

}

Note that for the first I frame the variable "m_totalCostIntra" is not properly initialized.

The following configuration file is used:
#======== File I/O ===============
InputFile : E:
RaceHorses_832x480.yuv
InputBitDepth : 8 # Input bitdepth
InputChromaFormat : 420 # Ratio of luminance to chrominance samples
FrameRate : 25 # Frame Rate per second
FrameSkip : 0 # Number of frames to be skipped in input
SourceWidth : 832 # Input frame width
SourceHeight : 480 # Input frame height
FramesToBeEncoded : 50 # Number of frames to be coded

Level : 4.1

#======== File I/O =====================
BitstreamFile : E:
test.265
ReconFile : E:
test_rec.yuv

#======== Profile ================
Profile : main

#======== Unit definition ================
MaxCUWidth : 64 # Maximum coding unit width in pixel
MaxCUHeight : 64 # Maximum coding unit height in pixel
MaxPartitionDepth : 4 # Maximum coding unit depth
QuadtreeTULog2MaxSize : 5 # Log2 of maximum transform size for

# quadtree-based TU coding (2...6)

QuadtreeTULog2MinSize : 2 # Log2 of minimum transform size for

# quadtree-based TU coding (2...6)

QuadtreeTUMaxDepthInter : 1
QuadtreeTUMaxDepthIntra : 1

#======== Coding Structure =============
IntraPeriod : 20 # Period of I-Frame ( -1 = only first)
DecodingRefreshType : 2 # Random Accesss 0:none, 1:CRA, 2:IDR, 3:Recovery Point SEI
GOPSize : 4 # GOP Size (number of B slice = GOPSize-1)
# Type POC QPoffset QPfactor tcOffsetDiv2 betaOffsetDiv2 temporal_id #ref_pics_active #ref_pics reference pictures predict deltaRPS #ref_idcs reference idcs
Frame1: P 4 1 0.3536 0 0 0 1 1 -4 0
Frame2: B 1 2 0.442 0 0 0 1 2 -1 3 0
Frame3: B 2 3 0.442 0 0 0 1 2 -2 2 0
Frame4: B 3 4 0.442 0 0 0 1 2 -3 1 0

#=========== Motion Search =============
FastSearch : 1 # 0:Full search 1:TZ search
SearchRange : 64 # (0: Search range is a Full frame)
BipredSearchRange : 4 # Search range for bi-prediction refinement
HadamardME : 1 # Use of hadamard measure for fractional ME
FEN : 1 # Fast encoder decision
FDM : 1 # Fast Decision for Merge RD cost

#======== Quantization =============
QP : 32 # Quantization parameter(0-51)
MaxDeltaQP : 0 # CU-based multi-QP optimization
MaxCuDQPDepth : 0 # Max depth of a minimum CuDQP for sub-LCU-level delta QP
DeltaQpRD : 0 # Slice-based multi-QP optimization
RDOQ : 1 # RDOQ
RDOQTS : 1 # RDOQ for transform skip

#=========== Deblock Filter ============
DeblockingFilterControlPresent: 0 # Dbl control params present (0=not present, 1=present)
LoopFilterOffsetInPPS : 0 # Dbl params: 0=varying params in SliceHeader, param = base_param + GOP_offset_param; 1=constant params in PPS, param = base_param)
LoopFilterDisable : 0 # Disable deblocking filter (0=Filter, 1=No Filter)
LoopFilterBetaOffset_div2 : 0 # base_param: -6 ~ 6
LoopFilterTcOffset_div2 : 0 # base_param: -6 ~ 6
DeblockingFilterMetric : 0 # blockiness metric (automatically configures deblocking parameters in bitstream)

#=========== Misc. ============
InternalBitDepth : 8 # codec operating bit-depth

#=========== Coding Tools =================
SAO : 0 # Sample adaptive offset (0: OFF, 1: ON)
AMP : 0 # Asymmetric motion partitions (0: OFF, 1: ON)
TransformSkip : 0 # Transform skipping (0: OFF, 1: ON)
TransformSkipFast : 1 # Fast Transform skipping (0: OFF, 1: ON)
SAOLcuBoundary : 0 # SAOLcuBoundary using non-deblocked pixels (0: OFF, 1: ON)

#============ Slices ================
SliceMode : 0 # 0: Disable all slice options.

# 1: Enforce maximum number of LCU in an slice,
# 2: Enforce maximum number of bytes in an 'slice'
# 3: Enforce maximum number of tiles in a slice

SliceArgument : 1500 # Argument for 'SliceMode'.

# If SliceMode==1 it represents max. SliceGranularity-sized blocks per slice.
# If SliceMode==2 it represents max. bytes per slice.
# If SliceMode==3 it represents max. tiles per slice.

LFCrossSliceBoundaryFlag : 1 # In-loop filtering, including ALF and DB, is across or not across slice boundary.

# 0:not across, 1: across

#============ PCM ================
PCMEnabledFlag : 0 # 0: No PCM mode
PCMLog2MaxSize : 5 # Log2 of maximum PCM block size.
PCMLog2MinSize : 3 # Log2 of minimum PCM block size.
PCMInputBitDepthFlag : 1 # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
PCMFilterDisableFlag : 0 # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.

#============ Tiles ================
TileUniformSpacing : 0 # 0: the column boundaries are indicated by TileColumnWidth array, the row boundaries are indicated by TileRowHeight array

# 1: the column and row boundaries are distributed uniformly

NumTileColumnsMinus1 : 0 # Number of tile columns in a picture minus 1
TileColumnWidthArray : 2 3 # Array containing tile column width values in units of CTU (from left to right in picture)
NumTileRowsMinus1 : 0 # Number of tile rows in a picture minus 1
TileRowHeightArray : 2 # Array containing tile row height values in units of CTU (from top to bottom in picture)

LFCrossTileBoundaryFlag : 1 # In-loop filtering is across or not across tile boundary.

# 0:not across, 1: across

#============ WaveFront ================
WaveFrontSynchro : 0 # 0: No WaveFront synchronisation (WaveFrontSubstreams must be 1 in this case).

# >0: WaveFront synchronises with the LCU above and to the right by this many LCUs.

#=========== Quantization Matrix =================
ScalingList : 0 # ScalingList 0 : off, 1 : default, 2 : file read
ScalingListFile : scaling_list.txt # Scaling List file name. If file is not exist, use Default Matrix.

#============ Lossless ================
TransquantBypassEnableFlag : 0 # Value of PPS flag.
CUTransquantBypassFlagForce: 0 # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled

#============ Rate Control ======================
RateControl : 1 # Rate control: enable rate control
TargetBitrate : 1000000 # Rate control: target bitrate, in bps
KeepHierarchicalBit : 0 # Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation
LCULevelRateControl : 0 # Rate control: 1: LCU level RC; 0: picture level RC
RCLCUSeparateModel : 0 # Rate control: use LCU level separate R-lambda model
InitialQP : 32 # Rate control: initial QP
RCForceIntraQP : 0 # Rate control: force intra QP to be equal to initial QP

### DO NOT ADD ANYTHING BELOW THIS LINE ###
### DO NOT DELETE THE EMPTY LINE BELOW ###

Attachments (1)

My.cfg (9.0 KB) - added by llzzyynjupt 3 years ago.

Download all attachments as: .zip

Change History (3)

comment:1 Changed 3 years ago by DefaultCC Plugin

  • Cc fbossen ksuehring davidf jct-vc@… added

Changed 3 years ago by llzzyynjupt

comment:2 Changed 3 years ago by ksuehring

  • Milestone HM-15.0 deleted
Note: See TracTickets for help on using tickets.

This list contains all users that will be notified about changes made to this ticket.

These roles will be notified: Reporter, Owner, Subscriber, Participant

  • David Flynn(Subscriber, Always)
  • Frank Bossen(Subscriber)
  • jct-vc@…(Subscriber)
  • Karl Sharman(Always)
  • Karsten Suehring(Subscriber, Participant, Always)
  • llzzyynjupt(Reporter)