HEVC最优CU划分确定的过程

HEVC中CU有64x64,32x32,16x16,8x8四种,对于一个大的LCU,应该如何划分CU才能使得RDCo最小,我们知道HM中是采用遍历递归的形式进行计算的,但是具体的流程又是怎么样的?

1,首先对于一个大的LCU即64x64的块,我们首先把他当作一个CU,计算出这个CU最佳的预测模式,并记录当前划分模式下的最佳预测数据。

2,然后我们对当前LCU进行划分,划分成4个32x32的CU,首先我们做的是对4个32x32的CU进行循环,但是对于每一个循环又有向下的递归,即,我们先计算第一个32x32              所对应的最佳预测模式,并记录预测数据,然后对第一个进行向下递归。

3,类似的,首先计算32x32向下递归的16x16CU所对应的最佳预测模式并记录其所对应的数据,然后上层还是对16x16的CU进行循环,下层又是对16x16的CU进行递归。

4,类似,首先我们计算8x8所对应的最佳预测模式并记录其所对应的预测数据,由于8x8已经达到最深的CU划分深度,所以这里我们我们只是循环计算各个8x8所对应的最佳预测      模式,并记录其数据。

5,待8x8的完成以后,我们拿四个8x8的RDCost的总和和第一个16x16整个划分所对应的RDCost比较,以此来决定是选择8x8划分还是选择16x16划分。

6,待第一个16x16完成以后,我们再重复3,4,5的步骤,决定第二个16x16的CU怎么划分,即是选择16x16划分还是4个8x8划分;然后是第3个16x16,第4个16x16.

7,待16x16完成以后,我们就把4个16x16的RRDCost总和一个32x32作比较,以此来决定是选择32x32划分,还是已经向下划分好的16x16以及16x16向下的划分。

8,待第一个32x32完成以后,我们再重复2,3,4,5的步骤,决定第2,3,4个32x32的划分模式。

9,等到4个32x32全部计算完成之后,我们再比较32x32CU划分的RDCost的总和和一个64x64CU的RDCost,然后是决定选择64x64还是32x32以及其向下的划分。

      整个过程就是HM中CU划分的递归过程,从这个过程可以看出,由于是从64x64一直向下划分到8x8,我们必须等划分到8x8才能决定CU的划分到底是什么样的,即是选择8x8还是16x16,待16x16完成以后,就选择16x16还是32x32,待32x32完成以后,就决定是32x32还是64x64。所以只有8x8CU划分完毕才能做后续CU划分的决定。

这里值得提出的是不管CU的大小多大,每一个CU预测完成(即确定了当前划分层次的预测模式)之后,都会有对象的对象来存储和当前CU所有有关的预测数据(最佳预测模式,预测数据,预测残差),存储这些数据的对象就是当前CU上一级的CU数据对象rpcTempCU,这些操作都是在函数rpcTempCU->cptyPartFrom下完成的,程序如下图所示,其中uiPartUnitIdx就是表示当前CU是上一级CU划分的第几个,因为上一级CU分下来是4个当前大小的CU,所以数据的存储肯定也要按照CU对应的位置存储。

HEVC最优CU划分确定的过程_第1张图片

      

你可能感兴趣的:(HEVC)