H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)

在宏块类型里介绍了I、P、B slice中的宏块类型解析,其中P_Skip、B_Skip、B_Direct这几种宏块类型并没有在码流中编码宏块运动矢量和参考帧索引信息。本文主要介绍这几种情况下,mv和ref_idx推导过程。
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第1张图片

mv预测

在帧间预测编码模式下,每个分块都有一个或两个mv需要编码。当采用小尺寸编码时,一个宏块内需要编码的mv也越多,所需比特额越多。同时,mv有两个值并且以1/4像素为单位,这也就意味着mv的数值还不小,因此有必要对mv进行压缩。H264标准利用临近块mv的相关性对当前块mv进行预测,只对实际mv与预测mv(mvp)的差值mvd进行编码。

Mv预测值的推导过程可分为亮度分量mvp和色度分量mvp。

1. 亮度分量mv预测值的推导过程

Mvp由当前块(任意分块大小)左边分块A、上边分块B、右上分块C的mv预测得到。亮度分量mv预测值推导过程分为两步:

  • 获取当前分块(任意分块大小)相邻块是否可用和mv等信息;
  • 根据相邻块信息通过中值预测得到当前块mv

1.1 相邻分块mv数据推导过程

当前分块和相邻块可以是任意大小(16x16、16x8、8x8、8x4、4x4),可以同属一个宏块,也有可能不在同一宏块。如下图所示,假设E为当前分块,A为E左方最上边4x4相邻块所属分块,B为E上方最左边4x4块所属分块,C为E右上角对角4x4块所属分块。
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第2张图片

以下图为例,每一个小块表示宏块中4x4大小块,假设当前宏块E(蓝色块)被划分为16个4x4小块,相邻宏块A被划分为2个16x8块。对于4x4块a,它的左相邻块为宏块A的第一个16x8块(c所在分块)。对于4x4块b,它的左相邻块与a一样,也是宏块A的第一个16x8块(d所在分块),它的上相邻块则是a。
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第3张图片

当分块C不可用时,如果左上角分块D可用则用D替代C;
当某个分块(A、B、C)不可用时,把该块mv置0,refIdx置-1;

1.2 mv中值预测过程

中值预测规则如下:

  1. 当前块为16x8大小,上面的16x8块由B预测,下面的16x8块由A预测;
  2. 当前块为8x16大小,左边的8x16块由A预测,右边的8x16块由C预测;
  3. 如果有且仅有一个相邻块的参考索引等于当前分块的参考索引,则mvp等于该块mv;
  4. 其余情况,取A、B、C块mv的中值。

2 色度分量mv预测值的推导过程

一般情况下色度分量mv等于亮度分量mv,只有一种特殊情况:
场宏块色度mv的垂直分量按下表计算。

H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第4张图片

3. P_Skip宏块mv推导过程

P_Skip宏块表示该宏块没有编码任何宏块信息,残差数据全为0,mv和参考帧索引(等于0)也没有编码。
P_Skip宏块亮度分量mv预测过程如下:

  1. 如果以下任意一个条件为真,则mv两个分量都为0;
    相邻宏块A不可用;
    相邻宏块B不可用;
    相邻宏块A参考帧索引为0,并且mv都为0;
    相邻宏块B参考帧索引为0,并且mv都为0;
  2. 如果是其他情况,使用上面章节的中值预测推导。

4. B_Skip\Direct模式下亮度mv推导过程

B slice中skip宏块和direct宏块需要使用一种特殊的预测方式direct预测。B_Skip既没有编码残差数据,也没有编码mv和refidx信息。B_Direct则编码残差数据,但没有编码mv和refidx信息,可以认为B_Skip是B_Direct的特例。只有16x16和8x8块存在direct模式。
Direct模式不需要传输mvd和ref_idx,因而能节省大量比特,mv和ref_idx通过已经解码帧计算得到。Direct预测分为两种模式:时域直接模式(temporal direct)、空域直接模式(spatial direct)。

4.1 对应位置4x4块(co-located)

参考帧或场中与当前宏块相对位置一样的宏块称为对应位置宏块(co-located),对应位置像素指在未进行隔行抽取时当前像素点在参考帧中所对应的位置,因为当前图像和参考图像可能分别为帧或场,所以分为多种情况。
对应位置4x4子宏块分割块,故名思义,该块大小为4x4。co-located的主要功能是得到出该4x4块的运动向量以及参考帧,以供后面的直接预测做处理。如果当前宏块进行的是直接预测,无论时域或空域,都会用到该co-located。
获取co-located信息步骤如下:
1)定位co-located所在图像colPic
要求co-located的位置,首先需要知道co-located所在的图像colPic的位置,colPic可以确定在当前图像的第一个后向参考图像RefPicList1[ 0 ]内,但colPic是选择RefPicList1[ 0 ]这一帧还是它的顶场或底场,这取决于当期图像与参考图像的编码方式。如下表所示:
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第5张图片

  • 第一项:field_pic_flag表示当前图像是以帧还是场方式进行编码
  • 第二项:代表RefPicList1[0]的编码方式是帧、场、互补场对(两个场)
  • 第三项:mb_field_decoding_flag代表当前宏块对是以帧、场方式进行编码(前提条件是当前图像是以帧方式进行编码,也只有当前图像选择了帧编码,才能选择宏块对(宏块帧场自适应)的编码方式)
  • 第四项:附加条件是为了在采用宏块级帧场自适编码方式时,应选择距离当前图像最近的顶场或底场作为col_Pic
  • 第五项:col_Pic的取值,firstRefPicL1Top 和firstRefPicL1Bottom 分别为RefPicList1[ 0 ]中的顶场和底场

注:其实第二项RefPicList1[ 0 ]是一个被动选项,因为它是根据当前图像的编码方式是帧、场或宏块帧场自适应决定的,如果当前图像是场,那么RefPicList1[ 0 ]就有可能是已解码的场或者以解码帧中的一场;如果当前图像是帧(非MBAFF),那么RefPicList1[ 0 ]就是帧;如果当前宏块是帧并且为MBAFF,那么RefPicList1[ 0 ]就是一个互补场对(两个场可以组成一个帧)

总结:如果当前图像是帧或场,那么colPic就是RefPicList1[ 0 ];如果当前图像为帧格式,RefPicList1[ 0 ]为MBAFF,则选择RefPicList1[ 0 ]中POC距离当前帧近的一场作为colPic。

2)获取co-located在colPic内的位置
得到了colPic,就可以通过当前宏块的16个4x4块的绝对位置(以4x4块为单位相对于图像左上角(0,0)的绝对位置( opic_block_x,opic_block_y),得到co-located在colPic的位置。
如果当前图像为帧,colPic为场,则co-located为(opic_block_x,opic_block_y>>1);
如果当前图像为场,colPic为帧,则co-located为(opic_block_x,opic_block_y<<1);
如果当前图像与colPic同为帧或场,则co-located为(opic_block_x,opic_block_y);
(注:像在jm18.6中,实际计算时,不会出现当前图像为场,colPic为帧的情况,因为场的参考图像都会被分为场后加入参考图像队列,所以最终计算时也会先根据当前场的是顶场或底场挑出参考帧中对应的场作为colPic )
Sps中的语法元素direct_8x8_inference_flag等于1,表示每个8x8块共用一个4x4的co-located,共用方式为一个宏块的4个8x8块分别只用该宏块4个角的4x4块作为co-located。如下图所示。
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第6张图片
3) 获得co-located的运动向量mvCol和参考帧refIdxCol

  • 如果co-located是帧内预测方式编码,那么将无法获得运动向量与参考帧,mvCol = 0,refIdxCol = -1;
  • 如果co-located是帧间预测编码方式,并且存在前向参考帧,那么mvCol将是co-located的前向运动向量MvL0[ mbPartIdxCol ][ subMbPartIdxCol ],refIdxCol是co-located所在的8x8块中的某一个4x4块的前向参考索引RefIdxL0[ mbPartIdxCol ];
  • 如果co-located是帧间预测编码方式,并且只存在后向参考帧,那么mvCol将是co-located的后向运动向量,refIdxCol是co-located所在的8x8块中的某一个4x4块的后向参考索引;

4.2 时域直接预测

时间模式的直接预测是基于一个假设:被预测的块处于均匀运动中,这样如果当前B块在List1中参考帧(下图中的List1 refrence,也就是colPic)的co-located块有相对于List0中参考帧的运动矢量List0MV,就可以利用当前B帧距离两个方向参考帧的距离(POC距离),按照比例计算出两个方向的MV。
时域模式是基于下图求出当前4x4块的前后向mvL0与mvL1,以及前向参考帧List0 reference的索引。后向参考帧索引默认为0.

H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)_第7张图片
已知的变量有:
后向参考图像List 1 reference (refPicList1[0])及其索引0
在计算co-located后得到的mvCol(mvCol需要根据VertMvScale进行调整,乘或除2),以及参考图像refColList0[refIdxCol](即List 0 reference)
td与tb为图像之间的POC距离,既然List 0 reference、Current B、List 1 reference 已经知道,那么就容易得出td与tb的值
未知的变量有:
List 0 reference的在当前参考图像列表中的索引
前后向运动向量mvL0与mvL1

求解方法:
List 0 reference的索引,该索引是参考图像列表中图像List 0 reference所在的最小索引值(这部分由于jm18.6中对mbaff采用了独立互补场对参考列表,所以看起来更简单一点,而标准是从refPicList0参考列表开始,然后结合VertMvScale进行推导,看起来比较繁琐,但其实得到的结果是一样的)。
mvL1 = mvCol/td*(td - tb)
mvL0 = mvCol - mvL1 (忽略mv方向)

时域模式的局限。
时域模式是利用List1参考帧中co-located的运动信息预测当前块的运动信息,只考虑了视频信息时间上的依赖关系,但在一些情况下,时域模式并不能达到很好的效果,比如List0和List1中间发生场景变换,或者从List0到List1所发生的运动不规则等情况。因此,空域兼顾时间和空间信息,显著提高了编码效率。

4.3 空域直接预测

与时域直接预测不同,空域预测是利用当前帧相邻块的运动信息进行预测。空域直接预测有两个步骤:

  • 参考帧选择:空域预测选择当前块的相邻块A、B、C使用的参考帧中非负最小帧号的参考帧(非帧内)作为当前块的参考帧(思路就是参考帧选择离当前帧越近越好),两个方向独立选择,如果有一个方向A、B、C都没有可用参考帧,那么认为空域预测在该方向参考帧不可用,只使用单项预测。如果两个方向都无可用参考帧(相邻块都是帧内预测编码),则选择两个方向离当前帧最近的参考帧。
    refIdxL0 = MinPositive( refIdxL0A, MinPositive( refIdxL0B, refIdxL0C ) )
    refIdxL1 = MinPositive( refIdxL1A, MinPositive( refIdxL1B, refIdxL1C ) )
  • 运动矢量选择:使用mv中值预测获

你可能感兴趣的:(编解码)