基于DM642的X264开源代码实现的研究
扫描二维码
随时随地手机看文章
关键字:H.264;开源软件;X264;TMS320DM642;优化
引言
H.264/AVC是ISO/IEC和ITU-T两大国际标准化组织联合制定的新一代视频编码标准。它引入多种宏块划分、多模式的帧内和帧间预测编码、高精度亚像素运动估计、多参考帧运动补偿等技术,提高了压缩比;采用整数DCT变换,避免了精度的损失。在码流结构上,提出VCL层和NAL层的概念,其中增加的NAL层负责将编码器的输出码流适配到各种类型的网络中,提供了友好的网络接口。同时,标准提供的许多工具如参数集、灵活的宏块排列次序、冗余片等,使得H.264的码流在网络中传输时具有更强的抗误码性能。基于H.264的实时编解码器设计与实现已经成为当前视频通信领域的热点问题。
1、H.264开源代码简介
H.264所具有的独特优势促进了与之对应的开源软件的开发与应用。目前常见的H.264开源软件编解码器有以下三种 :
1)JM
H.264的官方测试源码,由德国HHI研究所负责开发。该代码旨在实现H.264的所有特性,因而结构冗长,编码复杂度极高,多用于学术研究,不适于实际应用。
2)X264
X264是由法国巴黎中心学校的中心研究所于2004年6月发起,并由许多视频编码爱好者共同完成的项目。其目标是实现实用的264编码器,所以它引入MMX、SSE等汇编指令来提高编码速度,同时摒弃了一些耗时但对编码性能提高微小的模块,如多参考帧等。
3)T264
由中国视频编码自由组织联合开发的H.264编解码器。它和X264一样注重实用,吸收了JM、X264、XVID的优点。但其解码器只能解T264编码器生成的码流。
2、X264代码分析
本文所介绍的X264为060418版,下文所提到的程序结构和运行结果如不作特殊说明均针对该版本。
代码的实现流程如图1所示。
图1 X264编码流程图
整个代码的执行可以分为以下三个部分:
1)数据的读入与存放
X264开辟了unused、next、current、reference等区域分别保存未处理原始图片序列、即将编码帧序列、当前编码帧和参考帧序列,同时还开辟了fenc和fdec区域用于存放已编码帧和重构帧。
程序按以下顺序读入数据:首先,从YUV数据文件中读取数据存到临时变量pic_in,同时为unused开辟存储空间,并用fenc指针指向这个空间。接着,将pic_in中的图片数据拷贝到fenc所指向的区域,并在拷贝完成后对图片大小进行判断,如果长宽不为16的整数倍则进行像素扩展;将处理后的fenc区域数据放入next区域。之后,如果存在B帧,则从next区域取出B帧以后的P帧放到current区域中,也就是说先编码I、P帧再编码之间的B帧;否则,直接从next区域取出一帧存入current区域。此时current区域中存放的就是已经过预处理的即将要编码的帧数据了。最后,由于fenc区域是编码的直接对象,再将current区域中的内容拷贝到fenc中正式开始编码。
2)数据的压缩编码
①判断帧类型,初始化相关参数
如果是IDR帧,意味着是一个新切片的开始。在H.264中为了防止编码错误扩散规定当前切片不以本切片以外的其它帧为参考,因而遇到IDR帧需要重置参考帧区域。同时,将SEI(Sequence Enhancement Information)、SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)分别单独写入NAL单元。这三个参数集集合了编解码的核心参数,直接关系解码端能否正常解码。如果不是IDR帧,依据帧类型设定当前NAL单元的类型和切片类型。
接着进行一系列初始化参数的操作,包括建立关于参考帧的list0和list1,初始化量化参数QP、MV、参考帧等相关变量,初始化比特流的起始位置和大小等。
②以宏块为单位对视频数据进行编码
在进行预测编码之前必须得到周围块的相关信息。在X264中开辟了intra4x4_pred_mode和non_zero_count区域用来存放当前宏块左侧和上侧相邻宏块的预测模式和非零值个数。在编码开始之前通过x264_macroblock_cache_load()函数将相关数据载入缓存。然后,利用x264_macroblock_analyse()函数分析参数,确定最佳编码模式。I片从9种4x4模式和4种16x16模式中选择模式; P片选择帧间预测模式下的宏块分割方式或帧内预测模式下的4x4模式和16x16模式。接着,用x264_macroblock_encode()函数对宏块进行编码。编码过程严格按照编码框架中规定的DCT变换、zigzag扫描和熵编码的过程以先亮度块再色度块的顺序进行。需要声明的是编码过程对DC参数和AC参数的处理是分开进行的:首先对整个宏块进行DCT变换,然后将亮度块和色度块的DC参数抽出分别组成4×4和2×2的子块并对剩余AC参数进行量化扫描,接着对DC子块再进行Hadmard变换、量化、zigzag扫描、反变换、反量化,再对剩下的AC参数进行反量化,最后将处理后的DC子块和AC子块重新组合并对组合后的宏块进行IDCT变换。
以上过程完毕以后,统计CBP(Coded Block Pattern)信息。CBP一共6bit,用于表示当前宏块是否存在非零值,主要用于决定熵编码时采用的码表。其中,高2bit表示2个8×8色度块的CBP (2:Cb、Cr中至少一个4×4块的AC系数不全为0;1:Cb、Cr中至少一个2×2的DC系数不全为0;0:所有色度系数全0)。低4bit分别对应4个8×8亮度块,第i位(i= 0、1、2、3)表示一个MB中第i行的4个4×4子块是否有非零参数。若存在非零值,则将相应位置1。将各子块的非零值个数保存到non_zero_count区域。使用先前得到的CBP查相应码表进行熵编码,将编码参数和编码数据写入比特流。
③保存编码信息
利用x264_macroblock_cache_save()函数将当前MB最下一行和最右一列的子块的编码模式保存到intra4x4_pred_mode,将子块非零参数的个数保存到non_zero_count中,以备下一次预测编码采用。最后,统计MB信息,更新参考帧列表,并从unused区域取出新的帧放入fenc区域以备下次编码。
3)数据的输出
对NAL编码数据加上NAL头信息组成完整的NAL单元,输出到本地文件。
3、X264在TMS320DM642平台上的移植与优化
原始的X264代码是基于PC平台的,程序通过采用MMX和SSE语言编写SAD、DCT等函数使X264具有很高的编码速度。而在实际应用中,要想实时实现H.264的复杂算法,必须借助DSP这样具有超强运算能力的嵌入式平台。本文采用TMS320DM642开发板作为实现和开发的平台,并在其上进行代码的移植和优化。
1)TMS320DM642硬件平台简介
TMS320DM642是一款基于TI 的第二代高性能超长指令字(VLIW) 架构VelociTI.2(tm)的高性能DSP,该器件是目前计算密集型视频/图像应用领域的理想选择,其主要特点如下 :
① 增强功能单元:DM642 的8 个功能单元中的VelociTI.2 扩展包括加速视频与影像应用性能的新指令。
② L1/L2 分级存储器结构:16 KB 直接映射的L1P 程序高速缓存,16 KB 双路关联L1D 数据高速缓存,256 KB L2 统一映射RAM/高速缓存(灵活的RAM/缓存分配)。
③ 64 位外部存储器接口(EMIF):可实现与异步存储器和同步存储器无缝连接。
④ 增强型直接存储器存取(EDMA)控制器(64个独立通道)。
以DM642为硬件平台开发视频编码器,开发者可以充分利用其硬件特性,提高视频编解码算法的运算速度。
2)X264的移植
由于适用于PC机通过MMX和SSE编写的代码在DSP上无法运行,想要使X264代码在DM642上运行,必须将原来的代码加以修改使其变成纯C语言的代码。具体做法是:在X264代码中将HAVE_MMX编译选项屏蔽,同时将代码中与该编译选项相关的代码注释掉。当程序成为纯C代码时,就可以开始往DM642上移植了。
然而,DSP开发工具CCS有自己的ANSI C编译器和优化器,并有自己的语法规则和定义。所以需要将代码作相应修改,使其完全符合DSP中C的规则,同时要配置CCS的编译选项,才能使X264在CCS和VC下运行产生的结果一致。这个过程称为代码的DSP化。
由于纯C语言编写的程序无法利用DSP的并行处理机制,此时代码的运行速度非常慢。在DM642平台上,对相同的YUV数据(此处采用container.qcif)进行编码,若采用带X86汇编的X264代码(DCT和SAD部分采用汇编代码)在VC环境下运行,编码速度能达到QCIF 60fps;若将代码改为纯C语言仍然在VC下运行,则编码速度马上降到QCIF 10fps ;将该代码稍作修改移植到DM642的硬件平台,用CCS编译,编码速度仅能达到1帧/6秒。这样的速度离实时处理的目标还非常遥远。
所以,必须结合DSP本身的特点,对代码进行优化,才能在DM642平台上实现X264对视频图像的实时处理。
3)X264的优化
X264代码的优化分为三个层次:项目级优化,算法级优化和指令级优化。
①项目级优化:主要通过设置CCS编译器的选项,调整代码结构和合理分配内存来实现。如设置-o3选项,将常用数据分配到访问速度高的片内内存等。
②算法级优化:提出快速高效算法,从算法上挖掘潜力,提高运行速度,达到优化目的。用X264支持的4种运动估计算法(菱形搜索算法、六边形搜索算法、非对称十字型多层次六边形格点搜索算法和连续消除法)处理同样的YUV数据(此处仍为container.qcif),编码速度分别为13fps、11fps、9fps和4fps,可见不同的运动估计算法引起的编码速度的差别非常明显。
③指令级优化:这部分又可以分为C语言级的优化和汇编级的优化。前者主要包括消除冗余代码、调整数据类型、优化程序结构、打开for循环和充分利用内联函数等操作。后者主要是将耗时函数抽取出来,用线性汇编改写,充分利用丰富的媒体处理指令,最大限度的利用DSP的并行性,加快编码速度。汇编级优化涉及到的主要部分有SAD计算、DCT变换、反DCT变换、量化等过程比较规范,重复性比较高的计算过程。
4、结束语
目前,H.264视频编码技术以其独有的优势,受到业界几乎所有主流视频相关设备、产品厂商的支持。由于完全独立开发编解码器所需要的人力和物力都很大,许多公司和团体都采用直接修改移植开源代码的方式以求缩短开发周期。在目前可选的几种开源代码中, X264以其结构精简适于应用的特点,成为众多团体选择的对象。熟悉X264代码,以此为基础将其移植到DSP平台并进行优化,对构建高效的多媒体平台具有一定的实际意义。
参考文献
[1] 毕厚杰.新一代视频压缩编码标准-H.264/AVC.人民邮电出版社,2005.
[2] 李世平.2005年全球H.264编解码器荟萃. http://blog.csdn.net/sunshine1314
[3] 李方慧,王 飞,何佩琨.TMS320C6000 DSPs 原理与应用(第二版) [M].电子工业出版社,2003.
[4] 张旭东,魏振宇,史鵾.H.264编解码器在C6416 DSP上的实现与优化.电子产品世界,2005,5:71-74.
[5] 安向阳,沈庭芝.基于TMS320DM642的H.264编码的实现和优化.微计算机信息,2005,7-2:128-130.