AMVR技术要点请参考VVC标准文档,本文仅记录学习过程。
1) 功能理解
H266 亮度MV默认采用 1/4 像素精度(内部计算时采用1/16像素精度),而AMVR就是对每个cu依次按照整像素、4倍像素、半像素的精度进行ME,再预测计算RDCost,并取最优结果。
- ME时得到的MV需要按照精度进行缩放,然后再存储。
- ME的一般过程是 整像素搜索 -> 1/2像素搜索 -> 1/4像素搜索。
2)VTM代码(在VTM9基础上有所改动)
在xCheckRDCostInterIMV()函数中,通过 cu.imv 标识当前采用的是何种像素精度。
对于Normal AMVP模式,处理流程如下:
- 先计算亮度的 1/4 和 整像素 MVD的RDCost,分别标记为 bestNoImvCost 和 bestIntPelCost
- 两者比较之后,再决定是否要做 4倍像素的RDCost
- 如果1/4像素精度的RDCost 远小于 整像素的RDCost,就直接跳过4倍像素精度的检查;说明MVD比较精细
- VTM中是 bestIntPelCost > 1.06 * bestNoImvCost
- 如果整像素MVD的RDCost 明显大于之前的最佳RDCost,那么就直接跳过 1/2 像素的检查
- 因为如果整像素的cost远大于最优cost,那么最优结果要么是1/4像素,要么是4倍像素;说明MVD要么很精细,要么很粗糙,两个极端。
- VTM中是 bestIntPelCost > 1.25 * bestCost
代码流程图如下
3)直观感受
用工具分析一段使用AMVR工具的码流,图像中每个CU的预测模式、AMVR模式和MV0信息见下图。
其中红色方框内的几个CU分别使用了整像素精度(Fpel)和1/2像素精度(Hpel),其余默认采用1/4像素精度。