HEVC-HM16.9源码学习(0)概念与术语表
概念
编码结构
- Slice(片):每个GOP被划分为多个片,片与片之间进行独立编解码。
- SS(片段):每个片由一个或多个片段组成,包括一个独立SS和若干个依赖SS。
- CTU(编码树单元):同一位置处的一个亮度CTB和两个色度CTB,再加上相应的语法元素形成一个CTU;四叉树的根节点与CTU关联。
- CU(编码单元):编码单元是进行预测、变换、量化和熵编码等处理的基本单元,每一个CTU按照四叉树分割方式被划分为不同大小的编码单元。
- PU(预测单元):帧内预测、帧间预测的基本单元,PU的划分包括4种对称结构: 2Nx2N, 2NxN, Nx2N, NxN。另外,还有4种非对称结构:2NxnU, 2NxnD, nLx2N, nRx2N。
编码过程
参数
- 码率=比特率,Bit rate = 每秒传送的比特(bit)数
- 序列的失真测度:
失真函数d(ai,bj)是随机变量,要分析整个信源的失真大小,只能用它的数学期望或统计平均值来表示。失真函数的数学期望称为平均失真度,可以表示信源压缩传输时平均每个符号所引起的失真的大小。 - 单符号的平均失真:
- 序列的平均失真:
- 衡量预测值与实际值的差异程度, Xi像素实际值,\hat{Xi}预测像素值。预测残差:
-
绝对值差和(SAD)
-
平均绝对值差(MAD)
- 均方误差MSE,越低越好
- 信噪比SNR,Ps信号有效功率,Pn噪声有效功率;越高越好:
- 峰值信噪比PSNR(单位:dB分贝),n表示图像像素值所用的比特数,通常为8;越高越好:
- SSIM 基于结构相似度的图像质量测度
- RD Cost 率失真代价:
J:最终的衡量数据,
D:有损的衡量数据(均方差),Distortion失真,
λ:拉格朗日乘数,
R:数据量(MV)。
率失真优化较大部分其他区块比对的衡量方法来得慢(如SAD),因此率失真优化通常只在动作补偿的最后一个步骤才会被使用。
预测
帧内预测
为了减少视频帧内的空域冗余,根据变换块的大小以及相邻已编码块的边界像素值来进行预测。HEVC对亮度块的帧内预测包括方向预测、平面预测、DC预测,对于色度分量的帧内预测分别是平面预测、水平预测、垂直预测、DC预测、导出预测模式。
用于帧内预测的参考像素需要先进行一个低通滤波,HEVC自适应滤波操作。
低通滤波:一种过滤方式,规则为低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。但是阻隔、减弱的幅度则会依据不同的频率以及不同的滤波程序(目的)而改变。
帧间预测
为了减少时域冗余。更复杂。HEVC采用高级运动矢量预测,通过利用空域、时域内的相邻块的运动适量来推导最可能的运动矢量集合。合并模式(Merge),允许继承时域或空域相邻块的参考帧、运动矢量信息。
- 高级运动矢量预测AMVP
用于需要传递运动参数的帧间预测模式。每次从若干运动矢量预测候选中选择两个运动矢量预测候选,并选择其一作为最优的预测。
利用空域和时域上mv的相关性,为当前PU建立了候选预测mv列表。编码器从中选出最优的预测mvp,并对mv进行差分编码;解码端通过建立相同的列表,仅需要MVD和mvp在候选列表中的***,即可计算出当前PU的mv。
(1)利用fillMvpCand构建候选列表
(2)对每个候选调用xGetTemplateCost计算cost,找到最优的候选mv
(3)设置最优的mv
- 运动合并模式
从时域或空域相邻块获取当前块的运动信息,包括运动矢量和参考帧等。需要编码一个索引值,该索引值用于从可供选择的多套运动参数集合中选择最优的运动参数,由于时域对应帧是确定的,不需编码参考帧索引和运动矢量差异,只需要编码一个候选索引。
- 子像素插值
HEVC对亮度块采用1/4像素精度运动预测,对色度采用1/8像素精度预测。采用基于DCT的插值滤波器,对所有亚像素位置使用一致的分离插值处理进行一次操作。对于亮度块,在1/2像素位置使用8-拍滤波器插值,在1/4像素位置使用7-拍滤波器插值。对于色度块,采用1/8像素精度和4-拍滤波器。
术语表
英文/简写 | 翻译 | 解释 | 代码 |
---|---|---|---|
CBF(coded block flag) fast mode | 快速CBF策略 | 如果CU的预测模式是MODE_INTER,其对应的预测残差不包含非零的变换系数,就跳过该CU的其余候选模式,当前模式为最优模式,且直接进行下一步的四叉树分割 | getQtRootCbf(0) |
VPS | 视频参数集 | (1) 用于解释编码过的视频序列的整体结构,包括时域子层依赖关系等。HEVC中加入该结构的主要目的是兼容标准在系统的多子层方面的扩展,处理比如未来的可分级或者多视点视频使用原先的解码器进行解码但是其所需的信息可能会被解码器忽略的问题。 (2)对于给定视频序列的某一个子层,无论其SPS相不相同,都共享一个VPS。其主要包含的信息有:多个子层或操作点共享的语法元素;档次和级别等会话关键信息;其他不属于SPS的操作点特定信息。 (3)编码生成的码流中,第一个NAL单元携带的就是VPS信息 | |
SPS | 序列参数集 | (1)一段HEVC码流可能包含一个或者多个编码视频序列,每个视频序列由一个随机接入点开始,即IDR/BLA/CRA。序列参数集SPS包含该视频序列中所有slice需要的信息。 (2)SPS的内容大致包括解码相关信息,如档次级别、分辨率、某档次中编码工具开关标识和涉及的参数、时域可分级信息等 | TComSPS |
PPS | 图像参数集 | 1)PPS包含一幅图像所用的公共参数,即一幅图像中所有SS引用同一个PPS。其大致内容包括初始图像控制信息,如初始量化参数 Quantization Parameter,QP)、分块信息等 (2)在解码开始的时候,所有的PPS全部是非活动状态,而且在解码的任意时刻,最多只能有一个PPS处于**状态。当某部分码流引用了某个PPS的时候,这个PPS便被**,称为活动PPS,一直到另一个PPS被** | TComPPS |
component | 成分 | 分来自三个阵列之一(亮度和两个色度)的阵列或单个样本,组成4:2:0,4:2:2或4:4:4颜色格式的图片或阵列或单个样本 组成单色格式图片的数组。 | COMPONENT_Y=0, COMPONENT_Cb=1, COMPONENT_Cr=2, MAX_NUM_COMPONENT=3 |
transquant-bypass (TQB) | 跳过进行伸缩、变换和环路滤波过程 | m_TransquantBypassEnableFlag | |
GOP | 图像组 | 将该视频序列分割为若干个小的图像组,存在两种GOP类型:封闭式GOP(Closed GOP)和开放式GOP (Open GOP) | |
Slice | 片 | 每个GOP又被划分为多个片,片与片之间进行独立编解码。一个独立的Slice可以被进一步划分为若干SS,包括一个独立SS和若干个依赖SS,并且以独立SS作为该Slice的开始。 | TComSlice |
SS | 片段 | 每个片由一个或多个片段 Slice Segment, SS)组成;一个SS包含整数个CTU (至少一个),并且这些CTU分布在同一个NAL单元中。(独立SS是指它所涉及的句法元素可以由自身确定,依赖SS是指它所涉及的某些句法元素由已解码的独立SS推导得到) | |
Tile | 一幅图像不仅可以划分为若干个Slice, 也可以划分为若干个Tile。即从水平和垂直方向将一幅图像分割为若干个矩形区域,一个矩形区域就是一个Tile。每个Tile包含整数个CTU,其可以独立解码。 | ||
CTU | 编码树单元 | 一个SS在编码时,先被分割为相同大小的CTU;其尺寸由编码器指定,且可大于宏块尺寸。同一位置处的一个亮度CTB和两个色度CTB,再加上相应的语法元素形成一个CTU;四叉树的根节点与CTU关联 | |
CU | 编码单元 | 编码单元是进行预测、变换、量化和熵编码等处理的基本单元,每一个CTU按照四叉树分割方式被划分为不同类型的编码单元 | TComDataCU |
PU | 预测单元 | 帧内预测、帧间预测的基本单元,PU的划分包括4种对称结构: 2Nx2N, 2NxN, Nx2N, NxN。另外,还有4种非对称结构:2NxnU, 2NxnD, nLx2N, nRx2N。 | |
TU | 变换单元 | 变换单元是独立完成变换和量化的基本单元,其尺寸也是灵活变化的,它的大小依赖于CU模式,在一个CU内,允许TU跨越多个PU,以四叉树的形式递归划分 | |
Early CU | 提前终止策略 | 如果当前CU的最优编码模式是MODE_SKIP模式,那么终止该CU后续四叉树划分和模式判决 | getUseEarlyCU |
Early Skip | 早期跳出模式 | 如果CU的PU划分模式是PART_2Nx2N,预测模式是MODE_INTER,运动矢量差MVD是(0,0),且预测残差不包含非零变换系数(就是变换系数全是0),就判定当前模式是最优模式,跳过剩余的模式,直接进行下一步的四叉树分割及子CU模式判决。 | getUseEarlySkipDetection |
RD cost | 率失真代价 | J=D+λ⋅R;J:最终的衡量数据, D:有损的衡量数据(均方差),Distortion失真, λ:拉格朗日乘数, R:数据量(MV)。 | |
deltaQP (DQP) | QP预测误差 | deltaQP表示QG层QP与其预测QP的差值,但它是以CU为单元进行传递的。二者之间没有固定的大小关系,而且并非所有CU都含有deltaQP信息 含有非零系数的CU才会携带deltaQP信息) | |
AMP(asymmetric motion partition) | 不对称运动分割 | CU划分成PU时不对称(非偶数倍)的划分方式 | SIZE_2NxnU = 4, SIZE_2NxnD = 5, SIZE_nLx2N = 6, SIZE_nRx2N = 7 |
intra random access point(IRAP) | 随机介入点 | ||
PCM | / | 在该模式下,编码器直接传输一个CU的像素值,而不经过预测、变换等其他操作。同样地,解码端可以直接恢复当前CU的像素值,而不需要进行其他处理。对于一些特殊的情况,例如当图像的内容极不规则或QP非常小时,该模式与传统的“帧内一变换 一量化一熵编码”相比,编码效率可能会更高。此外,PCM模式还适用于无损(Lossless)编码情形。 | getUsePCM |
RDO (Rate-Distortion Optimization) | 率失真优化 | (与RD Cost概念有区别,RDO是一种技术)hevc使用的是SBAC-RDO,在每次率失真判决前, 都采用预编码的方式估计编码比特数, 而无需进行真正的熵编码。 | m_pppcRDSbacCoder |
CABAC | 上下文自适应的二进制算术编码 | hevc中唯一的熵编码方式。利用每个语法元素的上下文关系,根据已编码元素为待编码元素选择概率模型,即上下文建模;根据当前的统计特性自适应地进行概率估计;使用算术编码。 | TEncBinCABAC |
IDR(Instantaneous Decoding Refresh) | 即时解码刷新 | 属于I帧,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。 |