帧间预测--merge模式理论部分

作者:66

在开始帧间预测代码分析之前,先把理论部分再理一遍。这部分涉及到的知识点较之前多些,相关的资料与代码不容易找出匹配的部分,造成作为新手的我阅读源代码反复好几次才搞清楚(还没体验过上手就明了的感觉)。

我把理论部分修改尽力趋同于后面对代码的解析。

相关的名词:ME(运动估计)、MC(运动补偿)、MV(运动向量,其实就是运动距离加方向,代码中用Dir表示方向,MV表示距离)、SAD(绝对误差和)

AMVP(高级运动向量预测)、MVD(预测残差)、MVP(参考的MV)。

HEVC中使用了两种MV预测技术,Merge技术和AMVP技术,两种技术都用到了空域和时域的MV预测的思想,不同的是,Merge直接拿相近的MV来用,AMVP拿来之后与真正的MV作了比较,编码MVD。因此,Merge下没有MVDAMVPMVD,这是第一点不同。第二点就是,拿别人的MV来用之前,MergeAMVP都比较机智,不是每次都抄一个人的MV,它们都拿几个相邻PUMV作为候选,对比出一个靠谱的拿来用(这不就是作弊嘛,抄抄别人的,不劳而获),它们的候选数量和选择顺序(这个到后面会明白)不同。

先看Merge

另外一点要明白的是,他们选出来最优MV后,要用这个MV进行运动估计,就是找相邻帧上与当前PU最相近的块,至于怎么找,之后再说。

Merge

Merge为当前PU建立一个MV候选列表,候选数量为5,遍历五个MV选取率失真最小的一个作为最优MV,解码端同样地方式建立一个候选列表,传输时仅传输MV在列表中的索引即可。

空域                          

 

图一、空域候选PU相对位置

当前PU五个方向上的候选PU,遍历顺序为:A1->B1->B0->A0->B2,候选列表的大小为5,但HEVC中至多使用其中4个(哪怕五个都存在),并且当其中某一个不可用时,顺序用下一个(不够就补零吧)。

不可用的情况分如下两种:

 

图二、PU的左右、上下划分

PU左右划分而且当前PU位于第二个时A1是不可用的,如果使用了A1MV,图中puCpumv一致,和不划分就没区别了。同样,PU的上下划分时第二个的PU是不能使用B1的。

②时域:

类比空域,空域用相邻块,则时域用相邻帧的同位(对应位置)PUMV来推测当前位置的MV。来看下怎么推测的。

帧间预测的图像都要有参考图像,像B帧参考它之前的图像,P帧可以参考它之前也可以参考之后。当前帧叫cur,当前帧的参考帧叫cur_ref,当前帧的同位帧叫col,同位帧的参考帧叫col_ref,好像有点乱,我一开始也乱。

 

图三、时域MV伸缩

图中的竖线表示那一帧图片在时间线上的位置,假设物体匀速运动,那么从colcol_ref运动时间为Tcol,从curcur_ref的运动时间为Tcur,物体运动的MV(距离)应该与时间成正比,于是就有:

这样就能由col(同位)帧推导出当前帧的MVHEVC中,时域最多提供一个候选MV

一般在col帧中相对当前PU位置为右下或中部,如图:

 

图四、候选PU位置

时域colPU首选P1位置,若P1处不可用或不存在时,选P2位置的PU

空域与时域:

对于B帧,就是需要参考前向帧MV又需要后向帧MV的帧,它有两个MV列表,list0listMerge下为B帧建立了一个组合列表,将两个MV列表的候选MV组合到一起,组合方式如下表:

combIdx

0

1

2

3

4

5

6

7

8

9

10

11

L0CandIdx

0

1

0

2

1

2

0

3

1

3

2

3

L1CandIdx

1

0

2

0

2

1

3

0

3

1

3

2

表一、Bslice候选MV组合列表

另外关于B帧在计算MV或像素误差统计时,HEVC中不是在前后col帧中选其一,而是直接以两帧像素各以1/2比例叠加成新帧参与计算。这样做不是太合理,没有考虑两帧对当前帧的参考价值,也就是没按加权(距离当前帧的时间远近不同,RD的不同等)来叠加成新帧,这个在H.266中提了出来,但因为代价太大(性能提升不明显,计算又过于复杂)被否决了。

  (本文为作者原创,未经允许严禁转载)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章