每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择

CU PU TU划分以及PU最佳预测模式选择

在HM对CU进行划分(CU模式判别)、PU模式选择(划分)、以及PU预测模式划分的过程总算有点理解,现对整个过程进行详细介绍。

HM进行块划分和模式选择主要的工作是:

一、分层递归所有CU划分模式。
二、对每一个CU遍历所有PU(划分)模式,选出最优划分模式,与此同时也完成了最优TU模式的选择。
三、对每一个PU遍历所有的预测模式(intra,inter等,对帧内帧间都遍历一遍比较选出最优模式,记录预测数据。选择最优预测模式。

划分过程中并不是按一二三的顺序进行的,为并不是把CU划分好了再进行PU模式选择和预测模式选择,是后者在CU划分的过程中进行了。画了两个图便于理解如下图所示:
每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择_第1张图片

每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择_第2张图片

首先关于CU划分讲解:

①把CTU作为CU(LCU),计算此CU (这个CU已完成了二跟三)的RDCost,此时出为64 * 64,深度为0,记录预测数据。包含分割数据split_flge。
②对64 * 64的CU进行四叉树划分,得到四个32 * 32的CU ,计算这四个小CU的RDCost,相加得到RDCost和,并且得到四个分别的最佳预测模式和预测数据并记录。
③对32 * 32的CU继续划分,得到四个16 * 16的CU ,同样的重复②中操作。
④达到最深深度8 * 8的CU同样进行②的操作,用四个8 * 8的CU率失真代价之和与被拆分的16*16的CU进行比较作为反馈,决定是否拆分(若小的小则确实该拆分,若大的小则不必进行分四叉树)。
⑤进行向上的比较,确定是否四叉树划分。
这样就是所谓的遍历一遍,也就是说一个LCU被划分为64个最小CU后才能完成最后的CU划分。我们必须等划分到8x8才能决定CU的划分到底是什么样的,即是选择8x8还是16x16,待16x16完成以后,就选择16x16还是32x32,待32x32完成以后,就决定是32x32还是64x64。所以只有8x8CU划分完毕才能做后续CU划分的决定。不管CU的大小多大,每一个CU预测完成(即确定了当前pu划分层次的pu预测模式)之后,都会有对象的对象来存储和当前CU所有有关的预测数据(最佳预测模式,预测数据,预测残差)。

下面对PU模式选择的讲解:

PU模式判别
①计算2Nx2N模式的率失真代价,将其作为最优代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2Nx2N作为最优的PU模式
②如果CU的深度已经取得最大值,且inter_4x4_enabled_flag是1,那么执行③,否则执行④
③计算NxN模式的率失真,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将NxN作为最优的PU模式
④计算Nx2N模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将Nx2N作为最优的PU模式
⑤计算2NxN模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NxN作为最优的PU模式
⑥如果TestAMP_Hor为1,当前CU执行水平方向上的AMP模式,否则执行本步骤。计算2NxnU模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NxnU作为最优的PU模式;否则计算2NxnD模式的率失真代价,更新最优的代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NnD作为最优的PU模式
⑦如果TestAMP_Ver为1,当前CU执行垂直方向上的AMP模式,否则执行本步骤。计算nLx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将nLx2N作为最优的PU模式;否则计算nRx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将nRx2N作为最优的PU模式
⑧注意上面的都是帧间的模式,现在需要计算帧内2Nx2N模式的率失真代价,更新最优模式和代价
⑨如果当前CU深度为最大值,计算帧内NxN模式的率失真代价,更新最优模式和代价
⑩如果当前CU大于或等于PCM模式所允许的最小单元,并且代价大于PCM模式,那么更新最优模式和代价
⑪结束搜索,得到最优的PU模式。注意对于每一种PU模式,都要夯实不同的TU划分,选取最优的TU模式,因此最优的PU模式包含了最优的TU模式

下面对PU模式选择进行讲解:

在对每一个PU的模式选择,都会对帧内和帧间进行遍历,待比较RDCost之后再选择此PU块选择帧内模式还是帧间模式。
1)帧间预测模式。
HEVC采用了Merge和AMVP技术,更加高效地表示帧间预测参数,但是这两种方式有比较大的区别,因此帧间预测可以分成Merge帧间预测模式和非Merge帧间预测模式(采用AMVP技术),分别选取最优的Merge帧间预测模式和非Merge帧间预测模式,然后从中选取最优的模式。
对于Merge帧间预测模式,遍历所有的候选模式,计算率失真代价,选择率失真代价最小的模式为最优模式。当采用merge帧间预测模式I按摩,且预测残差信号的编码比特数为零时,只需要编码skip标识和merge索引两个语法元素,此时该模式称为MODE_SKIP模式
对于非Merge帧间预测模式(采用AMVP技术)
①根据AMVP技术确定MVP列表,计算每个MVP的率失真代价,得到最优的MVP
②以最优MVP为起始点,进行整像素运动预测,得到最优的整像素运动矢量
③以整像素运动矢量为中心,进行半像素搜索,从周围的8个点确定最优的半像素精度运动矢量
④以半像素精度矢量为中心,进行1/4像素精度的运动搜索,确定最优的1/4像素精度运动矢量

2)帧内预测模式。
①遍历所有的预测模式,得到每种模式下的残差信号,再对残差信号进行Hadamard变换计算SATD值
②利用SATD值计算每种预测模式的率失真代价,选取率失真代价最小的几种模式(与PU大小相关)为预测模式集
③将已编码相邻块的预测模式补充到预测模式集中
④遍历模式集合中的所有模式,并对残差信号进行正常编码(熵编码),计算率失真代价
⑤选取最优的预测模式作为该PU的最优模式
⑥当亮度块的模式确定之后,把该模式以及DC、planar、水平方向模式、垂直方向模式作为色度块的候选模式,选取最优的模式即可

以上的过程都是在函数TEncCu::xCompressCU中实现。

以上是学习笔记,仅供于学习。

你可能感兴趣的:(HM代码学习,hevc,c++,h.264)