const TComDataCU* TComDataCU::getPUAbove( UInt& uiAPartUnitIdx,
UInt uiCurrPartUnitIdx,
Bool bEnforceSliceRestriction,
Bool planarAtCtuBoundary,
Bool bEnforceTileRestriction ) const
{
//當前PU塊的最上邊的4x4小塊的Raster
UInt uiAbsPartIdx = g_auiZscanToRaster[uiCurrPartUnitIdx];
//當前CU在當前CTU中的Raster位置
UInt uiAbsZorderCUIdx = g_auiZscanToRaster[m_absZIdxInCtu];
const UInt numPartInCtuWidth = m_pcPic->getNumPartInCtuWidth();
//如果當前PU不在當前CTU的第0行
if ( !RasterAddress::isZeroRow( uiAbsPartIdx, numPartInCtuWidth ) )
{
//uiAPartUnitIdx 表示當前PU與uiAbsPartIdx 同列的上一行的4x4小塊位置
uiAPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx - numPartInCtuWidth ];
//如果當前PU的uiAbsPartIdx的塊位置與當前CU處於同一行,則返回當前CTU指針以及uiAPartUnitIdx
if ( RasterAddress::isEqualRow( uiAbsPartIdx, uiAbsZorderCUIdx, numPartInCtuWidth ) )
{
return m_pcPic->getCtu( getCtuRsAddr() );
}
else
{
//如果不在一行,說明當前PU part上面還有一個PU part,且處於同一個CU中,返回當前CU指針
//以及上一個PU在當前CU中的索引,uiAPartUnitIdx -= m_absZIdxInCtu
uiAPartUnitIdx -= m_absZIdxInCtu;
return this;
}
}
if(planarAtCtuBoundary)
{
return NULL;
}
//如果當前PU處於當前CTU的第0行,返回上一個相鄰的CTU地址,以及相應的索引
//uiAPartUnitIdx ,表示當前PU上一個相鄰的PU,這兩個相鄰PU處於不同的CTU中。
//
uiAPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx + m_pcPic->getNumPartitionsInCtu() - numPartInCtuWidth ];
if ( (bEnforceSliceRestriction && !CUIsFromSameSlice(m_pCtuAbove)) || (bEnforceTileRestriction && !CUIsFromSameTile(m_pCtuAbove)) )
{
//如果這兩個CTU不在同一個Slice或者Tile則表示沒有有效的相鄰的PU above
return NULL;
}
return m_pCtuAbove;
}