HEVC的帧间预测解码(4)

来源:互联网 发布:软件项目招标文件 编辑:程序博客网 时间:2024/06/05 15:03

HEVC的帧间预测解码(1)

HEVC的帧间预测解码(2)

HEVC的帧间预测解码(3)

HEVC的帧间预测解码(4) 

HEVC的帧间预测解码(5)



前面的文章完成了merge模式的MV的计算,下面讨论非merge模式的MV。


4 非merge模式的MV计算


PU的merge_flag等于0时,就是非merge模式了,基本的思路就是从PU中解出mvd,然后通过计算mvp,最后得到MV。

4.1 非Merge模式整体流程


1.如果inter_pred_idc[ xPb ][ yPb ](预测单元中的语法元素)为 PRED_LX 或者 PRED_BI,


refIdxLX = ref_idx_lX[ xPb ][ yPb ]

predFlagLX = 1


否则


refIdxLX = −1

predFlagLX = 0


2.变量mvdLX可由如下式子得到(MvdLX预测单元中的语法元素)


mvdLX[ 0 ] = MvdLX[ xPb ][ yPb ][ 0 ]

mvdLX[ 1 ] = MvdLX[ xPb ][ yPb ][ 1 ]


3.当predFlagLX为1时,进行mvp的解码过程,得到mvpLx

4.当predFlagLX为1时,mvLX可由如下公式得出:





整个过程比较清晰,其重点就在第3步,mvp的解码上。


4.2 Mvp的解码


mvp的解码过程有如下步骤:(O代表otherwise merge)

O1.  进行运动向量预测值的候选值(mvp candidates)的解码,得到availableFlagLXN 和mvLXN(N等于A或者B);

O2.  

如果availableFlagLXA 和availableFlagLXB都等于1 且mvLXA不等于mvLXB, 则


availableFlagLXCol=0


否则,进行时域候选值(注意:这一步和merge模式的步骤M2是相同的)的解码过程。得到availableFlagLXCol和mvLXCol.

O3.  运动向量预测参考值列表mvpListLX由如下得出:

i = 0 if( availableFlagLXA )  mvpListLX[ i++ ] = mvLXA if( availableFlagLXB )  mvpListLX[ i++ ] = mvLXB   (8-140) if( availableFlagLXCol )  mvpListLX[ i++ ] = mvLXCol

O4.

– 当 mvLXA 和 mvLXB 相等时, 将mvLXB从列表中移除,变量numMvpCandLX等于mvpListLX中的元素数.

– 当numMvpCandLX <2时, 重复下列步骤直到numMvpCandLX=2:


mvpListLX[ numMvpCandLX ][ 0 ] = 0 

mvpListLX[ numMvpCandLX ][ 1 ] = 0

numMvpCandLX = numMvpCandLX + 1 


–  当numMvpCandLX> 2时, 将所有idx>1的运动向量预测参考值mvpListLX[ idx ] 从列表之移除。

O5. 

利用变量mvp_lX_flag得到mvp,mvpListLX[ mvp_lX_flag[ xPb ][ yPb ] ] =mvpLX.


下面详细介绍


O1.运动向量预测值的候选值解码




中间的块代表当前PU,A0,A1,B0,B1,B2的几何位置如图所示

引入变量isScaledFlagLX,设置isScaledFlagLX=0;


计算mvLXA和availableFlagLXA:


1.     根据上图设置A0的位置( xNbA0, yNbA0)和A1的位置( xNbA1, yNbA1)。

2.     availableFlagLXA设置为0,mvLXA的两个分量都设为0;

3.     将坐标代入求inter的availability的过程(详见文章HEVC的Availability计算过程)。得到availableA0和availableA1。

4.     当availableA0或availableA1为TRUE, 变量isScaledFlagLX设置为1。

5.     对于下列处理过程,( xNbAk, yNbAk) 从( xNbA0, yNbA0)到( xNbA1, yNbA1)取值: 

–  当 availableAkis为TRUE且availableFlagLXA=0,记性下列处理:

如果PredFlagLX[xNbAk][ yNbAk]=1 而且DiffPicOrderCnt(RefPicListX[ RefIdxLX[ xNbAk][ yNbAk] ],RefPicListX[ refIdxLX ] ) =0则有:


availableFlagLXA =1

mvLXA = MvLX[ xNbAk][ yNbAk] 


否则, 当 PredFlagLY[ xNbAk][ yNbAk] (Y =!X) = 1 且 DiffPicOrderCnt(RefPicListY[ RefIdxLY[ xNbAk][ yNbAk] ], RefPicListX[ refIdxLX ] ) =0则有


availableFlagLXA=1

mvLXA = MvLY[ xNbAk][ yNbAk]


6.当 availableFlagLXA=0, 对于下列处理过程,( xNbAk, yNbAk) 从 ( xNbA0, yNbA0)到( xNbA1, yNbA1)取值,或者直到availableFlagLXA=1为止:

– 当availableAk为TRUE且availableFlagLXA=0时:

–   如果 PredFlagLX[ xNbAk][ yNbAk]=1 且LongTermRefPic( currPic, currPb, refIdxLX, RefPicListX )等于LongTermRefPic( currPic, currPb,RefIdxLX[ xNbAk][ yNbAk], RefPicListX )


availableFlagLXA = 1

mvLXA = MvLX[ xNbAk][ yNbAk]

refIdxA = RefIdxLX[ xNbAk][ yNbAk]

refPicListA = RefPicListX


–否则, 当 PredFlagLY[ xNbAk][ yNbAk] (Y =!X) 等于 1且LongTermRefPic( currPic, currPb,refIdxLX, RefPicListX ) 等于LongTermRefPic( currPic, currPb, RefIdxLY[ xNbAk][ yNbAk],RefPicListY )。


availableFlagLXA = 1

mvLXA = MvLY[ xNbAk][ yNbAk] 

refIdxA = RefIdxLY[ xNbAk][ yNbAk] 

refPicListA = RefPicListY 



解释一下“Y”(在MvLY,refIdxLY,等等)在这里的含义:就是X相反,X=0,则Y=1,X=1,则Y=0,在计算B时也会用到。


– 当availableFlagLXA等于 1,DiffPicOrderCnt( refPicListA[refIdxA ], RefPicListX[ refIdxLX ] ) 不等于0,  且 refPicListA[ refIdxA ]和RefPicListX[ refIdxLX ] 都为short-term参考图像, 则:


tx = ( 16384 + ( Abs( td ) >> 1 ) )/ td 

distScaleFactor = Clip3( −4096, 4095, ( tb* tx + 32 ) >> 6 )

mvLXA = Clip3( −32768, 32767, Sign(distScaleFactor * mvLXA ) *

( ( Abs( distScaleFactor *mvLXA ) + 127 ) >> 8 ) ) 


其中td 和 tb 由下式计算得到:


td = Clip3( −128, 127, DiffPicOrderCnt(currPic, refPicListA[ refIdxA ] ) )

tb = Clip3( −128, 127, DiffPicOrderCnt(currPic, RefPicListX[ refIdxLX ] ) )



计算mvLXB和availableFlagLXB:


1.     如图设置( xNbB0, yNbB0), ( xNbB1, yNbB1) 和( xNbB2, yNbB2)的位置。

2.     availableFlagLXB设置为0,mvLXB的两个分量都设为0;

3.     对于下列处理过程,( xNbBk, yNbBk)从( xNbB0, yNbB0)到( xNbB2, yNbB2)取值:

–   根据的过程,得到availableBk

–   当availableBk为TRUE且availableFlagLXB等于0时:

–如果PredFlagLX[xNbBk][ yNbBk]等于1, 且DiffPicOrderCnt( RefPicListX[RefIdxLX[ xNbBk][ yNbBk] ], RefPicListX[ refIdxLX ] )等于0。


availableFlagLXB = 1

mvLXB = MvLX[ xNbBk][ yNbBk]

refIdxB = RefIdxLX[ xNbBk][ yNbBk]


–否则, 当 PredFlagLY[ xNbBk][ yNbBk] (Y =!X) 等于1 且 DiffPicOrderCnt( RefPicListY[RefIdxLY[ xNbBk][ yNbBk] ], RefPicListX[ refIdxLX ] )等于0, 则:


availableFlagLXB=1

mvLXB = MvLY[ xNbBk][ yNbBk]

refIdxB = RefIdxLY[ xNbBk][ yNbBk]


4.     当isScaledFlagLX等于0 且availableFlagLXB等于1,availableFlagLXA 等于1则

mvLXA = mvLXB

5.     当isScaledFlagLX等于0时, 将availableFlagLXB设为 0,对于下列处理过程,( xNbBk, yNbBk)从( xNbB0, yNbB0)到( xNbB2, yNbB2)取值或者直到availableFlagLXB等于1为止:

–   根据HEVC的Availability计算过程的过程,得到availableBk

–   当availableBk为TRUE且availableFlagLXB等于0时:

–如果PredFlagLX[xNbBk][ yNbBk]等于1,且LongTermRefPic( currPic, currPb,refIdxLX, RefPicListX ) 等于LongTermRefPic( currPic, currPb, RefIdxLX[ xNbBk][ yNbBk],RefPicListX ),则:


availableFlagLXB = 1;

mvLXB = MvLX[ xNbBk][ yNbBk]  

refIdxB = RefIdxLX[ xNbBk][ yNbBk] 

refPicListB = RefPicListX


–否则, 当PredFlagLY[ xNbBk][ yNbBk] (Y = !X)等于1且LongTermRefPic( currPic, currPb,refIdxLX, RefPicListX ) 等于LongTermRefPic( currPic, currPb, RefIdxLY[ xNbBk][ yNbBk],RefPicListY ),则:


availableFlagLXB = 1

mvLXB = MvLY[ xNbBk][ yNbBk]

refIdxB = RefIdxLY[ xNbBk][ yNbBk] 

refPicListB = RefPicListY


– 当availableFlagLXB等于1, DiffPicOrderCnt( refPicListB[refIdxB ], RefPicListX[ refIdxLX ] ) 不等于0, 且refPicListB[refIdxB ]和RefPicListX[refIdxLX ]为short-term参考图像时:


tx = ( 16384 + ( Abs( td ) >> 1 ) ) /td

distScaleFactor = Clip3( −4096, 4095, ( tb *tx + 32 ) >> 6 )

mvLXB =Clip3( −32768, 32767, Sign(distScaleFactor * mvLXB ) *

    ( ( Abs( distScaleFactor *mvLXB ) + 127 ) >> 8 ) )


其中td 和 tb 由以下得到:


td = Clip3( −128, 127, DiffPicOrderCnt(currPic, refPicListB[ refIdxB ] ) )

tb = Clip3( −128, 127, DiffPicOrderCnt(currPic, RefPicListX[ refIdxLX ] ) ) 



O2.时域候选值解码


这一步和merge模式的步骤M2相同。


O3,O4,O5上面已经介绍的很详细了。


至此,MV的两种模式的计算就完成了。





0 0
原创粉丝点击