H.266/VVC帧内预测框架

本人是西电研一的一名普通学生,现在在通院信科所多媒体通信实验室,主要研究方向是视频编码标准H.266/VVC。
  
  如很多刚上研同学一样,入学以来经历了迷茫、对科研方向无从下手等问题。两个月来,在理清视频编码结构后,终于渐渐理解并敢于修改VVC的代码。准备在博客这个平台上记录自己的学习过程,希望可以与更多更优秀的人交流讨论。  
  第一次写微博,准备多说些。我是在大三最开始了解的视频编码,当时的计网老师也就是我现在的课题组组长介绍了多媒体通信这个研究方向。当时初步了解了一下感觉是我的兴趣所在,便联系了我现在的导师。考研过后,毕设让我开始了我的第一个视频编码的科研方向:环路滤波。大概两个月的时间,这也许让我适应了一阵子实验室生活,从小白变成了菜鸟。毕业暑假返校后,CCLM的提出使得帧内改进空间更大,我也开始把研究方向转向帧内,从初步理解的ALF转向色度DM模式。在师兄的帮助下从DM往上层看到色度帧内预测,进一步到亮度帧内预测。现在已对VTM3.0中帧内预测框架的代码有了大体认识,总结如下。

1 xCheckRDCostIntra

这个函数是进入帧内预测的通道:
  首先获取最佳帧间代价和EMT相关信息getUseIntraEMT,初始化缓存并使CU加入并进行赋值。
  如果是亮度通道,则进行亮度预测estIntraPredLumaQT(2.1),进行一些处理。如果是色度通道或不是色度独立划分,且色彩格式不是4:0:0,则进行色度预测estIntraPredChromaQT(2.2)
  最后处理变换标志位rootCbf,编码CU参数并更新CU上下文,计算RDO。更新EMT相关信息。

2.1 estIntraPredLumaQT

亮度预测过程如下:
  做初始化准备,设置EMT标志。(尚未理解EMT)
  0:EMT不适用于当前CU;
  1:EMT快速算法可以应用于当前CU,后面则直接拷贝进uiRdModeList和extendRefList。
  2:EMT检查是否应用当前CU,跳过了下面候选列表计算,设定skip的阈值,加载重定尺寸的uiRdModeList,CandCostList,extendRefList。

确定要测试的模式集。亮度模式可用数量67,确定要计算RDO的数量。
  如果EMT为0或1,初始化亮度预测模式initIntraPatternChType(相邻参考像素的获取+参考像素的滤波),首先初始化原始缓存、预测缓存、以及一系列参数。
  1.遍历67种亮度模式,对每一种序号大于2且是偶数的模式进行以下操作:令亮度预测方向是这个模式。如果可用DPCM进行第一次通过帧内估计,则直接调用encPredIntraDPCM传输一个cu的预测值;不可用DPCM则调用predIntraAng使用角度预测求解预测值。随后使用哈达玛变换得到残差平方和(SATD)的值,随后比较SATD更新候选列表updateCandList。选出N个预测可能性较大的方向,称为种子模式,重定列表尺寸为N(忽略掉额外的非种子模式)。
  2.遍历N个种子模式,更新种子模式:若种子模式在3到65中间,按序遍历种子及其相邻的角度,用DPCM或角度预测后变换求SATD过程同上,更新这N个值的列表。
  3.进行MPM的操作:调用PU::getIntraMPMs获取存有6个值的MPM列表(多参考行中,对选中的行MPM列表的每一个进行DPCM或角度预测后变换求RDO获取最佳参考行)。前M个MPMs被增加到前面N种模式中,得到帧内亮度预测最终列表(M+N个候选)。
  
  如果运用的快速PB,重定尺寸并重置上下文。至此模式列表选择全部结束。
  遍历扩展列表extendRefLis的每一项,设定上下文模型,对筛选出的帧内预测模式进行一系列完整的操作xRecurIntraCodingLumaQT,通过RDO比较更新以选取最优亮度模式。

2.2 estIntraPredChromaQT

色度预测过程如下:
  从第一个PU开始,初始化失真及代价。创建一个临时的编码结构,给TU创建一个储存。
  1.创建modelist列表:初始化色度模式列表modelist如下图所示,其中横行的亮度指的是色度块对应亮度块中间块的预测方向,竖行的色度列表存有对应默认值,当默认值与DM冲突时用66这个方向代替。每个竖着的一排都是对应其亮度方向的一个modelist列表
色度预测列表
  
  2.进行3种LM的一系列操作:最后存上RDO。(尚未细看)
  3.遍历四种传统模式和DM共5种:恢复上下文模型,将列表中的这个值赋值给色度预测方向,进行色度分量的编码工作xRecurIntraChromaCodingQT,返回失真。通过获得比特数及返回的失真得到RDO,用临时编码结构储存。比较更新这五种情况的最佳RDO,保存最优模式的数据,找到最佳模式和最小RDO。
  4.循环Cb与Cr:从临时编码结构赋值给当前编码结构。最终确定最佳模式和失真。

3 编解码

vtm3.0色度相关CABAC编码如下,解码即逆过程。
在这里插入图片描述
  以上是近期学习的一些总结,最底层部分除了DM外也没太看。听说实验室最近有要向视频编码的其他部分侧重的倾向,而我可能是对帧内了解最少的一个人,所以我的帧内之行可能就告一段落了,当然都说不准。黄色底纹部分是我认为我应该继续深入看的几个函数,在这里先开个坑以后慢慢填。刚上手难免会有些错误,希望能多与前辈们多多交流。

猜你喜欢

转载自blog.csdn.net/weixin_42979679/article/details/84172738