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 ) )
{
return false;
}
}
}
return true;
}
HEVC:deriveLeftRightTopIdxGeneral()代码注释
最新推荐文章于 2024-04-26 09:37:11 发布