上:介绍码率控制的初始化部分
- 对码率控制进行初始化。(主要分为序列级别GOP级别,frame级别LCU级别)
- 对上述4个级别分别进行比特的分配。
- 将各个单元分配的比特数根据R-lambda和lambda-QP模型求出各个单元的最佳QP并应用于编码中。
接下来就对这三个部分进行解读并加入一些我自己对各个模塊的理解。
转到m_cRateCtrl.init()的定义之中这里删除了部分else语句以提升代码的阅读性。
Access的示例图(图有点丑见谅。。)图中的1~8表示一个GOP中的8幀,在I帧(0)编码完成之后首先进行编码的是第8帧,之后0和8共同作为第4帧的参考帧再由0和4共同决定2、0和2共同决定1的编码。这样就仿佛昰一个层次结构一层一层进行编码,也就有了layer这个标识符以标志各帧所属的层而GOPID2Level 也就是所谓的layer,其中GOPID2Level[0]代表第8帧GOPID2Level[1]代表第4帧,GOPID2Level[2]代表第2帧GOPID2Level[3]代表第1和第3帧,以此类推
1.2.在TEncTop::encode() 中,对GOP级别内容进行初始化主要内容是对一个GOP中的各帧进行计算。
进入m_pcRateCtrl->initRCPic()函数在里面的m_encRCPic->create()函数中可以看到對frame中参数的定义,包括各项基本信息如下。(这一块不难参照对应变量即可了解其含义)
以上部分就是所有RC中初始化参数的设定。