HEVC的帧间预测解码(1)
2016-04-21 16:03
375 查看
HEVC的帧间预测解码(1)
HEVC的帧间预测解码(2)
HEVC的帧间预测解码(3)
HEVC的帧间预测解码(4)
1.概述
HEVC的帧间预测过程的复杂程度实在是令人发指。我从解码角度详细分析一下,由于细节非常多,难免有错误或者遗漏。
所以,请结合标准阅读本系列,否则很难理解
帧间预测(inter prediction)过程为解码提供帧间预测值(predSamples[x][y]),对应标准8.5.2中的内容。
简单说,帧间预测就是以预测块(PU,prediction unit)为单位,计算PU的运动向量(MV,motion vector),并根据MV从对应的参考帧中获得预测值的过程。
个人觉得此过程的焦点和难点就在于两点:1.参考队列缓存区(DPB)的维护 2.MV的计算。
其中第1点在文章HEVC的参考队列解码中已经详细介绍了。
本文着重介绍第2点,mv的计算。
2.PU相关
PU(prediction unit)预测单元,是进行帧间预测和运动补偿的基本单元。其划分的方法在文章HEVC标准中的图像分割(2)中已经介绍过了。如图,大的方框代表CTU,共有8中分块方式。图1 PU的分块
PU(prediction unit)预测单元,是进行帧间预测和运动补偿的基本单元。每一个PU中包含的参数有:
merge_flag:1表示当前PU的mvp计算采用merge模式,0表示不采用merge模式,默认为0,当包含PU的CU为skip模式时,merge_flag为1。
merge_idx:给出在merge模式时,从merging mvp候选列表(merging candidate list,在本文中简称MCL)中选取mvp所使用的index。
inter_pred_idc:给出PU的参考方向。0表示PRED_L0, 前向预测;1表示PRED_l1, 后向预测;2表示PRED_BI,双向预测(除了4x8和8x4的PU,这一点在后面会解释)。
ref_idx_l0:指出当前PU在reflist0(参考队列0,详见HEVC的参考队列解码)中的参考帧。
ref_idx_l1:指出当前PU在reflist1(参考队列1,详见HEVC的参考队列解码)中的参考帧。
mvp_l0_flag:指出在非merge模式时,从mvp候选列表(motion vector predictor candidate list 0)中选取mvp所使用的index。
mvp_l1_flag:指出在非merge模式时,从mvp候选列表(motion vector predictor candidate list 1)中选取mvp所使用的index。
除了上述的参数,我们的已知条件还有:当前CTU的左上角坐标 ( xCb, yCb ),当前PU的左上角坐标( xPb, yPb ),CTU的尺寸nCbS,PU的尺寸(nPbW X
nPbH),PU的partIdx。
下面分成merge模式和非merge模式进行mv的计算。
3.Merge模式的mv计算
3.1 Merge模式整体流程
当PU的merge_flag等于1时,采用merge模式计算mv。前置处理,当Log2ParMrgLevel >2 且nCbS == 8时有:
( xPb, yPb ) = ( xCb, yCb ) nPbW = nPbH= nCbS partIdx = 0
就是说,PU所在的CTU尺寸为8x8且Log2ParMrgLevel >2时,PU的坐标和尺寸都用CU的代替。
参数Log2ParMrgLevel 位于pps中,含义就是merge模式中多大的尺寸的块内部的PU可以平行(parallel)做mv运算。
比如Log2ParMrgLevel = 6,那么64x64内PU的merge模式的mv可以同时计算。具体的为什么能平行做,我们将在后面解释。
Merge模式的mv计算用一句话概括就是:组成一个mv候选值的列表,然后根据merge_idx从列表里选择出mv。
其中列表中的每一项候选值都包含如下元素:
availableFlag,refIdxLX,predFlagLX,mvLX(其中X等于0,1,分别代表前后向)
比如时域候选值(俗称的collocated)就包含(availableFlagCol,refIdxLXCol,predFlagLXCol,mvLXCol)
Merge模式的具体流程如下:
M1.计算空域候选值(spatial merging candidates)
M2.将时域候选值(temporal merging candidates)的refIdx,即refIdxLXCol(X等于0,或者1)设为0.
M3.计算前向参考的时域候选值的其他元素。
M4.如果当前slice为B,再计算一次后向参考的时域候选值。
M5.组成MCL(merging
candidate list)
M6.将变量numCurrMergeCand和numOrigMergeCand设为MCL中候选值的个数。
M7.如果当前slice为B,计算组合双向预测参考值(combined
bi-predictive merging candidates)。
M8.计算零运动向量参考值(zero motion vector merging candidates)。
M9.用merge_idx从MCL中选出MCL[merge_idx]。mvLX,refIdxLX, predFlagLX等于参考值的对应元素。
M10.如果predFlagL0等于1,predFlagL1等于1,且PU的尺寸为4x8和8x4,则
refIdxL1 = −1,predFlagL1 = 0。什么意思呢?只有前向参考,后向参考被弃掉了。所以4x8和8x4的PU没有可能双向参考。
相关文章推荐
- 网络编程——IOCP函数
- 趣味编程_8棋皇后
- 多个Activity之间传值,使用Intent
- 知识库
- HWADDR配置错误导致network重启失败处理
- HWADDR配置错误导致network重启失败处理
- xmanager
- Fast特征检测
- iOS-利用粒子发射器(CAEmitterLayer) 制作发射动画
- django的安装
- socfpga armv7 u-boot学习记录
- 基数排序思想和代码
- jquery $(document).ready() 与window.onload的区别
- 05-树9 Huffman Codes
- mysql查询最大值max()对应的记录值。
- time元素
- J-Children of the Candy Corn|BFS+DFS
- iOS tableview cell 多选 (批量邀请好友)
- 【小笨鸟看JDK1.7集合源码之三】LinkedList源码剖析
- 原子性与可见性