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。
相关文章推荐
- Hadoop2.6(新版本)----MapReduce工作原理
- 将一个数转化为二进制数
- sass与compass实战
- 方法
- NYoj 1236 密室逃脱
- fangfang(11)
- 简单区分指针数组与数组指针
- iOS之UI学习-UILabel
- selenium+webdriver+python定位不到元素的原因及解决办法
- struts自定义拦截器解读
- VF01开票自动生成会计凭证
- input disable属性下面 更改文本框或者按钮的颜色(对IOS兼容处理)
- android中Tools属性
- 0045 Ubuntu常用指令(与mysql,python,hadoop,spark,java ,g++,编辑器等相关)
- 从上往下打印二叉树
- jeecg报错:java.lang.Exception: No runnable methods
- 有关Hibernate和JPA很好的文章
- hihoCoder#1107 : Shortest Proper Prefix (前缀树)
- 文章标题
- nginx的安装和配置