十九帧间预测编码_5skip模式和direct模式
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十九帧间预测编码_5skip模式和direct模式相关的知识,希望对你有一定的参考价值。
- 帧间预测的几种特殊模式:
- P_Skip: 即COPY模式,在该模式下无运动矢量残差,无像素预测残差。重建时以MVP作为实际运动矢量,以预测像素块作为重建;
- B_Skip:同P_Skip类似的是该模式下同样无运动矢量残差,无像素预测残差。重建时,以Direct模式获取双向MV,以预测像素块作为重建;
- B_Direct:B_Direct模式分为B_Direct_8x8和B_Direct_16x16,分别表示整个宏块和一个子块按照B_Direct模式编码。该模式下,无运动矢量残差,有像素预测残差。重建时,以Direct模式获取双向MV,以预测像素块加上预测残差像素块作为重建;
Direct预测模式
Direct预测模式定义在标准文档的8.4.1.2节。主要执行步骤如下:
- 计算共置运动矢量(co-located motion vector)、参考帧索引等信息;
- 如果direct_spatial_mv_pred_flag为1,表示采用空间Direct模式;
- 如果direct_spatial_mv_pred_flag为0,表示采用时间Direct模式;
计算共置运动矢量和参考帧索引等信息
- 首先获取共置图像(colPic),对于帧编码的视频,colPic即参考帧列表List1的首帧RefPicList1[0]。
- 然后计算luma4x4BlkIdx的值;计算方法根据direct_8x8_inference_flag的取值不同:
- 如果direct_8x8_inference_flag为0,luma4x4BlkIdx的计算方法为 (4 * mbPartIdx + subMbPartIdx);
- 否则,luma4x4BlkIdx的计算方法为 (5 * mbPartIdx);
- luma4x4BlkIdx计算完成后,根据4×4子块逆扫描顺序将luma4x4BlkIdx转换为子块坐标(xCol, yCol);
- 根据表8-8的定义,计算共置宏块地址mbAddrCol、子块坐标yM和mv映射系数vertMvScale;从表中可知,对于帧编码视频,其mbAddrCol值等于当前宏块地址CurrMbAddr,子块坐标的yM等于步骤3中计算得到的yCol,mv映射系数vertMvScale为One_To_One。
- 设mbTypeCol和subMbTypeCol分别为共置宏块及其内部对应子块的类型,mbPartIdxCol和subMbPartIdxCol分别为共置宏块及其内部对应子块的内部划分索引值。根据子块坐标(xCol, yM)、mbTypeCol(如果共置宏块是8x8分割,则还有subMbTypeCol的数据),得到mbPartIdxCol和subMbPartIdxCol;
- 计算mvCol和refIdxCol。根据共置宏块的类型判断:
- 如果共置宏块是帧内编码宏块,则mvCol设为(0,0),refIdxCol设为-1;
- 如果共置宏块不是帧内编码宏块,则要判断共置宏块的predFlagL0Col和predFlagL1Col值;如果predFlagL0Col为1,则取共置宏块或其中的目标子块的MvL0作为mvCol,取RefIdxL0作为refIdxCol;
- 如果predFlagL0Col为0而predFlagL1Col为1,则取MvL1作为mvCol,取RefIdxL1作为refIdxCol;
空间Direct预测模式
空间Direct模式适用于B_Skip和B_Direct的运动矢量预测过程。该过程传入的数据包括mbPartIdx和subMbPartIdx,输出的数据结果有:
- 两个方向的参考帧索引refIdxL0, refIdxL1;
- 两个方向的运动矢量mvL0和mvL1;
- 运动矢量计数subMvCnt;
- 两个方向的预测方向标识位predFlagL0和predFlagL1;
首先计算两个方向的参考帧索引refIdxL0, refIdxL1。其主要步骤为:
- 获取当前8x8子块的分割类型currSubMbType;
- 计算当前子块的三个相邻块(左、上、右上)的三对参考帧索引(refIdxL0N和refIdxL1N);
- refIdxL0, refIdxL1分别为三个相邻块对应方向参考帧索引的最小正值,如果都不存在则都设为0,并将一个特定的标识位directZeroPredictionFlag设为1;
第二步为调用3.1中的方法计算mvCol和refIdxCol;
第三步为计算colZeroFlag。如果下列条件全部符合,则colZeroFlag为1,否则colZeroFlag为0:
- RefPicList1[0]为用于短期参考;
- refIdxCol值为0;
- 以1/4像素为单位,mvCol的两个分量都在-1到1之间;
最后,计算预测mv的值。如果下列条件符合其中之一,预测mv的两个分量全部为0;否则,按照运动矢量预测的方式通过相邻像素块的运动信息预测mv的值:
- 标识位directZeroPredictionFlag的值为1;
- refIdxLx的值为负值;
- refIdxLx的值为0,且colZeroFlag为1;
两个方向的预测方向标识位predFlagL0和predFlagL1分别代表两个方向的refIdx是否为非负值,subMvCnt的值表示两个标识位有几个为真。
时间Direct预测模式
与空间Direct模式类似,时间Direct模式同样适用于B_Skip和B_Direct的运动矢量预测过程。其输入输出的数据也与之一致。
首先调用3.1中的方法计算mvCol和refIdxCol;
在获取到了refIdxCol后,按照标准的说明,调用MapColToList0()获取到新的refIdxL0。实际上对于帧编码视频,MapColToList0()的作用就是从List0中找到第一个包含refIdxCol的参考帧,并将其索引值返回给refIdxL0。此外,refIdxL1的值被设为0。
下一步操作是计算currPicOrField和两个参考帧pic0以及pic1。对于帧编码视频,pic0设为RefPicList0[refIdxL0],pic1设为RefPicList1[0];currPicOrField为当前的图像对象。
最后计算两个预测mv的值。如果refIdxL0代表的是一个长期参考帧,或者pic1和pic2的poc相等,则两个预测mv的计算方式为:
- mvL0 = mvCol;
- mvL1 = 0;
否则,如果pic1和pic2的poc不相等,且refIdxL0代表的是一个短期参考帧,则mvL0和mvL1都是mvCol经过变换之后的缩放值,其缩放系数由当前帧、pic0和pic1的POC计算决定。计算方法如下图所示:
其时间与mv的关系可由下图表示:
以上是关于十九帧间预测编码_5skip模式和direct模式的主要内容,如果未能解决你的问题,请参考以下文章