最近大致看完了VTM6.0的帧内编码端的和变换部分相关的代码,这里进行一下简单的总结。
帧内编码端的变换涉及到变换最佳模式的选择,和变换部分相关的代码又比较杂,这里仅仅总结其中一部分代码。
帧内模式选择的入口函数是xCheckRDCostIntra,函数调用框图如图所示:
- xCheckRDCostIntra函数主要是进行了相应变换块可选变换模式集的遍历,通过并计算RD Cost选出最佳变换模式。
- estIntraPredChromaQT和estIntraPredLumaQT函数主要是分别对色度和亮度选择最佳预测模式
- xRecurIntraChromaCodingQT函数分别进行Cb Cr单独编码和JointCbCr联合编码,从而选出色度最佳编码模式。
- xIntraCodingLumaISP函数用于决定用于进行ISP分区、预测并进行变换等
- xRecurIntraCodingLumaQT函数用于对上层传来的变换集进行遍历
- xIntraCodingTUBlock用于对上层传来的预测模式和变换模式进行帧内编码从而计算失真。
对于帧内变换,相应的变换块的变换模式集对应如图所示:
其中对于每个尺寸的几种变换模式都是竞争关系,都是通过计算RD Cost选出最佳变换。
对于最大尺寸小于等于32的帧内亮度块,其进行DCT-2变换时,是通过调用第一个transformNxN函数计算相应的SAD来决定是使用DCT-2变换还是transformSkip模式。
对于LFNST变换,需要遍历lfnstIdx等于1和2的两种情况,分别对于两个LFNST矩阵。
----------------------------------------------------------VTM7.0变换部分更新----------------------------------------------------------------------
- TransformSkip模式下不再对残差进行伸缩和移位(JVET-P1000)
- Enable Transform skip for chroma(JVET-P0058)
- 改进色度帧内预测模式代价准则(JVET-P0058)
- Enable BDPCM for Chroma(JVET-P0059)
- SPS层加入MTSMaxCand控制MTS变换核数目(JVET-P0273)
- ISP模式下可以使用LFNST二次变换(JVET-P0392)
- 修改lfnstIdx和mtsIdx编码顺序(JVET-P0196)
- 为lfnstIdx编码添加一个上下文(JVET-P0350)