目录4.2 方向帧内预测4.2.1 预测方向定义4.2.2 参考像素的滤波过程1. 左上角参考像素滤波2. 左侧和上方参考像素滤波强度推导3. 左侧和上方参考像素的滤波过程4.2.3 参考像素上采样标志位upsampling_above的推导过程标志位upsampling_left的推导过程4.2.4 预测像素生成1. 预测方向角度小于 90°2. 预测方向角度大于 90°小于 180°3. 预测方向角度大于 180°4. 预测方向角度等于 90° 或 180°4.3 非方向帧内预测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-300————392613由于尺寸较小的变换块如 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. 左上角参考像素滤波对于WH ≥ 24的变换块当180° angle 90°时AV1 将利用左上角像素的右侧像素和下侧像素对其进行滤波滤波器系数是[5, 6, 5]2. 左侧和上方参考像素滤波强度推导当angle不等于 90°也不等于 180° 时对于LeftCol[0:WH-1]和AboveRow[0:WH-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:WH-1]和AboveRow[0:WH-1]进行滤波。表 4-2 所示为strength的取值及其含义。表 4-2strength的取值及其含义strength的取值含义0不对参考像素进行滤波1采用[0, 4, 8, 4, 0]滤波器2采用[0, 5, 6, 5, 0]滤波器3采用[2, 4, 4, 4, 2]滤波器根据当前变换块上方和左侧相邻变换块的预测模式是否是平滑预测模式AV1 定义了两种不同的方案来推导strength。关于平滑模式的定义请参考 4.3 节。在下面的描述中对于上侧参考像素AboveRow[]有d|angle-90°|对于左侧参考像素LeftCol[]则有d|angle-180°|。由于angle不等于 90°也不等于 180°因此变量d大于或等于 1。如果变换块上方和左侧相邻变换块的预测模式都不是平滑预测模式那么strength的推导过程如下设置strength0。如果WH ≤ 8即当前变换块是 4×4那么如果d ≥ 56则strength1。否则如果WH ≤ 12即当前变换块是 4×8/8×4那么如果d ≥ 40则strength1。否则如果WH ≤ 16即当前变换块是 8×8那么如果d ≥ 40则strength1。否则如果WH ≤ 24即当前变换块是 8×16、16×8、4×16 或 16×4那么如果d ≥ 8则strength1。如果d ≥ 16则strength2。如果d ≥ 32则strength3。否则如果WH ≤ 32即当前变换块是 16×16那么如果d ≥ 1则strength1。如果d ≥ 4则strength2。如果d ≥ 32则strength3。否则即当前变换块是 8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64那么如果d ≥ 1则strength3。如果变换块上方或左侧相邻变换块的预测模式是平滑预测模式那么滤波器强度strength的推导过程如下设置strength0。如果WH ≤ 8即当前变换块是 4×4那么如果d ≥ 40则strength1。如果d ≥ 64则strength2。否则如果WH ≤ 16即当前变换块是 4×8、8×4 或 8×8那么如果d ≥ 20则strength1。如果d ≥ 48则strength2。否则如果WH ≤ 24即当前变换块是 8×16、16×8、4×16 或 16×4那么如果d ≥ 4则strength3。否则即当前变换块是 16×16、8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64那么如果d ≥ 1则strength3。根据上面描述的滤波强度推导过程可以发现随着变换块尺寸的增加需要滤波的预测模式越来越多。比如当上方和左侧相邻变换块的预测模式不是平滑预测模式时根据上面描述的滤波强度推导过程可以发现对于 4×4 块只有预测方向D157_PRED需要对上侧参考像素进行滤波。对于 8×8 块对角线附近的帧内预测方向几乎都需要对上侧参考像素进行滤波。对于 32×32 块除了垂直预测方向以外其余的帧内预测方向都需要对上侧参考像素进行滤波。这种设计的原理是对于尺寸较大的变换块通过对更多的预测模式执行滤波过程可以增加帧内预测的多样性也就是说让更多的帧内预测模式成为潜在的最优候选预测模式。另外对比相邻变换块是否是平滑预测模式的滤波器强度推导过程可以发现当上方或左侧相邻变换块的预测模式是平滑预测模式时这种情况需要滤波的预测模式相对较多并且滤波强度也相对较大。这是因为滤波强度越大就可以越好地滤除参考像素中的高频噪声和干扰从而使得参考像素具有平滑特性。3. 左侧和上方参考像素的滤波过程给定滤波强度strength0以及滤波器系数w[3][5]{{0, 4, 8, 4, 0}, {0, 5, 6, 5, 0}, {2, 4, 4, 4, 2}}LeftCol[0:WH-1]和AboveRow[0:WH-1]的滤波流程描述如下如果当前变换块有可用的上方参考像素并且选定的帧内预测角度angle 180°那么 AV1 根据angle的取值对指定的参考像素进行滤波当angle 90°时对AboveRow[i]进行滤波i0, 1, 2, ..., WH-1。当angle 90°时只对AboveRow[i]进行滤波i0, 1, 2, ..., W-1。如果当前变换块有可用的左侧参考像素并且选定的帧内预测角度angle 90°那么AV1将根据angle的取值对指定的参考像素进行滤波当angle 180°时对LeftCol[i]进行滤波i0, 1, 2, ..., WH-1。当angle 180°时只对LeftCol[i]进行滤波i0, 1, 2, ..., H-1。这里需要注意的是上述公式中的AboveRow[i-2j]和LeftCol[i-2j]都是滤波之前的参考像素值。图4-6以滤波器系数[2, 4, 4, 4, 2]为例展示了左侧和上方参考像素的滤波过程。其中A表示AboveRowL表示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 (WH ≤ 8)即只有 4×4 变换块需要上采样操作。如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式则upsampling_above (WH ≤ 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 (WH ≤ 8)即只有 4×4 变换块需要上采样操作。如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式则upsampling_left (WH ≤ 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或LeftColout表示存储上采样输出结果的数组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 以sz8为例展示了上采样前后数组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:WH-1]和左侧参考像素LeftCol[-1:WH-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_above1时即参考像素使用上采样操作此时参考像素的数量增加了一倍并且参考像素位置发生了变化计算投影位置两侧的参考像素时需要特殊处理。图 4-8 所示为预测角度小于 90° 时p[0][1]的预测过程。其中黑色圆点表示参考像素位置灰色圆点表示预测像素位置。A₀,₁是p[0][1]的像素位置在上方参考像素中的投影位置base₀,₁和base₀,₁1是该投影位置附近的两个参考像素位置。根据正切函数定义图 4-8 中的idx1计算如下idx1 (row1) / tan(α) 2 / tan(α)。当用 64 对1/tan(α)进行缩放之后即可得到idx1 (row1)·dx 2·dx。图4-8 预测角度小于90时p[0][1]的预测过程由于上方参考像素总数maxBaseX (WH-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 (WH-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]的idxdy0 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]col0, 1, 2, ..., W-1。在水平预测中p[col][row] LeftCol[row]row0, 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)。
av1编码--方向帧内预测
发布时间:2026/5/26 9:05:29
目录4.2 方向帧内预测4.2.1 预测方向定义4.2.2 参考像素的滤波过程1. 左上角参考像素滤波2. 左侧和上方参考像素滤波强度推导3. 左侧和上方参考像素的滤波过程4.2.3 参考像素上采样标志位upsampling_above的推导过程标志位upsampling_left的推导过程4.2.4 预测像素生成1. 预测方向角度小于 90°2. 预测方向角度大于 90°小于 180°3. 预测方向角度大于 180°4. 预测方向角度等于 90° 或 180°4.3 非方向帧内预测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-300————392613由于尺寸较小的变换块如 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. 左上角参考像素滤波对于WH ≥ 24的变换块当180° angle 90°时AV1 将利用左上角像素的右侧像素和下侧像素对其进行滤波滤波器系数是[5, 6, 5]2. 左侧和上方参考像素滤波强度推导当angle不等于 90°也不等于 180° 时对于LeftCol[0:WH-1]和AboveRow[0:WH-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:WH-1]和AboveRow[0:WH-1]进行滤波。表 4-2 所示为strength的取值及其含义。表 4-2strength的取值及其含义strength的取值含义0不对参考像素进行滤波1采用[0, 4, 8, 4, 0]滤波器2采用[0, 5, 6, 5, 0]滤波器3采用[2, 4, 4, 4, 2]滤波器根据当前变换块上方和左侧相邻变换块的预测模式是否是平滑预测模式AV1 定义了两种不同的方案来推导strength。关于平滑模式的定义请参考 4.3 节。在下面的描述中对于上侧参考像素AboveRow[]有d|angle-90°|对于左侧参考像素LeftCol[]则有d|angle-180°|。由于angle不等于 90°也不等于 180°因此变量d大于或等于 1。如果变换块上方和左侧相邻变换块的预测模式都不是平滑预测模式那么strength的推导过程如下设置strength0。如果WH ≤ 8即当前变换块是 4×4那么如果d ≥ 56则strength1。否则如果WH ≤ 12即当前变换块是 4×8/8×4那么如果d ≥ 40则strength1。否则如果WH ≤ 16即当前变换块是 8×8那么如果d ≥ 40则strength1。否则如果WH ≤ 24即当前变换块是 8×16、16×8、4×16 或 16×4那么如果d ≥ 8则strength1。如果d ≥ 16则strength2。如果d ≥ 32则strength3。否则如果WH ≤ 32即当前变换块是 16×16那么如果d ≥ 1则strength1。如果d ≥ 4则strength2。如果d ≥ 32则strength3。否则即当前变换块是 8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64那么如果d ≥ 1则strength3。如果变换块上方或左侧相邻变换块的预测模式是平滑预测模式那么滤波器强度strength的推导过程如下设置strength0。如果WH ≤ 8即当前变换块是 4×4那么如果d ≥ 40则strength1。如果d ≥ 64则strength2。否则如果WH ≤ 16即当前变换块是 4×8、8×4 或 8×8那么如果d ≥ 20则strength1。如果d ≥ 48则strength2。否则如果WH ≤ 24即当前变换块是 8×16、16×8、4×16 或 16×4那么如果d ≥ 4则strength3。否则即当前变换块是 16×16、8×32、32×8、16×32、32×16、32×32、32×64、64×32、16×64、64×16 或 64×64那么如果d ≥ 1则strength3。根据上面描述的滤波强度推导过程可以发现随着变换块尺寸的增加需要滤波的预测模式越来越多。比如当上方和左侧相邻变换块的预测模式不是平滑预测模式时根据上面描述的滤波强度推导过程可以发现对于 4×4 块只有预测方向D157_PRED需要对上侧参考像素进行滤波。对于 8×8 块对角线附近的帧内预测方向几乎都需要对上侧参考像素进行滤波。对于 32×32 块除了垂直预测方向以外其余的帧内预测方向都需要对上侧参考像素进行滤波。这种设计的原理是对于尺寸较大的变换块通过对更多的预测模式执行滤波过程可以增加帧内预测的多样性也就是说让更多的帧内预测模式成为潜在的最优候选预测模式。另外对比相邻变换块是否是平滑预测模式的滤波器强度推导过程可以发现当上方或左侧相邻变换块的预测模式是平滑预测模式时这种情况需要滤波的预测模式相对较多并且滤波强度也相对较大。这是因为滤波强度越大就可以越好地滤除参考像素中的高频噪声和干扰从而使得参考像素具有平滑特性。3. 左侧和上方参考像素的滤波过程给定滤波强度strength0以及滤波器系数w[3][5]{{0, 4, 8, 4, 0}, {0, 5, 6, 5, 0}, {2, 4, 4, 4, 2}}LeftCol[0:WH-1]和AboveRow[0:WH-1]的滤波流程描述如下如果当前变换块有可用的上方参考像素并且选定的帧内预测角度angle 180°那么 AV1 根据angle的取值对指定的参考像素进行滤波当angle 90°时对AboveRow[i]进行滤波i0, 1, 2, ..., WH-1。当angle 90°时只对AboveRow[i]进行滤波i0, 1, 2, ..., W-1。如果当前变换块有可用的左侧参考像素并且选定的帧内预测角度angle 90°那么AV1将根据angle的取值对指定的参考像素进行滤波当angle 180°时对LeftCol[i]进行滤波i0, 1, 2, ..., WH-1。当angle 180°时只对LeftCol[i]进行滤波i0, 1, 2, ..., H-1。这里需要注意的是上述公式中的AboveRow[i-2j]和LeftCol[i-2j]都是滤波之前的参考像素值。图4-6以滤波器系数[2, 4, 4, 4, 2]为例展示了左侧和上方参考像素的滤波过程。其中A表示AboveRowL表示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 (WH ≤ 8)即只有 4×4 变换块需要上采样操作。如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式则upsampling_above (WH ≤ 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 (WH ≤ 8)即只有 4×4 变换块需要上采样操作。如果当前变换块的上方和左侧相邻变换块的预测模式不是平滑预测模式则upsampling_left (WH ≤ 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或LeftColout表示存储上采样输出结果的数组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 以sz8为例展示了上采样前后数组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:WH-1]和左侧参考像素LeftCol[-1:WH-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_above1时即参考像素使用上采样操作此时参考像素的数量增加了一倍并且参考像素位置发生了变化计算投影位置两侧的参考像素时需要特殊处理。图 4-8 所示为预测角度小于 90° 时p[0][1]的预测过程。其中黑色圆点表示参考像素位置灰色圆点表示预测像素位置。A₀,₁是p[0][1]的像素位置在上方参考像素中的投影位置base₀,₁和base₀,₁1是该投影位置附近的两个参考像素位置。根据正切函数定义图 4-8 中的idx1计算如下idx1 (row1) / tan(α) 2 / tan(α)。当用 64 对1/tan(α)进行缩放之后即可得到idx1 (row1)·dx 2·dx。图4-8 预测角度小于90时p[0][1]的预测过程由于上方参考像素总数maxBaseX (WH-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 (WH-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]的idxdy0 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]col0, 1, 2, ..., W-1。在水平预测中p[col][row] LeftCol[row]row0, 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)。