此函數用於輸出當前CU左上角和右上角在當前CTU中的位置,位置是以4x4的塊爲單位的。
下圖是博客 作者hevc_cjl所貼出來的:
m_absZIdxInCtu表示CU在當前CTU中的位置,uiAbsPartIdx表示當前PU劃分所處的位置,都是基於4x4塊的,如8x4 PU的第0個劃分的uiAbsPartIdx = 0,第一個劃分的uiAbsPartIdx = 2。
Void TComDataCU::deriveLeftRightTopIdxGeneral
( UInt uiAbsPartIdx, UInt uiPartIdx, UInt& ruiPartIdxLT, UInt& ruiPartIdxRT ) const
{
ruiPartIdxLT = m_absZIdxInCtu + uiAbsPartIdx;
UInt uiPUWidth = 0;
switch ( m_pePartSize[uiAbsPartIdx] )
{
case SIZE_2Nx2N: uiPUWidth = m_puhWidth[uiAbsPartIdx]; break;
case SIZE_2NxN: uiPUWidth = m_puhWidth[uiAbsPartIdx]; break;
case SIZE_Nx2N: uiPUWidth = m_puhWidth[uiAbsPartIdx] >> 1; break;
case SIZE_NxN: uiPUWidth = m_puhWidth[uiAbsPartIdx] >> 1; break;
case SIZE_2NxnU: uiPUWidth = m_puhWidth[uiAbsPartIdx]; break;
case SIZE_2NxnD: uiPUWidth = m_puhWidth[uiAbsPartIdx]; break;
case SIZE_nLx2N:
if ( uiPartIdx == 0 )
{
uiPUWidth = m_puhWidth[uiAbsPartIdx] >> 2;
}
else if ( uiPartIdx == 1 )
{
uiPUWidth = (m_puhWidth[uiAbsPartIdx] >> 1) + (m_puhWidth[uiAbsPartIdx] >> 2);
}
else
{
assert(0);
}
break;
case SIZE_nRx2N:
if ( uiPartIdx == 0 )
{
uiPUWidth = (m_puhWidth[uiAbsPartIdx] >> 1) + (m_puhWidth[uiAbsPartIdx] >> 2);
}
else if ( uiPartIdx == 1 )
{
uiPUWidth = m_puhWidth[uiAbsPartIdx] >> 2;
}
else
{
assert(0);
}
break;
default:
assert (0);
break;
}
ruiPartIdxRT = g_auiRasterToZscan [g_auiZscanToRaster[ ruiPartIdxLT ] + uiPUWidth / m_pcPic->getMinCUWidth() - 1 ];
}
deriveLeftBottomIdxGeneral表示獲取當前PU左下角4x4塊在CTU所處的位置。
Void TComDataCU::deriveLeftBottomIdxGeneral(
UInt uiAbsPartIdx, UInt uiPartIdx, UInt& ruiPartIdxLB ) const
{
UInt uiPUHeight = 0;
switch ( m_pePartSize[uiAbsPartIdx] )
{
case SIZE_2Nx2N: uiPUHeight = m_puhHeight[uiAbsPartIdx]; break;
case SIZE_2NxN: uiPUHeight = m_puhHeight[uiAbsPartIdx] >> 1; break;
case SIZE_Nx2N: uiPUHeight = m_puhHeight[uiAbsPartIdx]; break;
case SIZE_NxN: uiPUHeight = m_puhHeight[uiAbsPartIdx] >> 1; break;
case SIZE_2NxnU:
if ( uiPartIdx == 0 )
{
uiPUHeight = m_puhHeight[uiAbsPartIdx] >> 2;
}
else if ( uiPartIdx == 1 )
{
uiPUHeight = (m_puhHeight[uiAbsPartIdx] >> 1) + (m_puhHeight[uiAbsPartIdx] >> 2);
}
else
{
assert(0);
}
break;
case SIZE_2NxnD:
if ( uiPartIdx == 0 )
{
uiPUHeight = (m_puhHeight[uiAbsPartIdx] >> 1) + (m_puhHeight[uiAbsPartIdx] >> 2);
}
else if ( uiPartIdx == 1 )
{
uiPUHeight = m_puhHeight[uiAbsPartIdx] >> 2;
}
else
{
assert(0);
}
break;
case SIZE_nLx2N: uiPUHeight = m_puhHeight[uiAbsPartIdx]; break;
case SIZE_nRx2N: uiPUHeight = m_puhHeight[uiAbsPartIdx]; break;
default:
assert (0);
break;
}
ruiPartIdxLB = g_auiRasterToZscan [g_auiZscanToRaster[ m_absZIdxInCtu + uiAbsPartIdx ] + ((uiPUHeight / m_pcPic->getMinCUHeight()) - 1)*m_pcPic->getNumPartInCtuWidth()];
}