deriveLeftRightTopIdxGeneral函数
程序员文章站
2022-07-07 09:07:36
...
此函数用于输出当前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()];
}
上一篇: HEVC算法和体系结构:编码框架