最近大致看完了VTM6.0的帧内编码端的和变换部分相关的代码,这里进行一下简单的总结。

帧内编码端的变换涉及到变换最佳模式的选择,和变换部分相关的代码又比较杂,这里仅仅总结其中一部分代码。

帧内模式选择的入口函数是xCheckRDCostIntra,函数调用框图如图所示:

H.266/VVC帧内变换代码总结

  • xCheckRDCostIntra函数主要是进行了相应变换块可选变换模式集的遍历,并计算RD Cost选出最佳变换模式。
  • estIntraPredChromaQT和estIntraPredLumaQT函数主要是分别对色度和亮度选择最佳预测模式。
  • xRecurIntraChromaCodingQT函数分别进行Cb Cr单独编码和JointCbCr联合编码,从而选出色度最佳编码模式。
  • xIntraCodingLumaISP函数用于决定是否需要Skip ISP模式
  • xRecurIntraCodingLumaQT函数用于对上层传来的变换集进行遍历
  • xIntraCodingTUBlock用于对上层传来的预测模式和变换模式进行帧内编码从而计算失真。

对于帧内变换,相应的变换块的变换模式集对应如图所示:

H.266/VVC帧内变换代码总结

其中对于每个尺寸的几种变换模式都是竞争关系,都是通过计算RD Cost选出最佳变换。

对于最大尺寸小于等于32的帧内亮度块,其进行DCT-2变换时,是通过调用第一个transformNxN函数计算相应的SAD来决定是使用DCT-2变换还是transformSkip模式。

 对于LFNST变换,需要遍历lfnstIdx等于1和2的两种情况,分别对于两个LFNST矩阵。

相关文章: