H.266/VVC代码学习22:帧内预测的初始化(initIntraPatternChType)

进行帧内预测之前,首先要初始化,主要进行两个步骤:
1.相邻参考像素的获取
2.参考像素的滤波
这部分详细内容可见:H.266/VVC代码学习23:帧内参考像素及滤波

理论部分见万帅书P118-120
代码框架如下:

void IntraPrediction::initIntraPatternChType(const CodingUnit &cu, const CompArea &area, const bool bFilterRefSamples)
{
  const CodingStructure& cs   = *cu.cs;

  Pel *refBufUnfiltered   = m_piYuvExt[area.compID][PRED_BUF_UNFILTERED];//未滤波的缓存
  Pel *refBufFiltered     = m_piYuvExt[area.compID][PRED_BUF_FILTERED];//滤波的缓存

#if JVET_M0102_INTRA_SUBPARTITIONS
// ----- Step 0: 得到参考像素的长度,见下面一段代码 -----
  setReferenceArrayLengths( cu.ispMode && isLuma( area.compID ) ? cu.blocks[area.compID] : area );
#else
  setReferenceArrayLengths(area);
#endif

  // ----- Step 1: unfiltered reference samples 获取参考像素 -----
  xFillReferenceSamples( cs.picture->getRecoBuf( area ), refBufUnfiltered, area, cu );
  // ----- Step 2: filtered reference samples 参考像素的滤波 -----
  if( bFilterRefSamples )
  {
    xFilterReferenceSamples( refBufUnfiltered, refBufFiltered, area, *cs.sps
      , cu.firstPU->multiRefIdx
    );
  }
}

Step 0: 得到参考像素的长度,长度是块宽高的二倍:

  void IntraPrediction::setReferenceArrayLengths( const CompArea &area )
  {
    // set Top and Left reference samples length
    const int  width    = area.width;
    const int  height   = area.height;

    m_leftRefLength     = (height << 1);//高的二倍
    m_topRefLength      = (width << 1);//宽的二倍

  }

你可能感兴趣的:(H.266/VVC视频编码)