这些帧类型用于提供更好的压缩率,我们将在下一章看到这是如何发生的。现在,我们可以想到 I 帧是昂贵的,P 帧是便宜的,最便宜的是 B 帧。B利用前后的信息进行压缩,便是指前后的参考帧中都有较大的变化。
HEVC学习,其参考代码为HM ,梳理HM代码中的各个环节,并且分阶段,弄懂其意思是跨过门槛的第一个环节。
https://img-my.csdn.net/uploads/201511/16/1447638401_2084.png
帧内预测:
7、帧内预测的详解(入口函数:xCheckRDCostIntra):
7.1、对于亮度分量:
7.1.1、调用estIntraPredQT。主要做模式选择的工作,负责选出对于当前PU的最优模式,如DC、planar、角度等模式。
(1)首先对N个候选模式进行粗粒度筛选。代价函数是SATD+λ*ModeBits。选出若干个可能的候选模式。下面是相关的函数。
(2)predIntraLumaAng。计算当前PU的预测值。
(3)calcHAD。计算SATD代价。
(4)xModeBitsIntra。计算当前模式所消耗的比特数。
(5)xUpdateCandList。更新模式的代价,保持前N个模式的代价最小。
(6)选出N个模式之后,这N个模式会进入xRecurIntraCodingQT函数继续处理。
7.1.2、调用xRecurIntraCodingQT。根据选出的模式进行PU的分割,然后进行变换量化等工作。
(1)这个函数会被调用两次,第一次调用直接把PU当作TU,只为算出N个模式的RD代价, 从而选出一个最优的,在这个最优的模式被选出后,再次调用这个函数,对这个最优的模式进行PU的分割。下面的是相关的函数。
(2)xIntraCodingLumaBlk。对当前TU进行求残差,对残差进行变换、量化、反量化、反变换、重建等一系列工作,并求出失真。
(3)xGetIntraBitsQT。求出当前模式的所有信息进行熵编码会产生的比特数。
(4)calcRdCos。根据 xIntraCodingLumaBlk得到的失真和 xGetIntraBitsQT产生的比特数进行RD代价的计算,从而比较各个模式的优劣。
(5)xSetIntraResultQT。保存最优模式的数据。
7.2、对于色度分量,过程和亮度大部分一样。
帧间预测:
8.1、帧间分为两种方式,一种是默认的inter模式(入口函数xCheckRDCostInter),另一种是merge模式(入口函数xCheckRDCostMerge2Nx2N)。
8.2、inter模式的调用流程:xCheckRDCostInter——>predInterSearch——>encodeResAndCalcRdInterCU
8.3、merge模式的调用流程:xCheckRDCostMerge2Nx2N——>motionCompensation——>encodeResAndCalcRdInterCU
8.4、predInterSearch进行的是ME(运动估计)和MC(运动补偿)的过程。
8.5、motionCompensation进行的是MC的工作。因为merge进行的是MV预测,因此没有ME(运动估计)的过程。
8.6、encodeResAndCalcRdInterCU。根据预测值,求出残差,然后进行TU的划分,然后进行变换、量化等操作以及RD代价的计算。流程图如下:
8.6.1、encodeSkipFlag。对skip模式的标志进行编码。
8.6.2、encodeMergeIndex。对MVP的索引进行编码。
8.6.3、xEstimateResidualQT。在非skip模式的时候,进行RQT的决定(即应该把PU分割成什么样的TU)。
8.6.4、xAddSymbolBitsInter。计算当前模式在进行熵编码时产生的比特数。
8.6.5、xSetResidualQTData。保存当前最优的残差信息。
一、HEVC中熵编码采用的技术
1、零阶(或者k阶)哥伦布指数编码(变长编码,类似于哈夫曼编码那样),主要用于VPS、SPS、PPS、slice头部信息的编码
2、CABAC(算数编码),主要用于数据和参数的编码
265 reference code HM 学习笔记
1. 关于层次的划分,在一帧图像中,并非所有的CTU都是帧间预测或是帧内预测,而是更具计算RD的值进行选择。
在代码中,PU, TU与CU的关系是,根据树形关系来,进行组织?
2. hevc中的z顺序扫描与其他不同的地方,一般为从左到右,从上到下的顺序进行扫描,但由于在HEVC中的CU树形组织结构,基本为,在同一个树高上的CU按照这样的顺序进行。
真正的帧内预测都是以PU为划分单位开始进行的,帧内预测的首要步骤是对于左边与上边的相邻边界进行采样操作,获得采样数值,但依然需要对其进行滤波处理。
从代码中,我们是否能够看到,在每读入以帧YUV之后,我们就开始进行了编码工作,具体包括为,帧内帧间预测,转换量化,熵编码与环路滤波,接下来应该分析,拥有依赖关系的B帧,其编码顺序可能会有所调整。
帧内预测中的DC模式,planar,和一般的角度模式之间的区别。如何计算预测角度处,没有弄懂,原本的35个角度模式,是如何与我们所得出的边界采样点之间对应起来,且其返回值是什么,其实,xPredIntraAng函数的根本任务是,将PU块按照相应的角度模式进行填充,并将其放在pTrueDst形参中进行返回,以便进行RD判断运算,以此来确定,何种的角度模式是最合适的压缩模式。(可以观察这段代码,看其是如何将一个较为复杂的逻辑,使用简单的代码进行表述)
运动估计与运动补偿的区别和关系,运动估计是拥有位移向量,而运动补偿是还需要进行残差计算
帧间预测可以分为两个过程:运动估计和运动补偿。
运动估计(motion estimation,ME)——提取当前图像运动信息的过程。为当前编码块在已编码块中寻找最佳估计快,使得预测块与当前块残差尽可能的小,并计算当前块的偏移MV(motion vector)。
运动补偿(motion compensate,MC)——根据运动矢量和帧间预测方法,求得当前帧的估计值。