本文介绍AV1编码器中的去方块滤波模块的原理设计、代码实现以及快速算法。
去方块环路滤波器用于解决重建图片中的块效应问题。该滤波器是在VP9去块滤波器的基础上开发的,本质上是一种低通滤波器,通过对边界求平均值保留低频部分达到滤波效果。可以作用于水平/垂直、亮度/色度边界部分。与H.26x系列不太一样的地方在于它的滤波系数是通过搜索得到的。
具体的滤波过程如图所示。
去方块滤波器根据横跨边缘的最小变换尺寸以及是否在多个滤波器之间切换 边缘的最小变换大小,并根据边缘周围的区域是否相对平坦,在多个滤波器之间进行切换。边缘周围的区域是否相对平坦。对于一个给定的块,垂直边缘首先被过滤,然后是对水平边缘的过滤。边缘的过滤。该过滤器的主要思想可以总结为以下几点。
1.边界两侧的像素如果显示出明显的数值差异,该边缘很可能是一个真正的边缘,就不会被过滤。
2.如果边界两边的像素要被过滤,则要根据如表中的准则选择过滤器。
DB的首先需要确定滤波的level和sharpness,两者都是帧级别的参数,其中对level参数,会在块级别依赖其他信息进行微调。
确定了滤波lvl和sharpness后,需要进一步确定出其他的参数,包含limit blimit thresh等。这些参数都是块级别的参数。他们首先依赖于frame-level的设置,再通过划分、编码模式、参考帧和像素数据等进行refine。
根据之前的结果选择并应用滤波器。此部分如所示流程图。右边两个图则分别表示了Filter4和Filter8所对应的情况。
AOM参考代码中给出了包含如图所示的几种快速算法。随着提速的变大,DB的压缩效率也越来越低。
对于硬件实现而言,执行真实的搜索从而得到不错的压缩表现是不切实际的,往往无法等到整帧编码完成再进行搜索和滤波。
最好可以在编码LCU的时候就知道DB的滤波参数系数大小,因此LPF_PICK_FROM_Q是比较合适的,其仅需要读取量化参数就可以推算出滤波系数。
对于DB而言,需要给以下五个部分的语法元素到熵编码模块中。包含亮度分量水平和垂直的滤波强度、色度分量u和v的滤波强度。以及强度阈值sharpness。
此图给出了AOM代码DB部分的代码逻辑,可以看到主要包含了两个分支,一个是对滤波强度的选择、另一个则是对实际执行滤波操作。可以看到函数av1_loop_filter_frame是复用的,表示了在滤波搜索的过程中也会进行滤波过程。
以上是参考资料。
关 注 我 们
实验室网站:http://viplab.fudan.edu.cn/
OpenASIC官方网站:www.openasic.org
知乎专栏:http://zhuanlan.zhihu.com/viplab
微信公众号:OpenASIC
继续阅读
阅读原文