您的位置:首页 > 其它

HEVC的帧间预测解码(4)

2016-04-28 17:02 393 查看

HEVC的帧间预测解码(1)

HEVC的帧间预测解码(2)

HEVC的帧间预测解码(3)

HEVC的帧间预测解码(4)





前面的文章完成了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的两种模式的计算就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: