limit-sao测试与简单总结


SAO简述:

Sample Adaptive Offset(SAO)是作为HEVC内部环路滤波器(in-loop filter)存在的。由于HEVC使用比起AVC更加灵活的块分割策略(主要体现在超大的转换单元),因此容易产生更多的由于量化错误导致的瑕疵(例如ringing)。

SAO的主要思路就是首先将重建的样本分类为不同的类别,获得每个类别的偏移量,然后将偏移量叠加到该类别的每个样本。每一类的偏移量会在编码器里适当地计算出且明确地将信息给解码器,以有效降低取样失真,为了节省Side Information,样本类会在编码器和解码器中实现;为了在只有一编码树单元的情况下达到低延迟,基于编码树单元的句法被设计成可以指定取样自适应偏移的系数,此基于编码树单元最佳化算法可以导出每一编码树单元的取样自适应偏移系数,并且将取样自适应偏移系数交错放入Slide Data。(Wiki)

首先是样本压制速度测试:

Amaama_to_Inazuma Netoge_no_Yome Ajin_The_Movie Relife
–no-sao 771.57s 1261.64s 1385.48s 681.04s
–sao –limit-sao 819.33s 1299.52s 1403.46s 717.00s
–sao –no-limit-sao 837.08s 1319.80s 1419.23s 748.98s

按照文档说明在Faster的预设下能提高10%的速度,但是由于Faster并非我常用的预设,没有太高的参考价值。(ps. SAO原本就是脱胎于BDC/EXC的思路,利用较低成本的计算达到补偿的目的)于是我还是选择了比较接近Slower预设的参数做对比测试。速度提升(limit vs no limit)大约是2%-5%。当然我这次测试limit-sao的参数主要目的并非提高压制速度,而是希望能够解决SAO带来的一些副作用。

SAO典型的副作用是纹理涂抹,画面变模糊。如下图所示:

no-sao________________________________________sao____________________________________

例如图片右侧的高柜毛绒玩具一片区域,在开启SAO后就有明显的模糊现象。

有关SAO模糊的原因我查看了一下相关资料发现:SAO的Edge Offset处理过程中原本定义为offset为正/负值分别会是的图形变得平滑或者锐利。但是HEVC有如下描述”From the statistical analyses [14]–[16], the EO in HEVC disallows sharpening and sends absolute values of offsets, while signs of offsets are implicitly derived according to EO categories.” (Sample Adaptive Offset in the HEVC Standard)也就是说,HEVC为了降低码率开销,对于Edge Offset而言只允许柔化,而不允许锐化的偏移,这样符号位就可以不需要编码。

此外在Band Offset模式下,是将YUV的取值范围均分为32个band并且通过一些算法补偿连续的4个offset值最大的band,以此来拉近YUV重构图像与原始图像之间的差值。当然这样的补偿也存在着以下弊端。”Fig.6. can be used to explain why BO works in a few circumstances. The horizontal axis and the vertical axis are not explicitly shown but are used to denote the sample position and the sample value, respectively. The dotted curve is the original samples, while the solid curve is the reconstructed samples, which might be corrupted by quantization errors of prediction residues and phase shifts due to coded motion vectors deviating from the true motions. In this example, the reconstructed samples are shifted to the left of the original samples, which systematically results in negative errors that can be corrected by BO for bands k, k + 1, k + 2, and k + 3.”(Sample Adaptive Offset in the HEVC Standard)这样的一张图也就能解释为什么开启SAO后不仅出现了模糊,有些线条还出现了位移的现象。

limit-SAO原本的设计用途是降低编解码的压力。这项功能在x265文档中的表述为:启用这个功能后,根据帧间预测,CTU空间域先惯性,色度亮度的关系,在满足一定条件时会提前退出SAO的计算。

在SAO相关代码中用到了6处limit-sao开关:

if (!m_param->bLimitSAO || ((slice->m_sliceType == P_SLICE && !cu->isSkipped(0)) || (slice->m_sliceType != B_SLICE)))
if (!m_param->bLimitSAO || !bSaoOff)
if (!m_param->bLimitSAO || ((lclCtuParam->typeIdx != -1) && !bSaoOff))
if (m_param->bLimitSAO && ((slice->m_sliceType == P_SLICE && cu->isSkipped(0)) || (slice->m_sliceType == B_SLICE)))
if (m_param->bLimitSAO && ((slice->m_sliceType == P_SLICE && cu->isSkipped(0)) || (slice->m_sliceType == B_SLICE)))
if (m_param->bLimitSAO && ((slice->m_sliceType == P_SLICE && cu->isSkipped(0)) || (slice->m_sliceType == B_SLICE)))

根据代码上下文以及一些注释可以发现,在开启limit-sao后,一些SAO的类型,失真率,代价等计算会提前退出.由于减少了这些补偿的相关计算,那么由于这些补偿造成的柔化,偏移等等问题也就同样消失了。

那么再来看一下最后的效果。

limit-sao________________________________________no-limit-sao____________________________________

对比发现,相比之下开启limit-sao的图,毛绒玩具轮廓的模糊偏移问题明显改善了。同时有一定的噪点等瑕疵也随之而来。

根据我抽取的几帧比较来看:

  1. limit-sao的参数能够比较好的约束B帧以及部分P帧中纹理涂抹问题,对I帧影响很低。
  2. SAO的补偿在总体观感上是有一定优势的,主要是消除蚊噪以及Ringing。
  3. 配合适当的纹理增强,在一些番剧中还是比较值得一试的。

参考内容:

http://x265.readthedocs.io/en/stable/releasenotes.html

http://ieeexplore.ieee.org/abstract/document/6324411/

https://zh.wikipedia.org/zh/取樣自適應偏移

http://blog.csdn.net/linpengbin/article/details/48006427

http://www.cnblogs.com/DwyaneTalk/p/5714271.html

http://blog.csdn.net/nk_wavelet/article/details/52662954

http://blog.csdn.net/HEVC_CJL/article/details/8288479

 

, , ,
上一篇文章
limit-tu测试与简单总结
下一篇文章
x265 Stable v2.4 Rip成品体积相关测试

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Fill out this field
Fill out this field
请输入正确的电子邮件地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

菜单