H.264视频算法的经典测试模型研究

2014-07-12 03:04张文将
滁州学院学报 2014年2期
关键词:宏块代价调用

李 红,李 旸,张文将,王 力

H.264是由ITU-T的VCEG(视频编码专家组)和ISO/IEC的 MPEG(活动图像编码专家组)联合开发的新一代视频编解码标准[1-3],它在获得更好压缩性能的同时增加了算法的时间复杂度。JM是JVT公开发布的H.264官方测试模型,与官方标准相对应,理解H.264的编解码模型是学习H.264的基础。尽管H.264的每个JM版本都尽可能的实现了H.264当时的所有特性,但是JM忽视了编码的复杂度,使代码阅读的难度加大。JM8.6是JM 的一个经典开源模型[4-5],没有更高版本针对高分辨率和高清晰度有特别要求的FRExt分支,也没有引进最新的运动搜索以及快速模式选择算法,它的研究对于更快的掌握H.264的核心内容具有重要的意义。

1 在VC中编译运行JM8.6

JM8.6模型可以在 http://iphome.hhi.de/suehring/tml/网站上进行免费下载,用C语言编写而成,下面介绍在VC++6.0上运行JM8.6的步骤[6]。

(1)下载解压JM8.6源代码文件,检查源代码根目录下的bin文件,在确保存在配置文件encoder_*.cfg、待编码视频序列文件foreman_part_qcif.yuv和解码配置文件decoder.cfg之后,打开源代码根目录下的工作区tml.dsw。

(2)编码:鼠标选中“lencod工程”,打开“工程——设置——调试”,在“工作目录”下填写./bin,“程序变量”中填写-dencoder_baseline.cfg,点击“确定”,将“lencod工程”选中右击鼠标,选中“设为活动工程”并编译运行,成功完成编码之后检查源代码根目录下的bin文件夹,其中test.264即为压缩码流文件。

(3)解码:鼠标选中“ldecod工程”,进行同样设置之后在“程序变量”中填写decoder.cfg。解码编译成功后,检查源代码根目录下的bin文件夹,test_dec.yuv即为解码文件。

2 JM8.6模型中H.264算法的总体过程

H.264之所以比以往的视频编码算法优越是因为其引进了很多先进的技术,包括4×4整数变换、空域内的帧内预测、1/4像素精度的运动估计、多参考帧与多种大小的块的帧间预测技术、率失真优化技术等[7]。新技术带来了较高的压缩比,同时也大大提高了算法的复杂度。图1为H.264编码的总体过程[8],可以看出整个过程关键处就是循环编码每个宏块。

3 代价函数

代价函数是一种编码策略,即采用帧内编码与采用帧间编码的最优选择,其实质是使当前资源达到最佳结果的分配问题。理解代价函数是理解程序代码工作方式的关键。H.264中用到的代价共有三种:运动矢量代价MV_COST,参考帧代价REF_COST,模式代价MODE_COST。这三种代价共同作用选择出合适的运动矢量、参考帧和宏块的最佳分割方式。除了运动矢量代价MV_COST在RDO模式和非RDO模式下有相同的过程,其余两种都是可以依据不同情况的需要选择RDO模式和非RDO模式。

图1 H.264编码的总体过程

3.1 运动矢量代价

运动矢量代价主要用于运动搜索模块中,通过比较MV_COST来得到最佳预测块,公式如下:

式中SAD表示原始图像块与参考帧搜索位置块的绝对差值和。如果使用了Hadamard变换,则SAD就表示成SATD[9],表示对原始图像和预测图像之间的差值矩阵进行Hadamard变换之后的矩阵求绝对值。MVbits是编码运动矢量MV的比特数,查询mvbits[]列表可得。具体计算是在PartitionMotionSearch()函数中,该函数的主要功能是对每个分块进行运动搜索并计算得出代价。在JM8.6中的代码如下:

调用BlockMotionSearch()函数进行每个分块的运动搜索,可以得到运动向量并将对应的代价作为函数的返回值,更新motion_cost,为接下来的参考帧选择提供依据。motion_cost是一个全局变量,该数组存储了一个宏块的分块在不同帧间模式和参考帧下的运动估计的开销值。

3.2 参考帧代价

参考帧代价是用来选择最优参考帧,其在RDO方式下和非RDO方式下,定义有所不同。

非RDO方式时:

RDO方式时:

参考帧号是参考帧的编号,REFbits在JM同样用查询refbits[]列表可得。在以下的JM8.6的代码中,可以看出是分为RDO方式和非RDO方式计算的。

3.3 模式代价

观察代码 mcost+=motion_cost[mode][LIST_0][ref][block]了解到运动矢量代价 motion_cost和REF_COST代价都加到了中间变量mcost中,共同用于最佳模式的选择。

4 代码分析的结果

4.1 帧内与帧间模式选择过程

帧内与帧间模式的选择过程是H.264中非常重要的一部分,涵盖了H.264编码中的大部分内容,是在其核心函数encode_one_macroblock()中结合代价函数的计算实现的[10]。

为了简明起见,本文直接考虑待编码的宏块属于P Slice(I Slice模式包括在此之中且不考虑P Skip模式),通过对JM8.6模型的代码分析,得出在帧间宏块级(16×16,16×8,8×16)、亚宏块级P8×8(8×8,8×4,4×8,4×4)以及帧内的两种大模式I16MB、I4MB中选出最优的分割模式流程图,如图2。

图2 最优的分割模式选择过程

4.2 RDO方式下的函数调用模式框图

因为H.264编码器为了得到最佳的模式通常采用RDO技术[10-11],对每一种模式计算出率失真代价RDCost,所以这里主要分析RDO方式下的模式选择过程。根据配置文件中的RDOptimization的取值决定是否使用拉格朗日率失真优化模型进行模式选择,0为关闭,1为打开,2为考虑丢包等情况下的率失真。

RDO方式下的模式开销公式为:

SSD为当前块和重构块的差值,BLOCKbits表示编码所需要的比特数,调用熵编码函数确定。RDO方式下,帧间和帧内的模式选择是一起进行的,通过在 RDCost_for_macroblocks()中计算帧间宏块级(16×16,16×8,8×16)、亚宏块级P8×8(8×8,8×4,4×8,4×4)和帧内的I16MB、I4MB对应模式的RDO代价,进行比较得到最优的模式。

(1)对于帧间的宏块级模式调用函数Luma-ResidualCoding()对宏块的残差进行编码,具体是将一个宏块分为4个8×8块分别进行编码,调用LumaResidualCoding8x8()函数对8×8块的4个4×4块分别进行预测、dct变换等。LumaResidualCoding8x8()的主要工作分为三步:

第一步:因为PartitionMotionSearch()函数在进行运动搜索的时候已经计算出了运动矢量mv保存在了img->all_mv中,所以在Luma-Prediction4x4()函数中直接进行预测值的计算,保存在img->all_mv中。

第二步:在LumaResidualCoding8x8()中计算得到残差,保存在img->m7中。

第三步:调用dct_luma()函数对残差数据完成DCT变换,量化,反量化,反DCT变换,将重建值存储在enc_picture->imgY中。

(2)因帧间的亚宏块模式的RDO代价计算和非RDO模式相结合,所以在 RDCost_for_macroblocks()函数中只是调用函数SetCoeffAndReconstruction8x8()设置参数。跟踪代码进入亚宏块模式的非RDO计算,发现调用 RDCost_for_8x8blocks()函数进行了RDO代价计算。继续跟踪RDCost_for_8x8blocks()函数,最终也是调用了LumaResidualCoding8x8()函数对8×8块进行亮度值的预测、残差数据的变换量化、反变化反量化以及重建图像的计算和保存。此函数还调用熵编码函数进行计算比特值,包括模式,运动矢量和亮度残差数据的比特计算。

(3)进行帧内I4MB的9种模式选择时,调用Mode_Decision_for_8x8IntraBlocks()函数计算每一个8×8块的代价。每个8×8块又细分为4×4块的代价,调用 Mode_Decision_for_4x4IntraBlocks()函数实现,累加起来得到一个8×8块的代价,具体过程分为两步:

第一步:利用intrapred_luma()函数计算出9种预测模式下的预测值保存在img->mprr中。

第二步:调用 RDCost_for_4x4IntraBlocks()函数,计算返回的rdcost即是9种模式中比较得出的最优代价,保存在min_rdcost中,同时最优模式保存在best_ipmode中。

(4)对于帧内I16MB模式的代价计算,RDO模式与非RDO模式相同,但在RDO模式下要进行rdcost的计算。具体过程分为三步:

第一步:调用intrapred_luma_16x16()函数计算I16MB模式下的预测值,保存在img->mprr_2中。

第二步:调用find_sad_16x16(i16mode),依据SAD比较得到最优的I6MB模式。

第三步:调用dct_luma_16x16()函数进行亮度的DCT变换等。

(5)以上的分析都是分别在帧间宏块级、亚宏块级和帧内的I4MB,I16MB中选择最佳模式。函数的最后计算失真distortion(包括亮度和色度)和码率,按照公式(5)计算出最优的代价以及最优模式。

rdcost= (double)distortion+lambda *(double)rate (5)

以上所得,得出 RDCost_for_macroblocks()函数调用框图如图3所示。

图3 RDCost_for_macroblocks()函数调用框图

5 结束语

JM8.6作为经典测试模型,虽压缩性能提高,但算法复杂不便理解。现对其内部结构的研究有助于H.264算法的学习。本文先介绍了JM8.6的安装方法,后以待编码宏块P Slice为例,通过追踪RDO方式下代价函数的代码,得出encode_one_macroblock()函数的帧内与帧间选择流程图,也明确了RDCost_for_macroblocks()函数内部各个子函数的调用结构框图以及作用。在此基础上,研究的下一步将是对JM8.6模型中复杂的算法进行优化,以缩短编码时间和提高编码效率。例如在encode_one_macroblock()函数中进行帧内与帧间选择模式的算法优化,在BlockMotionSearch()函数中定义更加快速更加精确的运动搜索算法。

[1]JVT of ITU-T VCEG and ISO/IEC MPEG.Final draft international standard of joint video specification.JVT-G050.2003.

[2]毕厚杰,王 健.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2009.

[3]Iain E.G.Richardson.H.264and MPEG-4Video Compression[M].England:John Wiley & Sons Ltd,2003.

[4]陈 举,赵 琦,董金明.H.264编解码软件JM8.6的核心编码函数研究[J].计算机工程与设计,2008,29(17):4498-4506.

[5]ITU-T Recommendation H.264,Advanced video coding for generic audiovisual services[S].

[6]在 VC中编译运行JM 视频教程[EB/OL].http://www.chinavideo.org/forum.php?mod=view thread &tid=997,2006-9-27/2013-7-10.

[7]邓中亮,段大高,崔岩松,等.基于 H.264的视频编/解码与控制技术[M].北京:北京邮电大学出版社,2011.

[8]陈 靖,刘 京,曹喜信.深入理解视频编解码技术——基于H.264标准及参考模型[M].北京:北京航空航天大学出版社,2012.

[9]JM8.6中帧内帧间模式的选择[EB/OL].http://www.chinavideo.org/forum.php? mod = view thread&tid =11403&extra=page%3D5,2011-4-23/2013-08-01.

[10]谢翠兰,郑艺玲.基于SAD和SATD的 H.264快速帧内预测算法[J].计算机工程,2008,34(10):215-217.

[11]王维哲,周 兵,张行进.H.264编码中的帧内预测模式选择算法[J].计算机工程,2008,34(2):226-228.

猜你喜欢
宏块代价调用
基于运动估计与补偿的雷达拼图预测分析*
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
爱的代价
代价
基于系统调用的恶意软件检测技术研究
基于选择特征宏块的快速视频稳像
成熟的代价
利用RFC技术实现SAP系统接口通信
IP网络丢包条件下的H.264高清视频实时解码问题分析