最近看了一段时间的JEM的变换部分了,先来总结一些,一来梳理一下思路,加深理解,二来列个提纲,方便大家阅读。
变换是指对当前块减去帧内/帧间预测生成的预测块得到的残差进行变换编码,使能量更多的集中于左上角,从而来降低空间冗余。变换之后会进行量化,而后会进行熵编码。
变换的上层入口
变换的对象是残差信息,残差是当前块减预测块得到的。预测分为帧内/帧间两种。由于JEM引入了KLT变换技术,根据是否使用KLT变换,帧内变换的上层入口被分成了xIntraCodingTUBlock
(多核变换/原HEVC变换)和xIntraCodingTUBlockTM
(KLT变换),两者是竞争关系,选最优者做最后结果。帧间则直接将KLT变换的入口增加在了xEstimateInterResidualQT
中,会遍历两次分别做多核变换/原HEVC变换和KLT变换,两者竞争选最优。不过JEM中KLT复杂度太高,默认是关闭的。
xIntraCodingTUBlock
代码分析详见H.266代码学习:xIntraCodingTUBlock函数
代码框架图及主要函数分析
这里将详细讲一下前向变换的主要函数,反变换部分代码量小很多,而且是前向变换的逆过程,不做介绍了。
前向变换代码框架图(点击看大图):