HEVC的帧内预测(1)

来源:互联网 发布:mac 10.11.6 双系统 编辑:程序博客网 时间:2024/04/30 15:12




HEVC的帧内预测(intra prediction),即intra块的预测过程,为intra块解码提供预测值(predSamples[ x ][ y ])。


首先要确定当前块和邻块的关系。


1.z-scan order block availability


z-scan order block availability,就是在Z顺序扫描下的availability。


首先介绍计算MinTbAddrZs的方法


数组MinTbAddrZs表示以最小块(minimum blocks)为单位的z-scan 顺序地址,最小块的尺寸由变量Log2MinTrafoSize决定。

由以下公式得到:




看着是不是很头疼?有没有想死的感觉?


其中:CtbLog2SizeY为ctb(coding tree block)的尺寸对数,MinTbLog2SizeY为最小的Tb(transform block变换块)的尺寸对数。ctbAddrRs为当前ctb的raster扫描地址,CtbAddrRsToTs[ ctbAddrRs ]就是将ctbAddrRs转化为了Ts(tiles)扫描地址(详见HEVC标准中的图像分割(1))。


其实这公式表达的意思就是当前以最小块为单位的坐标(x,y)的地址,此地址的寻址顺序在CTB内部为z-scan,在跨越CTB时为tile扫描顺序。


举个例子,如图:




在图(1)中,黄色块代表当前的ctb,粗黑线标出了tile的边界,小方块代表ctb,黄色块代表(x,y)所在的ctb,即当前ctb,虚线箭头就是ts扫描的方向。则根据公式,当前ctb的ts扫描地址为24。

图(2)中,大的黄色块代表当前ctb,阴影块代表(x,y)所在的tb,假设CtbLog2SizeY = 4,MinTbLog2SizeY = 3,一个ctb中包含4个tb。(x,y)在当前ctb的地址为2。


所以MinTbAddrZs  = 24 + 2 = 26吗?错!!!


因为前面扫描过的ctb都有4个tb,所以MinTbAddrZs  = 24*4 + 2 = 98.


当前块左上角像素坐标(xCurr, yCurr),由以上MinTbAddrZs步骤计算出其最小块地址minBlockAddrCurr。

再计算左上角坐标为(xNbY, yNbY)的相邻块的最小块地址,minBlockAddrN

当相邻块位于图像范围外时,minBlockAddrN为-1,否则根据MinTbAddrZs方法进行计算。

 

如果有一个或者多个下列条件为真时,availableN 为FALSE

 1. minBlockAddrN 小于0

 2. minBlockAddrN 比 minBlockAddrCurr大

 3. 相邻块所在的slice segment对应的SliceAddrRs和当前块所在的slice segment对应的SliceAddrRs不同。

 4. 相邻块和当前块处于不同的tile。

否则, availableN为TRUE。


HEVC标准中的图像分割(2)中我们介绍过ctb的分块,其中提到


在intraSplitFlag为1时,要把当前的色度块分成4个块进行处理。


2.帧内预测模式计算


HEVC的帧内预测有34中模式,比H264的帧内预测更加精细。如下图的对比


H.264的intra预测模式

HEVC的intra预测模式



引入HEVC的帧内预测模式值与名称的对应

0:INTRA_PLANAR

1:INTRA_DC

2~34:INTRA_ANGULAR2~INTRA_ANGULAR34

帧内预测模式的值可以下步骤得出:

1. 用A表示当前块左边邻块,B表示当前快上边邻块。

2.计算备选帧内预测模式(candIntraPredModeX,X可以为A或者B),有下列步骤:

if(availableX==false){   candIntraPredModeX = INTRA_DC;}else if((CuPredMode[ xNbX][ yNbX ]!=INTRA)||( pcm_flag[ xNbX ][ yNbX ]==1)){   candIntraPredModeX = INTRA_DC;}else if(B位于另外一个coding tree unit){   candIntraPredModeX = INTRA_DC;}else{   candIntraPredModeX= IntraPredModeY[ xNbX ][ yNbX ]}


其中,availableX表示邻块的是否可用,由第1部分介绍的过程得出。

CuPredMode[ xNbX ][ yNbX ]指相邻块的预测模式,可为INTRA(1)或INTER(0)。

pcm_flag[ xNbX ][ yNbX ]指相邻块的pcm标志。

IntraPredModeY[ xNbX ][ yNbX ]指相邻块的帧内预测模式(范围:0~34)。

3. 备选模式表(candModeList[ x ], x = 0~2)的计算过程如下:

if (candIntraPredModeB==candIntraPredModeA){  if(candIntraPredModeA<2)  {     candModeList[0]=0, candModeList[1]=1,candModeList[2]=26;  }  else  {    candModeList[0] = candIntraPredModeA     candModeList[1] = 2 + ( ( candIntraPredModeA + 29 ) % 32 )    candModeList[2] = 2 + ( ( candIntraPredModeA −2 + 1 ) % 32 )   }}else{   candModeList[0] = candIntraPredModeA   candModeList[1] = candIntraPredModeB   if((candModeList[0]!=0)&&( candModeList[1]!=0))      candModeList[2] =0;   elseif((candModeList[0]!=1)&&( candModeList[ 1 ]!=1))      candModeList[2] =1;   else      candModeList[2] =26;}

完成此步骤后,得到备选模式表candModeList[x ]。

4.当前帧的亮度帧内预测解码模式(IntraPredModeY[ xPb ][ yPb ]),由以下步骤得出:

if(prev_intra_luma_pred_flag[ xPb ][ yPb ] ==1){   IntraPredModeY[ xPb ][ yPb ] = candModeList[ mpm_idx ]}else{   if(candModeList[ 0 ]>candModeList[ 1 ])     Swap( candModeList[ 0 ], candModeList[ 1 ] )     if(candModeList[ 0 ]>candModeList[ 2 ])     Swap( candModeList[ 0 ], candModeList[ 2 ] )     if(candModeList[ 1 ]>candModeList[ 2 ])     Swap( candModeList[ 1 ], candModeList[ 2 ] )     IntraPredModeY[ xPb ][ yPb ] =rem_intra_luma_pred_mode[ xPb ][ yPb ];   for(i=0;i<2;i++)   {      if(IntraPredModeY[ xPb ][ yPb ] >= candModeList[ i ])        IntraPredModeY[ xPb ][ yPb ]++;   }}


其中,prev_intra_luma_pred_flag,mpm_idx和rem_intra_luma_pred_mode都是coding_uint中的语法元素,可由cabac解码得到。


至此,得到亮度的帧内预测模式(IntraPredModeY)。











0 0