const TComDataCU* TComDataCU::getPULeft( UInt& uiLPartUnitIdx,//
UInt uiCurrPartUnitIdx,//
Bool bEnforceSliceRestriction,
Bool bEnforceTileRestriction ) const
{
UInt uiAbsPartIdx = g_auiZscanToRaster[uiCurrPartUnitIdx];
UInt uiAbsZorderCUIdx = g_auiZscanToRaster[m_absZIdxInCtu];//当前CU第一个4x4小块在Ctu中的Raster
const UInt numPartInCtuWidth = m_pcPic->getNumPartInCtuWidth();
//检查uiAbsPartIdx所在列是否为Ctu第一列,uiAbsPartIdx%numPartInCtuWidth==0则为第一列
if ( !RasterAddress::isZeroCol( uiAbsPartIdx, numPartInCtuWidth ) )
{//当前PU左边的块与PU在同一Ctu中
uiLPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx - 1 ];//PU左边(outer)4x4小块在Ctu中的ZIdx
//uiAbsPartIdx和uiAbsZorderCUIdx是否在Ctu的同一列,即当前PU左边缘是否与CU左边缘一样(是否是水平划分,或其他划分的第一个PU)
if ( RasterAddress::isEqualCol( uiAbsPartIdx, uiAbsZorderCUIdx, numPartInCtuWidth ) )
{//若是,则返回当前Ctu和uiLPartUnitIdx(PU左边小块outer在Ctu中的ZIdx)
return m_pcPic->getCtu( getCtuRsAddr() );
}
else
{//否则PULeft与当前PU在同一CU中,为Nx2N或nRx2N或NxN时,获取PU左边(outer)4x4小块在当前CU中的ZIdx
uiLPartUnitIdx -= m_absZIdxInCtu;
return this;
}
}
//若为当前Ctu中的isZeroCol(第一列),则获取与uiAbsPartIdx在同一行的Ctu中最右小块的ZIdx=RToZ[uiAbsPartIdx+CtuWidth-1],然后返回Left Ctu
uiLPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx + numPartInCtuWidth - 1 ];
if ( (bEnforceSliceRestriction && !CUIsFromSameSlice(m_pCtuLeft)) || (bEnforceTileRestriction && !CUIsFromSameTile(m_pCtuLeft)) )
{//若左边Ctu与当前Ctu不在同一Slice或同一Tile()独立编码,则返回空指针(无PULeft)
return NULL;
}
return m_pCtuLeft;//说明当前PU左边的块位于另外一个Ctu,例如:可通过pCtuLeft->getSkipFlag(uiLPartUnitIdx)
}
const TComDataCU* TComDataCU::getPUAbove( UInt& uiAPartUnitIdx,
HEVC:getPULeft();getPUAbove();getPUAboveLeft();getPUBelowLeft();getPUAboveRight()代码注释
最新推荐文章于 2020-10-18 11:49:29 发布