每个picture的比特分配权重,跟GOP级别的Lagrangian multiplier lambda有关。已知GOP内每个picture的alpha和beta,在保证所有Picture的target bit加起来等于GOP的target bit的前提下,通过二分法,迭代求出GOP的拉格朗日乘子。
在 TEncTop:encode()函数中,执行compress GOP( )之前,还执行了一句对每个GOP的初始化:
Void TEncTop:encode)
{
...
if ( m_RCEnableRateControl )
{
m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
}
// compress GOP
m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut, false, false, snrCSC, m_printFrameMSE);
}
- 在initRCGOP()函数中,完成了对每个picture的比特分配权重的确定
Void TEncRateCtrl::initRCGOP( Int numberOfPictures )
{
m_encRCGOP = new TEncRCGOP;
m_encRCGOP->create( m_encRCSeq, numberOfPictures );
}
- 在create()函数中,通过二分法完成了对GOP level 的lambda求解
Void TEncRCGOP::create( TEncRCSeq* encRCSeq, Int numPic )
{
destroy();
Int targetBits = xEstGOPTargetBits( encRCSeq, numPic );//GOP level bit allocation
if ( encRCSeq->getAdaptiveBits() > 0 && encRCSeq->getLastLambda() > 0.1 )
{
Double targetBpp = (Double