四分之一精度运动矢量编码及非整精度数值转换技术问询
非整数精度运动矢量的编码/解码逻辑
嘿,这个问题在视频编码开发里太常见了,我给你把核心逻辑拆解清楚——本质就是用缩放因子把浮点运动矢量转成整数存储,解码时再逆操作还原,不同精度对应不同的缩放因子:
1. Quarter Pel(1/4像素精度)
这个是H.264等标准里常用的精度,对应的缩放因子是 4(相当于把单个像素拆成4×4的小格子):
- 实际值转代码整数:直接把实际的浮点MV乘以4,结果刚好是整数(因为1/4精度下,实际值的小数部分只能是0、0.25、0.5、0.75)
比如你举的例子:(3.5, 2.75)- x分量:
3.5 × 4 = 14 - y分量:
2.75 × 4 = 11
所以代码里会用整数对(14, 11)来表示这个运动矢量
- x分量:
- 代码整数转实际值:把整数MV除以4就行
比如你提到的代码里的(114, 82):- x分量:
114 ÷ 4 = 28.5 - y分量:
82 ÷ 4 = 20.5
对应的实际运动矢量就是(28.5, 20.5)
- x分量:
2. 1/16 Pel(1/16像素精度)
更高精度的场景会用到这个,缩放因子是 16(单个像素拆成16×16的小格子):
- 实际值转代码整数:
整数MV = 实际MV值 × 16
比如实际值是(1.375, -2.5):- x分量:
1.375 × 16 = 22 - y分量:
-2.5 × 16 = -40
代码里就存(22, -40)
- x分量:
- 代码整数转实际值:
实际MV值 = 整数MV ÷ 16
比如代码里的(48, -32):- x分量:
48 ÷ 16 = 3.0 - y分量:
-32 ÷ 16 = -2.0
还原后就是(3.0, -2.0)
- x分量:
为啥要搞这套转换?
其实就是为了编码效率和计算稳定性:
- 整数比浮点数更适合熵编码(比如CABAC),能大幅压缩传输的数据量;
- 避免浮点运算带来的精度损失,编码解码两端能保证完全一致的结果;
- 硬件对整数运算的支持更成熟,不管是编码还是解码,速度都更快。
内容的提问来源于stack exchange,提问作者Chap
相关产品推荐
相关产品推荐

