zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

算法框架代码 核心 剖析 X264
2023-09-14 08:57:58 时间
h1 > 

        在正式介绍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()。

 

        函数关系图如下所示:

 



 

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

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

x264_frame_filter():半像素插值。

x264_pixel_ssd_wxh():PSNR计算。

x264_pixel_ssim_wxh():SSIM计算。

 

        函数关系图如下所示:

 


        

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


Panoptic-PartFormer:首篇端到端全景部件分割算法,代码已开源!(ECCV2022) 全景部件分割(PPS)旨在统一全景分割和部件分割。先前的工作主要使用不同的方法来单独处理thing、stuff和part,并未进行任何的计算共享和任务关联。因此本文搭建了一个统一的框架,即Panoptic-PartFormer来实现上述工作。本文在 Cityscapes PPS 和 Pascal Context PPS数据集上取得了最先进的结果,同时减少了70%的计算量和50%的参数量。相比于以往方法,在 Pascal Context PPS 数据集上,ResNet50主干下取得3.4%的提升,使用 Swin Transformer后,获得了10%的性能提升。
9行代码提高少样本学习泛化能力,代码已开源 | ICLR2021 Oral 本文介绍一篇最新发表在ICLR2021 Oral上的少样本学习工作,他们尝试从数据分布估计的角度去缓解少样本学习中的过拟合现象,并提出通过分布矫正(估计)的方式弥合这种差距。
深度学习框架大PK:TNN决战MNN,ncnn依旧经典 6月10日,腾讯优图实验室开源了一款深度学习推理框架TNN,高效解锁计算机视觉算法。开发者社区内,许多用户将其与ncnn,MNN等开源框架作比较。
DeepMind发布Acme,高效分布式强化学习算法框架轻松编写RL智能体 DeepMind 本周发布了一个强化学习优化框架Acme,可以让AI驱动的智能体在不同的执行规模上运行,从而简化强化学习算法的开发过程。
遗传算法框架 deap 简介与使用 deap(Distributed Evolutionary Algorithms in Python)是用于创建遗传算法实现的python库,框架支持使用遗传算法以及其他进化计算技术快速开发解决方案。DEAP提供了各种数据结构和工具,这些数据结构和工具在实现各种基于遗传算法的解决方案时必不可少。
TIP 2018论文概述:基于深度学习的HEVC复杂度优化 在此论文中,北京航空航天大学博士研究生李天一及其导师徐迈,提出了一种基于深度学习的视频编码复杂度优化方法,实现了在几乎不影响编码效率的前提下,显著降低高效率视频编码(High Efficiency Video Coding,HEVC)的复杂度。