x264代码剖析(十五):核心算法之宏块编码中的变换编码

x264代码剖析(十五):核心算法之宏块编码中的变换编码

 

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

 

1、变换编码

 

        变换编码将图像时域信号变换成频域信号,在频域中图像信号能量大部分集中在低频区域,相对时域信号,码率有较大的下降。 H.264对图像或预测残差采用4×4整数离散余弦变换技术,避免了以往标准中使用的通用8×8离散余弦变换逆变换经常出现的失配问题。

 

        在图像编码中,变换编码和量化从原理上讲是两个独立的过程。但在H.264中,将两个过程中的乘法合二为一,并进一步采用整数运算,减少编解码的运算量,提高图像压缩的实时性,这些措施对峰值信噪比(PSNR)的影响很小,一般低于0.02dB,可不计。H.264中整数变换及量化具体过程如下图所示,其中,如果输入块是色度块或帧内16×16预测模式的亮度块,则将宏块中各4×4块的整数余弦变换的直流分量组合起来再进行 Hadamard 变换,进一步压缩码率。




         下面给出编码器中变换编码及量化过程的流程。




        DCT变换的核心理念就是把图像的低频信息(对应大面积平坦区域)变换到系数矩阵的左上角,而把高频信息变换到系数矩阵的右下角,这样就可以在压缩的时候(量化)去除掉人眼不敏感的高频信息(位于矩阵右下角的系数)从而达到压缩数据的目的。早期的DCT变换都使用了8x8的矩阵(变换系数为小数),如下左图所示。在H.264标准中新提出了一种4x4的矩阵,如下右图所示。这种4x4 DCT变换的系数都是整数,一方面提高了运算的准确性,一方面也利于代码的优化。


         


2DCT源码分析

 

        DCT模块的源码主要包括以下内容(均处于common/dct.c中),本文也主要分析以下的函数:

1)、x264_dct_init()函数:初始化DCT变换和DCT反变换相关的汇编函数;

2)、sub4x4_dct()函数:将两块4x4的图像相减求残差后,进行DCT变换;

3)、add4x4_idct()函数:将残差数据进行DCT反变换,并将变换后得到的残差像素数据叠加到预测数据上;

4)、sub8x8_dct()函数:将两块8x8的图像相减求残差后,进行4x4DCT变换;

5)、sub16x16_dct()函数:将两块16x16的图像相减求残差后,进行4x4DCT变换;

6)、dct4x4dc()函数:将输入的4x4图像块进行Hadamard变换。

 

2.1x264_dct_init()函数

 

        初始化函数x264_dct_init()是对x264_dct_function_t结构体中的函数指针进行了赋值。X264运行的过程中只要调用x264_dct_function_t的函数指针就可以完成相应的功能,主要是用于初始化DCT变换和DCT反变换相关的汇编函数,处于common/dct.c

 

        对应的函数调用关系图如下:




        对应的代码分析如下:

 

/******************************************************************/
/******************************************************************/
/*
======Analysed by RuiDong Fang
======Csdn Blog:http://blog.csdn.net/frd2009041510
======Date:2016.03.23
 */
/******************************************************************/
/********************************
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值