由于SAO需要样本级操作来将每个样本分类为编码器和解码器中的边带或类别,因此需要尽可能减少每个样本的操作数量,以降低总体计算复杂性。在编码器端,有许多SAO类型需要测试,以在合理的计算复杂性下实现更好的速率失真性能。本文将讨论一些有效的编码器算法。
关于SAO的介绍可以参考:样本自适应偏移 Sample Adaptive Offset (SAO) – 我受到了惊吓 (mmedia-t.cn)
Fast Edge Offset Sample Classification
可以通过使用以下函数和方程以更有效的方式实施EO样本分类:
其中,“c”是当前样本,“a”和“b”是两个相邻样本。作为进一步的加速,上一步骤中获得的数据可以在下一个样本的分类中重复使用。例如,假设EO类为0(即,一维水平图案),并且CTB中的样本按照光栅扫描顺序进行处理。当前样本的“sign3(c-a)”等于左侧相邻样本的“sign3(c-b)”。同样,当前样本的“sign3(c-b)”可以被右侧的相邻样本重用。在软件实现中,sign3(x)函数可以通过使用逐位操作或查找表来实现,以避免使用if-else操作,这在某些平台上可能是耗时的。
Fast Band Offset Sample Classification
样本范围在BO中平均分为32个波段。由于32等于2的5次幂,所以BO样本分类可以实现为使用每个样本的五个最高有效位作为分类结果。通过这种方式,BO的复杂性降低了,特别是在硬件中,只需要电线连接而不需要逻辑门来从样本值获得分类结果。为了减少软件解码运行时间,可以通过使用逐位操作或查找表来实现BO分类,以避免使用if-else操作。
Distortion Estimation for Encoder
速率失真优化过程需要多次计算原始和重建样本值之间的失真。一个简单的SAO实现将通过向de-blocking后的样本添加偏移,然后计算得到的样本和原始样本之间的失真。为了减少存储器访问和操作次数,可以如下实现快速失真估计方法。设k, s(k)和x(k)分别是样本位置、原始样本和重建样本,其中k属于C,CTB内属于特定SAO类型(即BO或EO)起始边带位置或EO类别以及特定边带或类别的样本集合。原始样本和重建样本之间的失真可以通过以下等式描述:
原始样本和SAO修改的样本之间的失真可以通过以下等式描述
其中h是样本集的偏移量。失真变化由以下方程定义:
其中N是集合中的样本数,E是原始样本和重建样本(SAO之前)之间的差值之和,如以下等式所定义:
请注意,样本分类和(7.28)可以在去块滤波后输入样本变得可用后立即计算。因此,N和E只计算一次并存储。然后,ΔJ定义如下:
其中λ是拉格朗日乘数,R表示估计的比特。
对于具有特定SAO类型(即BO或EO)、起始频带位置或EO类别以及特定频带或类别的给定CTB,测试接近E/N的几个h值(偏移),并选择使ΔJ最小化的偏移。在选择了所有边带或类别的偏移之后,将32个BO边带中的每个边带或五个EO类别中的每个的ΔJ相加,以获得整个CTB的速率失真成本的增量(变化)。使用零偏移和EO类别0的BO边带的失真可以通过(7.25)预先计算,并存储以供后续重复使用。当SAO降低整个CTB的成本(即,增量成本为负)时,该CTB启用SAO。类似地,通过快速失真估计可以找到最佳SAO类型和最佳起始位置或EO类。
Slice-Level On/Off Control
HM参考软件通用测试条件使用分级量化参数(QP)设置。作为示例,在随机接入条件下,GOP大小为8。根据帧在GOP中的位置,帧可以属于不同的层次结构级别。通常,帧仅从具有较小或相同层次结构的帧中预测。具有较高层次结构的帧可能会被赋予较高的QP。
如下提供Slice级开/关判定算法。对于层次结构级别0的帧,Slice header中始终启用SAO。给定具有非零层次级别N的当前帧,先前帧被定义为解码顺序中具有层次级别(N-1)的上一个图片。如果在前一张图片中超过75%的CTB中禁用SAO,HM参考编码器将在当前图片的所有切片标头中禁用SAO,并跳过SAO编码过程。这种编码器技术不仅可以减少要解析的语法数量,还可以提高0.5%的BD速率。请注意,亮度和色度SAO可以在Slice header中单独启用或禁用。
SAO Parameters Estimation and Interaction with Deblocking
在HM参考编码器中,估计每个CTU的SAO参数。由于SAO被应用于去块滤波器的输出,所以在去块样本可用之前,不能精确地确定SAO参数。然而,当前编码树块(CTB)中的右列和底行的解块样本可能不可用,因为右侧的CTU和当前CTU下方的CTU可能尚未被重建(在单通道编码器中)。这一限制可以通过两个选项中的一个来克服。第一个选项估计可用CTB样本上的SAO参数,即除了三个底行亮度样本、一个底行Cb和Cr样本、最右侧四列亮度样本、最右边两列Cb和Cr样本之外的CTB样本。当使用64×64 CTU大小时,所提出的方法不会引起显著的编码效率损失。然而,对于较小的CTU大小,SAO参数估计中未使用的样本百分比较高,这可能导致显著的编码效率损失。在这种情况下,第二选项在SAO参数估计期间使用去块之前的样本,而不是不可用的去块样本,这可以减少较小CTU大小的编码效率损失。