AV1的量化编码技术

量化编码是主流视频编码格式里面必不可少的技术了,以标量量化为主的量化/反量化过程,已经被大家使用了好多年。

对比AV1里面的量化模块,如果是泛泛而谈,似乎是有蛮多相似和熟悉的内容。而对专门从事量化模块深入研究的人来说,他们对量化的关注点和技术细节的把控,或许可能是有一些不同的角度和理解吧。

图片

那AV1中的量化编码,和大众所熟知的H.264,H.265相比,又有哪些异同呢?

在阅读了一些相关的技术资料以后,可以确认的是,AV1中也有标量量化,有量化步长,也有Delta_q(但比H.265里的DQP要简单),有量化矩阵,也有RDOQ技术。

所不同的是,很明显的一点,AV1里用的是qindex的专业术语,它的取值范围是比较大的,在0~255之间均可取值。至于它为什么是取0~255,应该是因为8bit定长编码qindex时,取值范围就是这么大。

将它对应到我们在H.264或H.265里熟知的量化参数QP的话,取值范围是0~63,而AV1的qindex和quantizer/QP之间的对应关系是明确的,如下图所示:

图片

从qindex的0~255一共256个取值,映射到QP的0~63一共64个取值,核心就是使用quantizer_to_qindex这个数组,显然从quantizer/QP到qindex是一对一关系,而从qindex到quantizer/QP则是多对一关系。qindex和QP等于0时,是无损编码。

其次,AV1里的量化参数除了要区分亮度和色度分量外,还区分直流和交流分量,且在给定一个量化参数,直流系数的量化步长要比交流系数的小。

AV1量化参数和量化步长的映射关系:

图片

说完量化参数的定义和映射关系,接下来就是它的颗粒度问题,以及如何获取每个编码块的量化参数。

在AV1里面有一个帧级的量化参数,记作QPbase,在此基础上,每个编码块的亮度分量和色度分量的直流系数和交流系数的QP,将分别通过如下方式得到:图片

上面所有的△QP,会在码流里传输到解码端。可以看出,这便是Delta_q技术。

AV1中允许在SB级和编码块级进行QP的偏移。编码块级的QP偏移,可通过分段segment实现,AV1中允许将帧中的编码块最多分成8个段,然后每个段都可以有自己的偏移量,也即delta值,编码器侧会将段索引发送到解码器侧。

这样,交流分量的量化参数则计算如下:图片

提醒注意的是,在AV1的标准文本里并没有QP这个缩写的术语,虽然aom的参考软件里有”cqp”模式。

从标准文本所定义语法元素的角度来看,在frame header里的base_q_idx首先会指定亮度分量交流系数的qindex,即为上面提到的QPbase,然后由DeltaQYDc指定亮度分量的直流系数相对于交流系数的delta值。

接着diff_uv_delta语法指定色度分量U和V是否有不同的delta值。

图片

用base_q_idx加上面这些语法delta值,就是编码块的量化参数,然后可以通过查表再得到量化步长,这个查找表是AV1的标准文本中定义的3×256的Dc_Qlookup和Ac_Qlookup这两个数组。

如果想编码块里交流系数的量化步长不一样,可以选择使用量化矩阵技术。

最后再简单看看量化和反量化的实现,在libaom代码里面有关量化处理的函数,可以参考aom_dsp下面的quantize.c

图片

至于反量化过程,在给定量化系数f,量化步长Qstep时,反量化系数F计算如下:图片

这里的deNorm是个常数,可以根据变换块的面积大小(像素个数)来查表获取,这个表如下图:图片

以上便是AV1里有关量化处理的一些基本内容,才疏学浅,如有纰漏,还望海涵。

作者:手撕编解码

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论