H.266/VVC代码学习1:帧内预测框架(20190528更新VTM5.0)

在进行帧内预测学习之前,有必要了解一下帧内预测类IntraPrediction。
可参考博客:H.266/VVC代码学习26:VTM5.0中IntraPrediction类及其相应全局函数。
下面将进行帧内预测的具体学习,有关细节也可参考后面的链接:

文章目录

  • 1 xCheckRDCostIntra
  • 2 亮度预测和色度预测
    • 2.1 亮度预测:estIntraPredLumaQT
    • 2.2 色度预测:estIntraPredChromaQT
  • 3 编解码
    • 3.1 亮度编码
    • 3.2 色度编码
  • 4 结语

1 xCheckRDCostIntra

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

2 亮度预测和色度预测

2.1 亮度预测:estIntraPredLumaQT

亮度预测过程如下:
  做初始化准备,设置EMT标志。(尚未理解EMT)
  初始化亮度预测模式initIntraPatternChType(相邻参考像素的获取+参考像素的滤波),首先初始化原始缓存、预测缓存、以及一系列参数。
  1.遍历67种亮度模式,对每一种序号大于2且是偶数(即原H.265的35种)的模式进行以下操作:令亮度预测方向是这个模式。如果可用DPCM进行第一次通过帧内估计,则直接调用encPredIntraDPCM传输一个cu的预测值;不可用DPCM则调用predIntraAng使用角度预测求解预测值。随后使用哈达玛变换得到残差平方和SATD的值,随后比较SATD更新候选列表updateCandList。选出N个预测可能性较大的方向,这个称为种子模式,重定列表尺寸为N(忽略掉额外的非种子模式),其中N的大小numModesForFullRD由块宽度决定。。
  2.遍历N个种子模式,也进行VTM5.0中增加MIP预测,更新种子模式:若种子模式在3到65中间,按序遍历种子及其相邻的角度,用DPCM或角度预测后变换求SATD过程同上,更新这N个值的列表。随后,在MPM操作前根据块的形状和尺寸进行对应的MIP预测,同样的方式选出种子模式(VTM5.0更新,predIntraMip
  3.进行MPM的操作,计算RD代价:调用PU::getIntraMPMs获取存有6个传统模式值的MPM列表(多参考行中,对选中的行MPM列表的每一个进行DPCM或角度预测后变换求RDO获取最佳参考行),也获取存有3个MIP模式值的MPM列表。随后又一次进行MPM列表的获取,将前M个MPMs被增加到前面N种模式中,得到帧内亮度预测最终RD列表。遍历扩展列表RD列表的每一项,设定上下文模型,对筛选出的帧内预测模式进行一系列完整的操作——完成变换、量化、率失真计算的工作xRecurIntraCodingLumaQT,得到RD Cost更新最优模式,亮度预测结束。
  详细操作请见:
  H.266/VVC代码学习22:帧内预测的初始化(initIntraPatternChType)
  H.266/VVC代码学习21:帧内角度预测的实现(predIntraAng)
  H.266/VVC代码学习28:VTM5.0中的MIP技术(predIntraMip)
  H.266/VVC代码学习10:xRecurIntraCodingLumaQT函数

2.2 色度预测:estIntraPredChromaQT

色度预测过程如下:
  从第一个PU开始,初始化失真及代价。创建一个临时的编码结构,给TU创建一个储存。
  1.创建modelist列表:初始化色度模式列表modelist如下图所示,其中横行的亮度指的是色度块对应亮度块中间块的预测方向,竖行的色度列表存有对应默认值,每个竖着的一排都是对应其亮度方向的一个modelist列表。
H.266/VVC代码学习1:帧内预测框架(20190528更新VTM5.0)_第1张图片
  
  2.计算6种模式RD代价:按DC、Ver、Hor、LM_L、LM_T进行预测,按SATD排序,去掉两个SATD最大的模式,即还剩下三种模式,然后Planar、LM、DM加入得到待计算的6种模式。当默认值与DM冲突时用66这个方向代替。恢复上下文模型,将列表中的这个值赋值给色度预测方向,进行色度分量的编码工作xRecurIntraChromaCodingQT,返回失真。通过获得比特数及返回的失真得到RDO,用临时编码结构储存。比较更新这五种情况的最佳RD代价,保存最优模式的数据,找到最佳模式和最小RDO。
  详细操作请见:
  H.266/VVC代码学习14:色度列表(getIntraChromaCandModes)
  H.266/VVC代码学习8:xRecurIntraChromaCodingQT函数
  3.循环Cb与Cr:从临时编码结构赋值给当前编码结构。最终确定最佳模式和失真。

3 编解码

3.1 亮度编码

若不在MPM中,用截断的二进制编码。共67种模式,去掉MPM的6种,剩余61种。将这61种模式重新编号。编号为0-3的用5位编码这个编号即可,否则用6位编码该序号。对MIP模式的编码还在学习中,后续会更新。
H.266/VVC代码学习17:帧内亮度预测的编解码(intra_luma_pred_modes)

3.2 色度编码

H.266/VVC代码学习1:帧内预测框架(20190528更新VTM5.0)_第2张图片
具体见:H.266/VVC代码学习16:帧内色度预测的编解码(intra_chroma_pred_modes)

具体编码操作请见:H.266/VVC代码学习24:常见的熵编码函数(encodeBin、encodeBinEP、encodeBinsEP)

4 结语

以上是近期学习的一些总结,最底层部分除了DM外也没太看。特殊标记部分是我认为我应该继续深入看的几个函数,在这里先开个坑以后慢慢填。刚上手难免会有些错误,希望能多与前辈们多多交流。
  20190528更新:刚阅读了自己最开始的博客,发现了一些当初理解不到位和需要精进的地方,均已做出改动,一年的时间让我渐渐深入了视频编码这片天地。然而对还是研一的我而言这只是个小小的开始,也很庆幸还有足足两年的在学校时间让我继续开拓。希望我和所有这个方向的学生一起进步,学有所成!

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