目录
4.2 方向帧内预测
4.2.1 预测方向定义
AV1 把 VP9 标准定义的 8 种帧内预测方向作为基准预测方向:V_PRED、H_PRED、D45_PRED、D67_PRED、D113_PRED、D135_PRED、D157_PRED和D203_PRED。其中V_PRED和H_PRED分别表示垂直和水平预测方向,即预测方向的角度分别是 90° 和 180°。其余名为Dxx_PRED的预测模式表示预测方向角度为 xx。这里的预测方向角度是指预测方向直线与基准方向直线所成的夹角。基准方向直线可视为以待预测像素为起点,水平向右的直线。
由于 AV1 支持较大尺寸的变换块,并且随着变换块尺寸的增大,变换块包含的方向性纹理特征往往会变得更加丰富和复杂。为了覆盖更多的帧内预测方向,每个基准预测方向都有一个与之关联的角度偏移量集合,该集合共包含 7 个角度偏移量。每个角度偏移量以整数索引来标记,索引值范围是 - 3~+3 之间。角度偏移量索引与角度偏移量之间的对应关系如表 4-1 所示,索引值 0 对应角度偏移量 0°;索引值每增加 1,对应的角度偏移量将增加 3°。预测方向是将角度偏移量加到对应的基准预测方向角度上得到的,AV1 共有 56 种帧内预测方向。图 4-5 所示为 AV1 的帧内预测方向,展示了 AV1 中的 8 种基准预测方向以及每个基准预测方向与其角度偏移量相加所表示的预测方向。其中实线表示基准帧内预测方向,虚线表示基准帧内预测方向与其角度偏移量相加所表示的预测方向。
表 4-1 角度偏移量索引与角度偏移量之间的对应关系
| 索引值 | 角度增量 /(°) | 索引值 | 角度增量 /(°) | 索引值 | 角度增量 /(°) |
| -3 | -9 | -2 | -6 | -1 | -3 |
| 0 | 0 | — | — | — | — |
| 3 | 9 | 2 | 6 | 1 | 3 |
由于尺寸较小的变换块(如 4×4、4×8 和 8×4 变换块)的纹理结构方向有限,使用角度偏移量集合扩充得到的帧内预测方向的编码收益通常较小,因此,在 AV1 中,这些变换块只使用基准帧内预测方向。
在 AV1 中,亮度分量和色度分量的帧内预测方向是分开传输的。为了传输亮度分量的帧内预测方向,AV1 定义了语法元素intra_frame_y_mode和angle_delta_y。intra_frame_y_mode用于指明当前亮度变换块使用的基准帧内预测方向,而angle_delta_y用于指明亮度变换块使用的帧内预测方向相对于基准帧内预测方向(intra_frame_y_mode所表示的基准帧内预测方向)的角度偏移量的索引值。angle_delta_y的取值是 0~6,分别对应表 4-1 中的索引值 - 3~3。为了传输色度分量的帧内预测方向,AV1 定义了语法元素uv_mode和angle_delta_uv,以指明色度变换块的基准帧内预测方向和预测方向相对于基准帧内预测方向的角度偏移量。angle_delta_uv的取值也是 0~6,对应表 4-1 中的索引值 - 3~3。

图4-5 AV1的帧内预测方向
4.2.2 参考像素的滤波过程
在 AV1 的方向帧内预测过程中,当预测方向不是垂直和水平方向时,AV1 会根据需要对参考像素进行平滑滤波处理,以提升预测块的视觉质量。这一过程旨在消除参考像素值之间的突兀变化,防止在预测块中形成本来不存在的方向性边缘。在下面的描述中,假设当前变换块的宽度和高度分别是W和H,选定的帧内预测方向的角度用angle表示。
1. 左上角参考像素滤波
对于W+H ≥ 24的变换块,当180° > angle > 90°时,AV1 将利用左上角像素的右侧像素和下侧像素对其进行滤波,滤波器系数是[5, 6, 5]:

2. 左侧和上方参考像素滤波强度推导
当angle不等于 90°,也不等于 180° 时,对于LeftCol[0:W+H-1]和AboveRow[0:W+H-1],AV1 定义了 3 个平滑滤波器来对其进行滤波,包括 2 个 3 抽头滤波器和 1 个 5 抽头滤波器,它们的滤波器系数分别是[0, 4, 8, 4, 0]、[0, 5, 6, 5, 0]和[2, 4, 4, 4, 2]。AV1 根据选定的帧内预测模式和当前变换块的尺寸,为当前变换块推导出滤波器强度strength。然后,根据strength的取值来选择合适的滤波器,对参考像素LeftCol[0:W+H-1]和AboveRow[0:W+H-1]进行滤波。表 4-2 所示为strength的取值及其含义。
表 4-2 strength的取值及其含义
|
的取值 | 含义 |
| 0 | 不对参考像素进行滤波 |
| 1 | 采用 滤波器 |
| 2 | 采用 滤波器 |
| 3 | 采用 滤波器 |
根据当前变换块上方和左侧相邻变换块的预测模式是否是平滑预测模式,AV1 定义了两种不同的方案来推导strength。关于平滑模式的定义,请参考 4.3 节。在下面的描述中,对于上侧参考像素AboveRow[],有d=|angle-90°|;对于左侧参考像素LeftCol[],则有d=|angle-180°|。由于angle不等于 90°,也不等于 180°,因此变量d大于或等于 1。
如果变换块上方和左侧相邻变换块的预测模式都不是平滑预测模式,那么strength的推导过程如下:
- 设置
strength=0。 - 如果
W+H ≤ 8,即当前变换块是 4×4,那么如果d ≥ 56,则strength=1。 - 否则,如果
W+H ≤ 12,即当前变换块是 4×8/8×4,那么如果d ≥ 40,则strength=1。 - 否则,如果
W+H ≤ 16,即当前变换块是 8×8,那么如果d ≥ 40,则strength=1。 - 否则,如果
W+H ≤ 24,即当前变换块是 8×16、16×8、4×16 或 16×4,那么:
-
- 如果
d ≥ 8,则strength=1。 - 如果
d ≥ 16,则strength=2。 - 如果
d ≥ 32,则strength=3。
- 如果
- 否则,如果
W+H ≤ 32,即当前变换块是 16×16,那么:
-
- 如果
d ≥ 1,则strength=1。 - 如果
d ≥ 4,则strength=2。 - 如果
d ≥ 32,则strength=3。
- 如果
- 否则,即当前变换块是 8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64,那么如果
d ≥ 1,则strength=3。
如果变换块上方或左侧相邻变换块的预测模式是平滑预测模式,那么滤波器强度strength的推导过程如下:
- 设置
strength=0。 - 如果
W+H ≤ 8,即当前变换块是 4×4,那么:
-
- 如果
d ≥ 40,则strength=1。 - 如果
d ≥ 64,则strength=2。
- 如果
- 否则,如果
W+H ≤ 16,即当前变换块是 4×8、8×4 或 8×8,那么:
-
- 如果
d ≥ 20,则strength=1。 - 如果
d ≥ 48,则strength=2。
- 如果
- 否则,如果
W+H ≤ 24,即当前变换块是 8×16、16×8、4×16 或 16×4,那么如果d ≥ 4,则strength=3。 - 否则,即当前变换块是 16×16、8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64,那么如果
d ≥ 1,则strength=3。
根据上面描述的滤波强度推导过程可以发现,随着变换块尺寸的增加,需要滤波的预测模式越来越多。比如,当上方和左侧相邻变换块的预测模式不是平滑预测模式时,根据上面描述的滤波强度推导过程,可以发现:
- 对于 4×4 块,只有预测方向
D157_PRED需要对上侧参考像素进行滤波。 - 对于 8×8 块,对角线附近的帧内预测方向几乎都需要对上侧参考像素进行滤波。
- 对于 32×32 块,除了垂直预测方向以外,其余的帧内预测方向都需要对上侧参考像素进行滤波。
这种设计的原理是,对于尺寸较大的变换块,通过对更多的预测模式执行滤波过程,可以增加帧内预测的多样性,也就是说,让更多的帧内预测模式成为潜在的最优候选预测模式。
另外,对比相邻变换块是否是平滑预测模式的滤波器强度推导过程,可以发现,当上方或左侧相邻变换块的预测模式是平滑预测模式时,这种情况需要滤波的预测模式相对较多,并且滤波强度也相对较大。这是因为滤波强度越大,就可以越好地滤除参考像素中的高频噪声和干扰,从而使得参考像素具有平滑特性。
3. 左侧和上方参考像素的滤波过程
给定滤波强度strength>0以及滤波器系数w[3][5]={{0, 4, 8, 4, 0}, {0, 5, 6, 5, 0}, {2, 4, 4, 4, 2}},LeftCol[0:W+H-1]和AboveRow[0:W+H-1]的滤波流程描述如下:
- 如果当前变换块有可用的上方参考像素并且选定的帧内预测角度
angle < 180°,那么 AV1 根据angle的取值,对指定的参考像素进行滤波:
-
- 当
angle < 90°时,对AboveRow[i]进行滤波,i=0, 1, 2, ..., W+H-1。 - 当
angle > 90°时,只对AboveRow[i]进行滤波,i=0, 1, 2, ..., W-1。
- 当

- 如果当前变换块有可用的左侧参考像素并且选定的帧内预测角度`angle > 90°`,那么AV1将根据`angle`的取值,对指定的参考像素进行滤波:
-
- 当`angle > 180°`时,对`LeftCol[i]`进行滤波,`i=0, 1, 2, ..., W+H-1`。
- 当`angle < 180°`时,只对`LeftCol[i]`进行滤波,`i=0, 1, 2, ..., H-1`。

这里需要注意的是,上述公式中的`AboveRow[i-2+j]`和`LeftCol[i-2+j]`都是滤波之前的参考像素值。
图4-6以滤波器系数`[2, 4, 4, 4, 2]`为例展示了左侧和上方参考像素的滤波过程。其中A表示`AboveRow`,L表示`LeftCol`,黑色圆点标记位置`A[i]`和`L[i]`表示待滤波的参考像素;大括号覆盖区域表示`A[i]`和`L[i]`的滤波过程所需要的相邻像素。

图4-6 参考像素AboveRow[]和LeftCol[]的滤波过程
4.2.3 参考像素上采样
在自然图像中,水平和垂直预测模式通常比其他方向性的模式出现得更频繁,所以,对于尺寸较小,并且选定的帧内预测方向位于垂直和水平预测方向附近的变换块,AV1 会根据需要对参考像素AboveRow[]和LeftCol[]进行上采样操作,以提高这些变换块的预测方向精度。由于垂直预测方向和水平预测方向使用的是整像素位置参考像素来生成预测像素值,因此这两种预测方向并不需要对参考像素使用上采样操作。
假设upsampling_above和upsampling_left分别表示是否需要对AboveRow[]和LeftCol[]进行上采样操作的标志位。标志位等于 0 表示不进行上采样,等于 1 表示进行上采样。标志位upsampling_above和upsampling_left的推导方案可以描述如下:
标志位upsampling_above的推导过程:
d = |angle - 90°|。- 如果
d ≤ 0 || d ≥ 40,则upsampling_above = 0。 - 否则:
-
- 如果当前变换块的上方或左侧相邻变换块的预测模式是平滑预测模式,则
upsampling_above = (W+H ≤ 8),即只有 4×4 变换块需要上采样操作。 - 如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式,则
upsampling_above = (W+H ≤ 16),即变换块 4×4、4×8、8×4 和 8×8 需要上采样操作。
- 如果当前变换块的上方或左侧相邻变换块的预测模式是平滑预测模式,则
在upsampling_above的推导过程中,d ≤ 0表示选定的帧内预测方向为垂直预测方向,即预测角度等于 90°;而d ≥ 40表示选定的帧内预测方向角度距离垂直帧内预测方向较远。在这两种情况下,不需要对AboveRow[]进行上采样。
标志位upsampling_left的推导过程:
d = |angle - 180°|。- 如果
d ≤ 0 || d ≥ 40,则upsampling_left = 0。 - 否则:
-
- 如果当前变换块的上方和左侧相邻变换块的预测模式是平滑预测模式,则
upsampling_left = (W+H ≤ 8),即只有 4×4 变换块需要上采样操作。 - 如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式,则
upsampling_left = (W+H ≤ 16),即变换块 4×4、4×8、8×4 和 8×8 需要上采样操作。
- 如果当前变换块的上方和左侧相邻变换块的预测模式是平滑预测模式,则
在upsampling_left的推导过程中,d ≤ 0表示选定的帧内预测方向为水平预测方向;而d ≥ 40表示选定的帧内预测方向角度距离水平帧内预测方向较远。在这两种情况下,不需要对LeftCol[]进行上采样。
当upsampling_above和upsampling_left确定之后,AV1 将根据它们的取值来决定是否对AboveRow[]和LeftCol[]进行上采样。下面用p来表示数组AboveRow或LeftCol,out表示存储上采样输出结果的数组,sz表示需要插值的像素个数。在进行上采样之前,p[-1:sz-1]是可用的输入像素值,其余位置均是无效的像素值。当上采样完成之后,out[-2:2sz-2]是有效的像素值,这些像素值由输入像素值和插值得到的像素值组成,out[2i]存储的是原始输入像素值p[i],out[2i-1]是通过插值得到的半像素位置处的像素值。AV1 使用 4 抽头插值滤波器[-1, 9, 9, -1]插值得得到半像素位置的像素值。滤波器利用左右 2 个相邻整像素位置像素,根据下面的公式来插值得到对应半像素位置像素值:

图 4-7 以sz=8为例展示了上采样前后数组p[]中像素的对应关系,其中输出像素数组中的黑色圆点标记位置存储的是原始输入像素值。灰色三角形标记位置是待插值的半像素位置,该位置上的像素值是使用原始输入像素值p[1]、p[2]、p[3]和p[4]插值得得到的。
正如 4.2.4 节所述,在方向帧内预测中,预测像素是利用AboveRow[]或LeftCol[]中相邻两个参考像素的加权平均来生成的。假设预测方向的角度为α,在这个预测角度下,p[x][y]使用的参考像素是AboveRow[],那么p[x][y]计算如下:
![]()

图4-7 上采样过程的输入和输出像素之间的位置对应关系
其中base是根据预测角度α计算得到的参考像素位置,其计算方式如 4.2.4 节所述。所以,这种上采样过程有助于在AboveRow[]或LeftCol[]中的相邻参考像素之间实现更平滑的过渡,从而提高预测的准确性和视频质量。
与参考像素滤波过程一样,上采样过程也可以通过序列级语法元素enable_intra_edge_filter来选择性地开启或关闭。
4.2.4 预测像素生成
给定上方参考像素AboveRow[-1:W+H-1]和左侧参考像素LeftCol[-1:W+H-1],位置(x, y)处的预测像素值p[x][y]是通过将p[x][y]的样本位置按照选定的预测方向投影到参考像素数组上。如果投影位置位于两个参考像素之间,那么就利用投影位置两侧的参考像素,通过线性插值来计算投影位置的像素值。假设预测方向的角度用angle来表示,根据预测方向角度的大小,AV1 定义了 3 种帧内预测像素生成方案。
1. 预测方向角度小于 90°
当angle小于 90° 时,AV1 只用上方参考像素AboveRow[]即可生成预测像素p[col][row]。此时,预测像素值p[col][row]可以按照下面所示的步骤来计算:

其中,dx = ⌊64 / tan(angle)⌋,并且tan(angle)是angle的正切值。当upsample_above=1时,即参考像素使用上采样操作,此时参考像素的数量增加了一倍,并且参考像素位置发生了变化,计算投影位置两侧的参考像素时需要特殊处理。图 4-8 所示为预测角度小于 90° 时,p[0][1]的预测过程。其中黑色圆点表示参考像素位置,灰色圆点表示预测像素位置。A₀,₁是p[0][1]的像素位置在上方参考像素中的投影位置,base₀,₁和base₀,₁+1是该投影位置附近的两个参考像素位置。根据正切函数定义,图 4-8 中的idx1计算如下:idx1 = (row+1) / tan(α) = 2 / tan(α)。当用 64 对1/tan(α)进行缩放之后,即可得到idx1 = (row+1)·dx = 2·dx。

图4-8 预测角度小于90时p[0][1]的预测过程
由于上方参考像素总数maxBaseX = (W+H-1) << upsampling_above,因此当根据上面的步骤计算得到的base ≥ maxBaseX时,p[col][row] = AboveRow[maxBaseX]。
2. 预测方向角度大于 90°,小于 180°
当180° > angle > 90°时,有些像素需要利用上方参考像素AboveRow[]来预测,而另外一些像素则需要利用左侧参考像素LeftCol[]来预测。图 4-9 所示为预测角度大于 90°,小于 180° 时,p[0][0]和p[0][1]的预测过程,p[0][0]通过上方参考像素AboveRow[]来预测,而p[0][1]通过左侧参考像素来预测。这是因为p[0][1]在上方参考像素中的投影位置在左上角像素AboveRow[-1]的左侧,该投影位置左侧没有可用的上方参考像素,但是p[0][1]在左侧参考像素上的投影位置正好位于两个可用参考像素之间。

图4-9预测角度大于90,小于180时,p[0][0]和p[0][1]的预测过程
为了判断是否使用上方参考像素AboveRow[],AV1 首先计算p[col][row]上方参考像素的投影点位置idx和投影点位置左侧参考像素位置base:

如果base ≥ -(1 << upsampling_above),那么使用上方参考像素AboveRow[]来预测p[col][row],即:

否则,即base < -(1 << upsampling_above),则使用左侧参考像素LeftCol[]来预测p[col][row],即:

其中dx = ⌊64 / tan(180° - angle)⌋ 并且 dy = ⌊64 / tan(angle - 90°)⌋。
3. 预测方向角度大于 180°
当angle大于 180° 时,预测值p[col][row]只需要左侧参考像素LeftCol[]即可生成。此时,预测像素值p[col][row]可以按照下述公式所示步骤来计算:

其中dy = ⌊64 / tan(270° - angle)⌋。由于左侧参考像素总数maxBaseY = (W+H-1) << upsampling_left,因此当上述公式计算得到的base大于或等于maxBaseY时,p[col][row] = AboveRow[maxBaseY]。
图 4-10 所示为预测角度大于 180° 时,p[0][0]和p[1][0]的预测过程。其中dy0和dy1分别对应p[0][0]和p[1][0]的idx:dy0 = 1 / tan(270°-α) 并且 dy1 = 2 / tan(270°-α)。

图4-10 预测角度大于180时p[0][0]和p[1][0]的预测过程
4. 预测方向角度等于 90° 或 180°
预测方向角度等于 90° 的预测模式又称为垂直预测模式,等于 180° 的预测模式称为水平预测模式。在垂直预测中,p[col][row] = AboveRow[col],col=0, 1, 2, ..., W-1。在水平预测中,p[col][row] = LeftCol[row],row=0, 1, ..., H-1。
图 4-11 以p[0][0]和p[0][1]为例展示了垂直和水平预测模式的预测过程。在垂直预测模式中,p[0][0] = p[0][1] = AboveRow[0];在水平预测模式中,p[0][0] = LeftCol[0],p[0][1] = LeftCol[1]。

图4-11 垂直和水平预测模式的预测过程
为了避免在预测过程中计算角度的正切值,AV1 定义了数组Dr_Intra_Derivative[90]预先存储给定角度的正切值。具体来讲,元素Dr_Intra_Derivative[angle]表示64/tan(angle)。
1万+

被折叠的 条评论
为什么被折叠?



