十九帧间预测编码_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模式;

计算共置运动矢量和参考帧索引等信息

  1. 首先获取共置图像(colPic),对于帧编码的视频,colPic即参考帧列表List1的首帧RefPicList1[0]。
  2. 然后计算luma4x4BlkIdx的值;计算方法根据direct_8x8_inference_flag的取值不同:
    1. 如果direct_8x8_inference_flag为0,luma4x4BlkIdx的计算方法为 (4 * mbPartIdx + subMbPartIdx);
    2. 否则,luma4x4BlkIdx的计算方法为 (5 * mbPartIdx);
  3. luma4x4BlkIdx计算完成后,根据4×4子块逆扫描顺序将luma4x4BlkIdx转换为子块坐标(xCol, yCol);
  4. 根据表8-8的定义,计算共置宏块地址mbAddrCol、子块坐标yM和mv映射系数vertMvScale;从表中可知,对于帧编码视频,其mbAddrCol值等于当前宏块地址CurrMbAddr,子块坐标的yM等于步骤3中计算得到的yCol,mv映射系数vertMvScale为One_To_One。
  5. 设mbTypeCol和subMbTypeCol分别为共置宏块及其内部对应子块的类型,mbPartIdxCol和subMbPartIdxCol分别为共置宏块及其内部对应子块的内部划分索引值。根据子块坐标(xCol, yM)、mbTypeCol(如果共置宏块是8x8分割,则还有subMbTypeCol的数据),得到mbPartIdxCol和subMbPartIdxCol;
  6. 计算mvCol和refIdxCol。根据共置宏块的类型判断:
    1. 如果共置宏块是帧内编码宏块,则mvCol设为(0,0),refIdxCol设为-1;
    2. 如果共置宏块不是帧内编码宏块,则要判断共置宏块的predFlagL0Col和predFlagL1Col值;如果predFlagL0Col为1,则取共置宏块或其中的目标子块的MvL0作为mvCol,取RefIdxL0作为refIdxCol;
    3. 如果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。其主要步骤为:

  1. 获取当前8x8子块的分割类型currSubMbType;
  2. 计算当前子块的三个相邻块(左、上、右上)的三对参考帧索引(refIdxL0N和refIdxL1N);
  3. 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模式的主要内容,如果未能解决你的问题,请参考以下文章

十九帧间预测编码_3参考帧列表

十九帧间预测编码_2解码显示顺序与图像管理

十九帧间预测编码:帧间预测编码的基本原理

视频编解码 - 帧间预测

Codecs系列HEVC标准:帧间预测技术及x265实现分析

Codecs系列x265编码器:模式选择之RDO过程分析