H.264/AVC 帧间预测

首先介绍一下帧间的划分

264的帧间预测块尺寸包含了16x16到4x4。

每个宏块(16x16)可以使用4种方式进行划分:1个16x16,2个16x8,2个8x16,4个8x8,叫做宏块划分。

在8x8的情况下,子宏块还可以继续划分:1个8x8,2个4x8,2个8x4,4个4x4,叫做子宏块划分。

上述划分方式的简单示意图如下:

上述划分描述的是亮度分量,对于色度分量来说,色度块的尺寸是亮度块的一半,且色度块的划分方式和亮度块相同。 

每个宏块划分和子宏块划分都有一个或两个MV(P/B),每个MV都指向一个位于参考帧里的用于预测当前划分块的区域,这个区域的尺寸和当前的块相同。每个宏块划分可以利用不同的参考帧进行预测。然而,子宏块划分只能使用同一个参考帧进行预测。

然后介绍一下分数像素插值

亮度分量的分数像素只有1/4精度,色度只有1/8精度。

如何获取分数像素位置的像素值呢?这通过利用整数像素进行内插生成。

首先会生成1/2精度的像素,结合下图说明

 上图中,正常的A、B、C这种小灰块代表整数像素,在内插的过程中,先插值得到b再插值得到h。得到b的过程是利用E、F、G、H、I、J这六点的像素值做一个加权和;得到h的过程是利用A、C、G、M、R、T这六点的像素值做一个加权和。有了aa、bb、cc、dd、b、h这一类型的像素值,就可以通过加权求和得到i的像素值。

 然后通过1/2精度的像素值再内插出1/4精度的像素值,结合下图说明

 

 1/4精度的像素值的计算过程要更简单,只不过是相邻/对角像素值的平均值。

上面介绍了亮度像素的分数像素插值过程,下面再简单说说色度像素的。

色度像素也是需要通过整像素插值得到,简单示意图如下:

 A、B、C、D是整数像素,a是1/8精度的分数像素,a点像素值的计算公式如下,朴实无华:

 接着介绍一下MV的预测

当前块的MV可以由相邻块的MV预测得到,把预测值记作MVP,下图解释了相邻块如何确定:

假设E是当前宏块,A是E左边的,B是E上边的,C是E右上角的。如果A这个区域里有很多宏块划分/子宏块划分,那么选择最上边的作为A;如果B这个区域里有很多宏块划分/子宏块划分,那么选择最左边的作为B。

1. 如果要传输的划分不包含16x8或者8x16的划分尺寸,那么MVP 就是A、B、C的MV的中值。

2. 如果是16x8的划分,那么上边的16x8的MVP就是B的,下边的16x8的MVP就是A的。

3. 如果是8x16的划分,那么左边的8x16的MVP就是A的,右边的8x16的MVP就是B的。

4. 如果是skip的宏块,那么就按着第1种方式预测

 (这里有个小疑问,书本里只举了宏块划分获取MVP的例子,没有说子宏块划分获取MVP的例子,个人推测应该也是按着这种方式来。)

双向MVP

双向的分为两种情况,我们都知道这时候有两个参考帧a和b,从播放顺序考虑

1. 假如a和b一个在前一个在后,那么当前块在利用相邻块获取两个MVP的时候,一个相邻块的MV是指向前的,一个是指向后的。

2. 假如a和b都在前或者都在后,那么相邻块的MV都是指向前的,或者都是指向后的。在这时候有个很奇怪的操作:现在我有俩MV,一个是MVa,一个是MVb,这俩里就有一个MV需要做些变动。假设我当前帧的播放顺序是第5帧,a是第4帧,b是第2帧,MVa是(1,-1),MVb是(1.5,-2.5)。传输MVa的时候没有操作,传输MVb的时候,首先根据播放距离对MVa进行缩放,得到(3,-3),因为a和b相对于当前帧的距离比是3:1,所以MVa放大3倍,然后(1.5,-2.5)-(3,-3)得到(-1.5,0.5),传输这个(-1.5,0.5)作为MVb。(这操作是真滴离谱。这样能够减轻码流的压力吗????)

直接模式(Direct Mode)MVP

对于B slice的块来说,如果是direct mode,就不会传输MV。解码器会根据前面已编码的MV来计算list0和list1的MV,然后使用计算结果进行运动补偿。

这个direct mode分为spatial direct mode和temporal direct mode两种。

1. spatial

在同一个slice里前面已编码块的list0和list1的MV直接用作当前块的list0和list1的MV。

2. temporal

1)把list1参考帧里的co-located块的list0参考帧作为当前块的list0参考帧(假设list1与当前帧乡相距2,list0与当前帧相距3)

2)把list1参考帧里的co-located块的指向list0的MV记录下来(假设这个MV是(2.5,5))

3)依据当前帧和list1参考帧的距离,缩放MV,作为指向list1参考帧的MV((2.5,5)的2/5,得到(-1,-2))

4)依据当前帧和list0参考帧的距离,缩放MV,作为指向list0参考帧的MV((2.5,5)的3/5,得到(1.5,3))

加权预测

264有三种加权预测方式

1. P slice的显式加权

slice头里会写清楚权重是多少,curr_pixel = weight * ref_pixel

2. B slice的显示加权

slice头里会写清楚权重是多少,curr_pixel = weight_1 * ref1_pixel + weight_2 * ref2_pixel

3. B slice的隐式加权

weight_1和weight_2会根据与当前帧距离的远近分配权重

---------------------

吐槽一下两本教材对inter prediction的描述真没有265的教材写得清楚……我如果没有265和266的积累,应该很难看懂教材写的是什么……

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值