参考了CJL的一些信息:
http://blog.csdn.net/hevc_cjl/article/details/8275260
对CU最终的划分有些困惑主要原因是CU总是递归分割,这就导致了CU的分割位置比较难找寻,一直不懂HM是怎么把最后递归分割的那些cu的信息给一开始的CTU的,不过最近看着看着代码我也基本懂了,xcompresscu在递归分割后有这样一行代码:
rpcTempCU
->copyPartFrom( pcSubBestPartCU, uiPartUnitIdx, uhNextDepth );
// Copy small CU to bigger CU.就是把子CU的信息给上层CU那这样递归完了之后就会把所有子CU的信息给总的CTU
// One of quarter parts overwritten by predicted sub part.
Void TComDataCU ::copyPartFrom( TComDataCU* pcCU , UInt uiPartUnitIdx, UInt uiDepth )
{
assert( uiPartUnitIdx <4 );
m_dTotalCost += pcCU ->getTotalCost();
m_uiTotalDistortion += pcCU ->getTotalDistortion();
m_uiTotalBits += pcCU ->getTotalBits();
UInt uiOffset = pcCU ->getTotalNumPart()*uiPartUnitIdx ;
const UInt numValidComp= pcCU ->getPic()->getNumberValidComponents();
const UInt numValidChan= pcCU ->getPic()->getChromaFormat()== CHROMA_400 ? 1:2;
UInt uiNumPartition = pcCU ->getTotalNumPart();
Int iSizeInUchar = sizeof ( UChar ) * uiNumPartition;
Int iSizeInBool = sizeof ( Bool ) * uiNumPartition;
for( Int i=0; i<2; i++)
{
m_lastIntraBCMv[i] = pcCU ->getLastIntraBCMv(i);
}
for ( Int comp = 0; comp < MAX_NUM_COMPONENT ; comp++)
{
m_uhLastPLTUsedSizeFinal[comp] = pcCU ->getLastPLTInLcuUsedSizeFinal(comp);
m_uhLastPLTSizeFinal[comp] = pcCU ->getLastPLTInLcuSizeFinal(comp);
#if SCM_CE5_MAX_PLT_AND_PRED_SIZE
for ( Int i = 0; i < m_PLTMax