H.266/VVC代码学习29:VTM5.0中的PredictorMIP::initPredBlockParams函数

MIP顾名思义就是对矩阵的运算,大体框架可见:H.266/VVC代码学习28:VTM5.0中的MIP技术。进行矩阵的运算就必然要有输入矩阵和输出矩阵,而输入矩阵和输出矩阵分别是哪部分呢?本文将解答这个问题。本篇博客主要以下图8*8的块为例:
H.266/VVC代码学习29:VTM5.0中的PredictorMIP::initPredBlockParams函数_第1张图片

文章目录

  • 1 源码
  • 2 下采样后的边界
  • 3 下采样后的预测尺寸
  • 4 上采样边界尺寸
  • 5 预告

1 源码

void PredictorMIP::initPredBlockParams(const Size& block)//确定边界尺寸(多少个采样点)
{
  m_blockSize = block;
  m_numModes  = getNumModesMip(m_blockSize);//根据块的大小确定MIP的模式数量

  // init reduced boundary size 初始化下采样后的边界
  if (m_blockSize.width > 4 || m_blockSize.height > 4)//bdry:第二列矩阵,只有在4*4的块上是(2, 2),即4个。其余情况都是(4,4)即8个
  {
    m_reducedBoundarySize = Size(4, 4);
  }
  else
  {
    m_reducedBoundarySize = Size(2, 2);
  }

  // init reduced prediction size 初始化下采样后预测尺寸
  if (m_blockSize.width <= 8 && m_blockSize.height <= 8)
  {
    m_reducedPredictionSize = Size(4, 4);//pred:第一列矩阵,通过矩阵运算预测出的下采样后小分辨率图像边界,小于8*8块为16个(即4x4),大于8*8块为64个(8x8),4*n的有特殊运算
  }
  else
  {
    m_reducedPredictionSize = Size(std::min<SizeType>(m_blockSize.width, 8), std::min<SizeType>(m_blockSize.height, 8));
  }

  // init boundary size for upsampling 初始化上采样边界尺寸
  if (m_blockSize.height > m_blockSize.width)//短边直接拿出整条边,长边进行只拿出下采样后的那部分
  {
    m_boundarySizeForUpsampling = Size(m_blockSize.width, m_reducedPredictionSize.height);
  }
  else
  {
    m_boundarySizeForUpsampling = Size(m_reducedPredictionSize.width, m_blockSize.height);
  }

  // init upsampling factors 原始边长/下采样边长 = 几个点一采样
  m_upsmpFactorHor = m_blockSize.width / m_reducedPredictionSize.width;// 
  CHECKD(m_reducedPredictionSize.width * m_upsmpFactorHor != m_blockSize.width, "Need integer horizontal upsampling factor.");
  CHECKD((m_upsmpFactorHor < 1) || ((m_upsmpFactorHor & (m_upsmpFactorHor - 1)) != 0), "Need power of two horizontal upsampling factor.");

  m_upsmpFactorVer = m_blockSize.height / m_reducedPredictionSize.height;
  CHECKD(m_reducedPredictionSize.height * m_upsmpFactorVer != m_blockSize.height, "Need integer vertical upsampling factor.");
  CHECKD((m_upsmpFactorVer < 1) || ((m_upsmpFactorVer & (m_upsmpFactorVer - 1)) != 0), "Need power of two vertical upsampling factor.");
}

2 下采样后的边界

在图中表示是下图画红色圈圈的这一部分:
H.266/VVC代码学习29:VTM5.0中的PredictorMIP::initPredBlockParams函数_第2张图片
从上面的代码看,下采样后的边界有两种:一种如上图所示,针对宽或高大于4的,采样为左边4个上边4个,另一种是针对4*4的块,采样成左边2个上边2个。这些最后排列成一维向量,作为输入矩阵的一部分。

3 下采样后的预测尺寸

在图中表示是下图画红色圈圈的这一部分:
H.266/VVC代码学习29:VTM5.0中的PredictorMIP::initPredBlockParams函数_第3张图片
从上面的代码看,预测主要有两种:一种如上图所示,针对宽或高小于等于8的,预测出4x4共16个像素值,另一种是针对宽或高大于8的块,预测出8x8共64个像素值。这些最后排列成一维向量,作为输出矩阵。此外对于4xA和Ax4的块有特殊操作,大体说来就是预测出8x8共64个像素值,然后抽取其中4行或4列,得到一个4x8或8x4的结果。

4 上采样边界尺寸

在图中表示是下图画红色圈圈的这一部分:
H.266/VVC代码学习29:VTM5.0中的PredictorMIP::initPredBlockParams函数_第4张图片
上采样边界尺寸即上采样时需要得到的一些像素值的尺寸。代码中可知,将短边直接全部拿来用于上采样(图中为左边),而长边(图中为)每隔x个点(x= 长边边长/长边下采样后边长)进行取值,随后进行上采样操作得到全部值。

5 预告

由于最近主要研究MIP,关于VTM5.0的帧内大体框架暂时告一段落。而贯穿本文全文的都是下采样和上采样,那么下一篇博客就准备深入探究一下下采样和上采样函数。最后,欢迎大家交流和指正!

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