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的两种模式的计算就完成了。
相关文章推荐
- 以后记住
- 将十进制数转换为十六进制数
- Hdu 4763 Theme Section (kmp)
- IIS常见问题
- word 2013 修订模式下修订的文字样式设置
- Javascript变量提升解释
- NSRunLoop理解
- 单例模式
- UIImageView 浅析
- sqlite实例
- HEVC的帧间预测解码(3)
- Hadoop2.6(新版本)----MapReduce工作原理
- 将一个数转化为二进制数
- sass与compass实战
- 方法
- NYoj 1236 密室逃脱
- fangfang(11)
- 简单区分指针数组与数组指针
- iOS之UI学习-UILabel
- selenium+webdriver+python定位不到元素的原因及解决办法