x264代码剖析(十):x264核心算法框架

简介: <h1 style="text-align:center">x264<span style="font-family:宋体">代码剖析(十):</span><span style="font-family:Calibri">x264</span><span style="font-family:宋体">核心算法框架</span></h1> <p> </p> <p>        在正

x264代码剖析(十):x264核心算法框架

 

        在正式介绍H.264/AVC核心编码算法之前,首先分析一下其编码结构或者编码流程,后续我们可以根据编码的各个模块分别进行介绍,这样有利于对H.264/AVC视频编码算法的更深入了解。

 

        H.264并没有明确规定一个编解码器如何实现,而是规定了一个编码后的视频比特流的句法和比特流的解码方法,在实现上有较大的灵活性。

 

        H.264/AVC编码器的功能组成如下图所示,编码器仍旧采用变换和预测的混合编码方法。输入帧以宏块为单位被编码器处理,首先按照帧内或帧间预测编码的方法进行处理;接着,预测值与当前块相减,相减后得到的残差块经变换、量化后产生一组量化后的变换系数;最后,这组量化后的变换系数经过熵编码,与解码所需的一些头信息(如预测模式量化参数、运动矢量等)一起组成一个压缩后的码流,经NAL(网络自适应层)供传输和存储用。

 



        为了提供进一步预测用的参考图像,编码器必须有重建的功能。为了去除编解码环路中产生的噪声,提高参考帧的图像质量,从而提高图像压缩性能,设置了一个环路滤波器,滤波后的输出即是重建图像,可用作参考图像。

 

        从编码器的流程可以看出,我们若要学习H.264编码算法,最好就是按照帧内预测帧间预测变换与量化熵编码滤波的顺序依次学习。除此之外,网络适配层、率失真优化、码率控制也是非常重要的学习点。

 

        如下图所示是x264_slice_write()函数包括的内容,其中帧内预测与帧间预测处于Analysis模块,变换与量化处于Encode模块,熵编码处于Entropy Encoding模块,而重建过程中的滤波处于Filter模块,下面依次对这五大关键编码算法的函数关系进行统一的介绍,为接下来具体的算法细节介绍做铺垫。

 

 

 

        下面我们依次对帧内预测、帧间预测、变换与量化、熵编码与滤波这五大部分进行简单介绍。

 

1、帧内预测与帧间预测

 

        x264的 x264_slice_write()函数中调用的x264_macroblock_analyse()的源代码。x264_macroblock_analyse()对应着x264中的分析模块。分析模块主要完成了下面2个方面的功能:

1)对于帧内宏块,分析帧内预测模式

2)对于帧间宏块,进行运动估计,分析帧间预测模式

 

        分析模块的x264_macroblock_analyse()调用了如下函数:

x264_mb_analyse_init()Analysis模块初始化。

x264_mb_analyse_intra()Intra宏块帧内预测模式分析。

x264_macroblock_probe_pskip():分析是否是skip模式。

x264_mb_analyse_inter_p16x16()P16x16宏块帧间预测模式分析。

x264_mb_analyse_inter_p8x8()P8x8宏块帧间预测模式分析。

x264_mb_analyse_inter_p16x8()P16x8宏块帧间预测模式分析。

x264_mb_analyse_inter_b16x16()B16x16宏块帧间预测模式分析。

x264_mb_analyse_inter_b8x8()B8x8宏块帧间预测模式分析。

x264_mb_analyse_inter_b16x8()B16x8宏块帧间预测模式分析。

 

        x264_mb_analyse_intra()用于对Intra宏块进行帧内预测模式的分析。该函数的定义位于encoder\analyse.c,如下图所示。

 



        x264_mb_analyse_inter_***()用于对inter宏块进行帧间预测模式的分析。该函数的定义位于encoder\analyse.c,如下图所示。

 

 


2、变换与量化

 

        宏块编码模块的x264_macroblock_encode()调用了x264_macroblock_encode_internal(),而x264_macroblock_encode_internal()完成了如下功能:

x264_macroblock_encode_skip():编码Skip类型宏块。

x264_mb_encode_i16x16():编码Intra16x16类型的宏块。该函数除了进行DCT变换之外,还对16个小块的DC系数进行了Hadamard变换。

x264_mb_encode_i4x4():编码Intra4x4类型的宏块。

帧间宏块编码:这一部分代码直接写在了函数体里面。

x264_mb_encode_chroma():编码色度块。

 

        函数关系图如下所示:

 


 

3、熵编码

 

        熵编码模块包含两个函数x264_macroblock_write_cabac()x264_macroblock_write_cavlc()。如果输出设置为CABAC编码,则会调用x264_macroblock_write_cabac();如果输出设置为CAVLC编码,则会调用x264_macroblock_write_cavlc()

 

        函数关系图如下所示:

 



4、滤波

 

        滤波模块对应的x264_fdec_filter_row()调用了如下函数:

x264_frame_deblock_row():去块效应滤波器。

x264_frame_filter():半像素插值。

x264_pixel_ssd_wxh()PSNR计算。

x264_pixel_ssim_wxh()SSIM计算。

 

        函数关系图如下所示:

 


        

         本文暂时只给出帧内预测、帧间预测、变换与量化、熵编码、滤波五大部分的函数关系图,具体的算法分析以及代码剖析将在后面继续更新。

目录
相关文章
|
1月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
139 26
|
1月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
1月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
124 1
|
1月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
|
27天前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
342 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
1月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
150 14
|
25天前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
|
25天前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
|
1月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
125 1
|
1月前
|
存储 机器学习/深度学习 算法
基于A星算法的无人机三维路径规划算法研究(Mattlab代码实现)
基于A星算法的无人机三维路径规划算法研究(Mattlab代码实现)
155 1

热门文章

最新文章