HEVC函数分析之TComPattern::initPattern( )

废话不多说直接上代码注释。有错的话,请指教。

//设定当前CU中PU的参数
Void TComPattern::initPattern( TComDataCU* pcCU,   //当前的CU(64*64到8*8) 
	                         UInt uiPartDepth,   //PU相对于当前CU的深度 
			    UInt uiAbsPartIdx ) //当前的PU以4*4块为单位,以Zscan扫描顺序的序号(以LCU为标准)
{


//为了计算参考点的位置:是否需要计算上一行,左一列
  Int   uiOffsetLeft  = 0;
  Int   uiOffsetAbove = 0;
  
  //当前PU的宽和高
  //pcCU->getWidth (0)为当前CU的宽,当前CU可能会被分为很多层,第0个就是当前CU的尺寸
  UChar uiWidth          = pcCU->getWidth (0)>>uiPartDepth;
  UChar uiHeight         = pcCU->getHeight(0)>>uiPartDepth;
  
  //先计算当前CU的起始地址,再加上Zscan的扫描序号,构成当前PU在整个图片中的绝对位置
  UInt  uiAbsZorderIdx   = pcCU->getZorderIdxInCU() + uiAbsPartIdx;
  UInt  uiCurrPicPelX    = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsZorderIdx] ];
  UInt  uiCurrPicPelY    = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsZorderIdx] ];
  
  /*
  计算参考点的起始坐标
  m_piPatternOrigin = pcCU->getPic()->getPicYuvRec()->getLumaAddr(pcCU->getAddr(), uiAbsZorderIdx)
  - m_iOffsetAbove * m_iPatternStride //当前地址的上面m_iOffsetAbove行的位置处
  - m_iOffsetLeft;//当前地址的左面m_iOffsetLeft列处
  */
  //在计算参考点的位置时,当前的位置的起始点要是在第一列,因为左面没有像素,需要设置0,不是第一列时取左面一列的数据,此时设为1
  if( uiCurrPicPelX != 0 )
  {
    uiOffsetLeft = 1;
  }
  
  //在计算参考点的位置时,当前的位置的起始点要是在第一行,因为上面没有像素,需要设置0,不是第一行时取上一行的数据
  if( uiCurrPicPelY != 0 )
  {
    uiOffsetAbove = 1;
  }


  //根据上面的偏移,计算Y,Cb,Cr的参考点处的位置,0,1,2用来表示是Y,Cb,Cr
  m_cPatternY .setPatternParamCU( pcCU, 0, uiWidth,      uiHeight,      uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx );
  m_cPatternCb.setPatternParamCU( pcCU, 1, uiWidth >> 1, uiHeight >> 1, uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx );
  m_cPatternCr.setPatternParamCU( pcCU, 2, uiWidth >> 1, uiHeight >> 1, uiOffsetLeft, uiOffsetAbove, uiAbsPartIdx );
}


请指教:1729048547


你可能感兴趣的:(HEVC函数分析之TComPattern::initPattern( ))