目录
前置文章:
H.264 入门篇 - 04 (B_Skip、P_Skip 、B_Direct宏块)
0、概述
H.264 编码中,帧间压缩办法,是通过帧间估计相关一系列方式来实现;
首先,这里指基于宏块(macroblock)的运动估计,基本思想是将图像序列的每一帧分成许多互不重叠的块,并认为块内所有像素的位移量都相同,然后对每个宏块到参考帧某一特定搜索范围内根据一定的块匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。
运动估计的主要任务是在历史参考帧当中为当前正在编码的宏块找到一个匹配块。
一般来说,时间上相邻的前后两帧之间物体运动的位移量通常不会很大,所以可以从当前宏块位置出发,在历史帧相同位置宏块周围一个小区域内进行搜索,寻找匹配的块。显然搜索区域越大计算的成本就越高,所以实际产品中需要一些技巧来加快搜索速度,减少计算量。
H.264 协议允许在 DPB 缓存内的任何一个重建帧中寻找匹配块以找到一个最优的匹配块。显然搜索的成本与引用参考帧的数量是成正比的,比如在2个参考帧中搜素匹配块需要花费的时间(芯片面积)和功耗基本上就是单参考帧情况的2倍。因此从节省成本的角度出发,最简单的方案就是只参考前一帧,这样做即节省参考帧缓存又节省编码器算力,缺点就是会牺牲一些码率性能。
找到一个最优匹配块后,运动估计会输出一个运动矢量(Motion Vector, MV),即参考块相对当前块的位置坐标。
NOTES:一个自然的问题是,如果没有找到合适的匹配块怎么办?答案其实很简单,这个宏块采用帧内预测即可。因此,在H.264以及H.265技术中,P帧和B帧都是可以有 Intra-coded 宏块的。所以,在 P 和 B 的 Slice 中,都可以看到存在若干的 I 的帧内预测方式的宏块 。
如下所示,一个 P Slice 中,红色部分宏块均为 Intra 预测编码,黄色部分宏块是 P_Skip,蓝色宏块是 P 类型宏块;
运动估计的下一步就是运动补偿(Motion Compensation),意思是从当前块中减去匹配块得到残差块。如果两个块的匹配度很高,则残差块基本为0,剩余能量很小。
1、依赖关系
名称解释:
运动估计(me)得到的是运动向量(mv)
运动预测得到的是运动向量预测值:mvp
运动向量残差值是 mvd
- mv:运动向量,参考帧中相对于当前帧的偏移;
- mvp:根据帧内相领块A,B,C的 MV 预测得到的向量;
- mvd:两个向量间的差别;
mvd 是实际被编入码流的;
所以,到这里,我们知道了,要求解 mvd,我们需要一些要素:
- 参考帧 (1个或者多个):放置在 DPB 缓存;
- 被编码的图片(目标图片)宏块;
- 参考帧和目标图片选取搜索范围;
- 匹配准则找到匹配块:需要一个标准来衡量什么是“相似”;
- 计算出 mv;
- 预测出 mvp;
- 求解出 mvd;
目的是求解出 mvd 进行编码,需要 mv 和 mvp:
- mv 的求解需要参考帧(可能有多参考帧)、目标宏块、搜索范围算法以及匹配算法;
- mvp 的求解按照 H.264 的 SPEC 进行;
2、估计算法
估计算法 me 用于搜索宏块匹配位置的算法,有全搜索法(1/2像素和 1/4 像素),菱形法(DS)、六边形法(HEXBS)等。
常见的快速搜索算法有:三步法、二维对数法、交叉法、菱形法等,
几年还有若干改进的算法,主要从预测搜索起点,中止判别条件以及搜索模板的选择等方向;
X264 中:
#define X264_ME_DIA 0 //钻石搜索
#define X264_ME_HEX 1 //六边形所搜
#define X264_ME_UMH 2 //非对称十字六边形网络搜索
#define X264_ME_ESA 3 //全搜索
#define X264_ME_TESA 4 //hadamard 全搜索法,这个算法和ESA相比主要是在搜索范围上的变化
3、匹配准则
产生了搜索位置后,下面就是进行宏块匹配算法,来寻找最 “相似的”宏块算法;
x264中所采用的匹配准则是SAD,SATD. SAD 即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
一般帧内要对所有的模式进行检测,帧内预测选用SATD.在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后 SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用 SATD选择码流较少的匹配位置。