懒人李冰

记录我的生活、学习

AV1(DAV1D) 解码详解(一)

AV1作为一个开放、免专利的视频编码格式,专为通过网络进行传输而设计。学习一个新的视频编解码标准除了看SPEC,最好的方法是看源码aom。本文主要记录 AV1 中使用到的技术、官方工程 AOM 和 DAV1D 两个工程的建立。

AV1 工具介绍

编码块划分

尽管编码块的划分是在编码端完成,但作为一个视频压缩中的技术手段,这里也给出简单的描述。

VP9 中使用最大块64x64的块,沿着 4 个方向划分到最小的4x4块,并且对8x8块有额外严格的限制。AV1 不仅扩大了划分方式到 10 个方向,并且增大最大块到128x128,这其中包括了4:1/1:4的矩形划分(该划分方式不存在于 VP9 中)。对于举行划分,无法进行递归的划分。AV1 对于8x8以下的块有更加灵活的划分方式。

注意,图中标记为 R 的,代表还可以继续向下划分。

DAV1D中关于块划分和块大小的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
enum BlockPartition {
    PARTITION_NONE,
    PARTITION_H,
    PARTITION_V,
    PARTITION_SPLIT,
    PARTITION_T_TOP_SPLIT,
    PARTITION_T_BOTTOM_SPLIT,
    PARTITION_T_LEFT_SPLIT,
    PARTITION_T_RIGHT_SPLIT,
    PARTITION_H4,
    PARTITION_V4,
    N_PARTITIONS,
    N_SUB8x8_PARTITIONS = PARTITION_T_TOP_SPLIT,
};

enum BlockSize {
    BS_128x128,
    BS_128x64,
    BS_64x128,
    BS_64x64,
    BS_64x32,
    BS_64x16,
    BS_32x64,
    BS_32x32,
    BS_32x16,
    BS_32x8,
    BS_16x64,
    BS_16x32,
    BS_16x16,
    BS_16x8,
    BS_16x4,
    BS_8x32,
    BS_8x16,
    BS_8x8,
    BS_8x4,
    BS_4x16,
    BS_4x8,
    BS_4x4,
    N_BS_SIZES,
};

帧内预测

VP9 支持 10 种帧内预测模式,其中包括 8 个方向预测模式(角度从 45° 到 207°)和 2 个非方向预测模式(DC 和 TM 模式)。AV1 中,帧内编码从各个角度对它进行了升级:从方向预测的角度进行了升级、非方向预测通过考虑梯度和丰富预测因子来进行了升级、利用色度和亮度的相关性进行了升级以及针对人为制造内容进行了工具的开发。

更多的方向预测模式

AV1 支持 56 个方向的预测,利用当前块的上边界和左边界,重建的图像,通过方向的差值来预测当前块的像素值,它的角度的表达式方向是从 8 个主要的差值方向中,选择其中之一,并用一个 Delta 值来确定精确的角度。

非定向平滑帧内预测器

除方向预测模式外,AV1 还支持非定向帧内预测模式,它有 4 种不同的差值方法对当前值进行预测,当前值 P 将会由深蓝色模块的像素差值获得。

AV1 通过增加 3 种平滑预测模式 SMOOTH_V、SMOOTH_H、SMOOTH 扩展非定向帧内模式,它们分别是在纵向、横向以及双向平均的方式进行二次差值。除此以外,还有一个 PAETH 预测器。

基于递归滤波的帧内预测器

利用滤波的方式递归地对每个像素值进行预测,在编解码方面复杂度会有所提升。

从亮度值预测色度值

从亮度值预测色度值得工具,它利用视觉图像当中亮度值通道与色度值通道具有高度相似性的特点,通过选择适当的参数再以重建亮度值通道来预测色度值,这个工具对于游戏视频具有很好地压缩效果。

调色板模式

调色板模式是将块内的元素当做几种离散的颜色,不同于直接传输像素本身的参数值,而是通过传输色块的颜色编号实现压缩的目的。AV1 支持从 8x8 到 64x64 的块,支持调色板模式,编码器会自动根据视频内容选择是否使用调色板模式。调色板模式对于当前块有单一色调的场景十分有用,一般这种场景出现在屏幕内容的压缩当中。宏块的每个平面的调色板预测期由两部分指定:1. 一个调色板,有2-8 种颜色。2. 块中每个像素的颜色索引。基色的数量决定了保真度和紧凑性的平衡。使用基于邻近的上下文对颜色索引进行熵编码。

帧内拷贝模式

AV1 允许它的帧内编码器在预测当前块时,回去往回搜索当前帧中已经重建的部分,这种方式在某种程度上与帧间编码搜索之前的帧是类似的。该方法对于屏幕内容的视频压缩非常有效,因为屏幕内容的视频通常会在同一帧中包含相同的文本、字符等内容。下图是一个典型的帧内拷贝应用场景,因为文字图片里很多字母相同,使得它的压缩效率可以高达 50%。

帧间预测

帧间压缩工具比帧内压缩工具更丰富。AV1 比 VP9 在参考帧的数量和结构上有了进一步的优化,支持 8 个参考帧,并能够使用其中的 7 个参考帧进行预测,而 VP9 只使用了其中三个。AV1 还支持分层结构进行双向预测。

扩充参考帧

AV1 将每帧的参考帧个数从 3 个扩充到 7 个。这里面除了包括 VP9 中提到的 LAST 帧、GOLDEN 帧和 ALTREF 帧外,还添加了两个最近的 LAST2 和 LAST3 帧和两个最近的 BWDREF 和 ALTREF2 帧。如下图所示,该图描述了一个 golden-frame 组中多层结构,该组中多个帧共享同一个 GOLDEN 和 ALTREF 帧。BWDREF 帧是一个 look-ahead 帧,它直接编码不进行滤波,因此更适合作为后向参考帧。ALTREF2 作为中间的未来滤波的参考,它位于 GOLDEN 和 ALTREF 中间的。所有这些参考帧或者通过单一预测模式被选中、或者通过组合预测模式被选中。AV1 提供了大量的参考帧组合,同时支持双向和单向组合预测。

高级合成预测

当有两个参考帧时,如何把它们融合在一起生成预测块,AV1 在这方面支持多种不同的方式来生成预测块,包括平均值运动补偿、加权运动补偿、楔形分割预测等等。

运动补偿的原理是利用平滑滤波的方式将两个运动补偿块重叠在一起,特点是能够消除运动的不连续性带来的影响,以此提高预测准确率。双向预测种,可以通过调整两个预测块的权重来达到生成不同预测块的目的。AV1 除了支持平均运动补偿外,还会根据参考帧的距离来加权生成预测块,特点是当一个参考帧距离现在帧非常近的时候,它的预测准确度可能会更高,于是我们给予它更高的权重,当另一个参考帧距离比较远的时候,给予远处的参考帧一个更低的权重,权重并不直接通过比特流传输,会通过传输序号的方式在预设值的表格里查询对应的权重。

AV1 还支持楔形分割预测,可以通过方块运动补偿中无法准确模拟物体边界的缺点。楔形分割已经作为查表预存在编解码器中,通过编码器选择合适的最佳楔形分割方式传输比特流来告知解码器。

转换编码

转换块划分

转换块划分。在 VP9 中的转换块划分是固定大小的,AV1 允许亮度帧间编码块划分成不同大小的转换单元,它可以通过最多 2 个级别的递归分区来表示。为包含扩展的编码块划分,AV1 支持正方形、2:1/1:2、4:1/1:4 的转换大小。从4x4 到 64x64。除此之外,亮度转换单元通常选择最大可能的尺寸。

扩展转换内核

AV1 编码中,对帧内和帧间块增加了很多转换方法。在变换处理方面,AV1 除了支持传统的 DCT 外,还支持 ADST、fADST、IDT,由于他们都是二维可划分的,所以 AV1 共支持 16 种组合。

环路滤波和图像后处理

AV1 使用了非常多的环内滤波工具作用于解码帧中。最初阶段是去块滤波器(Deblocking Filter),该滤波器与 VP9 中使用的那个有很少的改动。最长滤波器由 VP9 中的 15-taps 减少到 13-tap。其他在 AV1 中使用的滤波器有以下几种: 约束方向增强滤波器(CDEF)、超分辨率重建(Frame Super-resolution)、 环内重建滤波器(Loop Restoration Filters)、电影颗粒胶片效果合成器(Film Grain Synthesis)。

约束方向增强滤波(CDEF)

约束方向增强滤波器,应用在去块滤波之后,对每一个 8x8 的块估计物体的方向,并沿着物体方向采用增强滤波,它能保留物体边缘的清晰度,提升重建图像的质量。

帧超分辨率重建

帧超分辨率重建,应用在 CDEF 之后,它首先将图像沿着水平方向降采样,只对低分辨率图像进行编码,在解码器升采样把分辨率图像还原为原分辨率。这个方法显著提升了低码率下的编解码的主观观测质量。

环内重建滤波器

环内重建滤波器,是另一个重要的增强图像质量的后期处理方法。它包含了两种滤波器。编码器从两者中选择其一。维纳滤波器采用可分离的对称设计。自导向投影滤波器使用两个重建信号的线性组合来近似真实信号。编码器通过比较滤波结果,选择合适的参数,并传输给解码器。

DAV1D 中关于这两种滤波器定义如下:

1
2
3
4
5
6
enum Dav1dRestorationType {
    DAV1D_RESTORATION_NONE,
    DAV1D_RESTORATION_SWITCHABLE,
    DAV1D_RESTORATION_WIENER,
    DAV1D_RESTORATION_SGRPROJ,
};

电影胶片颗粒效果合成器

电影胶片颗粒效果合成器,是针对高质量视频而设计的一个工具。电影胶片的颗粒效果,很难用传统的视频压缩方法保留。AV1 将颗粒效果合成作为后期处理的步骤,对颗粒效果单独处理,它的工作原理是将电影胶片颗粒效果在编码前从原视频中分离出来。分离后的图像进行普通编解码,而颗粒效果在最后与解码后的图像合成为最终的输出视频。

AOM 工程

AV1 前期准备

  • 安装CMake,版本需求 3.5 以上。
  • 安装Git
  • 安装Perl
  • 对于x86,需要安装yasmnasm
  • 安装python

获取源码

1
$ git clone https://aomedia.googlesource.com/aom

编译

AV1采用的配制方法不再是通常的config命令,而是cmake.cmake会生成配置文件和编译文件,大多数系统中,默认的编译文件是Makefile。 执行cmake会得到如下提示:

1
2
3
4
cmake [options] <path-to-source>
...
Options
    -G <generator-name> = Specify a build system generator.

某些参数可以直接通过 cmake传递进去,如是否编译encoder

其实不止 AV1 的官方代码,DAV1D工程,同样有类似的配置过程,只不过它使用的是meson而不是cmake,但效果是一样的。

Linux 下编译方法

Linux 下的编译最简单了,只需要用cmake配置,然后make编译即可。

1
2
$ cmake path/to/aom
$ make

上面的方法就可以用到Linux平台下,生成aomdec可执行文件,进行解码。

Windows 下编译方法

Windows下使用Visual Studio同样可以编译运行av1的代码。只需要在cmake时指定 VS 版本号即可,支持的工具可以通过cmake --help来查看。

1
2
3
$ make aom_vs
$ cd aom_vs
$ cmake /path/to/aom -G "Visual Studio 12 2013 Win64" -DCONFIG_AV1_ENCODER=0 -DCONFIG_LOWBITDEPTH=0 -DAOM_TARGET_CPU=generic

此时在aom_vs路径下,会生成一个AOM.sln,用VisualStudio 2013打开该文件后,编译运行即可使用VisualStudio调试学习了。

交叉编译

1
2
3
4
$ mkdir aom_armv7
$ cd aom_armv7
$ CFLAGS="-pie -fPIE" LDFLAGS="-pie -fpIE" cmake /path/to/aom -DCROSS=/path/to/cross_build_tool_bin/ -DCMAKE_TOOLCHAIN_FILE=/path/to/tools -DCONFIG_AV1_ENCODER=0 -DCONFIG_LOWBITDEPTH=0
$ make

配置选项

上面再编译的过程中,已经提到了很多配置选项,在此举几个例子:

  • -DCONFIG_AV1_ENCODER=0表示不编译av1 encoder
  • -DAOM_TARGET_CPU=generic表示不编译汇编。
  • -G "Visual Studio 12 2013 Win64"表示生成的配置文件,可以通过VS2013来打开编译运行。
  • -DCMAKE_CONFIGURATION_TYPES=Debg表示生成Debug 类型的可执行文件。

AOM VS 工程

DAV1D 工程

DAV1D 工程是一个跨平台的 AV1 解码器,该开源项目的目标是加速解码进度,解决目前还没有硬件支持 AV1 解码的问题。它包括了大多数 AOM 工程的特性。浏览该工程源码,该源码代码比较紧凑、很多函数甚至是宏定义完成的,调试非常困难……

DAV1D 下载

1
2
$git clone git@code.videolan.org:videolan/dav1d.git
$git clont https://code.videolan.org/videolan/dav1d.git

DAV1D 工程编译

  1. 安装Meson(0.47或更高版本)和 Ninja,如果是 x86 平台,需要安装nasm(2.13.02或更高版本)
  2. cd dav1d
  3. meson --buildtype debug --backend vs2017 ./ vs2017,其中各个参数的含义,可以通过meson --help命令查看,注意,该命令的执行要在 Visual Studio 工程的 Native Tool Command 下执行。有时可能是安装时的配置的问题,即使在 Native Tool Command 下执行,仍然有问题,我是在Developer Command Prompt for VS 2017下执行成功的。
  4. 安装完成后,就可以使用 Visual Studio 2017 打开 dav1d.sln 了。

DAV1D VS 工程

参考文档

AV1 Codec Library

欢迎添加微信交流