您的位置:首页 > 其它

HEVC的帧间预测解码(3)

2016-04-28 17:01 573 查看

HEVC的帧间预测解码(1)

HEVC的帧间预测解码(2)

HEVC的帧间预测解码(3)

HEVC的帧间预测解码(4)



3.5 计算组合双向预测参考值(M7)

接着上一篇文章HEVC的帧间预测解码(2)继续讲merge模式的mv计算。

当slice为B时,才会进行M7。

引入变量MaxNumMergeCand(可由slicesegment header中的语法元素 five_minus_max_num_merge_cand计算得到)。其范围是[1,5],规定了MCL的最大长度(即最多包含参考值的数量)。

当1<numOrigMergeCand<MaxNumMergeCand时,numInputMergeCand等于numCurrMergeCand, 变量combIdx等于0, 变量combStop等于FALSE, 重复下列步骤直到combStop为TRUE:

1.利用combIdx根据下表得到l0CandIdx 和 l1CandIdx



2.

l0Cand = mergeCandList[ l0CandIdx ]

l1Cand = mergeCandList[ l1CandIdx ]

3. 当下列3个条件全部成立时:

– predFlagL0l0Cand= = 1

– predFlagL1l1Cand= = 1

–(DiffPicOrderCnt( RefPicList0[ refIdxL0l0Cand], RefPicList1[ refIdxL1l1Cand] ) != 0 ) | | ( mvL0l0Cand!= mvL1l1Cand )

参考值combCandk(k= numCurrMergeCand −numInputMergeCand) 添加到MCL(mergeCandList)的末尾,即mergeCandList[ numCurrMergeCand ] = combCandk。并有:

refIdxL0combCandk= refIdxL0l0Cand

refIdxL1combCandk= refIdxL1l1Cand

predFlagL0combCandk= 1

predFlagL1combCandk= 1

mvL0combCandk[ 0 ] = mvL0l0Cand[ 0 ]

mvL0combCandk[ 1 ] = mvL0l0Cand[ 1 ]

mvL1combCandk[ 0 ] = mvL1l1Cand[ 0 ]

mvL1combCandk[ 1 ] = mvL1l1Cand[ 1 ]

numCurrMergeCand = numCurrMergeCand + 1

4.变量combIdx增加1;

5. 当combIdx=( numOrigMergeCand * ( numOrigMergeCand −1 ) ) 或者numCurrMergeCand = MaxNumMergeCand时, 将combStop设为 TRUE。

经过M7之后,MCL可能被更新了,可能会增加combCandk项。为什么说可能呢?因为如果M7之前,MCL中候选的数量已经达到MaxNumMergeCand了,就不会添加combCandk。

3.6 计算零运动向量参考值(M8)

引入变量numRefIdx:

– 如果slice_type 等于P,则

numRefIdx =num_ref_idx_l0_active_minus1 +1.

– 否则 (slice_type 等于 B),

numRefIdx= Min( num_ref_idx_l0_active_minus1 + 1, num_ref_idx_l1_active_minus1 + 1 ).

当numCurrMergeCand<MaxNumMergeCand, 变量numInputMergeCand = numCurrMergeCand, 变量zeroIdx=0, 重复下列步骤直到numCurrMergeCand 与MaxNumMergeCand相等:

1.

– 如果 slice_type等于P, 参考值zeroCandm(m 等于 ( numCurrMergeCand −numInputMergeCand )) 添加到mergeCandList的末尾, 即mergeCandList[ numCurrMergeCand ] =zeroCandm,并有:

refIdxL0zeroCandm= ( zeroIdx <numRefIdx ) ? zeroIdx : 0

refIdxL1zeroCandm= −1

predFlagL0zeroCandm= 1

predFlagL1zeroCandm= 0

mvL0zeroCandm[ 0 ] = 0

mvL0zeroCandm[ 1 ] = 0

mvL1zeroCandm[ 0 ] = 0

mvL1zeroCandm[ 1 ] = 0

numCurrMergeCand = numCurrMergeCand + 1

– 否则(slice_type 等于B), 参考值zeroCandm(m= ( numCurrMergeCand−numInputMergeCand ))添加到mergeCandList末尾, 即mergeCandList[numCurrMergeCand ] = zeroCandm, 并有:

refIdxL0zeroCandm= ( zeroIdx <numRefIdx ) ? zeroIdx : 0

refIdxL1zeroCandm= ( zeroIdx <numRefIdx ) ? zeroIdx : 0

predFlagL0zeroCandm= 1

predFlagL1zeroCandm= 1

mvL0zeroCandm[ 0 ] = 0

mvL0zeroCandm[ 1 ] = 0

mvL1zeroCandm[ 0 ] = 0

mvL1zeroCandm[ 1 ] = 0

numCurrMergeCand = numCurrMergeCand +1

2. 变量zeroIdx增加1

和M7一样,MCL可能会被更新。

3.7 得到运动向量(M9,M10)

M9 N = mergeCandList[ merge_idx],merge_idx为预测单元中的语法元素。就是以merge_idx索引号,从MCL中得到运动向量

mvLX[ 0 ] = mvLXN[ 0 ]

mvLX[ 1 ] = mvLXN[ 1 ]

refIdxLX = refIdxLXN

predFlagLX = predFlagLXN

M10. 当 predFlagL0等于 1且 predFlagL1等于1, 且 ( nOrigPbW + nOrigPbH ) 等于12时

refIdxL1 = −1

predFlagL1 = 0

大功告成,merge模式的mv就计算完成了。总结成一句话就是:构建MCL,其长度不能超过MaxNumMergeCand,用merge_idx从候选值中得到mv。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: