时间:
2015年
级别:
IEEE
机构:
上海交通大学
摘要
x265是一款开源的HEVC编码器,采用了多种优化技术,具有较快的编码速度和优良的编码性能。作为HEVC的一项关键技术,x265还采用了样本自适应偏移(sample adaptive offset, SAO)来减少重建帧与原始帧之间的失真。尽管x265采用了多种并行加速技术,但对SAO相关计算量的减少研究较少,使得SAO因计算量大而成为速度瓶颈。首先,深入研究和分析了x265中SAO的实现和复杂度;然后,基于帧间预测模式、CTU的空间相关性以及亮度和色度之间的关系,提出了一种提前终止SAO过程的快速算法。实验结果表明,在BDBR仅增加0.52%或BDPSNR损失0.014 dB的情况下,该算法可以节省 72.2% 的SAO处理时间。
介绍
与H.264/AVC相比,高效视频编码(HEVC)在相同视频质量下码率降低了50%。HEVC采用了更灵活的编码树块(CTB)和样本自适应偏移量(SAO)等先进技术。作为一种新采用的技术,SAO在去块滤波之后,通过给每个像素增加一个偏移量来减少重建帧与原始帧之间的失真。SAO包括两种类型的偏移量:带偏移量(BO)和边缘偏移量(EO)。对于每种类型,将每个像素分为不同的类别,并计算重建像素值与原始像素值之间的差异,以确定最佳偏移量。因此,每对像素之间的差值需要计算5次(BO 1次,EO 4次),计算复杂度很高。
x265是一个开源的编码器,旨在提供世界上最快和计算效率最高的HEVC编码器。该编码器采用帧并行和波前并行,在多核处理器上可以显著提高编码速度。在环路滤波器之前,还对编码过程进行了许多优化,如简化模式选择、利用单指令多数据流(SIMD)和多媒体扩展(MMX)等。
然而,对SAO相关计算的优化研究较少,使得SAO成为x265的速度瓶颈。通过分析x265的计算复杂度,SAO约占总编码时间的22.1%。
同时,SAO是一种非常有效的编码工具,可以大大提高编码性能。在HEVC参考软件HM上实现了平均2%的码率下降,在x265编码器上实现了6.7%的码率下降。因此,在x265的实时实现中,迫切需要快速、高效、低复杂度的SAO算法。
目前,有关的研究工作较少,以获得编码性能损失较小的低复杂度SAO算法。利用帧内预测模式信息,在[4]
中提出一种SAO快速编码算法,简化最佳SAO边缘偏移类型的决策过程。在[5]
中,利用减少SAO类型候选项、下采样统计和预去块效应重建技术,提出了一种优化的SAO算法。在[6]
中提出了一种减少BO候选波段数和EO类别计算的SAO快速编码算法。
然而,这些快速SAO算法仅在HM上表现良好,不适用于x265。例如,在x265编码器中,为节省编码时间,对B帧禁用了intra-in-inter rate-distortion optimization (RDO)过程。由于没有帧内预测信息,因此不能采用[4]中提出的方法。而在x265中采用下采样的方法会造成一定程度的编码性能损失。
本文提出了一种快速的SAO算法,该算法利用了帧间模式选择过程中的skip模式信息、CTU的空间域相关性以及亮度和色度之间的关系。由于x265的更快设置比其他设置具有更好的编码速度和RD性能权衡,因此本文的所有测试和讨论都是基于x265版本1.2
的更快设置。本文的其余部分组织如下。第二节分析了x265中的SAO过程。第三节详细介绍了所提出的算法。第四节和第五节分别给出了实验结果和结论。
x265中SAO
SAO是在去块滤波之后应用的一种环路滤波器,旨在减少主要由量化误差引起的振铃效应。SAO参数包括合并标志、SAO类型和四个偏移量,分别对应BO的四个连续波段或EO的五类中的四类。该算法通过在每个频带或每个类别中增加像素的偏移量来减少重建帧与原始帧之间的失真。SAO由两种不同的类型组成,即带偏移(BO)
和边缘偏移(EO)
。
带偏移BO
在带偏移(BO)中,所有像素被划分为32个固定的带,每个带具有相同的强度间隔。每个带有一个偏移量,定义为该带内重建像素值与原始像素值之间的平均差值。由于某一CTU内的像素值都集中在少数几个带,为了节省码率,通过RD代价只选择4个连续的带,如图1所示。将4个对应的偏移量和第一选择频带的位置传输给解码器进行采样补偿。
边缘偏移EO
采用0度
、90度
、135度
、45度
4种1-D 3像素模式对边缘偏移进行像素分类,如图2所示。每个模式对应于一个EO类型。对于每一种类型,通过与相邻的两个像素进行比较,将像素分为5类。这五个类别的分类规则如表1所示。除类别0外,每个类别都有相应的偏移量。编码器尝试每一种EO类型,通过计算每种EO类型的RD代价来选择最佳的EO类型。将最佳EO类型及其对应于类别1
、2
、3
和4
的4个偏移量分别编码到比特流中。
x265 中的 SAO
SAO处理在x265的CTU级上执行。对于特定的CTU,首先采集每个SAO类型的统计信息;在某一类图像的采集过程中,将像素分为不同的类别,并计算每类中重建像素与原始像素值之间的总差值,即偏移量的原始值。然后,利用这些统计信息,实现对各类数据中各类别偏移量的估计;然后,基于RD代价选择最优类型及其对应的偏移量;最后,通过检查SAO的合并模式来决定是否使用相邻CTU的SAO参数来替换当前参数。
通过在x265编码器中禁用SAO和启用SAO,对编码性能和编码时间进行了分析。作为比较,我们还分析了HEVC参考软件HM 12.0
在“随机接入”配置下的RD性能损失和编码时间。
通过测试A类(2560x1600)和B类(1920x1080)进行实验。结果如表2所示。
如表2所示,禁用SAO导致x265的平均比特率增加6.69% ,HM的平均比特率增加1.98%。因此SAO在x265中更为重要。此外,在x265中禁用SAO使得整个编码时间减少了22.1% ,即SAO在总编码时间中所占的比例很大。因此,降低SAO的计算复杂度对于加速x265至关重要。
提出的SAO算法
使用性能分析工具进一步研究了SAO的复杂性。各部分编码时间占比如图3所示。由此可见,对每种SAO类型的统计收集是最耗时的部分,约占x265中SAO编码总时间的87% 。因此,为了提高SAO处理速度,需要尽早确定SAO类型,以减少不必要类型的统计量收集计算。
将某个CTU限制在BO
和EO(0,1,2,3)
的一种或两种SAO类型是不合理的。然而,我们发现大部分的CTU最终被识别为SAO OFF,这意味着SAO并没有被应用在这些CTU上。如果我们能够预先将这些CTU与其他CTU区分开来,并将它们设置为SAO OFF,那么就可以保存所有与SAO相关的计算,如统计信息的收集或每种SAO类型的RDO计算。
本文提出了三种基于帧间预测模式、CTU的空间相关性和亮度与色度的关系来准确区分CTU的方法,并将其设置为SAO OFF。
基于64x64跳过模式的SAO提前终止
将SAO应用于消除量化误差引起的振铃效应。但如果将64x64大小的CTU的最佳模式确定为跨层预测的skip模式,则该CTU将主要集中在背景或简单运动的区域,振铃效应很少。此外,以skip模式为最优模式的64x64尺寸的CTU,其残差较小,在量化过程中被量化为零,并且没有残差系数被编码到比特流中。因此,这些CTUs采用低码率编码,这意味着它们对SAO参数引起的码率增加更加敏感。这些观察结果表明,skip模式下的CTUs被设置为SAO OFF的概率很大,这与接下来的研究结果一致。
我们调查了被选择为SAO的64x64_skip CTUs和其他CTUs的命中率,如表3所示。值得一提的是,每个序列的命中率都是QP=22
、27
、32
和37
的平均值。从表3中,我们可以注意到命中率从左到右递减。在64x64_skip CTUs的情况下,命中率相当高,从76.9%到96.7%不等。因此,我们可以提前确定64x64_skiped CTUs的SAO类型为SAO OFF。在进一步分析的基础上,在下章节介绍了其他CTU的解决方案。
基于CTU空间相关性的SAO提前终止
研究者发现空域相邻CTU的深度搜索范围与RD代价之间存在相关性。这也适用于SAO类型的决策。相邻的CTU可能具有相似的纹理和运动特征。因此,如果当前的CTU左邻域和上邻域的CTU都是SAO OFF,那么当前的CTU很可能被设置为SAO OFF。我们进一步实现了一个实验来验证这一点,测试命中率,被定义为SAO关闭的CTU在左侧和上述相邻CTU中所占的比例。结果如表4所示。
在这种情况下,高达96.3%的CTU经过充分的统计收集和RDO后被选择为SAO OFF,我们可以提前确定它们为SAO OFF,而不需要任何统计信息收集和RDO计算。
为了实现进一步的减少,对于相邻的CTU不全是SAO的CTU,我们选择BO
、EO 0
和EO 1
(即EO 0度
和EO 90度
)作为SAO类型的候选。由于很少有CTU编码为EO 2
和EO 3
,因此SAO EO 类型 2和3被禁用且不被检查,从而可以成比例地减少SAO的计算量几乎没有RD性能损失。
基于亮度和色度关系的SAO提前终止
在x265和HM中,亮度和色度的SAO模式选择和编码过程是独立实现的。然而,由于亮度和色度分量的高度相关性,一个CTU的亮度和色度块共享相同的帧间预测模式和相同的MV。因此,选择其中最优的亮度块来预测色度的SAO类型也是可行的。与SAO具有相同类型的亮度分量和色度分量所占比例如表4所示,平均高达96.11%。因此,如果亮度分量被判定为SAO OFF,则提前终止其色度分量的SAO处理,并将其设置为SAO OFF,从而在保证RD性能损失可忽略的情况下节省色度处理时间。
整体SAO算法
基于上述分析,提出的整体算法如图4所示。由于P帧和I帧分别是B帧和相邻P帧的参考帧,它们对SAO类型的错误判断更加敏感,因此对P帧和I帧采用严格的策略以保持SAO性能。也就是说,对于64x64_skied CTUs,我们不检查两种类型的EO 2和3,而对于其他CTUs,完整的SAO过程应该通过检查所有的SAO类型来实现。
所提算法总结如下:
步骤1:
检查当前CTU的帧类型,然后检查CTU类型。如果是I帧或P帧,请执行步骤2;否则请执行步骤4。
步骤2:
如果当前64x64大小的CTU的最优模式为skip模式,执行“BO
”、“EO 0
”和“EO 1
”的SAO处理,然后转到步骤7。否则,请执行步骤3。
步骤3:
执行亮度的整个SAO过程,然后转到步骤7。
步骤4:
如果当前64x64大小的CTU的最优模式为skip模式,请提前确定亮度的SAO类型为SAO OFF,然后执行步骤7;否则,请执行步骤5。
步骤5:
如果当前CTU左侧和上方相邻的CTUs都是SAO OFF,则提前确定亮度的SAO类型为SAO OFF,执行步骤7;否则,请执行步骤6。
步骤6:
执行亮度的BO
、EO 0
和EO 1
的SAO过程,执行步骤7。
步骤7:
检查当前CTU亮度是否SAO OFF。如果是,提前确定色度的 SAO类型为 SAO OFF;否则,对色度做相同的分析亮度从步骤1到步骤6。
实验结果
提出的SAO算法在x265 v1.2上进行了快速实现。选取JCT-VC推荐的A类(1920x1080)和B类(2560x1600)中的测试序列,在QP 22
、27
、32
和37
上评估本文方法的性能。实验结果如表5所示。锚点是启用SAO的原始x265。这里的SAO时间节省定义为
实验结果表明,所提算法在BDBR仅增加0.52%或BDPSNR损失0.014dB的情况下,平均可以节省72.2% 的SAO时间。由于在x265中禁用SAO, BDBR平均增加了6.69% ,如表2所示,因此可以得出结论,该算法仅用原始SAO编码过程的27.8%计算量就可以保持92.2%的SAO性能。因此,所提方法是非常有效和有价值的。
序列“BQTerrace”在SAO开启、SAO关闭和所提算法下的RD性能曲线如图5所示。可以看出,本文算法得到的RD曲线与原算法得到的RD曲线具有较高的一致性,并且远优于SAO OFF算法得到的RD曲线。
结论
本文对x265中的SAO进行了性能分析,提出了一种快速的SAO算法。该算法利用帧间预测的64x64跳过模式、CTU的空间域相关性以及亮度和色度之间的关系等信息,提前判断SAO类型为SAO OFF或减少SAO类型搜索候选集。实验结果表明,该算法在BDBR仅增加0.52%或BD-PSNR损失0.014dB的情况下,使SAO的计算复杂度降低了约72.2%。