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

    xiaoxiao2023-10-29  144

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

    文章目录

    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 下采样后的边界

    在图中表示是下图画红色圈圈的这一部分: 从上面的代码看,下采样后的边界有两种:一种如上图所示,针对宽或高大于4的,采样为左边4个上边4个,另一种是针对4*4的块,采样成左边2个上边2个。这些最后排列成一维向量,作为输入矩阵的一部分。

    3 下采样后的预测尺寸

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

    4 上采样边界尺寸

    在图中表示是下图画红色圈圈的这一部分: 上采样边界尺寸即上采样时需要得到的一些像素值的尺寸。代码中可知,将短边直接全部拿来用于上采样(图中为左边),而长边(图中为)每隔x个点(x= 长边边长/长边下采样后边长)进行取值,随后进行上采样操作得到全部值。

    5 预告

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

    最新回复(0)