1、RC总体框架
参考http://blog.csdn.net/hevc_cjl/article/details/10982699
2、 码率控制的一个大致流程图:来自于http://blog.csdn.net/cpp12341234/article/details/46043615
3、copressGOP函数:HM16.0中TEncGop类中compressGop函数RC部分在1447-1543行(初始化相关参数),1838-1864行(每编码完一张图片更新参数)。
参考http://blog.csdn.net/cpp12341234/article/details/45766687
和http://blog.csdn.net/hevc_cjl/article/details/11115721
- Double lambda = 0.0;
- Int actualHeadBits = 0;
- Int actualTotalBits = 0;
- Int estimatedBits = 0;
- Int tmpBitsBeforeWriting = 0;
- if ( m_pcCfg->getUseRateCtrl() )
- {
- Int frameLevel = m_pcRateCtrl->getRCSeq()->getGOPID2Level( iGOPid );
- if ( pcPic->getSlice(0)->getSliceType() == I_SLICE )
- {
- frameLevel = 0;
- }
- m_pcRateCtrl->initRCPic( frameLevel ); //!< picture level 初始化
- estimatedBits = m_pcRateCtrl->getRCPic()->getTargetBits(); //!< 在initRCPic中已经计算出了targetBits
- Int sliceQP = m_pcCfg->getInitialQP(); //!< 对应于配置文件中的InitalQP
- if ( ( pcSlice->getPOC() == 0 && m_pcCfg->getInitialQP() > 0 ) || ( frameLevel == 0 && m_pcCfg->getForceIntraQP() ) ) // QP is specified
- { //!< 如果配置文件对序列第一帧指定了初始QP,则基于这个QP计算出lamda
- 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;