天天看点

x264代码剖析(十六):核心算法之宏块编码中的量化编码x264代码剖析(十六):核心算法之宏块编码中的量化编码

        为了进一步节省图像的传输码率,需要对图像进行压缩,通常采用变换编码及量化来消除图像中的相关性以减少图像编码的动态范围。本文主要介绍量化的相关内容,并给出x264中量化编码的代码分析。

        量化过程就是根据图像的动态范围大小确定量化参数,既保留图像必要的细节,又可以减少码流。在图像编码中,变换编码和量化从原理上讲是两个独立的过程。但在h.264中,将两个过程中的乘法合二为一,并进一步采用整数运算,减少编解码的运算量,提高图像压缩的实时性,这些措施对峰值信噪比(psnr)的影响很小,一般低于0.02db,可不计。下面给出编码器中变换编码及量化过程的流程。

x264代码剖析(十六):核心算法之宏块编码中的量化编码x264代码剖析(十六):核心算法之宏块编码中的量化编码

        下面给出毕厚杰著作的《新一代视频压缩编码标准——h.264/avc(第二版)》中量化的相关理论知识,仅供学习参考。

x264代码剖析(十六):核心算法之宏块编码中的量化编码x264代码剖析(十六):核心算法之宏块编码中的量化编码

        量化的相关函数大都位于common/quant.c中,主要包括以下函数:

x264_quant_init():初始化量化和反量化相关的汇编函数

quant_4x4():对4x4的dct残差矩阵进行量化

quant_one():完成一个dct系数的量化工作

quant_4x4x4():对4个4x4的dct残差矩阵进行量化

        下面对这些函数进行深入分析。

        量化模块的初始化函数是x264_quant_init()。该函数对x264_quant_function_t结构体中的函数指针进行了赋值。x264运行的过程中只要调用x264_quant_function_t的函数指针就可以完成相应的功能。对应的代码分析如下:

       其中, x264_quant_function_t的定义如下:

        quant_4x4()用于对4x4的dct残差矩阵进行量化,quant_4x4()循环16次调用了quant_one()完成了量化工作。并且将dct系数值,mf值,bias偏移值直接传递给了该宏。对应的代码分析如下:

        其中,quant_one()完成了一个dct系数的量化工作,从quant_one()的定义可以看出,它实现了上文提到的h.264标准中的量化公式。它的定义如下:

        quant_4x4x4()用于对4个4x4的dct残差矩阵进行量化。该函数的定义位于common\quant.c,从quant_4x4x4()的定义可以看出,该函数相当于调用了4次quant_4x4()函数。对应的代码分析如下:

x264代码剖析(十六):核心算法之宏块编码中的量化编码x264代码剖析(十六):核心算法之宏块编码中的量化编码

至此,x264中量化的重点函数就分析完毕了。

继续阅读