H.266 JEM7.0 变换之一(大尺寸块的高频归零以及自适应多核变换AMT)

高频归零的大尺寸块变换

JEM中,支持大尺寸块的变换(最大为128x128),主要用于高分辨率视频。高频变换系数数在变换块(宽或高,或者宽和高)大于等于64时归零,所以只包含低频系数。由于块尺寸较大,变换后的高频分量大多集中在块的左上角部分,通过此操作可达到减少数据量的目的。
如对于宽为M,高为N的MxN的变换块,当M大于等于64时,只保留左侧32列的变换系数。同样,当N大于等于64时,只保留顶部32列的变换系数。当大尺寸块采用transform skip模式,整个块不进行调零操作。调零操作语句为:
iWidth/iHeight > ZERO_OUT_TH ? iWidth-ZERO_OUT_TH : 0
其中,ZERO_OUT_TH = 32
且在前向变换函数及反向变换函数中均有相关操作,所对应的宏为:JVET_D0077_TRANSFORM_OPT

自适应多核变换

Adaptive multiple core transform(AMT)
除了HEVC中加入的DCT-II以及4x4 DST-VII,AMT也被用来对帧间核帧内块进行残差编码。AMT使用了DCT/DST中的多个变换。如下表所示:
这里写图片描述
为了保持变换矩阵的正交性,变换矩阵相比于HEVC进行了更精确的量化。为了控制变换系数的中间值在16bit 范围内,在水平和垂直变换后,所有的系数比HEVC中多右移2位。
AMT在宽高均小于等于64的CU中使用,并通过CU级别的一个标志位来表明是否使用AMT。当flag = 0,CU中使用DCT-II编码残差。对AMT可用的CU亮度编码块而言,需多传输两个flag来表明使用的是水平还是垂直变换。和在HEVC中一致,JEM中块的残差也可以用transform skip模式。为了避免语法编码产生冗余,当CU级别的AMT flag不为零时,transform skip标志位不传输。
变换量化的主函数为:

TComTrQuant::transformNxN()

该函数中负责变换的函数为(若为transform skip模式选择前者,没有进行DCT变换,只是把残差系数位移;否则选择后者):

TComTrQuant::xTransformSkip()
TComTrQuant::xT()

transformNxN()函数下负责量化的函数为:

TComTrQuant::xQuant()

函数xT()中,负责多核变换的函数为:xTrMxN_EMT(),首先控制变换系数的中间值,比HEVC中多右移两位,随后模式选择的过程主要分为两步:

  • 如果是帧内且变换模式不是DCT2_EMT,进行帧内水平垂直变换模式的选择;
  • 如果是帧间且变换模式不是DCT2_EMT,进行水平垂直变换模式的选择。

最后再根据所选模式,进入相应的函数指针数组,调用函数,进行快速的垂直、水平变换。

帧内残差编码

由于不同帧内预测模式的残差数据不同,使用基于模式的变换候选选择操作。定义三个如表所示的变换子集。变换子集的选择是根据帧内预测模式进行的。
三个变换候选集
各帧内预测模式水平H以及垂直V变换子集
Transform Set所对应函数中的数组,帧内预测模式所对应的垂直、水平子集分别为:

g_aiTrSubsetIntra[3][2]
g_aucTrSetVert[NUM_INTRA_MODE-1]
g_aucTrSetHorz[NUM_INTRA_MODE-1]

当CU的AMT flag = 1时,帧内预测的变换子集需先定义。随后,每个水平和垂直变换,基于显式标记的标志来选择两个候选中的一个。

帧间预测残差

只有一个变换集合,包括DST-VII以及DCT-VIII,用于所有帧间模式的水平、垂直变换。
Transform Set所对应函数中的数组为:

g_aiTrSubsetIntra[4]

编码端的加速操作

由于所有五个不同的变换候选在残差块穷举搜索时均需要计算率失真代价以便于衡量,AMT在编码端的复杂度相对较高。故有下述编码过程的加速方法:
在编码端,每个CU的编码模式均使用两次。如下左图,第一个通道计算对CU只使用DCT-II(CU级别flag = 0)的率失真代价,第二个通道计算采用多种变换(CU级别flag = 1)的率失真代价。此外,通过观察可发现,无论使用哪个通道CU级别的编码模式是相对一致的。所以,当确定CU的多变换通道时,只使用DCT-II的数据被收集并用于跳过非必要的第二个多变换通道的率失真计算。如下右图,当CU的AMT flag = 0时编码模式的率失真代价超过最小率失真代价的门限时,跳过第二个多变换通道。
这里写图片描述
加速过程的判断为:ucEmtUsageFlag(在函数estIntraPredLumaQT()中)
若为0表明当前CU不使用EMT;
若为1表明当前CU使用EMT,且计算DCT2
若为2表明当前CU使用EMT,且DCT2的存储结果会被重复利用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值