先看一下头文件TENCRATECTRL.h
struct TRCLCU
{
Int m_actualBits; //LCU实际比特
Int m_QP; // QP of skip mode is set to g_RCInvalidQPValue
Int m_targetBits;//LCU的目标比特
Double m_lambda;
Double m_bitWeight; //根据BU分配的该LCU比特,还要经过修正才是m_targetBits,但非I帧修正才用这个
Int m_numberOfPixel;//像素总量
Double m_costIntra; //I帧该LCU编码的代价,I帧修正用这个
Int m_targetBitsLeft;//包括该LCU在内和之后的LCU编码需要的总bits
};
LCU的参数有点复杂,后面再讲。这篇帖子主要针对seq
TEncRCSeq是序列级别码率控制,功能是GOP层码率分配
先看成员变量
主要函数如下:
先看create,就是cfg文件的配置参数
根据该序列的bpp初始化阿尔法和贝塔的更新参数
一些计算,序列的平均帧比特,每帧的LCU个数
bitRatio是GOP中不同位置帧的比重初始化,全部初始化为1,等比例分配。
m_GOPID2Level是GOP中不同位置帧的分级,也全部初始化为1,等比例分配法
如果是其他码率分配方式将会在TEncRateCtrl::init中调用如下图的函数重新设定 比重和分级。
intBitRatio和initGOPID2Level函数
initPicPara和initLCUPara,阿尔法和贝塔参数初始化
序列刚创建,还没编码,所以剩余帧数等于总帧数,剩余比特等于总比特,m_adaptiveBit和自适应比特算法有关,m_lastLambda是已经编码过的上一帧相同级别的帧的Lambda。
updateAfterPic函数,编码完一帧后更新参数,剩余比特和剩余帧数更新
setAllBitRatio函数
setAllBitRatio是自适应码率的GOP层每帧的比重分配算法,如果不开启自适应码率控制这个算法没用,放到GOP帖子里讲解。