H264/AVC 介绍
编码结构
- 场和帧:视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。 在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行之间的空间相 关性较强,而帧内邻近行空间相关性强,因此活动量较小或静止的图像宜采用帧编码方式,对活动 量较大的运动图像则宜采用场编码方式。
- 宏块 MB:一个编码图像通常划分成若干宏块组成,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
- 片 Slice:可以分为 I 片、P 片、B 片; I 片只包含 I 宏块,P 片可包含 P 和 I 宏块,而 B 片可包含 B 和 I 宏块。
- 档次 Profile:H264 规定了三种档次,基本档次、主要档次、扩展档次。
- 级 level: 在H264中,每个
Level
都对应着一组参数的限制,这些参数包括但不限于最大码率、分辨率、帧率等。Level
越高,视频的码率、分辨率和帧率就越高,同时压缩率也会相应降低。
帧内预测
- 4x4 亮度预测模式:一共 9 种模式,8 种方向模式,加上 DC 模式。
- 16x16 亮度预测模式:一共 4 种模式,水平、垂直、DC、plane 模式。
- 8x8 色度块预测模式:类似 16x16 的亮度预测模式,但编号不同,即 DC、 水平、垂直plane。
帧间预测
- 树状结构运动补偿:每个宏块 16x16 像素可以有 4 种方式分割,即一个 16x16、两个 16x8、两个 8x16、四个 8x8;而 8x8 模式的咩个子宏块还可以有 4 种方式分割,即一个 8x8、两个 4x8、两个 8x4、四个 4 x4。 这些分割和子宏块大大提高了各宏块之间的关联性。这种分割下的运动补偿 则称为树状结构运动补偿。
- 运动矢量: 帧间编码宏块的每个分割或者子宏块都是从参考图像某一相同尺寸区域预测而得。两者之间的 差异即运动矢量 MV。其中对亮度成分采用 1/4 像素精度,色度采用 1/8 像素精度。
- 内插像素生成:半像素通过整像素点进行 6 抽头滤波得出, 权重为(1/32 ,-5/32 ,5/8, 5/8, -5/32, 1/32);1/4 像素通过线性内插得出;色度像素需要 1/8 精度得 MV,也同样通过整像素的线性内插得出。
- MV 预测: 每个分割MV的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可 利用邻近分割的MV较强的相关性,MV可由邻近已编码分割的MV预测而得。预测矢量MVp基 于已计算MV和MVD(预测与当前的差异)并被编码和传送。MVp则取决于运动补偿尺寸和邻近 MV的有无。
- B 片预测: B 片中的帧间编码宏块的每个子块都是由一个或两个参考图像预测而得。该参考图像在当前图像的前面或者后面。B 片用到了两个已编码图像列表list0 和 list1,包括短期和长期图像两种。这两个列表都可包含前向和后向的已编码图像(按显示顺序排列)。
- 加权预测:加权预测是一种用来修正P或B片中运动补偿预测像素方法。H.264中由3中加权预测 类型: 1) P片宏块“explicit”加权预测; 2) B片宏块“explicit”加权预测; 3) B片宏块“implicit”加权预测;
- H.264 采用树状结构的运动补偿技术,提高了预测能力。特别是,小块预测提高了模型 处理更好的运动能够描述的能力,产生更好的图像质量。H.264运动向量的精度提高到1/4像素(亮 度),运动补偿算法的预测能力得到进一步提高。H.264 还提供多参考帧可选模式,,这将产生更好 的视频质量和效率更高的视频编码。相对于1帧参考,5个参考帧可以节约5%~10%的比特率,且 有助于比特流的恢复。当然,并不是说参考帧越多越好,经实验,考虑到缓冲区的能力和编码器的 效率,目前一般都选取3~5个参考帧。
H264 的 SP/SI 帧技术
- SP 帧编码的基本原理同P帧类似,仍是基于帧间预测的运动补偿预测编码,两者之间的差异在 于SP 帧能够参照不同参考帧重构出相同的图像帧。充分利用这一特性,SP帧可取代了I帧,广泛 应用于流间切换(bitstream switching)、拼接(splicing)、随机接入(random access)、快进快退(fast forward, fast backward)以及错误恢复(error recovery)等应用中,同时大大降低了码率的开销。与 SP 帧相对应,SI帧则是基于帧内预测编码技术,其重构图像和对SP的重构图像完全相同。
整数变换与量化
- 变换: H.264 对 图像或预测残差采用了4×4整数离散余弦变换技术,避免了以往标准中使用的通用8×8离散余弦变 换逆变换经常出现的失配问题。
- 在图像编码中,变换编码和量化从原理上讲是两个独立的过程。但在H.264中,将两个过程中 的乘法合二为一,并进一步采用整数运算,减少编解码的运算量,提高图像压缩的实时性,这些措 施对峰值信噪比(PSNR)的影响很小,一般低于0.02dB,可不计。
- 量化: 量化过程在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。H.264 采用标量量化技术,它将每个图像样点编码映射成较小的数值。 最后的H.264草 案规定,亮度QP的最大值是51,而色度QP的最大值是39。
- DCT 直流洗漱的变换量化: 如果当前处理的图像宏块是色度块或帧内16×16预测模式的亮度块,则需要将其中各图像块的 DCT变换系数矩阵W中的直流分量或直流系数W00按对应图像块顺序排序,组成新的矩阵WD,再 对WD进行Hadamard变换及量化。
熵编码
- 熵编码的基本原理:熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立 在随机过程的统计特性基础上的。 对信息源 X 的各个符号的自信息量取统计均值,得到平均信息量,即为信息源 X 的熵。
- CAVLC: H.264 的CAVLC(基于上下文自适应的可变长编码)中,通过根据已编码句法元素的情况动态调整编码中使用的码表,取得了极高的压缩比。 CAVLC用于亮度和色度残差数据的编码。
- CAVLC 的上下文模型: 利用相邻已编码符号所提供的相关性,为所要编码的符号选择合适的上下文模型。利用合适的 上下文模型,就可以大大降低符号间的冗余度。在 CAVLC 中上下文模型的选择主要体现在两个方 面, 非零系数编码所需表格的选择以及拖尾系数后缀长度的更新
- CAVLC 的编码过程: 编码非零系数的数目(TotalCoeffs)以及拖尾系数的数目(TrailingOnes) 、 编码每个拖尾系数的符号 、 编码除了拖尾系数之外的非零系数的幅值(Levels) 、 编码最后一个非零系数前零的数目(TotalZeros) 、 编码每个非零系数前零的个数(RunBefore)
- CABAC: 基于上下文的自适应二进制算术熵编码 是算术编码的一种, 算术编码的思想是用0到1的区间上的一个数来表示一个字符输入流,它的本质是为整个输入 流分配一个码字,而不是给输入流中的每个字符分别指定码字。
- CABAC 在计算量和编码速度上进行了优化,用了量化查表、移位、逻辑运算等方法代替复 杂的概率估计和乘法运算。在实际应用中,CABAC 与其它主流的熵编码方式相比有更高的编码效 率,用一组质量在28~40dB的视频图像做测试,应用CABAC可使比特率进一步提高9%~14%。
码率控制
- 在H.264 视频编码标准中仅仅规定了编码后比特流的句法结构和解码器的结构,而对于编码器 的结构和实现模式没有具体的规定。然而无论编码器的结构如何,相应的视频编码的控制都是编码 器实现的核心问题。在对数字视频信号进行压缩编码时,编码器通过相应的编码控制算法以确定各 种编码模式,如宏块的划分类型、运动矢量以及量化参数等,已选定的各种编码模式进一步确定了 编码器输出比特流的比特率和失真度。 H.264 编码器采用了基于 Lagrangian 优化算法的编码控制模型,其编码性能相较于以往的所有 编码标准有了重大提高。
去方块滤波
- 块效应:H.264/MPEG-4 AVC视频编码标准中,在编解码器反变换量化后图像会出现方块效应。其产生的原因有两个。最重要的一个原因是基于块的帧内和帧间预测残差的DCT变换。变换系数的量化过程相对粗糙,因而反量化过程恢复的变换系数带有误差,会造成在图像块边界上的视觉不连续。第 二个原因来自于运动补偿预测。运动补偿块可能是从不是同一帧的不同位置上的内插样点数据复制而来。因为运动补偿块的匹配不可能是绝对准确的,所以就会在复制块的边界上产生数据不连续。 当然,参考帧中存在的边界不连续也被复制到需要补偿的图像块内。
- 去方块滤波:主要分为边界分析、滤波运算两个过程。
- 边界分析:自适应边界级滤波器通过边界强度(Bs)决定去方块滤波器选择滤波参数,控制去除方块效应的程度。对所有4×4亮度块间的边界,边界强度参数值在0到4之间 。最后根据 Bs 的值进行自适应滤波。
-
- 滤波运算:主要分为 Bs 在 0~3 的边界滤波和 Bs 在 4 的边界滤波。
H265/HEVC 介绍
- 2010.4 月组建视频编码联合组 (JointCollaborativeTeamonVideoCoding, JCT-VC),联手制定新一代视 频编码标准——H. 265/HEVC。
- 2010年10月的JCT-VC第三次会议公布了第一份 HEVC工作草案说明”,并在会后发布了正式的测试模型HM(H EVCModel)。
- HEVC 的编码框架:
编码结构
- 图像组 GOP:视频序列由若干个图像构成一组,即 GOP,每个 GOP 之间独立编解码。
- Slice:每个 GOP 被划分成多个片 Slice,一个片可以是一帧图像,也可以是一帧图像中的一部分。
- SS:每个片 Slice 可以由一个或多个片段组成;HEVC 编码的最高层为 SS 层。
- Tile:即 从水平和垂直方向将一幅图像分割为若干个矩形区域,一个矩形区域就是一个 Tile,每个 Tile 包含整数个 CTU,可以独立解码。
- 编码树单元 CTU:类似 H264 中宏块的概念,一个 CTU 由一个亮度编码树 CTB 和两个色度编码树块 CTB 以及一些语法元素组成;亮度 CTB 的大小 LxL 中 L 取值可以是 16、32、64。
- 编码块 CB:在 H264 中编码块是固定的,即宏块;但在 HEVC 中一个 CTB 可以直接作为一个 CB,也可以进一步以四叉树的形式划分多个小的 CB;因此亮度 CB 最大为 64x64,最小为 8x8。
- 编码单元 CU:每一个 CTU 按照 四叉树 分割方式被划分为不同类型的编码单元,即 CU;一个亮度 CB 和相应的色度 CB 及其相关的句法元素共同组成一个编码单元 CU。
- 预测单元 PU:HEVC 中的 PU 规定了编码单元的所有预测模式,一切与预测有关的信息都定义在预测单元部分,此时假定编码单元为 2Nx2N。
- 帧内预测单元 PU 的可选模式:2Nx2N、NxN。
- 帧间预测单元 PU 的可选模式:4 种对称模式;4 种非对称模式,非对称按照 1:3、3:1 的比率划分;此外 skip 模式也是帧间预测的一种,只能选择 2Nx2N 。
- 变换单元 TU:HEVC 中变换单元 TU 用来独立完成变换和量化的基本单元;尺寸大小灵活,4x4~32x32。
- TU 大小依赖于 CU 模式。
- 在一个 CU 内,允许 TU 跨越多个 PU,以四叉树形式递归划分。
- 档次 Profile:HEVC 提出来三种档次,Main、Main10、Main Still Picture。
- 级别 Level:13 个级别,和 Tier 配合使用;4 和 4 以上的 8 个 level 支持 High Tier。
- 层 Tier:2 个层,Main Tier、High Tier。
预测编码
帧内预测
- 帧内亮度分量支持的 PU 大小:4x4、8x8、16x16、32x32、64x64
- 亮度预测模式 :每一种大小的 PU 都支持 35 种预测模式,DC、Planar、33 种角度模式。
- 帧内色度预测模式:一共有 5 种,DC、Planar、水平、垂直、对应的亮度预测模式。
- 帧内预测过程:35 种预测模式是在 PU 的基础上定义的,但具体的预测过程是以 TU 为单位的。标准规定 PU 可以以 四叉树 的形式划分TU,且一个 PU 内的所有TU 共享同一种预测模式。
- 判断当前 TU 相邻参考像素是否可用并做相应的处理;
- 对参考像素进行滤波;
- 根据滤波后的参考像素计算当前 TU 的预测像素值。
帧间预测
- 运动估计:H265 中新算法 TZSearch,起搜点以 AMVP 技术确定,之后根据菱形模版、正方形、全搜的过程进行搜索确定最佳整像素 MV。
- 亚像素运动估计:沿用了 H264 的插值算法(半像素 6 抽头,1/4 像素两点内插),但 H265 在亮度分量半像素采用离散余弦变换的 8 抽头滤波器,1/4、3/4 采用离散余弦变换生成的 7 抽头滤波器;色度分量的 1/8 像素采用离散余弦变换的 4 抽头滤波器。
- MV 预测技术:H265 在提出了两种新技术——Merge 技术、AMVP 技术;Merge 和AMVP 技术都使用了空域和时域MV预测的思想,通过建 立候选MV列表,选取性能最优的一个作为当前 PU 的预测 MV。
- Merge 技术:可以看作是一种编码模式;当前 PU 的 MV 直接由空域(或时域)上邻块的 PU 预测得到,不存在 MVD。
- MV 候选列表中有 5 个 MV;率失真代价计算,选择最优的 MV;若当前MV候选列表中候选MV的个数达不到 5 个时,需要使用 (0, 0) 进行填补以达到规定的数目。
- 编码器只需要传输最优 MV 在 MV 候选列表中的索引即可,所以大幅度减少了运动信息的比特数。
- 空域选择最多 4 个,时域 MV 候选列表的建立利用了当前 PU 在邻近已编码图像中对应位置 PU (即同位PU)的运动信息。与空域情形不同,时域候选列表不能直接使用候选块的运动信息,而需要根据与参考图像的位置关系做相应的比例伸缩调整。
- AMVP 技术:可以看作是一种 MV 预测技术;需要对实际 MV 和预测 MV 的差值进行编码,所以存在 MVD。
- MV 候选列表中有 2 个 MV;空域 5 个挑选 2 个候选 MV,时域选择 1 个候选 MV,填补(0, 0),保留候选列表中前两个 MV 作为最终预测 MV 候选列表。率失真代价计算选择最优预测 MV 作为起搜点,进行运动搜索,确定当前 PU 的最终 MV。
- Merge 技术:可以看作是一种编码模式;当前 PU 的 MV 直接由空域(或时域)上邻块的 PU 预测得到,不存在 MVD。
- 加权预测:加权预测可用于修正P Slice 或B Slice 中的运动补偿预测像素, HEVC 标准规定了两种加权预测方法 : 默 认 (Default ) 加权预测、Explicit 加权预测。
- 默认加权比较简单,不使用权重,直接根据参考队列的像素加 32。
- Explicit 加权预测使用权重乘以参考队里的预测像素,再加 32。权重由编码器决定,需要传送到解码端。
变换编码
- H265 沿用了 H264 的整数 DCT 变换,并进行了不同变换尺寸形式的推广,此外还用了整数 DST 变换。
- HEVC 采用了 4 种变换尺寸:4x4、8x8、16x16、32x32。
- DST 变换:HEVC 规定在帧内 4x4 亮度分量残差编码中使用 4x4 整数 DST变换;使得编码性能提高 0.8%。
- 这主要是由于帧内预测利用周围已重构块边缘像素预测当前块的方法使得帧内预测残差具有如下特征:距离预测像素越远,预测残差幅度越大。而DST的基函数能够很好地适应这一特征。
- 变换单元 TU:TU 是 HEVC 中变换、量化、熵编码的基本单位。
- CU、PU、TU 关系:PU 和 TU 都直接由 CU 划分,因此二者没有明确的关系,一个 PU 可以包含多个 TU,一个 TU 也可以包含多个 PU,但二者都必须小于 CU。但在帧内预测中,考虑依赖关系,一个 PU 可以包含一个或多个 TU,但一个 TU 只能对应一个 PU。
- 哈达玛变换:与 DCT 相比,哈达玛变换只有加减运算,而且可以用递归实现,且正向反向具有相同的形式,因此算法简单,易实现。
- 在 H264 中哈达玛变换被用在亮度分量帧内 16x16 模式中 DC 系数以及色度分量 DC 系数,进一步去相关。
- 在 H265 中熵编码以 TU 为单位,因此标准中未使用哈达玛变换。
- 在 H265 中 hadamard 变换更多用来计算残差信号 SATD,因为残差 SATD 相比 SAD,更接近 DCT;因此 SATD 广泛应用在快速模式选择中。
量化编码
- 在视频编码中 ,残差信号经过离散余弦变换 (DCT)后 , 变换系数往往具有较大的动态范围。因此对变换系数进行量化可以有效地减小信号取值 空间,进而获得更好的压缩效果。同时,由于多对一的映射机制,量化过程不可避免地会引入失真,它也是视频编码中产生失真的根本原因。
- 量化器 :分为标量量化器和矢量量化器,主流的编码器都使用标量量化器.
- 量化步长:HEVC 规定了 52 个量化步长,对应着 52 个量化参数(0~51);色度的量化参数限制为 0~45。
- RDOQ:率失真量化优化就是将量化过程与率失真优化 RDO 准则相结合,对于一个变换系数,给定多个可选量化值,通过率失真 优化 RDO,选择最合适的量化值。
- QP 控制机制:HEVC 引入引入了量化组 (Quantization Group, QG)的概念,规定一个 CTB 可以包含 一个或多个固定大小的 QG,同一 个QG内的所有含有非零系数的 CU 共享一个QP,不同的 QG 可以使用不同的 QP。
- QG:将一幅图划分成 NxN 个正方块,其大小 N 由 PPS 指定,且在最大 CU 和最小 CU 之间,QG 和 CU 没有固定关系。
环路后处理
- 环路后处理在编码框架中位置:经过滤波的重构像素才能作为后续编码像素的参考使用。环路滤波处理后的重建像素更有利于参考,进一步减小后续编码像素的预测残差,有效地提高视频的主客观质量。
去方块滤波
- 造成方块的原因:各个块的变换量化的编码过程相对独立,因此引入的量化误差也是相对独立;此外运动补偿预测过程也会造成方块效应。
- 去方块滤波:HEVC 需要针对所有 PU、TU 的边界中所有 8x8 块的边界进行处理;包括两个环节,滤波决策和滤波操作。虽然去块滤波的最小单位是 8x8 块,但实际是将 8x8 分成两部分独立处理,垂直 8x4 为基本单位,水平 4x8 为基本单位。
- 滤波决策:获取边界强度、滤波开关决策、滤波强弱选择。
- 边界强度 BS,取值 0、1、2;对于亮度分量, 0 表示不需要滤波,1 和 2 需要后续操作;对于色度分俩你给,0、1 表示不需要滤波,2 需要后续操作;
- 滤波操作:主要分为亮度分量的强滤波、弱滤波,和色度的滤波。
- 滤波决策:获取边界强度、滤波开关决策、滤波强弱选择。
- 滤波的具体实现:去方块滤波的具体实现因滤波顺序的不同可有多种形式,可以以 CTB 为基本单位,按照 raster 扫描方式进行处理;或先将整幅图像划分成互不重叠的8 x8 的块,然后再进行滤波;或以CU 为基本单位,按照Z 扫描方式进行处理。但其整体上都遵循对整幅图像先水平滤波再垂直滤波,并且仅对8x8 大小的块边界进行处理的原则。
样点自适应滤波
- 振铃效应:HEVC 仍然采用基于 DCT 变换, 并在频域对变换系数进行量化。对于图像里的强边缘,由于高频交流系数的量化失真,解码后会在边缘周围产生波纹现象,这种失真被称为振铃效应,严重影响视频的主客观质量。
- SAO 技术:样点自适应补偿技术则从像素域入手降低振铃效应: 对重构曲线中出现的波峰像素添加负值进行补偿,波谷添加正值进行补偿。
-
- 以 CTB 为单位,通过选择一个合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值, 可以有效提高视频的主客观质量。
- 两大类补偿形式:边界补偿 EO、边带补偿 BO,此外还有参数融合技术。
- 边界补偿 EO:边界补偿(EO)技术是通过比较当前像素值与相邻像素值的大小对当前像 素进行归类,然后对同类像素补偿相同数值。边界补偿共分为 4 种模式,水平、垂直、135°、45°
- 边带补偿 BO:边带补偿 (BO)技术根据像素强度值进行归类,它将像素范围等分成 32 条边带。HEVC 规定 CTB 只能选择 4 条连续的边带,并只对属于这 4 个边带的像素进行补偿。
- 参数融合技术:对于一个 CTB,其 SAO 参数直接使用相邻块的 SAO 参数,只需要标记使用了哪个相邻块的 SAO 参数即可。
熵编码
- 熵编码:熵编码是指按信息熵原理进行的无损编码方式,无损熵编码也是有 损视频编码中的一个关键模块,它处于视频压缩系统的末端。熵编码把一系列用来表示视频序列的元素符号转变为一个用来传输或存储的压缩码流,输入的符号可能包括量化的变换系数、运动矢量信息、预测模式信息等。熵编码可以有效去除这些视频元素符号的统计冗余,是保证视频编码压缩效率的重要工具之一。
- 熵:信息的多少称为信息量;自信息是信源发出某一符号所含有的信息量;自信息的数学期望为信源的信息熵。
- 变长编码:对信源输出的消息 (一个信源符号或者固定数目的多个信源符号) 采用不同长度的码字表示,这种编码方式称为变长编码。
- 哈夫曼编码是一种最佳变长编码;
- 指数哥伦布编码是结构规则的变长编码,解决了哈夫曼编码不规则结构导致的快速解码困难的问题。
- 算术编码:与变长编码不同,算术编码本质是为整个输入序列分配一个码字,而不是给每个输入流中的每个字符分别指定码字,因此平均意义上可以为单个字符分配码长小于 1 的码字,所以算术编码可以给出接近最优的编码结果。
- 这个码字是一个介于 0 和 1 之间的实数,表示为一个二进制分数。
-
算术编码的基本原理:根据信源可能发生的不同符号序列的概率, 把[0,1)区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率,这样信源发出的不同符号序列将与各子区间一一对应。因此每个子区间内的任意一个实数都可以用来表示对应的符号序列 ,这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特数就越少,因而相应的码字就越短。
- 指数哥伦布编码:属于变长编码,基本原理就是用短码表示出现概率较高的信息,用长码表示出现概率较低的信息;在熵编码中,很多语法元素都采用指数哥伦布码的形式映射为二进制比特流。其中零阶指数哥伦布编码应用非常广泛。
- 零阶哥伦布编码:是指数哥伦布编码家族的一种,可以根据公式直接解析码字,无须查表,解码复杂度较低。
- CABAC:基于上下文的自适应二进制算术编码 (CABAC)是 一种将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。CABAC 作为 H265 的主熵编码方法。
- 过程:二进制化、上下文建模、二进制算术编码
- 二进制化:一般采用一元码、定长码、指数哥伦布编码等二元方法。
- 上下文建模:根据条件熵理论,利用其他已编码的语法元素进行条件编 码,相对于独立编码或者无记忆编码能够进一步提高编码性能。这些用来作为条件的已编码符号信息称为上下文。在编码中,语法元素使用的上下文概率模型都被唯一的上下文索引 号 r 标识,每一个 r 涉及两个概率模型变量,即最大概率符号 MPS 和 概率状态索引。
- 二进制算术编码:二进制算术编码对当前语法元素二进制化后的每一个 Bin(二进制符号)根据其概率模型参数进行算术编码,得到最后的输出码流。
- 变换系数熵编码:HEVC标准中 , 亮度数据和色度数据均以变换块(TransformBlock, TB)为单位,通过 CABAC 编码非零系数的位置信息和非零系数的幅值信息来表示其变换系数。
- 变换系数扫描:在 H265 中变换系数的扫描是基于 4x4 的子块进行的。
- 扫描方式:对角扫描、水平扫描、垂直扫描。
网络适配层
- 与H.264类似 ,HEVC也采用了视频编码层 (VideoCoding Layer, VCL) 和 网络适配层(Network Abstract Layer, NAL) 的双层架构,以适应不同的网络环境和视频应用。网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行必要的标识,使其可以很好地适应复杂多变的网络环境。
- 图像类型:承载视频数据的 NALU 称为 VCLU,承载非视频数据的 NALU 称为 non-VCLU。
- 随机接入点 IRAP:从 IRAP 开始,后续的视频流可以独立解码,IRAP 后的第一幅图像被称为 IRAP 图像。
- IRAP 类型:IDR 图像、CRA 图像、BRA 图像
- 网络适配单元 NALU:所有的视频压缩数据被封装成一个个的NALU,它们具有统一的语法结构。 每一个 NALU包含两部分: NALU头 (Header)和 NALU载 荷 (Payload)。 NALU头长度为固定的两字节,反映NALU 的内容特征。NALU 载荷长度为整数字节, 承载视频压缩后的比特流片段。
- NALU 头:由定长的 2 字节四部分组成,forbidden_zero_bit 占 1 比特,设置为 0;nal_uint_type 占 6 比特,取值 0~63,称为 NALU 类型;nuh_layer_id 占 6 比特,用于标识可分层或 3D 视频;nuh_layer_id_plusl 占 3 比特,标识时域分层信息。
- 编码切片:0~9
- SEI:39、40
- AUD:35
- PPS:34
- SPS:33
- VPS:32
- 关键帧:16~20
- NALU 载荷:视频编码输出的比特流片段称为 SODB,在 SODB 后添加 RBSP 尾 就生成了原始载荷数据 RBSP;在NAL内部为了防止与起始码竞争,引入了填充字节0x03,这样便形成了EBSP(Encapsulated Byte Sequence Payload)。
- NALU 头:由定长的 2 字节四部分组成,forbidden_zero_bit 占 1 比特,设置为 0;nal_uint_type 占 6 比特,取值 0~63,称为 NALU 类型;nuh_layer_id 占 6 比特,用于标识可分层或 3D 视频;nuh_layer_id_plusl 占 3 比特,标识时域分层信息。
HEVC 并行处理技术
- Slice:继承了 H264 的并行技术。
- Tile:为了并行处理将一副图像划分成若干个矩形区域;但 Tile 的引入也会随着数量的增加编码性能降低。
- 波前并行 WPP:该技术允许多行 CTB 同时进行,但是后一行的处理要比前一行滞后两个 CTB。
- 依赖片:将一段用于波前并行处理的CTB 行数据或一个Tile打包到一个单独的NAL单元当中,这样一个单元被称为一个依赖片;依赖片的引入也有利于并行处理,尤其在解码端。
其他
- 此外还有关于率失真优化和码率处理相关技术。
H266/VVC 介绍
- ITU-T 和 ISO/IEC 于 2015 年成立了 JVET 工作组并开始 H.266/VVC 编码标准的研制工作,2020 年 7 月 H.266 第一版标准正式发布。H.266 相比于 H.265 在相同画质下可以节省 50%左右的码率。
- 相关代码:
编码结构
编码单元划分
四叉树划分
- CTU:继承了 HEVC 的四叉树划分结构,同时编码树单元 CTU 的最大尺寸为 128x128;CTU 是 HEVC 提出的概念,一个 CTU 包括一个亮度编码树块 CTB 和 两个对应色度编码树块 CTB ,及相关的语法元素。
- CU:CTU 可以按照四叉树方向向下划分成不同编码单元 CU;VVC 去除了 HEVC 的 PU、TU 概念,直接在 CU 上进行预测、变换。
多类型树划分
- CU 除了可以按照四叉树划分,还可以按照多类型树(multi-type tree,MTT)进行划分。
- 具体过程:VVC 首先对 CTU 按照四叉树分成不同的 CU,然后叶子节点的 CU 可以按照多类型树划分,包括垂直二叉树、水平二叉树、垂直三叉树、水平二叉树;其中三叉树按照 1:2:1 的比例划分。
- 仅对四叉树的叶子节点进行多类型树划分,多类型树的叶子节点也称为 CU。
- 编码单元划分示意图:
参数集
- CVS:H266的编码码流包含一个或多个编码视频序列(Coded Video Swquence,CVS),每个CVS 以帧内随机接入点(Intra Random Access Point, IRAP)或逐渐解码刷新(Gradual Decoding Refresh, GDR)图像开始。CVS是时域独立可解码的基本单元。
- CLVS: 编码视频序列层,当编码码流只包含一层时,CVS与CLVS一致。
- AU:访问单元
- PU:图像单元,不同于H265里的预测单元PU,在H266中的每个PU为一幅图像,包含一个或多个片Slice。CVS、AU、PU的关系如下。
- VPS:视频参数集,VPS主要用于承载视频分级信息,表达PU间的依赖关系,支持可分级视频编码或多视点视频编码。
- SPS:序列参数集,
- PPS:图像参数集,
- PH: 图像头,作用与PPS相似,PH承载频繁变换的编码参数信息,如IRAP /GDR图像标识、Slice类型允许、图像序列、去方块滤波、SAO参数等。
- APS: 自适应参数集,主要包含的信息具有大量数据,如传递自适应环路滤波参数ALF、参数映射与色度缩放参数LMCS、量化矩阵参数。
- DCI: 解码能力信息。
- SEI: 附加增强信息。
Slice、Tile、子图像划分
- Tile:一幅图像可以划分若干个Tile,即从水平方向和垂直方向将一幅分割成若个矩形区域,一个矩形区域就是一个Tile,每个Tile包含整数个CTU,可以独立解码。划分Tile的主要目的是在增强并行处理能力的同时又不引入新的错误扩散。
- Slice:在H266中一图图像可以被分割成一片或多片Slice,目的是压缩数据的高效存储、传输,每个Slice对应一个单独的NAL单元。
- 在 h266 中 Slice 划分可以分为光栅扫描 Slice 模式 和 矩形划分 Slice 模式;光栅扫描 slice 模式的 slice 包含按扫描顺序的几个完整 Tile。矩形 slice 模式的 slice 可以包 含多个 Tile 或同一个 Tile 内的多个连续 CTU 行,最终 slice 是矩形区域。
- 子图像:包含一个或多个 slice 最终形成一个矩形区域。每个子图像边界同时也是 slice 的边界,且子图像的垂直边界也是 Tile 的垂直边界。
Profile、Tier、level
- Profile:规定了 VVC 可以采用哪些算法和编码工具,VVC 规定了 6 种 Profile 档次。
- Tier:H266/VVC规定了 2 个层Tier,主要规定了最大码率,用来区分不同场景的码率要求; 两个层分别是Main Tier(
general_tier_flag=0
)、High Tier(general_tier_flag=1
)。 - level:H266/VVC规定了 13 个级别,支持从SQCIF 到8K多种分辨率的图像。图像的宽和高受到该级别定义参数MaxLumaPs的限制,还约束了水平方向和垂直方向Tile的最大数量,以及每秒Tile的最大数量。
帧内预测
- 参考像素 :H266沿用大范围边界像素作为当前CU的参考,当参考像素不可用或不存在时使用默认值填充的方式得等到参考像素值。H266引用多参考行内预测(Multiple Reference Line Intra Prediction, MRLP)技术,领域像素可选范围扩展到当前CU上侧三行和左侧三列。得到邻域像素后,进行平滑滤波或差值滤波,引入模式依赖的帧内平滑(Mode Dependent Smoothing,MDIS)技术,根据预测模式和CU尺寸进行不同的滤波处理。
- 单参考行像素:当参考像素不存在或者不可用时(比如图像边界、Slice边界、Tile边界或尚未编码块),H266使用最邻近的像素进行填充,比如下图A的参考像素不存在,则A所有像素都用B的最下方的像素进行填充。
-
- 多参考行内预测:
-
- 参考像素滤波 MDIS:
满足条件下的整数平滑滤波
、非整像素下的三次插值滤波器
、非整像素的高斯插值滤波器
。
- 参考像素滤波 MDIS:
- 帧内模式:65 种角度预测模式,DC 模式、Planar 模式,一共 67 种预测模式。
- 传统角度模式:位于-135°~45°内,水平类模式编号为2 ~ 33,垂直类编号34 ~ 66;每种角度预测模式都相当于在水平或垂直方向做了角度偏移。
- 宽角度模式 WAIP:在H266中,二叉树划分和三叉树划分都会导致非方形CU的出现,传统的角度模式范围可能会限制非方形CU对参考像素的选择。针对非方形CU,增加宽角度预测模式后,仍使用 65 种候选角度预测模式,即增加的宽角度预测模式替换了部分传统角度预测模式。
-
- 基于矩阵的帧内预测 MIP:传统预测模式及宽角度预测模式都是以像素映射或线性渐变方式计算预测值,无法对不规则纹理做出有效的预测。H266标准使用了MIP技术,采用离线训练神经网络的方法,得到多个固定的权重矩阵,进而利用权重矩阵计算预测值。
- 预测值修正:基于像素距离对部分帧内预测模式的预测值进行修正,H266/VVC使用了位置相关的帧内预测组合(Position Dependent Intra Prediction Combination,PDPC)技术,借助不同位置的参考像素值修正预测值。该技术将参考像素与预测像素之间的距离作为权重计算修正值,再与预测值加权计算的得到最终的预测值,该过程称为预测值修正。
- PDPC技术仅对部分预测模式进行修正,具体包括Planar模式、DC模式、编号[2, 18] 和 编号[50, 66] 内的角度预测模式。
- 帧内子区域划分技术 ISP:ISP技术旨在充分利用与待预测像素距离相近的参考像素进行预测。根据编码块得到大小,将亮度帧内预测块垂直划分或水平划分为若干个子区域,并按照从左到右、从上到下的顺序依次进行编码及重建。ISP技术使得帧内预测编码可以基于CU子区域进行,前一个子区域编码之后的重建像素为下一个子区域提供参考,各子区域共用同一种帧内预测模式。
- 分量间线性模型预测技术 CCLM:在H266中,CU色度分量进行预测编码前,亮度分量已经完成编码获得亮度重建值,因此亮度分量可以作为色度分量预测的参考信息。CCLM技术通过参考像素的亮度重建值和色度重建值建立分量间线性关系,根据待预测像素的亮度重建值计算色度预测值,过程如下图。
- 亮度分量的最可能模式(Most Probable Mode,MPM)技术:MPM技术充分利用相邻块预测模式之间的相关性,来进行亮度预测模式的编码。
- 色度分量亮度派生模式(Derived Mode,DM)技术:针对色度预测模式编码,H266使用了DM模式,即直接使用对应位置的亮度预测查模式信息。
帧间预测
- MV 预测技术
- 在自然图像中,一个运动物体可能会包含多个编码块(单元),这些编码块之间可能具有类似的运动信息,即编码图像中空间相邻的块可能具有较强的空间 相关性。如果当前编码块使用相邻已编码块的 MV 进行自身 MV 的预测,并将得到的预测 MV 与实际 MV 的差值进行编码传输,就可以减少编码 MV 所需的比特数。其中 MV 的差值称为 MV 残差(MVD,Motion Vector Difference)。
- HEVC 中 MV 预测技术:采用时空域信息 MV 预测思想被应用在 Merge 和 AMVP 技术中;核心思想都是建立一个候选 MV 列表,从中选取性能最优的 MV 最为当前块的预测 MV;但 Merge 和 AMVP 的候选列表长度不同,Merge 是 5 个,AMVP 是 2 个。
- H266 中 MV 预测技术:继承了 HEVC 的 Merge 技术和 AMVP 技术,同时还扩展了一些新技术。
- 在自然图像中,一个运动物体可能会包含多个编码块(单元),这些编码块之间可能具有类似的运动信息,即编码图像中空间相邻的块可能具有较强的空间 相关性。如果当前编码块使用相邻已编码块的 MV 进行自身 MV 的预测,并将得到的预测 MV 与实际 MV 的差值进行编码传输,就可以减少编码 MV 所需的比特数。其中 MV 的差值称为 MV 残差(MVD,Motion Vector Difference)。
- Merge 模式
- 是一种编码模式,不存在 MVD。Merge模式不需要传输 MVD 和参考帧索引,是一种高效的MV编码方法。H266保留了常规Merge模式的同时,还引入了CIIP、MMVD、GPM、SbTMVP、仿射Merge等技术。
- 候选 MV 列表长度:最多 6 个 候选 MV。
- VVC 中 Merge 模式中 MV 候选类型:空域相邻块 MVP、同位块时域 MVP、基于历史信息构建的 FIFO 表中 MVP、成对的平均 MVP、零运动矢量。
- 常规 Merge 技术:直接将MVP运动矢量信息(参考图像索引、运动矢量)作为当前CU运动矢量信息的帧间编码方式。
- 空域相邻块 MVP:与 HEVC 一样,最多提供 4 个候选 MV。
- 零运动矢量:还剩下就将单向、双向、值为(0,0)的MV补充道MergeMVP列表的末端,如果计算完平均候选项后Merge还未填满,则用0MV填充候选列表,直到候选列表达到最大长度。
- 成对的平均 MVP:如果还有位置,就使用平均候选AvgCnd来补充列表,使用Merge候选列表中前两个候选项对来生成成对平均候选mvp。
- 基于历史的 MV 预测 HMVP:将先前已编码块的运动信息存储在一个最大长度为 6 的HMVP列表中,随着编码过程不断更新,按照先进先出的原则保持列表控制冗余,每个CTU行重新置0。如果MergeMVP 列表还有空域位置,就按照HMVP列表顺序添加不同的选项。在空域候选和时域候选推导完成之后,将HMVP的Merge候选项加入Merge候选列表。
- 同位块时域 MVP:参考帧同位置,按比例伸缩调整,最多提供 1 个候选 MV。
- Skip 模式:是 Merge 模式中的 特例 ,直接使用MVP信息作为当前CU的运动矢量,编码端仅需要编码运动矢量(MV)在候选列表中的索引,不编码MVD信息和预测残差信息。Skip模式也可以是 MMVD、GPM、SbTMVP、仿射Merge等的拓展模式。
- 联合帧内帧间预测模式 CIIP:利用帧内预测值和帧间预测值的加权平均值得到当前CU预测值的技术。
- MMVD:因为视频相邻区域 CU 往往有不同的运动特性,常规merge降低了MV编码比特数,但也因为不准确的MV产生大的预测误差。AMVP技术编码运动矢量的预测残差MVD,与MVP一起表示运动矢量。但是AMVP模式下的MVD通常需要较多的比特表达,所以VVC引入了一种带有运动矢量差的merge技术MMVD。
- 利用VVC中普通Merge候选列表构建的过程,得到当前CU的候选列表,并选择位与列表的前两个候选作为初始的运动矢量基。
- 对该初始MV进行扩展,主要在运动幅度和运动方向上进行扩展,来得到最终的扩展后的运动矢量,以形成新的运动矢量。
- GPM :VVC中,CTU可以经过二叉、三叉、四叉树划分,但是实际视频内容和多样,当物体运动具有非水平或垂直边缘的时候,不能有效匹配,所以引入几何帧间预测模式 GPM,允许使用非水平或垂直直线对矩形CU进行划分,每个子区域可以使用不同的运动信息进行运动补偿。从而提升预测准确度。为merge拓展模式。
- GPM两个分区的运动信息使用Merge模式编码,GPM模式的候选列表是由常规Merge模式推导而来的。
- SbTMVP 模式:它类似于HEVC中的时间运动矢量预测(TMVP),使用同位图片中的运动场来改善当前图片中CU的运动矢量预测和Merge模式。SbTMVP与TMVP的主要区别在于:
- TMVP预测CU级别的运动,而SbTMVP预测子CU级别的运动;
- TMVP直接从同位图片的同位块获取时间运动矢量,而SbTMVP在从同位图片中获取时间运动信息之前应用了运动偏移,这个运动偏移来自当前CU的空间相邻块的运动矢量。
- 仿射 Merge 模式:仿射Merge技术(Affine Merge)是H.266/VVC视频编码标准中的一项新技术,它允许使用仿射变换来更准确地预测运动矢量。在仿射Merge模式中,当前块的运动信息是基于空间上相邻的块的运动信息推导出来的。这种技术特别适用于描述复杂运动,如旋转、缩放、拉伸等非平移运动。
- 在H.266/VVC中,仿射Merge模式使用基于子块的帧间预测,其中子块的大小固定为8x8,并且仅用于宽度和高度都不小于8的 CU。仿射Merge模式通过使用Merge模式的思路,从子块Merge候选列表中选择运动信息,这个列表由空间相邻块的运动信息构成。
- 在编码过程中,从候选列表中选择一个最佳候选,并将该候选的运动信息作为当前块的运动信息。
- 使用这些控制点的运动矢量来推导当前CU的运动矢量预测。
- 从空间相邻的CU中获取运动矢量信息,这些信息被用来生成控制点的运动矢量 CPMV。
- 在H.266/VVC中,仿射Merge模式使用基于子块的帧间预测,其中子块的大小固定为8x8,并且仅用于宽度和高度都不小于8的 CU。仿射Merge模式通过使用Merge模式的思路,从子块Merge候选列表中选择运动信息,这个列表由空间相邻块的运动信息构成。
- AMVP 技术
- 是一种 MV 预测技术,存在 MVD。
- AMVP模式是H.265/HEVC中提出的新的MV预测技术,H.266/VVC仍采用了该技术,并在HEVC的基础上进行了改进。AMVP通过高效表达运动矢量插值MVDF进行运动信息编码。主要是利用空域和时域的运动矢量的相关性,为当前PU建立了候选预测MV列表,编码端从其中选出最优的预测MVP,并对MVP进行差分编码(即通过运动搜索获得真正的MV,将运动矢量差进行编码(MV-MVP));解码端通过建立相同的列表,仅需要预测MVP在列表中的索引和运动向量残差MVD即可计算出当前PU的MV。
- 候选 MV 列表长度:常规 AMVP 技术中候选列别长度最多 2 个。
- 常规 AMVP:是针对运动矢量信息的差分编码技术;该模式利用空域、时域上运动矢量的相关性,为当前CU建立MVP候选列表。与Merge不同,编码端为当前CU建立MVP候选列表,针对不同的参考图像构建得到的MVP列表可能不同,常规AMVP需要编码参考帧索引、MVP列表索引、MVD。
- 空域:最多允许 2 个
- 零运动矢量:
- 基于历史 HMVP:类似 Merge,从最近的 4 个 MV 候选中选择。
- 时域:类似 Merge
- 对称运动矢量差分编码 SMVD:在实际场景中,物体的运动在短时间内时匀速的;对于双向预测,并且参考帧位于当前帧两侧的情形,前后向运动矢量可能具有对称一致性。因此,H266采用对称运动矢量差分编码(Symmetric MVD Coding,SMVD)模式,只编码前向MVD,后向MVD则根据对称一致性推导得到。
- 自适应运动矢量精度 AMVR:提高运动矢量精度有利于提高运动补偿效果,而运动剧烈场景则需要更大的运动矢量范围,同时,在提高运动矢量范围和精度时,编码运动矢量需要更多的比特数。H266兼顾运动矢量和精度,引入CU级的自适应运动矢量精度(Adaptive Motion Vector Resolution,AMVR)技术,该技术允许每个CU自适应选择一种精度表示MVD,最高精度为1/16亮度像素,最低精度为4亮度像素。
- 仿射 AMVP:
- 亚像素插值:H266/VVC采用双线性插值方法,插值滤波器为一维滤波器,按照先水平方向后垂直方向的顺序完成二维亚像素插值。
- 亮度分量最高支持1/16像素精度插值,统一为 8 抽头滤波器,由基于离散余弦变换的滤波器生成。
- 色度分量最高支持1/32像素精度插值,统一使用 4 抽头滤波器,水平、垂直滤波器系数分别由水平、垂直方向的缩放因子决定。
- 帧间加权预测:加权预测(Weighted Prediction,WP)是 H.264 和 HEVC 中用来提高渐 变视频内容编码效率的工具,WP 技术为参考帧列表 L0 和 L1 中的每个参考图像 传输加权参数(权值和偏置),在运动补偿过程中,将使用相应参考图像的权值和偏移量,在 HEVC 中进行双向预测时,预测值等于前向预测值和后向预测值 的均值。
- H266/VVC采用 Slice级加权预测 和 CU级加权预测(Bi-Prediction with CU-Level Weight, BCW)。Slice级加权预测所有CU共用同一组参数,归为显性(Explicit)预测,BCW每个CU利用索引确定加权值,归为默认加权,当不使用加权与测试时,归为默认加权。
- 光照强弱出现变化时,视频中同场景会出现全局或局部的亮度变化,如拍摄的光圈变化,人为剪辑的淡入淡出等;传统的运动补偿得到的残差较大,Slice级加权预测可以有效应对此种场景。Slice级加权预测通过对参考图像的重建像素值做一个线性变换得到预测值。
- 解码端运动矢量细化DMVR: Merge模式可以高效表示运动矢量信息,但可能会导致其运动矢量并非使参考块与编码块最匹配。为了改进Merge模式下MV的精确性,进一步减少预测残差,H266采用了一种基于双边匹配的解码端运动矢量细化技术(Decoder-Side Motion Vector Refinement, DMVR)。
- 基于光流场的预测值修正:对于时域邻近的视频帧,同一目标在不同帧上的亮度通常不会发生变化,而且运动距离很小;因此可以利用图像帧中像素亮度在时间域上的变化及像素空域相关性,计算视频帧之间的像素运动信息,即光流。当前像素值可以根据参考像素值(对应位置)、光流值、空域梯度得到。当运动补偿中运动矢量存在较小误差时,可以计算运动矢量误差(光流值),对预测值进行补偿。称为基于光流的预测值修正。
- BDOF: 采用双向运动补偿的帧间编码块,可以利用前向预测参考块和后向预测参考块得到一致性,估计前向预测参考块和后向预测参考块间的光流,作为运动矢量的修正值,这技术称为双向光流(Bi-Directional Optical Flow, BDOF)。
- 基于光流的仿射预测修正: 在H266中,仿射运动补偿技术(仿射Merge模式、仿射AMVP模式)以4x4子块为处理单位,每个4x4子块拥有一个共同的运动矢量,而仿射运动区域,每个像素的运动矢量都不同,导致每个像素点的亮度补偿值可能有少许偏差。针对采用仿射运动补偿的编码块,光流预测细化(Prediciton Refinement with Optical Flow, PROF)技术为4x4子块的每个像素计算光流补偿值,即像素运动矢量与子块运动矢量的差值,然后根据光流计算公式计算每个像素的亮度补偿值。
- 帧间预测模式的组织形式
变换编码
量化编码
环路滤波
熵编码
AV1 介绍
网址:
https://aomedia.googlesource.com/aom
下载:
git clone https://aomedia.googlesource.com/aom
IVF视频格式
- 参考:Duck IVF - MultimediaWiki
- 参考:Indeo IVF - MultimediaWiki
- 可以看到IVF有两种定义,一种是 Intel创建,用于封装其Indeo编解码器。Indeo是一系列视频编解码器,由英特尔在1990年代开发,主要用于视频游戏和早期的互联网视频流。Indeo编解码器以其高压缩率和良好的视频质量而闻名;另外一种是IVF(Interleaved Video Format)是一个简单的文件格式,它被设计用来传输未压缩的VP8视频数据,VP8是一种开源的视频压缩格式,由On2 Technologies开发,并被Google收购后进一步开发和优化。目前也用来封装 VP9、AV1 的视频数据。
- 利用码流分析工具打开 AV1 的码流如下,因此 IVF 的文件格式可以描述如下:
- IVF Start Header 解释:利用码流分析工具展开 AV1 的码流中的IVF Start Header,如下
- 根据官网解释,IVF Start Header由 32 字节组成,如下图,多字节是采用小端编码。
- IVF Frame Header 解释:利用码流分析工具展开 AV1 的码流中的IVF Frame Header,如下
- 根据官网解释,IVF Frame Header 是一个12 字节组成,如下图,主要就是描述当前帧的大小和时间戳。
块分区
编码块分区
- 最大的编码块单元 LCU : 128x128
- 编码块尺寸类型:128x128、64x64、32x32、16x16、8x8、4x4
- 超块 SuperBlock:可以为 128x128 或 64x64,默认 128x128,在序列头中进行信息传递,即在编码参数中可配置
- 分区类型:一共 10 种
- PARTITION_NONE:不划分模式(No-partitioning mode),表示超块不进行进一步划分
- PARTITION_HORZ:二划分模式(2-partition modes),将超块按照水平方向划分成两部分
- PARTITION_VERT:二划分模式(2-partition modes),将超块按照垂直方向划分成两部分
- PARTITION_SPLIT:四划分模式(4-partition modes),将超块等分成四个小块,并允许递归
- PARTITION_HORZ_A:三划分模式(T-shaped partition modes),将超块水平划分成两部分,再将上部分垂直划分两部分
- PARTITION_HORZ_B:三划分模式(T-shaped partition modes),将超块水平划分成两部分,再将下部分垂直划分两部分
- PARTITION_VERT_A:三划分模式(T-shaped partition modes),将超块垂直划分成两部分,再将左部分垂直划分两部分
- PARTITION_VERT_B:三划分模式(T-shaped partition modes),将超块垂直划分成两部分,再将右部分垂直划分两部分
- PARTITION_HORZ_4:四划分模式(4-partition modes),将超块水平方向等分成四部分
- PARTITION_VERT_4:四划分模式(4-partition modes),将超块垂直方向等分成四部分
- 根据编码块划分模式,一共可以有 22 种可能的块尺寸类型
- 编码块分区注意事项:
- 只有PARTITION_SPLIT模式允许低估划分,其他模式无法进一步分割
- 对于 8x8、128x128 块,无法使用PARTITION_HORZ_4、PARTITION_VERT_4
- 对于 8x8,无法使用三划分模式,即PARTITION_HORZ_A、PARTITION_HORZ_B、PARTITION_VERT_A、PARTITION_VERT_B
- 在 libaom 源码中实际上没有在三划分模式和水平、垂直四划分模式进行下一步的预测搜索
变换块分区
- 对于每个帧内、帧间编码块,编码块可以进一步分区成多个变换单元,分区深度可以达到 2 级别;
- 所有可能的变换尺寸类型:
- 当前深度的变换尺寸与下一深度的变换尺寸映射关系如下图:
- 变换类型根据变换比例划分:
- 1:1 方块:当变换块是正方形时(例如,4x4、8x8等),在进行下一级的变换划分时,会创建四个相同大小的1:1正方形变换块。例如,一个8x8的变换块可以划分为四个8x8的子变换块。
- 1:2/2:1 非方块:当变换块是水平或垂直的非正方形时(例如,4x8或8x4),在进行下一级的变换划分时,会创建两个1:1正方形变换块。这意味着一个4x8的变换块可以划分为两个4x4的变换块,或者一个8x4的变换块也可以划分为两个4x4的变换块。
- 1:4/4:1 非方块:当变换块是更细长的水平或垂直非正方形时(例如,4x16或16x4),在进行下一级的变换划分时,会创建两个1:2或2:1的非正方形变换块。例如,一个4x16的变换块可以划分为两个4x8的变换块,或者一个16x4的变换块可以划分为两个8x4的变换块。
- 对于帧内编码块,变换分区方法是所有变换块必须有相同尺寸,变换块以 raster 扫描顺序,如下图:
- 亮度分量变换尺寸一致性:假设有一个32×16的编码块(coding block),在第一级变换划分时,会创建两个尺寸相同的16×16变换块。如果进行第二级变换划分,那么每个16×16的变换块将被进一步划分为四个8×8的变换子块,最终得到八个8×8的变换子块。
- 对于帧间编码块,变换单元分区以递归方式分区,深度最大 2 级别;
- 分区支持类型:1:1、1:2/2:1、1:4/4:1
- 变换单元尺寸:4x4 ~ 64x64
- 如果编码单元是小于等于64x64,变换单元分区仅仅适用于亮度分量;而色度块的变换尺寸和编码尺寸相同
- 如果编码单元的宽或高是大于 64,那么亮度和色度编码块将隐式地分割成最小尺寸的变换单元。对于亮度分量,分割成min(W, 64)×min(H, 64)大小的变换单元;对于色度分量,分割成min(W, 32)×min(H, 32)大小的变换单元。
- 对于色度编码块,变换块尺寸通常与编码块尺寸相同;然而,存在一个特殊情况,即当色度编码块的宽度或高度大于32像素时,色度变换块的宽度或高度会被设置为32像素。
- 如果色度编码块的宽度或高度超过32像素,无论实际尺寸如何,色度变换块的尺寸都将被限制为32x32像素。这个限制确保了变换块不会超过这个最大尺寸。例如,如果一个色度编码块是64x32,那么在变换过程中,它将被划分为两个32x32的变换块。
帧内预测
方向帧内预测模式
- 方向帧内预测模式被应用到帧内预测,通过给定的方向模式来模拟局部纹理信息;方向帧内模式由名义模式和角度增量表示,名义模式类似 VP9,有 8 种角度(45°、67°、90°、113°、135°、157°、180°、203°),角度增量的索引值范围-3 ~ +3,零增量表示名义模式,预测角度是由名义模式加上一个角度增量表示;
- 一共有 56 种方向预测模式;
- 名义模式索引和角度增量索引是分开信号传输,且名义模式的索引再相关角度增量索引之前被信号传输;
- 值得注意的是,对于小尺寸(4x4、4x8、8x4),扩展帧内预测角度带来的编码增益很小,因此名义模式被使用而角度增量索引没有被信号传输;
非方向帧内预测模式
- 除了放向帧内预测模式,还有 5 种非方向帧内模式用来模拟平滑纹理,分别是DC_PRED、SMOOTH_V、SMOOTH_H、SMOOTH、Peath预测;
- DC_PRED 模式:通过平均顶部和左侧邻近块的重建样本来生成当前块的预测样本。
- SMOOTH_V 、SMOOTH_H 、SMOOTH模式:分别沿垂直和水平方向使用二次插值生成预测值,而SMOOTH 模式则使用沿两个方向的二次插值结果的平均值来生成预测值。用于二次插值的样本包括来自顶部和左侧邻近重建块的重建样本,以及通过顶部和左侧重建样本估计的右侧和底部边界的样本。
- Paeth 预测模式:是一种加权预测,如图所示,根据其顶部(T)、左侧(L)和左上角(TL)的参考样本预测每个样本。在这些参考样本中,与(T + L – TL)的值最接近的那个值被选为预测样本。
- Paeth模式是以人名命名的模式, 有个人在开发 PNG 图像编码时发明了Paeth预测。
递归滤波模式
- 在AV1编码标准中,滤波帧内预测模式是一组用于帧内预测的工具,它们通过应用不同的滤波器来预测当前编码块(coding block)内的像素值,基于周围的已知像素(通常是顶部和左侧的像素)。
- 5 种滤波帧内模式被定义(FILTER_DC_PRED、FILTER_V_PRED、FILTER_H_PRED、FILTER_D157_PRED、FILTER_PAETH_PRED),每一种模式都特定一组八个 7-tap 滤波器;
- 给定选定的滤波模式索引(0到4),当前块被划分为4x2的子块;
- 对于一个4x2的子块,每个样本通过使用7个顶部和左侧的相邻样本作为输入,通过7-tap插值来预测;
- 对于每个4x2的子块,使用相应的7-tap滤波器根据相邻的样本来预测当前子块内的样本;
- 预测过程可以以4x2子块为单位递归进行,这意味着为一个4x2预测块生成的预测样本可以用来预测另一个4x2子块;
- 递归内预测模式特别适合于预测具有明显方向性纹理的区域,例如边缘或斜线。通过递归地利用已预测的样本来预测新的样本,这种方法可以有效地捕捉和延续图像中的方向性特征。
从亮度到色度模式
- 从亮度到色度CfL 是一种色度帧内预测模式,通过建立共位重建亮度采样的线性函数来模拟色度采样;
- 对于不同的色度采样格式(例如4:2:0和4:2:2),可能需要对重建的亮度像素进行子采样,以匹配色度样本的分辨率;
- 在CfL模式中,从亮度样本中移除直流分量以形成交流(AC)贡献。预测块是色度直流(DC)分量和缩放的亮度交流(AC)分量之和;
- 在CfL模式中,指定两个颜色分量之间线性函数的模型参数(如缩放因子α)由编码器优化,并在编码过程中信号化到比特流中;
- DC分量是预测块内所有样本的平均值,代表块的直流或平均亮度水平;AC分量是亮度样本与DC分量的差值,代表块内的交流或细节信息。
- 色度的预测模式一共有 14 种,而 CfL 模式是序号 13,在 enums.h 种定义;
帧间预测
运动矢量预测
- 运动矢量可以被相邻块预测,这些相邻块可以是空域相邻块,或位于参考帧中的时域相邻块;通过检查所有这些块,将确定一组运动矢量预测器,并用于编码运动矢量信息。
空域运动矢量预测
- 两组空域相邻块可以被利用寻找空域 MV 预测器,第一组包括当前块的直接上方和左侧的邻近空间邻居,第二组包括靠近但不是直接相邻于当前块的外部空间邻居。
- 对于每组空间邻近块,首先从左到右检查顶行,然后从上到下检查左列。对于相邻空间邻近块,在检查完左列邻近块之后,还会额外检查右上角的块。对于非相邻空间邻近块,首先检查位于(-1,-1)位置的左上角块,然后以与相邻邻近块相似的方式检查顶行和左列。首先检查相邻邻近块,其次检查下一子节将描述的时间运动矢量预测器,之后检查非相邻空间邻近块。
- 对于使用一对参考帧的复合预测,不使用非相邻空间邻近块来推导运动矢量预测器。
时域运动矢量预测
- 除了空域相邻块,MV 预测器还可以使用参考图像的同位块来推导出运动矢量(MV)预测器,即所谓的时间MV预测器。
- 过程:
- 存储参考帧的MV:首先,将参考帧的MV与各自的参考帧索引一起存储。
- 为当前帧的每个8×8块生成时间MV预测器:对于当前帧的每个8×8块,识别并存储穿过该块的参考帧的MV,并与参考帧索引一起存放在时间MV缓冲区中。
- 示例:如下图所示的例子中,参考帧1(R1;图右侧)的MV,即MVref,从R1指向R1的参考帧(图左侧)。在此过程中,它穿过了当前帧的8×8块。MVref被存储在与这个8×8块相关联的时间MV缓冲区中。
-
- 运动投影过程:在推导时间MV预测器的过程中,参考帧按预定义的顺序进行扫描:LAST_FRAME、BWDREF_FRAME、ALTREF2_FRAME、ALTREF_FRAME和LAST2_FRAME。按扫描顺序,较晚的参考帧的MV会替换之前识别的MV。
- 最终时间MV预测器的确定:给定预定义的块坐标,识别并投影存储在时间MV缓冲区中的相关MV,以派生出指向当前块到其参考帧的时间MV预测器,例如上图中的MV0。
- 时间MV预测器的预定义块位置:如下图所示,展示了派生16×16块时间MV预测器的预定义块位置。最多检查七个块以找到有效的时间MV预测器。在检查最近的空间MV预测器之后,但在检查非相邻空间MV预测器之前,会检查时间MV预测器。
- MV预测器的派生:在派生MV预测器时,将所有空间和时间MV候选项汇集在一起,每个预测器被分配一个在扫描空间和时间邻近块期间确定的权重。基于相关权重,对候选项进行排序和排名,并识别出多达四个候选项,将它们添加到MV预测器列表中。这个MV预测器列表也被称为动态参考列表(DRL),如下一子节所述,它在动态MV预测模式中进一步使用。
动态运动矢量预测
- 运动向量(MVs)的预测可以通过以下方式完成:
- 空间邻近块:在当前帧内,利用空间上邻近的编码块来预测MV。
- 时间邻近块:在参考帧内,利用时间上邻近的块来预测MV。
- MV预测器集合:通过检查所有这些块,最多可以确定四个MV预测器。
- 单参考帧间预测的MV预测模式:
- NEARESTMV:始终使用MV预测器列表中索引为0的条目。它适用于那些运动变化不大的场景,选择最接近当前编码块的运动向量作为预测。
- NEARMV:使用索引为1、2或3的条目之一,信号化一个三元DRL(直接参考列表)索引来指示使用哪个条目作为MV预测器。
- NEWMV:使用索引为0、1或2的条目之一,信号化一个三元DRL索引来指示使用哪个条目作为MV预测器,并信号化相对于MV预测器的MV差分(MVD)。
- GLOBALMV:使用基于帧级全局运动参数的MV作为MV预测器。它适用于全局运动补偿的场景,其中整个帧或大部分区域都遵循相同的运动。
- 复合帧间预测的MV预测模式:
- NEAREST_NEARESTMV:始终使用列表中索引为0的MV对。
- NEAR_NEARMV:使用由三元DRL索引信号化的索引为1、2或3的MV对。
- NEAREST_NEWMV:始终使用列表中索引为0的MV对作为MV预测器,并为第二个MV信号化一个MVD。
- NEW_NEARESTMV:始终使用列表中索引为0的MV对作为MV预测器,并为第一个MV信号化一个MVD。
- NEAR_NEWMV:使用由三元DRL索引信号化的索引为1、2或3的MV对作为MV预测器,并为第二个MV信号化一个MVD。
- NEW_NEARMV:使用由三元DRL索引信号化的索引为1、2或3的MV对作为MV预测器,并为第一个MV信号化一个MVD。
- NEW_NEWMV:使用由三元DRL索引信号化的索引为0、1或2的MV对作为MV预测器,并为两个MV都信号化MVD。
- GLOBAL_GLOBALMV:基于每个参考帧的帧级全局运动参数使用MV。
-
- 除了NEARESTMV和NEAREST_NEARESTMV模式外,在所有情况下,都需要信号化DRL索引来指定用作MV预测器的确切MV或MV对。然而,DRL索引的范围在参考列表中可以根据MV预测模式是[0, 1, 2]或[1, 2, 3]。
平移运动补偿插值滤波
- 平移运动补偿(Translational Motion Compensation)是视频编码中一种基本的运动补偿技术,用于处理视频帧之间的运动变化。这种技术基于一个简单的假设:场景中的对象在连续的帧之间沿着直线移动,而没有旋转或缩放等复杂变换。
- 平移运动模型假定编码块内的所有像素共享同一个单一的运动向量(MV),如下图所示。这个MV可以表示为1/16像素精度,也就是说,MV的最小粒度是像素的1/16。在使用指向分数采样位置的MV来派生预测块时,会应用插值来生成预测块。【和传统的编解码标准 h264 等里运动补偿一样】
- 如果MV指向一个分数水平位置,首先应用一个行方向的水平插值滤波器来生成一个中间块。接着,如果MV还指向一个分数垂直位置,那么使用这个中间块,再应用一个列方向的垂直插值滤波器来生成最终的预测块。
- 这个过程的步骤如下:
- 水平插值:当MV的水平分量是分数时,对参考帧进行水平方向的插值,生成中间块。
- 垂直插值:如果MV的垂直分量也是分数,接着对中间块进行垂直方向的插值,生成最终的预测块。
- 插值滤波器:插值过程中使用的滤波器可以是行方向或列方向的,具体取决于MV指向的位置。
- 中间块:在需要两次插值(即MV同时有水平和垂直方向的分数分量)的情况下,第一次插值生成的块作为中间结果,用于第二次插值的输入。
- 这种平移运动补偿方法能够适应运动向量不是整数像素的情况,通过插值技术确保预测块的生成既准确又平滑,减少由于运动估计不精确带来的图像失真。
- 在帧头中,首先信号一个标志,用来指示当前帧是否可以选择插值滤波器。如果这个标志的信号值表明插值滤波器不可选择,那么接下来会信号两个比特,以指示应用四种预定义的有限脉冲响应(FIR)滤波器中的哪一种。这四种FIR滤波器包括:
- 6-tap常规FIR滤波器(REGULAR):这是一种具有6个系数的常规FIR滤波器,用于一般的插值处理,相关系数在表 4 中列出。
- 6-tap平滑FIR滤波器(SMOOTH):同样是具有6个系数的FIR滤波器,但设计上更侧重于平滑效果,以减少图像噪声,相关系数在表 5 中列出。
- 8-tap锐化FIR滤波器(SHARP):这种滤波器具有8个系数,设计上旨在增强图像的锐度,适用于需要强调细节的场景,相关系数在表 6 中列出。
- 2-tap双线性滤波器(BILINEAR):这是一种简单的双线性插值滤波器,具有2个系数,提供较平滑的插值效果,相关系数在表 7 中列出。
- 插值滤波器可以在编码块的水平和垂直方向上分别切换。如果在序列头中启用了双滤波器(dual filter),则可以分别为水平和垂直方向信号不同的插值滤波器选择。如果不启用双滤波器,则每个编码块只能信号一次插值滤波器选择,并且这个选择将同时用于水平和垂直方向。
- 当插值滤波器可以选择时,候选的插值滤波器包括三种预定义的有限脉冲响应(FIR)滤波器,即:
- 常规(REGULAR)
- 平滑(SMOOTH)
- 锐化(SHARP)
- 对于水平或垂直方向尺寸小于或等于 4 的较小编码块,常规(REGULAR)和平滑(SMOOTH)滤波器将被另外两种 4-tap滤波器替换,如表 8 所示,而锐化(SHARP)滤波器则不再可用。
- 这种设计允许编码器根据编码块的大小和内容选择最合适的插值滤波器,以优化编码效率和图像质量。对于较小的编码块,可能需要不同的滤波器特性来适应细节较少的区域,从而减少可能的噪声或失真。对于较大的编码块,或者当启用了双滤波器选项时,可以选择更多的滤波器选项来适应不同的方向上的插值需求。
- 这些滤波器的选择取决于编码器的决策,以及是否需要根据图像内容选择更适合的插值方法来优化编码效率和图像质量。如果插值滤波器是可切换的,编码器可能会根据图像的特性和运动矢量的细节选择不同的滤波器来实现最优的编码性能。
变形运动补偿
- 与假设参考块和目标块之间为平移运动模型的传统运动补偿不同,变形运动(warped motion)采用了仿射模型。仿射运动模型可以表示为以下方程(1):
- 在上述方程中:
- [x, y] 是原始像素的坐标;
- [x,, y,] 是参考块变形后的像素坐标;
- 矩阵中的a1、a2、a3、b1、b2、b3是仿射变换中的参数。
- 需要最多六个参数来指定变形运动:
- a3、b3指定传统的平移运动向量(MV);
- a1、b2指定沿MV的缩放;
- a2、b1指定旋转 。
- 仿射变换能够更准确地描述和补偿图像中物体的复杂运动,如旋转、缩放、倾斜等,这在传统的平移运动补偿中是难以实现的。通过使用仿射运动模型,编码器可以生成更加平滑和准确的预测块,从而提高视频编码的效率和质量。
全局变形运动
- 全局运动信息在每个帧间帧中被信号标记,其中包含了全局运动类型和运动参数。全局运动类型和相关联的参数数量如下表所示。
- 全局运动类型:
- 恒等(0 运动):表示没有运动,不需要额外的运动参数,参数数量为0。
- 平移:表示块在空间上的直线移动,需要2个参数(水平和垂直方向上的移动量)。
- 旋转或缩放:选准表示块绕某一点旋转,需要4个参数来定义旋转的中心和旋转角度。缩放表示块在大小上的缩放变化,需要4个参数来定义缩放中心和缩放比例。
- 一般仿射:表示更复杂的二维变换,包括旋转、缩放、倾斜等,需要6个参数来定义变换矩阵。
- 对于一个帧间被编码块,在参考帧序号被传输后,如果当前块的运动被识别为全局运动,那么将使用给定参考帧的全局运动类型和相关参数来处理当前块。
局部变形运动
- 对于一个帧间编码块,局部变形运动当以下条件都满足时被允许使用:
- 当前块是单一预测
- 宽或高是大于或等于 8 采样
- 至少有一个紧邻的邻居块与当前块使用相同的参考帧
- 如果当前块使用局部变形运动,则不直接传输仿射参数,而是通过最小化参考投影和基于当前块及其直接邻居的运动矢量建模的投影之间的均方误差来估计这些参数。为了估计局部扭曲运动的参数,如果相邻块与当前块使用相同的参考帧,则会收集相邻块中心像素的投影样本对及其在参考帧中的对应像素。之后,通过在一个或两个维度上将中心位置移动四分之一样本来创建3个额外的样本,这些样本也被视为投影样本对,以确保模型参数估计过程的稳定性。
重叠块运动补偿
- 对于一个帧间编码块,重叠块运动补偿 OBMC 被允许当下面条件都满足时:
- 当前块是单一预测
- 宽或高是大于或等于 8 采样
- 至少有一个相邻块是帧间预测
- 当 OBMC 被应用在当前块时,首先,使用当前块分配的运动矢量生成初始的帧间预测样本,然后,将当前块的帧间预测样本与基于上方和左侧块的运动矢量生成的帧间预测样本混合,以生成最终的预测样本。基于当前块的大小,限制了邻近运动矢量的最大数量,每个上方和左侧块最多可以有4个运动矢量参与当前块的OBMC过程。
- 在下图中展示了一个相邻块处理顺序的例子,其中每个块中标记的值表示当前块和相邻块运动矢量的处理顺序。具体来说,首先应用当前块的运动矢量来生成帧间预测样本P0(x,y)。然后,应用块1的运动矢量来生成预测样本p1(x,y)。之后,在块0和块1之间的重叠区域,预测样本是p0(x,y)和p1(x,y)的加权平均值。块1和块0的重叠区域在下图中以灰色标记。以相同的方式进一步应用并混合块2、3、4的运动矢量。
- 通过这种方式,OBMC技术平滑了块边缘,减少了块效应,特别是在快速运动或复杂场景中,可以提高预测的准确性和视频质量。
参考帧
- 在视频编码中,解码帧缓冲区(decoded frame buffer)用于存储已经解码的帧,以供帧间预测使用。以下是关于解码帧缓冲区和参考帧选择的详细描述:
- 帧缓冲区容量:最多可以存储 8 个帧。
- 参考帧选择:编码每一帧时,可以从解码帧缓冲区中选择最多两个参考帧用于帧间预测。
- 单参考帧间预测:只使用一个帧作为参考帧。
- 复合帧间预测:使用两个参考帧,并结合这两个参考帧生成的预测块来生成最终预测。
- 单向和双向复合预测:
- 单向复合预测:选择的参考帧要么是都在当前帧的显示顺序之前,要么是都在当前帧之后。
- 双向复合预测:一个参考帧在当前帧的显示顺序之前,另一个在之后。
- 参考帧组合:
- 单向复合预测限制在 4 种组合。
- 双向复合预测支持所有 12 种可能的参考帧组合。
- 参考帧更新:编码完成后,编码器决定解码帧缓冲区中哪个参考帧需要被替换,并且在比特流中明确信号这一更新。
- 参考帧类型:解码帧缓冲区存储四种类型的参考帧:
- LAST帧:最近过去的已显示帧。
- 交替参考帧(ARF):来自过去或未来的帧,可以选择不显示。
- GOLDEN帧:较远过去的已显示帧。
- BWD帧:将来要显示的帧。
- ARF合成:ARF可以由编码器合成,例如,可以通过沿着多个原始帧的运动轨迹进行时间滤波来生成。
- 通过这种方式,视频编码标准(如AV1)能够灵活地处理复杂的场景和运动,提高编码效率和视频质量。参考帧的智能选择和更新策略对于编码性能至关重要,特别是在快速运动或复杂视频内容中。
复合预测
复合帧间预测
- 帧间预测使用两个参考帧被称为复合预测(compound prediction)类似 H264 标准的中加权预测,其公式化定义如下:
- 在这个公式中:
- P0(x, y) 和 P1(x, y) 分别指当前位于 (x, y) 的样本从两个参考帧得到的预测样本。
- w(x, y) 是应用于第一个参考帧预测样本的权重因子。
- P(x, y) 是最终的复合预测结果。
- 根据权重因子 w(x, y) 和预测块的派生方式,可以定义不同的复合运动预测模式,这些模式将在后续的子章节中描述。在SKIP模式下,如果使用两个参考帧,w(x,y) 总是被设置为32。
这种复合预测方法通过结合两个不同时间点的参考帧信息,可以更有效地预测当前帧的像素值,尤其在场景中存在显著的时间冗余时。通过适当地加权两个参考帧的贡献,可以生成比单一参考帧预测更平滑、更准确的预测结果,从而提高编码的压缩效率。公式中的右移操作(>> 6)是一个算术右移6位,用于规范化最终预测值到合适的数值范围内。
楔形复合预测
- 移动物体的边界通常很难通过网格块来近似分区,因此 AV1中的解决方案是设计基于楔形的复合预测(Wedge-based),对于每种块尺寸,都有一组 16 个预定义的二维权重数组被硬编码。每个数组中的权重是这样排列的,以便投影到一个预定义的楔形分区模式。在每个楔形分区模式中,沿着某个特定边缘方向和位置指定了两个楔形分区。如图5所示,针对正方形和矩形块设计了16个形状的楔形模式,其中包含水平,垂直或倾斜度为±2或±0.5的分区方向。在复合基于楔形的预测模式中,位于两个楔形分区之一的样本,权重大部分设置为64。位于另一个楔形分区的样本,权重大部分设置为0。此外,在楔形分区边界沿线,权重被赋值为32。
- 在基于楔形的预测模式中,预定义了两个语法元素:
- wedge_index,它指定楔形分区模式的索引(范围从0到15);
- wedge_sign,它指定哪一个分区将被赋予主导权重。
- 这种基于楔形的预测模式允许对块内部的不同区域应用不同的权重,以适应块内部可能存在的速度和方向变化。通过选择适当的wedge_index和 wedge_sign,编码器可以根据实际的运动矢量场进行更精确的预测,从而提高预测的准确性和编码效率。
差分复合预测
- 差分复合预测的权重w(x, y)的派生方式如下:
- mask_type 是已信号化的标识,表明权重分配的方式;
- w(x, y) 是应用于预测样本的权重因子,在应用到最上面公式之前,会被裁剪限制到[0, 64]之间。
距离复合预测
- 在基于距离的复合预测中,权重 w(x, y)取决于当前帧与参考帧之间的时间距离。设置 d0 和 d1分别表示当前帧到两个参考帧之间的距离。
- 如果d0小于 d1,则应用在 P0(x, y)的w(x, y)的派生方式如下:
- 否则,d0 大于 d1 ,派生方式是对称的:
- 当w(x, y)等于 32 时,此时P0(x, y) 和 P1(x, y)被赋予相等的权重。
复合帧间帧内预测
- 在复合帧间-帧内预测模式中,预测块是内部预测和帧间预测的结合体。也就是说,P0(x, y) 是一个帧内预测样本,而 P1(x,y) 是一个帧间预测样本。帧内预测块是使用直流(DC_PRED)、垂直(V_PRED)、水平(H_PRED)或平滑(SMOOTH)预测模式派生的,而帧间预测块是使用平移运动的单参考帧间预测派生的。根据帧内预测样本和帧间预测样本的权重如何派生,可以应用两种复合帧间-帧内预测模式,包括常规帧间 - 帧内预测 和 基于楔形的帧间-帧内预测。
常规复合
- 不同的帧内预测模式使用不同的权重派生方式。在常规帧间-帧内预测中,权重值沿着预测方向递减。更具体地说,应用于帧内预测样本 𝑃0 (x,y) 的权重描述如下:
- sizeScale通过块的宽 W 和高 H 派生而来:
- WeightLUT 是一个硬编码查找表:
楔形复合
- 复合帧间-帧内预测也可以使用基于楔形(Wedge-based)的加权方案来应用。更具体地说:
- 预测块是帧内预测块和帧间预测块的组合。
- 加权是通过使用由 wedge_index 指定的楔形分区模式来明确,wedge_index 的范围是从0到15。
- 基于楔形的帧间-帧内运动预测模式与常规基于楔形的运动预测模式有所不同,原因在于:
- wedge_sign 的值,它指定具有主导权重的分区,是派生出来的,而不是显式信号化的。
- 在基于楔形的帧间-帧内预测中:
- 楔形分区:使用 wedge_index 选择的预定义楔形分区模式来确定块内不同区域的权重分配。
- 权重派生:wedge_sign 的值是基于块的运动矢量和其他上下文信息派生的,而不是作为编码过程中的显式信号。
- 适应性:由于 wedge_sign 是派生的,编码器可以根据块内的实际运动矢量场自动选择最合适的楔形分区,从而提高预测的准确性。
- 编码效率:通过使用基于楔形的加权方案,可以更灵活地适应块内的运动和纹理变化,从而提高编码效率。
- 视觉效果:基于楔形的帧间-帧内预测可以改善编码后视频的视觉质量,尤其是在块内部存在复杂运动或深度变化的场景中。
- 实现复杂性:虽然基于楔形的预测模式提供了更高的适应性和预测准确性,但它也可能增加了编码器的实现复杂性,因为需要额外的逻辑来确定 wedge_sign 的值。
- 上下文感知:编码器可能使用上下文信息,如块的历史编码模式、邻近块的预测模式或块内纹理的复杂性,来辅助派生 wedge_sign。
变换
- 可分离二维(2D)变换过程被应用到预测残差上,总结如下:
- 正向变换:首先对输入残差块的每个列进行一维(1D)垂直变换,然后对垂直变换的输出的每一行进行水平变换。
- 反向变换:首先对输入去量化系数块的每个行进行一维( 1D ) 水平变换,然后对水平变换的输出的每个列进行一维(1D)垂直变换。
- 支持的变换类型:包括四种主要的变换类型:
- a) 离散余弦变换(DCT-2),有4点、8点、16点、32点和64点的版本。
- c) 恒等变换(IDTs),有4点、8点、16点和32点的版本。
- b) 非对称离散正弦变换(ADST),4点、8点、16点非对称DST(DST-4,DST-7)及其翻转版本。
- 4点、8点、16点、32点是单位矩阵变换。
- ADST的特殊说明:当变换大小为4点时,指的是DST-7;当变换大小大于4点时,指的是DST-4。
- 变换基底:支持的变换类型的变换基底列在下表中:
- 对于亮度分量,每个变换块的变换类型机制总结如下:
- 变换类型选择:对于亮度分量,每个变换块可以从一组预定义的变换类型候选集中选择一对水平和垂直变换。
- 信号传递:这种选择通常在比特流中明确信号传递,除非变换块的最大宽度或高度(max(W, H))等于64,在这种情况下,选择不进行信号传递。
- 变换块大小与候选集的关系:
- 当变换块的宽度或高度大于或等于32像素(max(W, H) ≥ 32)时,变换类型候选集取决于预测模式,并根据下表确定。
-
-
- 当变换块的宽度和高度都小于32像素(max(W, H) < 32)时,变换类型候选集同样取决于预测模式,但依据的是下表确定。
-
-
- 预测模式的影响:变换类型的选择依赖于预测模式,这意味着不同的预测模式可能对应不同的变换类型候选集,从而影响编码效率和图像质量。
- 变换类型候选集定义如下表:
- 色度分量在变换类型选择上的隐式过程,总结如下:
- 隐式选择过程:色度分量的变换类型选择不是通过比特流显式信号传递的,而是通过其他方式隐式决定。
- 帧内预测残差:对于帧内预测残差,变换类型根据帧内预测模式选择,具体的选择依据是下表中的规定。
- 帧间预测残差:对于帧间预测残差,变换类型不是独立选择的,而是根据对应亮度块(luma block)的变换类型选择来决定。
- 比特流中的信号传递:由于色度分量的变换类型选择是隐式的,因此在比特流中不需要对色度分量的变换类型进行信号传递。
- 下表提供了帧内预测模式与变换类型之间的对应关系。
-
- 这种隐式选择机制简化了比特流中的数据量,因为色度分量的变换类型选择与亮度分量紧密相关,不需要额外的信号传递。
- 大型尺寸(例如64点)变换的计算成本通过零化所有系数来进一步降低,除了以下两种情况:
- 对于64×64/64×32/32×64 DCT_DCT混合变换,保留左上角的32×32象限。
- 对于64×16,保留左侧的32×16区域;对于16×64,保留顶部的16×32区域的DCT_DCT混合变换。
-
- DCT-2和ADST的实现:DCT-2(一种离散余弦变换)和ADST(非对称离散正弦变换,包括DST-4和DST-7)都采用蝴蝶结构实现。
- 蝴蝶结构:蝴蝶结构包含多个阶段的蝴蝶运算,每个阶段的运算可以并行计算,然后按顺序串联进行。【x264 内部就是这样实现变换操作】
这种优化方法可以显著减少不必要的计算,同时保持变换的有效性,特别是在处理大尺寸变换时。蝴蝶结构的使用则是一种高效的数学实现方式,广泛应用于各种变换算法中。
量化
- 变换系数的量化可能针对 DC 和 AC 变换系数应用不同的量化步长大小;且针对亮度和色度的变换系数有不同的量化步长大小。
- 为了指定量化步长,在帧头中首先信号传输一个名为
base_q_idx
的语法元素,这是一个8位固定长度代码,用于指定亮度 AC 系数的量化步长。base_q_idx
的有效范围是 [0, 255]。之后,会进一步信号传输相对于base_q_idx
的亮度 DC 系数的增量值,表示为 DeltaQYDc。 - 此外,如果存在多个颜色平面,那么会信号传输一个名为
diff_uv_delta
的标志,以指示Cb和Cr颜色分量是否应用不同的量化指数值。如果diff_uv_delta
信号传输为0,则只信号传输相对于base_q_idx
的色度DC系数(表示为 DeltaQUDc)和AC系数(表示为 DeltaQUAc)的增量值。否则,会信号传输相对于base_q_idx
的Cb和Cr DC系数(表示为 DeltaQUDc 和 DeltaQVDc)和 AC系数(表示为 DeltaQUAc 和 DeltaQVAc)的增量值。 - 上述解码的 DeltaQYDc、DeltaQUAc、DeltaQUDc、DeltaQVAc 和 DeltaQVDc 被加到
base_q_idx
上以得出量化指数。然后,这些量化指数根据两个表格进一步映射到量化步长。对于 DC 系数,量化指数到量化步长的映射对于 8 位、10 位和 12 位内部位深由查找表 Dc_Qlookup[3][256] 指定,而量化指数到量化步长的映射对于8位、10位和12位由查找表 Ac_Qlookup[3][256] 指定。
- 给定量化步长,表示为 Qstep,输入的量化系数进一步使用以下公式进行去量化:
F = sign * ( (f * Qstep) % 0xFFFFFF ) / deNorm
- 其中,f 是输入的量化系数,F 是输出的去量化系数,
- 其中,
sign
表示符号函数,%
表示取模运算,0xFF
表示十六进制的255。 - deNorm 是一个常数值,它来源于变换块面积大小,如下表所示:
-
- 当量化指数为 0 时,量化使用等于1的量化步长进行,这是无损编码模式。
熵编码
- AV1采用了一种多符号上下文自适应算术编码技术,这与 H.265/H.266 中使用的二进制算术编码(CABAC)有所不同。
- AV1 的熵编码技术通过两个主要处理过程来压缩输入的符号序列:累积分布函数(CDF)和布尔操作。CDF 允许使用包含 2 到 16 个符号的字母表,并且符号的概率是自适应的,而布尔操作则使用固定的两个符号字母表和不变的符号概率。这种多符号算术编码技术可以更有效地利用待编码符号序列的高层次结构相似性,从而提高压缩效率。
- AV1 的熵编码器在编码过程中,输入由 M 种符号组成的序列及其概率上下文。编码器的输出是一个比特流,其中语法元素与包含 M 个符号的字母表相关联,M 的值可以在 2 到 16 之间变化。在编码或解码每个语法元素后,15 位的 CDF 概率值会被更新,以反映编码过程中的概率变化。
- AV1 的熵编码技术包括预计算、范围变量更新、低位更新和产生比特流的四个阶段。这种设计允许 AV1在保持视频质量的同时,实现更高的压缩比率,从而在视频传输和存储方面具有优势。
- 多符号算术编码引擎
- 在 AV1 编码技术中,M-ary 算术编码引擎用于熵编码语法元素。每个语法元素与一个包含 M 个元素的字母表相关联,其中 M 的值可以是 2 到 16 之间的任何整数。编码的输入是一个 M-ary 符号,上下文由一组 M个概率组成。编码或解析每个语法元素后,这些概率会更新,并且概率以 15 位累积分布函数(CDF)的形式表示。
- CDF 是一个 M 个 15 位整数的数组,定义如下: C = [c0, c1, … , cM-2, 215] 其中 ( cn / 32768 ) 是符号小于或等于 n 的概率。
- 概率更新使用以下方程进行:
- 其中 α 是基于符号解码次数的概率更新率(最多 32 次), m 是 CDF 中的元素索引。α 的自适应允许在编码/解析语法元素的开始阶段进行更快的概率更新。
- M-ary 算术编码过程遵循传统的算术编码引擎设计;然而,只有最高的 9 位输入到算术编码器/解码器。这意味着实际用于编码过程的概率值是 CDF 数组中每个元素的高 9 位,这有助于减少计算复杂度,同时保持编码的精度。
- 这种设计允许 AV1 编码器在编码过程中动态调整概率模型,以适应输入数据的统计特性。随着编码过程的进行,随着对符号出现频率的更好理解,概率模型会逐渐细化,从而提高编码效率。通过这种方式,AV1编码器能够实现更高的压缩比,同时保持或提高视频质量。
- 系数编码
- 在 AV1 编码技术中,变换块(transform block)的系数编码开始于一个 all_zero 标志的编码,该标志指示变换块是否仅包含零残差。如果 all_zero 标志被编码为 0,则表示变换块中存在非零系数,随后需要编码主变换核类型(primary transform kernel type)和块结束(end-of-block, EOB)位置。
- 系数的编码流程如下:
- all_zero 标志:首先编码all_zero标志,如果变换块内所有系数都是零,则此标志为 1;否则为 0。
- 三个级别平面的编码:
- 系数值编码:系数值通过多个级别的映射(level maps)以及符号值进行编码。存在三个级别的平面:低级别(lower-level)、中级别(middle-level)和高级别(higher-level),分别对应不同的系数幅度范围(0–2, 3–14, 15 及以上)。
- 主变换核类型和 EOB 位置:如果 all_zero 标志为 0,则需要编码主变换核类型和 EOB 位置。EOB 位置指示非零系数的最后一个位置。
- 低级别和中级别平面:在编码 EOB 值之后,低级别和中级别平面以反向扫描顺序(zig-zag scan)编码在一起。
- 符号平面和高级别平面:然后,符号平面和高级别平面以正向扫描顺序编码在一起;
- 剩余值的熵编码:高级别平面编码后,使用指数-哥伦布(Exp-Golomb)编码对剩余值(系数幅度减去 14)进行熵编码。
- 上下文模型的应用:
- 低级别平面:上下文模型取决于主变换方向(双向、水平、垂直)、变换块大小,以及变换域中最多五个邻近变换系数。
- 中级别平面:使用类似的上下文模型,但上下文邻近系数的数量从 5 减少到 2。
- 高级别平面:不使用上下文建模,直接使用 Exp-Golomb 编码进行编码。
- 符号平面的编码:除了直流(DC)符号使用邻近变换单元的 DC 符号进行编码外,所有其他系数的符号值直接编码,不使用上下文建模。
- 这种编码方式允许 AV1 编码器有效地表示变换系数,通过利用系数的统计特性和上下文信息来提高编码效率。通过区分不同级别的系数幅度并应用不同的上下文模型和编码策略,AV1 能够在保持视频质量的同时实现更高的压缩比。
环路滤波和后处理
环路滤波
- 去块滤波 DF:用于减少量化引起的变换块边界处的块效应。
- 选取去块滤波级别时有四种方法:
- LPF_PICK_FROM_FULL_IMAGE:用不同值搜索整个图像
- LPF_PICK_MINIMAL_LPF:将滤波器级别设为0并禁用去块
- LPF_PICK_FROM_SUBIMAGE:从图像的一部分估计级别
- LPF_PICK_FROM_Q:基于量化器和帧类型估计滤波器级别
- 在从整个图像或子图像估计滤波器级别时,搜索从上一帧的滤波器级别开始,直到滤波器步长小于或等于零。除了滤波器级别之外,还有一些其他参数可以控制去块滤波器,例如锐度级别、模式增量和参考增量。
- 去块滤波是在 128x128 的超块级别上进行的,垂直和水平边缘分别进行滤波。对于 128x128 的超块,首先对垂直/水平边缘与每个8x8块对齐的边缘进行滤波。如果使用4x4变换,将进一步对内部边缘与4x4块对齐的边缘进行滤波。滤波器长度可以从4-tap、6-tap、8-tap、14-tap和0-tap(无滤波)之间切换。根据滤波器中的抽头数量来确定抽头的位置,以便计算滤波掩码。当最终执行滤波时,如果边缘方差高,则添加外部抽头。
- 对于亮度(luma)色度分量,可以应用4-tap、8-tap和14-tap的预定义滤波器。
- 对于色度(chroma)色度分量,可以应用4-tap和6-tap的预定义滤波器。
- 如果变换块在两边的宽度和高度都大于16像素,则对亮度色度分量应用14-tap滤波器。
- 去块滤波器的工作原理:
- 去块滤波器是低通滤波器,用于平滑边界,减少伪影。
- 去块过程中,会检查边界条件以避免过度平滑实际的纹理边缘。
- 边界条件检查:
- 当边界样本显示出高局部变化时,识别为实际边缘,不应用去块滤波器。
- 边界样本被识别为高变化的条件包括:
- |p1 - p0| > T0
- |q1 - q0| > T0
- 2|p0 - q0| + |p1 - q1|/2 > T1
- 其中,p0, p1, q0, q1 表示变换块边界左右(或上下)两侧的重建样本。
- 滤波器长度为8或14时的额外检查:会检查额外的两个样本以确定是否存在高变化
- |p3 - p2| > T0
- |q3 - q2| > T0
- 阈值(Threshold):
- ( T0 ) 和 ( T1 ) 是阈值,可以在超块(superblock)基础上决定。
- 较高的阈值值表示有更高的机会应用去块滤波器。
- 下图展示了使用14-tap滤波器在垂直变换块边界上应用去块滤波器的示意图。
- 选取去块滤波级别时有四种方法:
- 约束性方向增强滤波 CDEF:沿着物体方向滤波,目的是消除变换和量化过程中产生的振铃效应,同时保留物体边缘的清晰度,从而提升重建图像的质量,在去块滤波之后,超分或环路恢复滤波之前进行。
- 边缘方向估计:在 CDEF 中,边缘方向搜索是在 8x8 块 级别上执行,一共有 8 个边缘方向。
-
- 最优边缘方向 d_opt 通过最大化以下项被找到:
-
-
-
- 这里 xp 是像素 p 的值。
- Pd,k 是沿着方向 d 的第 k 行的像素集合。
- Nd,k 是集合 Pd,k 中像素的数量。
-
-
-
-
- 边缘方向估计的目的是找到最能代表块内纹理方向的边缘方向,以便更有效地进行图像增强或滤波处理。通过计算不同方向上的像素值的累积平方和,并除以该方向上像素的数量,可以评估每个方向的纹理一致性。最优边缘方向是使得 Sd 最大的方向,这表明该方向上的像素具有较高的一致性,可能是块的主要纹理方向。
- 方向滤波器:由主滤波器和次滤波器组成
- 主滤波器:沿着边缘方向工作,对于偶数强度,参数 a 设为2,参数 b 设为4。对于奇数强度,a 和 b 都设为3。
-
-
-
- 次滤波器:沿着相对边缘 45° 方向工作。
-
-
- CDEF 方程:
-
-
- 其中 x(i,j)和 y(i,j) 分别是CDEF滤波器的输入和输出重建样本值。
- w 是主滤波器和次滤波器抽头之间应用的权重因子。
- f(d,S,D) 是非线性滤波函数。
- S 是滤波强度, D 是阻尼参数。
- 对于8位内容,主滤波器强度 Sp 范围从0到15,次滤波器强度 Ss 可以是0, 1, 2或4。
- 阻尼参数 D 对于亮度色度分量范围从3到6,对于色度色度分量范围从2到4。
-
-
- 非线性滤波:
-
-
- CDEF是一个非线性滤波过程,它防止在边缘处应用滤波器时过度模糊。
- 通过忽略与当前待滤波像素差异过大的像素来实现。
- 当当前像素与其相邻像素d之间的差异在给定阈值内时,f(d,S,D) 设为d;否则设为0。
- 强度 S 确定最大允许差异,阻尼 D 确定忽略滤波器抽头的样本位置,通过调整滤波强度和阻尼参数,CDEF能够适应不同的图像内容和质量需求。
-
- 环路恢复滤波 LR:LR是环路滤波管道中的最后阶段,用于最终改善重建图像的质量。
- 应用单元大小:LR滤波器在64×64、128×128或256×256大小的块上应用,这些块被称为环路恢复单元(Loop Restoration Unit, LRU)。
- 应用选项:可分离对称维纳滤波、双自导向滤波、不使用滤波
- 可分离对称维纳滤波:维纳滤波器(Wiener filter)的设计目标是在给定信号和噪声的统计特性下,找到一个线性滤波器,使得从含噪声的信号中估计出的原始信号与实际信号之间的均方误差(Mean Squared Error, MSE)最小。Wiener滤波器使用了一个7×7的可分离滤波器,重建样本的滤波是通过顺序应用垂直和水平滤波器完成的。
- 双自导向滤波:Self-Guided Filters (SGFs) 是一种用于图像和视频恢复的技术,旨在通过结合两个初始过滤帧 X1 和 X2 来改善图像质量,最终恢复Xr是通过将退化样本与粗略恢复之间的差异结合起来获得的:
后处理
- 视频超分:AV1 在低比特率下应用了超分辨率的技术。
- 编码端:原视频下采样(非规范过程)——下采样的视频被编码——去块滤波、约束性方向滤波 CDEF——线性上采样(规范过程)恢复原始空间分辨率——循环恢复处理部分丢失的高频部分;最后两步骤就是超分辨率过程。
- 解码端:去块滤波和 CDEF 在低分辨率完成,然后超分过程。
- 胶片颗粒合成:提高视频质感,通常会通过添加胶片颗粒(film grain)来模拟传统胶片的视觉效果。
- 由于其高度随机性,电影颗粒本身很难有效压缩。AV1编码格式通过一种基于自回归(AR)模型的电影颗粒合成工具,有效地解决了这个问题。
- 编码端:输入视频去除胶片颗粒,作为去噪过程 —— 使用Canny边缘检测器分析输入视频的结构和强度,并使用平滑区域来估计胶片颗粒的强度 —— 去噪视频和胶片颗粒参数将被发送到解码器端。
- 解码端:为了重建胶片颗粒,以下参数被发送到解码器端:滞后值(lag value)、自回归系数(autoregressive coefficients)、色度分量的预计算查找表索引值(values for precomputed look-up table index of chroma components),以及一组用于分段线性缩放函数的点集(a set of points for a piece-wise linear scaling function)。这些参数作为量化整数进行信号传输,包括64字节的缩放函数和74字节的自回归系数。一旦接收到这些参数,就按照光栅扫描顺序应用自回归过程,生成一个64x64的亮度模板和两个32x32的色度胶片颗粒模板。这些模板用于生成图片剩余部分的颗粒。
屏幕内容编码
帧内块拷贝IntraBC
- Intra Block Copy(IntraBC)是一种类似于视频帧间预测的编码工具。其主要区别在于,在IntraBC中,预测块是由当前图片的已重建样本(在应用循环滤波器之前)形成的。因此,IntraBC可以被视为在当前图片内的“运动补偿”。
- 块向量:IntraBC 使用一个向量(BV)来指示同一图像中当前块的预测块。这种向量可以在比特流中进行信号传输。
- BV 的精度:BV 的表示精度为整数点,这意味着它不包含小数部分。
- 编码标志:在编码当前块之前,首先信号一个标志,指示是否使用 IntraBC。
- BV 差值计算:如果标志指示使用 IntraBC,则计算当前 BV 与预测 BV 的差值 diff,并将差值分类为四种类型之一:
- 水平和垂直分量都为零。
- 水平分量非零,垂直分量为零。
- 水平分量为零,垂直分量非零。
- 水平和垂直分量都非零。
- BV 类型信息: BV 类型信息需要被传输到比特流中,然后是 BV 差值 diff。
- 硬件挑战:
- 当允许使用IntraBC时,禁用循环滤波器,包括去块滤波器、CDEF(约束方向增强滤波器)和循环恢复滤波器。通过这样做,可以在IntraBC和帧间预测之间共享已重建样本的图片缓冲区。
- 为了便于并行解码,预测不能超出限制区域。对于一个大块,如果其左上角的位置坐标是(x0, y0),那么位置(x, y)的预测可以通过IntraBC访问,如果y < y0且x < x0 + 2 * (y0 - y)。
- 为了允许硬件写入延迟,立即重建的区域不能被IntraBC预测访问。受限的立即重建区域可以是1 ∼ n个大块。因此,在修改2的基础上,如果一个大块左上角的位置坐标是(x0, y0),那么位置(x, y)的预测可以通过IntraBC访问,如果y < y0且x < x0 + 2 * (y0 - y) - D,其中D表示受限的立即重建区域的大小,在 AV1 中,D 被设置为超块宽度的两倍,即 256 像素。。当D是一个大块时,预测区域如下所示的图示。
Palette模式
- AV1 编码中的调色板模式(Palette mode)是一种用于提高压缩效率的技术,特别适用于当前块使用 DC_PRED 预测模式进行帧内编码(intra coding)的情况。允许编码器使用有限数量的颜色来近似块,其中每个调色板可以有2到8种颜色。这些颜色指定了块中所有像素的索引,而基色的数量决定了保真度和紧密度之间的平衡。颜色索引基于相邻上下文进行熵编码。
- 应用条件:
- 调色板模式可以在亮度(luma)和色度(chroma)块上应用。
- 仅当块的尺寸大于或等于 8×8 像素,并且宽度和高度都不超过 64 像素时,才能应用调色板模式。
- 语法元素信号:
- has_palette_y:指示是否对当前编码块应用调色板模式的标志。
- palette_size_y_minus_2:指定调色板大小的语法元素,实际大小为该值加 2。
- use_palette_color_cache_y:指示是否为调色板的每个条目继承颜色索引的标志。
- 颜色索引继承:如果继承的调色板条目数量少于信号的调色板大小,则剩余的颜色索引将被显式地信号传输。
- 色度组件共享:对于色度分量,has_palette_uv 和 palette_size_uv_minus_2 在两个色度颜色组件(Cb 和 Cr)之间共享。但是,Cb 和 Cr 的调色板中的颜色索引是分别信号传输的。
- 编码顺序:调色板模式编码的块中的颜色索引按照对角线扫描顺序进行信号传输和编码。扫描从右上角开始,到左下角结束。
- 熵编码上下文:当前块的第一个颜色索引使用单独的语法 color_index_map_y 进行编码。剩余的索引使用它们的上一个(top)、左一个(left)和左上一个(top-left)邻近索引作为熵编码的上下文信息。
- 对角线扫描优化:这种对角线扫描方法有助于利用图像的空间相关性,尤其是在图像块中颜色变化不大的情况下。
- 编码效率:通过减少表示图像块中颜色变化所需的比特数,调色板模式可以显著提高编码效率。
- 图示参考:
总结来说,AV1 编码中的调色板模式通过限制颜色索引的数量,并按照特定的对角线扫描顺序进行编码,有效地压缩了颜色变化有限的图像区域。这种方法特别适合屏幕内容和动画等颜色种类有限的场景,有助于减少编码后视频的数据量,同时保持图像质量。