H.266/VVC-VTM代码学习-帧内预测03-DC模式下计算预测像素值xPredIntraDc、xGetPredValDc

H.266/VVC专栏传送

上一篇:H.266/VVC-VTM代码学习-帧内预测02-获取参考像素并对其滤波xFillReferenceSamples、xFilterReferenceSamples
下一篇:H.266/VVC-VTM代码学习-帧内预测04-Planar模式下计算预测像素值xPredIntraPlanar

前言

VTM是H.266/VVC视频编码标准的参考软件,研究VTM代码给研究人员解释了VVC编码标准的详细标准规范与细节。

本文是笔者对VTM代码的一点学习记录,成文于笔者刚开始接触VVC期间,期间很多概念和理论框架还很不成熟,若文中存在错误欢迎批评指正,也欢迎广大视频编码学习者沟通交流、共同进步。

VTM代码的下载及编译请参考博文:
【视频编码学习】H.266/VVC参考软件VTM配置运行(VTM-6.0版本)
本文涉及的代码存在于工程下的/lib/CommonLib/SourceFiles/IntraPrediction.cpp文件中。

一、主要函数

1.函数代码

(1)入口函数 IntraPrediction::xPredIntraDc

void IntraPrediction::xPredIntraDc( const CPelBuf &pSrc, PelBuf &pDst, const ChannelType channelType, const bool enableBoundaryFilter )
{
  //生成DC值
  const Pel dcval = xGetPredValDc( pSrc, pDst );
  //填充DC值
  pDst.fill( dcval );
}

(2)计算DC值函数IntraPrediction::xGetPredValDc

Pel IntraPrediction::xGetPredValDc( const CPelBuf &pSrc, const Size &dstSize )
{
  CHECK( dstSize.width == 0 || dstSize.height == 0, "Empty area provided" );

  int idx, sum = 0;
  Pel dcVal;
  const int width  = dstSize.width;
  const int height = dstSize.height;
  //最后求均值时的除数
  //若width == height,则为2*width
  //若width != height,则为max(width, height)
  const auto denom     = (width == height) ? (width << 1) : std::max(width,height);
  //除法用移位操作实现,对应的移位位数
  const auto divShift  = floorLog2(denom);
  //四舍五入除法在移位前补充的对应偏移值
  const auto divOffset = (denom >> 1);

  //宽大于高时,sum计算宽的参考像素总值
  if ( width >= height )
  {
    for( idx = 0; idx < width; idx++ )
    {
      sum += pSrc.at(m_ipaParam.multiRefIndex + 1 + idx, 0);
    }
  }
  //高大于宽时,sum计算高的参考像素总值
  if ( width <= height )
  {
    for( idx = 0; idx < height; idx++ )
    {
      sum += pSrc.at(m_ipaParam.multiRefIndex + 1 + idx, 1);
    }
  }

  //宽等于高时,经历以上两个循环,sum计算宽与高的参考像素总值

  //四舍五入求均值
  dcVal = (sum + divOffset) >> divShift;
  return dcVal;
}

2.逻辑结构

(1)入口函数

1.调用函数得到当前块的DC值。

2.调用函数将当前块DC值填充至当前块的所有预测位置。

(2)计算DC值函数

1.宽大于高时,计算上方参考像素行的像素平均值作为DC值。

2.高大于宽时,计算左侧参考像素列的像素平均值作为DC值。

3.高等于宽时,计算上方和左侧所有参考像素的平均值作为DC值。

4.注意,以上操作均未用到左下方和右上方的参考像素。

上一篇:H.266/VVC-VTM代码学习-帧内预测02-获取参考像素并对其滤波xFillReferenceSamples、xFilterReferenceSamples
下一篇:H.266/VVC-VTM代码学习-帧内预测04-Planar模式下计算预测像素值xPredIntraPlanar

posted @ 2020-11-03 07:26  liaojq2020  阅读(77)  评论(0)    收藏  举报