您的位置:首页 > 编程语言

HEVC:deriveLeftRightTopIdxGeneral()代码注释

2018-04-08 21:09 911 查看
Void TComDataCU::deriveLeftRightTopIdxGeneral ( UInt uiAbsPartIdx, UInt uiPartIdx, UInt& ruiPartIdxLT, UInt& ruiPartIdxRT ) const
{//uiAbsPartIdx:当前CU中4x4小块Idx,一般为0;uiPartIdx:CU对称划分和非对称划分中PU Part的Idx;ruiPartIdxLT:LT_inner_ZIdx;ruiPartIdxRT:RT_inner_ZIdx;
ruiPartIdxLT = m_absZIdxInCtu + uiAbsPartIdx;//当前CU块最左上角(内部)4x4小块在当前Ctu中的ZIdx
UInt uiPUWidth = 0;

switch ( m_pePartSize[uiAbsPartIdx] )//获取当前PU宽度
{
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;
}
//获取当前CU右上角(inner)4x4小块在当前Ctu中的ZIdx=ZToR[LTinner_Raster + PUWidth/4 - 1]
ruiPartIdxRT = g_auiRasterToZscan [g_auiZscanToRaster[ ruiPartIdxLT ] + uiPUWidth / m_pcPic->getMinCUWidth() - 1 ];
}

Void TComDataCU::deriveLeftBottomIdxGeneral( UInt uiAbsPartIdx, UInt uiPartIdx, UInt& ruiPartIdxLB ) const
{//uiAbsPartIdx:当前CU中4x4小块Idx,一般为0;uiPartIdx:CU对称划分和非对称划分中PU Part的Idx;ruiPartIdxLB:;
UInt uiPUHeight = 0;
switch ( m_pePartSize[uiAbsPartIdx] )//获取当前PU高度
{
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;
}
//获取当前CU左下角(inner)4x4小块在当前Ctu中的ZIdx=ZToR[LTinner_Raster + (PUHeight/4-1)*CtuWidth]

ruiPartIdxLB      = g_auiRasterToZscan [g_auiZscanToRaster[ m_absZIdxInCtu + uiAbsPartIdx ] + ((uiPUHeight / m_pcPic->getMinCUHeight()) - 1)*m_pcPic->getNumPartInCtuWidth()];
}

Void TComDataCU::deriveLeftRightTopIdx ( UInt uiPartIdx, UInt& ruiPartIdxLT, UInt& ruiPartIdxRT ) const
{
ruiPartIdxLT = m_absZIdxInCtu;
ruiPartIdxRT = g_auiRasterToZscan [g_auiZscanToRaster[ ruiPartIdxLT ] + m_puhWidth[0] / m_pcPic->getMinCUWidth() - 1 ];

switch ( m_pePartSize[0] )
{
case SIZE_2Nx2N:                                                                                                                                break;
case SIZE_2NxN:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 1; ruiPartIdxRT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 1;
break;
case SIZE_Nx2N:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 2; ruiPartIdxRT -= ( uiPartIdx == 1 )? 0 : m_uiNumPartition >> 2;
break;
case SIZE_NxN:
ruiPartIdxLT += ( m_uiNumPartition >> 2 ) * uiPartIdx;         ruiPartIdxRT +=  ( m_uiNumPartition >> 2 ) * ( uiPartIdx - 1 );
break;
case SIZE_2NxnU:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 3;
ruiPartIdxRT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 3;
break;
case SIZE_2NxnD:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : ( m_uiNumPartition >> 1 ) + ( m_uiNumPartition >> 3 );
ruiPartIdxRT += ( uiPartIdx == 0 )? 0 : ( m_uiNumPartition >> 1 ) + ( m_uiNumPartition >> 3 );
break;
case SIZE_nLx2N:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 4;
ruiPartIdxRT -= ( uiPartIdx == 1 )? 0 : ( m_uiNumPartition >> 2 ) + ( m_uiNumPartition >> 4 );
break;
case SIZE_nRx2N:
ruiPartIdxLT += ( uiPartIdx == 0 )? 0 : ( m_uiNumPartition >> 2 ) + ( m_uiNumPartition >> 4 );
ruiPartIdxRT -= ( uiPartIdx == 1 )? 0 : m_uiNumPartition >> 4;
break;
default:
assert (0);
break;
}

}

Void TComDataCU::deriveLeftBottomIdx( UInt  uiPartIdx,      UInt&      ruiPartIdxLB ) const
{
ruiPartIdxLB      = g_auiRasterToZscan [g_auiZscanToRaster[ m_absZIdxInCtu ] + ( ((m_puhHeight[0] / m_pcPic->getMinCUHeight())>>1) - 1)*m_pcPic->getNumPartInCtuWidth()];

switch ( m_pePartSize[0] )
{
case SIZE_2Nx2N:
ruiPartIdxLB += m_uiNumPartition >> 1;
break;
case SIZE_2NxN:
ruiPartIdxLB += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 1;
break;
case SIZE_Nx2N:
ruiPartIdxLB += ( uiPartIdx == 0 )? m_uiNumPartition >> 1 : (m_uiNumPartition >> 2)*3;
break;
case SIZE_NxN:
ruiPartIdxLB += ( m_uiNumPartition >> 2 ) * uiPartIdx;
break;
case SIZE_2NxnU:
ruiPartIdxLB += ( uiPartIdx == 0 ) ? -((Int)m_uiNumPartition >> 3) : m_uiNumPartition >> 1;
break;
case SIZE_2NxnD:
ruiPartIdxLB += ( uiPartIdx == 0 ) ? (m_uiNumPartition >> 2) + (m_uiNumPartition >> 3): m_uiNumPartition >> 1;
break;
case SIZE_nLx2N:
ruiPartIdxLB += ( uiPartIdx == 0 ) ? m_uiNumPartition >> 1 : (m_uiNumPartition >> 1) + (m_uiNumPartition >> 4);
break;
case SIZE_nRx2N:
ruiPartIdxLB += ( uiPartIdx == 0 ) ? m_uiNumPartition >> 1 : (m_uiNumPartition >> 1) + (m_uiNumPartition >> 2) + (m_uiNumPartition >> 4);
break;
default:
assert (0);
break;
}
}

/** Derive the partition index of neighbouring bottom right block
* \param [in]  uiPartIdx     current partition index
* \param [out] ruiPartIdxRB  partition index of neighbouring bottom right block
*/
Void TComDataCU::deriveRightBottomIdx( UInt uiPartIdx, UInt &ruiPartIdxRB ) const
{
ruiPartIdxRB      = g_auiRasterToZscan [g_auiZscanToRaster[ m_absZIdxInCtu ] + ( ((m_puhHeight[0] / m_pcPic->getMinCUHeight())>>1) - 1)*m_pcPic->getNumPartInCtuWidth() +  m_puhWidth[0] / m_pcPic->getMinCUWidth() - 1];

switch ( m_pePartSize[0] )
{
case SIZE_2Nx2N:
ruiPartIdxRB += m_uiNumPartition >> 1;
break;
case SIZE_2NxN:
ruiPartIdxRB += ( uiPartIdx == 0 )? 0 : m_uiNumPartition >> 1;
break;
case SIZE_Nx2N:
ruiPartIdxRB += ( uiPartIdx == 0 )? m_uiNumPartition >> 2 : (m_uiNumPartition >> 1);
break;
case SIZE_NxN:
ruiPartIdxRB += ( m_uiNumPartition >> 2 ) * ( uiPartIdx - 1 );
break;
case SIZE_2NxnU:
ruiPartIdxRB += ( uiPartIdx == 0 ) ? -((Int)m_uiNumPartition >> 3) : m_uiNumPartition >> 1;
break;
case SIZE_2NxnD:
ruiPartIdxRB += ( uiPartIdx == 0 ) ? (m_uiNumPartition >> 2) + (m_uiNumPartition >> 3): m_uiNumPartition >> 1;
break;
case SIZE_nLx2N:
ruiPartIdxRB += ( uiPartIdx == 0 ) ? (m_uiNumPartition >> 3) + (m_uiNumPartition >> 4): m_uiNumPartition >> 1;
break;
case SIZE_nRx2N:
ruiPartIdxRB += ( uiPartIdx == 0 ) ? (m_uiNumPartition >> 2) + (m_uiNumPartition >> 3) + (m_uiNumPartition >> 4) : m_uiNumPartition >> 1;
break;
default:
assert (0);
break;
}
}

Bool TComDataCU::hasEqualMotion( UInt uiAbsPartIdx, const TComDataCU* pcCandCU, UInt uiCandAbsPartIdx ) const
{
if ( getInterDir( uiAbsPartIdx ) != pcCandCU->getInterDir( uiCandAbsPartIdx ) )
{
return false;
}

for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
{
if ( getInterDir( uiAbsPartIdx ) & ( 1 << uiRefListIdx ) )
{
if ( getCUMvField( RefPicList( uiRefListIdx ) )->getMv( uiAbsPartIdx )     != pcCandCU->getCUMvField( RefPicList( uiRefListIdx ) )->getMv( uiCandAbsPartIdx ) ||
getCUMvField( RefPicList( uiRefListIdx ) )->getRefIdx( uiAbsPartIdx ) != pcCandCU->getCUMvField( RefPicList( uiRefListIdx ) )->getRefIdx( uiCandAbsPartIdx ) )

8f03
{
return false;
}
}
}

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐