const TComDataCU* TComDataCU::getPUBelowLeft(UInt& uiBLPartUnitIdx, UInt uiCurrPartUnitIdx, UInt uiPartUnitOffset, Bool bEnforceSliceRestriction) const
{
UInt uiAbsPartIdxLB = g_auiZscanToRaster[uiCurrPartUnitIdx];
const UInt numPartInCtuWidth = m_pcPic->getNumPartInCtuWidth();
UInt uiAbsZorderCUIdxLB = g_auiZscanToRaster[ m_absZIdxInCtu ] + ((m_puhHeight[0] / m_pcPic->getMinCUHeight()) - 1)*numPartInCtuWidth;
//如果PU在圖像下邊界,則無BelowLeft
if( ( m_pcPic->getCtu(m_ctuRsAddr)->getCUPelY() + g_auiRasterToPelY[uiAbsPartIdxLB] + (m_pcPic->getPicSym()->getMinCUHeight() * uiPartUnitOffset)) >= m_pcSlice->getSPS()->getPicHeightInLumaSamples())
{
uiBLPartUnitIdx = MAX_UINT;
return NULL;
}
//如果 uiAbsPartIdxLB 不是CTU最後一行
if ( RasterAddress::lessThanRow( uiAbsPartIdxLB, m_pcPic->getNumPartInCtuHeight() - uiPartUnitOffset, numPartInCtuWidth ) )
{
//如果 uiAbsPartIdxLB 不是第0列
if ( !RasterAddress::isZeroCol( uiAbsPartIdxLB, numPartInCtuWidth ) )
{
//塊 uiAbsPartIdxLB的zscan 應該大於其左下角的PU
if ( uiCurrPartUnitIdx > g_auiRasterToZscan[ uiAbsPartIdxLB + uiPartUnitOffset * numPartInCtuWidth - 1 ] )
{
uiBLPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdxLB + uiPartUnitOffset * numPartInCtuWidth - 1 ];
//如果PU與CU處於同一行或列,則返回CTU及PU左下角的索引
if ( RasterAddress::isEqualRowOrCol( uiAbsPartIdxLB, uiAbsZorderCUIdxLB, numPartInCtuWidth ) )
{
return m_pcPic->getCtu( getCtuRsAddr() );
}
else
{
//否則返回當前CU,以及所求PU在CU中的位置索引
uiBLPartUnitIdx -= m_absZIdxInCtu;
return this;
}
}
uiBLPartUnitIdx = MAX_UINT;
return NULL;
}
//如果是第0列,返回左邊的CTU地址以及 左下角PU在其中的位置索引
uiBLPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdxLB + (1+uiPartUnitOffset) * numPartInCtuWidth - 1 ];
if ( bEnforceSliceRestriction && !CUIsFromSameSliceAndTile(m_pCtuLeft) )
{
return NULL;
}
return m_pCtuLeft;
}
uiBLPartUnitIdx = MAX_UINT;
return NULL;
}