getPUAbove函數 獲取PU上面的塊

const TComDataCU* TComDataCU::getPUAbove( UInt& uiAPartUnitIdx,
                                          UInt uiCurrPartUnitIdx,
                                          Bool bEnforceSliceRestriction,
                                          Bool planarAtCtuBoundary,
                                          Bool bEnforceTileRestriction ) const
{
//當前PU塊的最上邊的4x4小塊的Raster
  UInt uiAbsPartIdx       = g_auiZscanToRaster[uiCurrPartUnitIdx];
//當前CU在當前CTU中的Raster位置
  UInt uiAbsZorderCUIdx   = g_auiZscanToRaster[m_absZIdxInCtu];
  const UInt numPartInCtuWidth = m_pcPic->getNumPartInCtuWidth();
//如果當前PU不在當前CTU的第0行
  if ( !RasterAddress::isZeroRow( uiAbsPartIdx, numPartInCtuWidth ) )
  {
//uiAPartUnitIdx 表示當前PU與uiAbsPartIdx 同列的上一行的4x4小塊位置
    uiAPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx - numPartInCtuWidth ];
//如果當前PU的uiAbsPartIdx的塊位置與當前CU處於同一行,則返回當前CTU指針以及uiAPartUnitIdx 
    if ( RasterAddress::isEqualRow( uiAbsPartIdx, uiAbsZorderCUIdx, numPartInCtuWidth ) )
    {
      return m_pcPic->getCtu( getCtuRsAddr() );
    }
    else
    {
//如果不在一行,說明當前PU part上面還有一個PU part,且處於同一個CU中,返回當前CU指針
//以及上一個PU在當前CU中的索引,uiAPartUnitIdx -= m_absZIdxInCtu
      uiAPartUnitIdx -= m_absZIdxInCtu;
      return this;
    }
  }

  if(planarAtCtuBoundary)
  {
    return NULL;
  }
//如果當前PU處於當前CTU的第0行,返回上一個相鄰的CTU地址,以及相應的索引
//uiAPartUnitIdx ,表示當前PU上一個相鄰的PU,這兩個相鄰PU處於不同的CTU中。
//
  uiAPartUnitIdx = g_auiRasterToZscan[ uiAbsPartIdx + m_pcPic->getNumPartitionsInCtu() - numPartInCtuWidth ];

  if ( (bEnforceSliceRestriction && !CUIsFromSameSlice(m_pCtuAbove)) || (bEnforceTileRestriction && !CUIsFromSameTile(m_pCtuAbove)) )
  {
//如果這兩個CTU不在同一個Slice或者Tile則表示沒有有效的相鄰的PU above
    return NULL;
  }
  return m_pCtuAbove;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章