接下来的一段时间将对码率控制代码追踪这一块的学习心得和领悟做个简要的记录,在将来的某一天,这些博文将让我清晰地看到自己的成长。
码率控制的关键两个步骤:(1)码率分配(2)目标码率的实现
所以在看代码的时候也尽量将步骤与代码对应起来,分块阅读,整合思考与优化。
在码率控制的两个步骤中又可以依据操作对象(层次)的不同,分别从GOP,picture,lcu这三个方面去看程序。在对功能函数进行解读之前,我先来看下在整个解决方案中,程序是如何一层一层的调用下来的。
// call encoding function
cTAppEncTop.encode();//cTAppEncTop是TAppEncTop的对象,该语句的含义是调用成员函数。。encode是类TAppEncTop的成员函数
这是main函数里面的一段代码,也是真正编码功能开始的入口。
// call encoding function for one frame
if ( m_isField ) m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, flush ? 0 : &cPicYuvTrueOrg, snrCSC, m_cListPicYuvRec, outputAccessUnits, iNumEncoded, m_isTopFieldFirst );
else m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, flush ? 0 : &cPicYuvTrueOrg, snrCSC, m_cListPicYuvRec, outputAccessUnits, iNumEncoded );
这是Void TAppEncTop::encode()里面的一段代码,调用类TEncTop的成员函数encode。下面进入到这个类成员函数中去。到这算是从APP类来到了lib类工程当中。
<span style="color:#ff6666;">Void TEncTop::encode</span>( Bool flush, TComPicYuv* pcPicYuvOrg, TComPicYuv* pcPicYuvTrueOrg, const InputColourSpaceConversion snrCSC, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
{
if (pcPicYuvOrg != NULL)
{
// get original YUV
TComPic* pcPicCurr = NULL;
xGetNewPicBuffer( pcPicCurr );
pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
pcPicYuvTrueOrg->copyToPic( pcPicCurr->getPicYuvTrueOrg() );
// compute image characteristics
if ( getUseAdaptiveQP() )
{
m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
}
}
if ((m_iNumPicRcvd == 0) || (!flush && (m_iPOCLast != 0) && (m_iNumP