AV1 编码标准帧内预测
AV1(AOMedia Video 1)是一种开源的视频编码格式,旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面,AV1相较于其前身VP9和其他编解码标准,如H.264/AVC和H.265/HEVC,进行了显著的增强和扩展。
帧内预测模式的扩展:AV1支持更多细化的角度模式,从VP9的10种模式扩展到了56种模式。这些模式包括8个基础角度模式,每个基础角度模式两侧以3°为步长分布有6个扩展角度。
非角度模式的新增:除了角度模式,AV1还新增了多种非角度模式,如Smooth模式(垂直、水平和垂直+水平)、DC模式、Paeth模式、CFL(Chroma from Luma)模式、调色板模式以及基于递归滤波的预测模式 。
帧内预测的实现:在AV1的参考软件libaom-av1中,帧内预测从函数
av1_predict_intra_block_facade()
开始,并涉及到构建intra predictor,处理调色板模式,以及在非调色板模式下,准备周边块的参考信息 。帧内预测的性能:AV1的帧内预测技术通过利用空间和时间上邻近像素的相关性,减少了数据的冗余,提高了压缩效率 。通过对比实验,使用帧内预测技术在某些编码模式中可以实现2%的性能提升 。
帧内预测的优化方法:AV1采用了自适应环路滤波算法来减少预测残差的边缘伪影,并采用了可变大小的预测块和扩展的预测模式集合来增强预测的适应性和灵活性。此外,还利用了深度学习技术来优化帧内预测的模式选择和残差计算过程。
帧内预测的局限性与改进空间:尽管AV1的帧内预测技术在提高编码效率方面取得了显著成果,但在处理快速运动和复杂纹理的场景下可能效果不佳,需要进一步优化
。未来的研究可以关注新型帧内预测算法的开发,如深度学习在帧内预测中的应用,以及帧内预测技术与其他视频编码技术的融合与优化 。帧内预测的未来发展趋势:帧内预测技术将朝着更加智能化、自适应化的方向发展,深度学习的应用将使帧内预测更加精准,同时新技术如人工智能、云计算、物联网的发展也将为帧内预测技术带来新的挑战和机遇。
方向帧内预测
- 方向性内预测用于模拟局部纹理,它使用一组边缘方向。存在八个名义上的方向性内预测模式,每个模式都有一个与之关联的角度偏移量集合,这些偏移量以介于-3到+3之间的整数值进行索引,其中名义角度位于0度。预测方向是通过将角度偏移量加到名义内角度上来得到的。总共有56个方向性内预测模式。
- 八个名义方向预测模式对应的角度分别为:45°、67°、90°、113°、135°、157°、180°、203°。
- 名义方向预测模式和相关的角度偏移索引都会被信号化,名义模式索引会在相关的角度偏移索引之前进行信号化。对于较小的块尺寸,即4×4、4×8和8×4,扩展内预测角度精度带来的额外编码增益通常是边缘的;因此,在这些情况下,通常只使用名义模式,不应用或信号化任何角度偏移。
非方向帧内预测
除了方向性内预测模式外,还有五种非方向性内预测模式:DC_PRED、SMOOTH、SMOOTH_H、SMOOTH_V和Paeth,这些模式通常用于平滑区域的预测。
- DC_PRED 模式:通过平均顶部和左侧邻近块的重建样本来生成当前块的预测样本。
- SMOOTH_V 和 SMOOTH_H 模式:分别沿垂直和水平方向使用二次插值生成预测值,而SMOOTH 模式则使用沿两个方向的二次插值结果的平均值来生成预测值。用于二次插值的样本包括来自顶部和左侧邻近重建块的重建样本,以及通过顶部和左侧重建样本估计的右侧和底部边界的样本。
- Paeth 预测模式:如第5图所示,根据其顶部(T)、左侧(L)和左上角(TL)的参考样本预测每个样本。在这些参考样本中,与(T + L – TL)的值最接近的那个值被选为预测样本。
- Paeth模式是以人名命名的模式, 有个人在开发 PNG 图像编码时发明了Paeth预测。
这些非方向性内预测模式适用于预测那些在图像中没有明显方向性纹理的区域,例如天空或肤色等平滑渐变的区域。通过使用不同的预测模式,编码器能够更灵活地适应图像内容的变化,从而提高编码效率和压缩性能。
递归帧内预测
在AV1中定义了五种递归内预测模式。每种模式指定了一组八个7-tap(7个系数的)滤波器。给定所选的递归内预测模式索引(0到4),当前块被划分为4×2子块的倍数。对于每个4×2子块,每个样本通过使用来自顶部和左侧块的七个相邻样本作为输入进行7-tap插值来预测,如图6所示。在每个4×2子块内不同坐标的样本应用不同的滤波器。这个预测过程在一个编码块内对4×2子块逐个执行,并且为每个4×2子块生成的预测样本可以用来预测下一个4×2子块。递归内预测的一个例子如图所示。
模式选择:编码器从五种递归内预测模式中选择一种,每种模式对应一组特定的7-tap滤波器系数。
块划分:当前编码块根据所选模式被划分为多个4×2像素的子块。
样本预测:对于每个4×2子块,根据所在位置,使用来自顶部和左侧的七个样本进行7-tap插值来预测子块内的每个样本。
滤波器应用:每个子块内的样本根据其在子块中的位置使用不同的滤波器。这意味着在子块的不同位置,预测使用的权重组合会有所不同。
递归预测:一旦一个4×2子块的预测样本生成,这些样本可以作为预测下一个子块的参考,从而实现递归效果。
过程重复:这个过程在编码块内对每个4×2子块重复进行,直到整个块的预测完成。
递归内预测模式特别适合于预测具有明显方向性纹理的区域,例如边缘或斜线。通过递归地利用已预测的样本来预测新的样本,这种方法可以有效地捕捉和延续图像中的方向性特征。
依赖亮度的色度预测
色度从亮度(Chroma from Luma,简称CfL)是一种仅应用于色度编码块的内预测模式。CfL预测模式通过一个线性模型,使用相应的重建亮度样本来推导色度预测样本。当相应的亮度和色度分辨率不同时,例如在4:2:0和4:2:2色度子采样格式中,需要在将重建的亮度样本输入CfL模式之前进行子采样。预测块是色度直流(DC)分量和缩放的亮度交流(AC)分量之和。一个块的DC分量由块的平均值组成,而AC分量是通过从块中移除DC分量来得到的。在CfL模式中,模型参数,例如应用于亮度AC分量的缩放因子,在编码过程中计算并信号化到比特流中。CfL预测模式的流程图在图中展示。
CfL模式的工作原理:
适用性:CfL模式专门用于色度编码块,不适用于亮度块。
分辨率差异处理:如果亮度和色度的分辨率不同,需要先对亮度样本进行子采样,以匹配色度分辨率。
线性模型:CfL使用一个线性模型来预测色度样本,该模型基于对应位置的亮度样本。
DC和AC分量:
- DC分量:是预测块内所有样本的平均值,代表块的直流或平均亮度水平。
- AC分量:是亮度样本与DC分量的差值,代表块内的交流或细节信息。
预测块的计算:预测块是通过将色度的DC分量与缩放后的亮度AC分量相加得到的。
模型参数:编码过程中会计算模型参数,如亮度AC分量的缩放因子,并将其编码到比特流中,以便解码器可以正确重建色度样本。
比特流信号化:编码器在编码过程中计算出的模型参数需要通过比特流传输给解码器。
流程图:图中提供了CfL预测模式的工作流程,展示了从亮度样本到色度预测样本的转换过程。
CfL模式利用了亮度和色度之间的相关性,通过亮度信息来辅助色度的预测,从而提高编码效率,特别是在色度分辨率低于亮度分辨率的情况下。
帧内预测模式信号
对于亮度(luma)分量,内预测模式包括56个方向性内预测模式、5个非方向性预测模式和5个递归滤波模式。以下是用于信号化编码块内预测模式的过程:
- 首先信号化语法元素
y_mode
,以指示应用的是八个名义上的方向性内预测模式之一还是五个非方向性内预测模式之一。- 如果块大小大于8×8,并且
y_mode
指示的是方向性内预测模式,即1到8,则进一步信号化语法元素angle_delta_y
,以指示角度偏移量索引,范围在-3到+3之间。- 否则,如果亮度预测模式是
DC_PRED
,并且编码块的最大宽度和高度小于或等于32,信号化标志use_filter_intra
,以指示是否应用递归内预测模式。- 如果
use_filter_intra
信号化为1,则进一步信号化filter_intra_mode
,以指示应用的是五个递归内预测模式中的哪一个。对于色度(chroma)分量,内预测模式包括56个方向性内预测模式、5个非方向性预测模式和CfL(色度从亮度)预测模式。以下是用于信号化编码块内预测模式的过程:
- 信号化语法元素
uv_mode
,以指示应用的是八个名义上的方向性内预测模式之一、五个非方向性预测模式之一,还是CfL预测模式。- 如果块大小大于8×8,并且
uv_mode
指示的是方向性内预测模式,则进一步信号化语法元素angle_delta_uv
,以指示角度偏移量索引,范围在-3到+3之间。- 否则,如果
uv_mode
指示CfL模式作为内预测模式,则使用缩放参数α,该参数进一步为Cb和Cr色度分量信号化。对于信号化y_mode
,对于内帧和间帧的编码块应用不同的上下文。
- 在内帧中,信号化
y_mode
的上下文从邻近的亮度内预测模式中派生。- 在间帧中,信号化
y_mode
的上下文从当前编码块大小中派生。- 对于信号化
uv_mode
,上下文是使用同位亮度内预测模式派生的。
这个信号化过程确保了编码器能够准确地传达所需的内预测模式,以便解码器可以正确地重建编码块。通过这种方式,编码器可以根据块的内容和大小选择最合适的预测模式,从而提高编码效率和视频质量。
libaom中关于帧内预测相关代码介绍
- 在
av1/common/enums.h
中有关于帧内预测模式类型的相关枚举:
enum { CFL_PRED_U, CFL_PRED_V, CFL_PRED_PLANES } UENUM1BYTE(CFL_PRED_TYPE);// Note: All directional predictors must be between V_PRED and D67_PRED (both
// inclusive).
enum {DC_PRED, // Average of above and left pixelsV_PRED, // VerticalH_PRED, // HorizontalD45_PRED, // Directional 45 degreeD135_PRED, // Directional 135 degreeD113_PRED, // Directional 113 degreeD157_PRED, // Directional 157 degreeD203_PRED, // Directional 203 degreeD67_PRED, // Directional 67 degreeSMOOTH_PRED, // Combination of horizontal and vertical interpolationSMOOTH_V_PRED, // Vertical interpolationSMOOTH_H_PRED, // Horizontal interpolationPAETH_PRED, // Predict from the direction of smallest gradientNEARESTMV,NEARMV,GLOBALMV,NEWMV,// Compound ref compound modesNEAREST_NEARESTMV,NEAR_NEARMV,NEAREST_NEWMV,NEW_NEARESTMV,NEAR_NEWMV,NEW_NEARMV,GLOBAL_GLOBALMV,NEW_NEWMV,MB_MODE_COUNT,PRED_MODE_INVALID = MB_MODE_COUNT,INTRA_MODE_START = DC_PRED,INTRA_MODE_END = NEARESTMV,DIR_MODE_START = V_PRED,DIR_MODE_END = D67_PRED + 1,INTRA_MODE_NUM = INTRA_MODE_END - INTRA_MODE_START,SINGLE_INTER_MODE_START = NEARESTMV,SINGLE_INTER_MODE_END = NEAREST_NEARESTMV,SINGLE_INTER_MODE_NUM = SINGLE_INTER_MODE_END - SINGLE_INTER_MODE_START,COMP_INTER_MODE_START = NEAREST_NEARESTMV,COMP_INTER_MODE_END = MB_MODE_COUNT,COMP_INTER_MODE_NUM = COMP_INTER_MODE_END - COMP_INTER_MODE_START,INTER_MODE_START = NEARESTMV,INTER_MODE_END = MB_MODE_COUNT,INTRA_MODES = PAETH_PRED + 1, // PAETH_PRED has to be the last intra mode.INTRA_INVALID = MB_MODE_COUNT // For uv_mode in inter blocks
} UENUM1BYTE(PREDICTION_MODE);// TODO(ltrudeau) Do we really want to pack this?
// TODO(ltrudeau) Do we match with PREDICTION_MODE?
enum {UV_DC_PRED, // Average of above and left pixelsUV_V_PRED, // VerticalUV_H_PRED, // HorizontalUV_D45_PRED, // Directional 45 degreeUV_D135_PRED, // Directional 135 degreeUV_D113_PRED, // Directional 113 degreeUV_D157_PRED, // Directional 157 degreeUV_D203_PRED, // Directional 203 degreeUV_D67_PRED, // Directional 67 degreeUV_SMOOTH_PRED, // Combination of horizontal and vertical interpolationUV_SMOOTH_V_PRED, // Vertical interpolationUV_SMOOTH_H_PRED, // Horizontal interpolationUV_PAETH_PRED, // Predict from the direction of smallest gradientUV_CFL_PRED, // Chroma-from-LumaUV_INTRA_MODES,UV_MODE_INVALID, // For uv_mode in inter blocks
} UENUM1BYTE(UV_PREDICTION_MODE);enum {II_DC_PRED,II_V_PRED,II_H_PRED,II_SMOOTH_PRED,INTERINTRA_MODES
} UENUM1BYTE(INTERINTRA_MODE);