这几天在看HM-6.2的Unified R-Q Model码率控制算法的代码,对应的提案是JCTVC-H0213,对应的文章是“Pixel-Wise Unified Rate-Quantization Model for Multi-Level Rate Control”。该模型与lambda域码率控制一样,不支持AI配置。该模型使用二次模型计算QP。本文主要阐述其中两点:编码缓冲区、QP计算。
经典算法JVT-GO12只有一个编码缓冲区,本文要描述的模型的编码缓冲区比较奇葩,它有两个编码缓冲区,代码中的变量分别是:
class TEncRateCtrl
{
...
Int m_occupancyVB;
Int m_initialOVB;
...
}
第一帧带来的缓冲区占用量放在m_initialOVB中。该模型必须给一个初始QP,然而初始QP可能偏大也可能偏小,使得m_initialOVB为负或为正。其他帧带来的缓存区状态的变化会同时影响m_occupancyVB和m_initialOVB,并使得m_initialOVB越来越接近0。m_initialOVB等于0后,就只影响m_occupancyVB了。m_occupancyVB从编码第二个GOP中的图像后不为0。
之所以单独列出一个m_initialOVB,在他们的文章“Pixel-Wise Unified Rate-Quantization Model for Multi-Level Rate Control”中给出的原因:
Note that only the first frame encoded by intra is taken into account for this paper. The actual generated bit for the first frame has a quite decisive effect on the accuracy of rate control.
跟新缓冲区状态的核心代码如下:
Void TEncRateCtrl::updataRCFrameStatus(Int frameBits, SliceType eSliceType)
{
FrameData* pcFrameData = &m_pcFrameData[m_indexPOCInGOP];
Int occupancyBits;
Double adjustmentBits;
m_remainingBitsInGOP = m_remainingBitsInGOP + ( ((m_currBitrate-m_prevBitrate)/m_frameRate)*(m_sizeGOP-m_indexFrame) ) - frameBits;
occupancyBits = (Int)((Double)frameBits - (m_currBitrate/(Double)m_frameRate));
if( (occupancyBits < 0) && (m_initialOVB > 0) )
{
adjustmentBits = xAdjustmentBits(occupancyBits, m_initialOVB );
if(m_initialOVB < 0)
{
adjustmentBits = m_initialOVB;
occupancyBits += (Int)adjustmentBits;
m_initialOVB = 0;
}
}
else if( (occupancyBits > 0) && (m_initialOVB <