1 引言
H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像专家组(MPEG)联合制定的视频压缩标准。它在H.263/H.263++的基础上发展,在继承所有编码压缩技术优点的同时引入许多全新的编码技术和网络适配层NAL的概念,从而拥有更高的编码效率和更好的网络适配性。为从低码率的实时通信系统或无线环境到高码率的HDTV和数字存储系统提供一个优良的视频压缩编码通用工具。但H.264标准优异的性能表现是以编码运算复杂度和运算量大为代价,在通用的PC机平台实现会占用较大的CPU和内存资源。随着数字信号处理器(DSP)技术的高速发展,DSP的处理速度和能力飞速提高。DSP已满足H.264标准的编解码运算速度要求。因此,在稳定的媒体处理器平台上实现H.264标准有着较好的工程意义和应用前景。
详细介绍了以TMS320DM6446DSP为核心的视频编码系统的硬件设计,并重点研究了H.264编码器在以TMS320DM 6446为目标的CCS平台上的移植和优化工作。
2 视频编码系统硬件设计
2.1 DSP的选型
DSP选用TI公司的Davinci媒体处理专用器件TMS320DM6446(简称DM6446)。它采用ARM+DSP双核架构,包含一个TMS320C64x+核心和一个ARM926EJ-S核心。C64x+核心采用改进的超长指令字VLIW体系结构,内部拥有8个并行的运算单元,时钟频率600 MHz,峰值处理能力高达4 752 MI/s。DM6446片内为两级高速缓存(Cache)结构,设计有独立的32位DDR2 SDRAM接口和16位异步EMIF接口。此外,DM6446还集成有多种适用于视音频多媒体处理的片内资源和接口,如用于和外部解码器连接的视频处理前端模块VPFE、和视频显示设备连接的视频处理后端模块VPBE、多通道音频串口等。
DM6446不仅在处理性能上完全满足H.264标准要求。而且在内部结构、片内资源和外部接口上对视频处理应用专门优化,大大降低视频应用的开发难度和成本。
2.2 系统结构框图
视频编码系统硬件结构原理框图如图1所示。主机通过PCIE总线对DSP进行初始化加载程序。摄像头输出的模拟视频信号经视频解码模块转换为数字信号,经FPGA转换电平。通过DM6446的VPFE模块接口送人DSP,进行压缩编码处理。编码后的视频数据从DM6446的EMIF接口输出通过PCIE总线送回主机进行下一步处理。DM6446的VPBE模块可将采集的数字视频信号再转换为模拟信号输出至电视进行监控。DDR2 SDRAM存储编码过程中的原始图像、参考帧、编码参数等数据。DM6446通过I2C总线配置A/D转换器。FPGA与PCIE桥PEX8311之间加入双端口RAM,以提高数据的传输效率。
2.3 视频解码模块设计
模拟视频信号的传输格式种类很多,而且国际上对数字视频信号的传输格式有明确的标准规定,因此一般通用的A/D转换器并不适合视频领域应用。这里选用专用的视频解码器ADV7189B,它支持12路模拟视频通道,包含3个具有防噪性能的12位54 MHz的A/D转换器。支持CVBS、S-端子、YprPb 3种格式的模拟视频信号输入,能够自动侦测NTSL/PAL/SECAM制式,输出ITU-R BT.656标准的数字视频信号。选用12路模拟通道中的3路,复用的支持3种模拟视频格式。ADV7189B输出10位数字视频信号、独立的垂直同步信号VD、水平同步信号HD和像素同步时钟LLC1,电压均为3.3 V电平,经过FPGA转换为DM6446要求的1.8 V,然后从DM6446的VPFE模块专用数字视频信号接口送入DSP。压缩编码前,VPFE模块将ITU-R BT.656标准的视频数据转换为H.264兼容的YUV4:2:O格式,存入DDR2 SDRAM中。VPFE模块还支持对视频数据进行白平衡、缩放等预处理操作。ADG3301实现I2C总线的电平转换。
2.4 视频编码模块设计
DM6446片内的VPBE模块包含4个54 MHz的D/A转换器,可在DM6446内部将数字视频信号直接转化为模拟视频信号,4路输出,并且支持CVBS、S-端子、YprPb 3种模拟视频格式。因此,视频编码模块设计较为简单,只需对4路模拟输出信号放大,就可直接与监视设备连接。选用TI公司的电压反馈CMOS运算放大器OPA357进行运算放大。
2.5 控制电路设计
DM6446的视频信号接口、EMIF接口为1.8 V电平,ADV7189B接口、PCIE桥接口为3.3 V电平。系统需要大量的电平转换工作,同时还需要实现大量的逻辑控制、PCIE桥与DM6446的通信协议。FPGA器件是最适合的选择。选用Altera公司的逻辑器件EP2C35,它可在片内实现1.8 V、2.5 V、3.3 V电平的转换,并且能够满足系统对逻辑控制功能的要求。EP2C35内部集成有片内存储器,可在ADV7189B与DM6446之间建立一个缓存区,提高数据传输效率。FPGA与DM6446、ADV7189B和PCIE桥接口电路如图2所示。
3 H.264编码器的DSP移植与优化
目前,H.264编码器的实现版本主要有:JM、T264、X264。其中JM是H.264官方源码,实现H.264所有特征,但其程序结构冗长,只考虑引入各种新特性以提高编码性能,忽略编码复杂度,其复杂度极高,不宜实用;T264编码器编码输出标准的264码流,解码器只能解T264编码器生成的码流;X264是编码器注重实用,在不明显降低编码性能的前提下,努力降低编码的计算复杂度。这里,用X264编码器对DSP平台移植、优化。X264程序在DSP平台上实现及优化主要有:程序简化、代码移植、代码优化。
3.1 程序简化
X264编码器除支持H.264的基本档次外,还包含主要档次的某些功能选项以及其他功能模块,代码尺寸较大,因此需要将不必要的功能模块删除,以减小代码尺寸。主要做以下删减:删除X264程序中的解码部分,以及基本档次功能之外的CABAC、B slice部分;X264程序是基于X86的PC平台,包含了SSE、MMX等。PC平台使用的优化技术,在DSP平台下无效:针对DSP平台特点,调整删减后的代码文件结构。
3.2 代码移植
TI公司的DSP开发工具CCS具有自己的ANSI C编译器和优化器,并有自己的语法规则和定义,经过上一步简化后得到纯C版本的X264编码器需要经过修改才能够在CCS下应用于具体的DSP。主要包括:①Visual c++、CCS对于变量和结构体的“重复定义”问题的不同处理,需更改头文件中变量和结构体定义的位置;②用功能相同的库函数代替CCS中没有的库函数,如strncasecmp();③数据格式的不同,用long代替CCS中没有的_int64格式;④按照CCS下C语言的规则定义数组;⑤修改系统配置参数的读取方式;⑥编写针对TMS320DM6446存储结构的CMD文件。如此,X264便可以在CCS下编译通过并运行。
3.3 代码优化
纯C版本的X264程序并没有利用DM6446的资源和并行机制,代码运行速度极低。因此必须对代码进行优化,提高处理性能。X264代码优化有以下3个层次:项目级优化、算法级优化和指令级优化:
(1)项目级优化项目级优化主要是对CCS提供的各种编译参数进行选择、搭配、调整,如本文使用的选项-o3、-pm等;利用CCS编译器提供的优化功能,改善循环及多重循环体性能,进行软件流水,提高软件的并行性;改写不适合编译器优化的语句,使CCS能够对程序进行更好的优化。
(2)算法级优化进行算法级优化时。应使VC环境下的纯C版本与CCS下的版本同步更新,VC版本运行正确,既可以保证算法理论上的正确,又可以加快工作速度并减少问题的产生。该算法优化工作主要有以下几点:①运动估算法的选择:X264编码器提供3种可选的整像素运动估算法:X264_ME_ESA(全搜索法)、X264_ME_HEX(六边形搜索法)、X264_ME_DIA(小菱形搜索法)。在VC环境下使用纯C版本代码对同一视频序列使用3种不同的搜索方法进行编码。对比3种搜索方法在编码速度、峰值信噪比(PSNR)、码率方面的性能。对比之下X264_ME_ESA算法的峰值信噪比最高,X264_ME_HEX次之,X264_ME_DIA最低,但相互之间的质量差别并不大,码率差别也很小,但编码速度却有明显差距,X264_ME_DIA较前两者在编码速度上有明显的优势。经比较,选择使用X264_ME_DIA运动估计算法。②帧内预测模式的改进:在X264的帧内预测流程中加入提前终止模式选择的条件,改进算法的流程。进行16×16宏块帧内模式搜索时,在当前模式的开销小于已搜索过的模式的最小开销的一半时,终止16×16帧内预测模式选择,以当前模式为最佳16×16帧内预测模式。对4×4块也加入相同的条件,并且若当前4×4块帧内预测模式的预测开销比相应的最佳16×16块帧内预测模式的开销的1/16还要小,则终止4×4块的帧内预测模式选择,以当前预测模式作为最佳4×4块的帧内预测模式。改进后的帧内预测主体流程如图3所示,灰色部分为加入的判定条件。
帧间预测模式的改进:将当前的16×16宏块划分为4个8×8宏块,分别预测其运动矢量,然后以左右相邻、上下相邻的2个8×8块的运动矢量的差值和阈值相比较为依据,判定是否进行16×8、8×16等分块模式的预测,最后选择开销最小的划分模式为最佳帧间划分模式。
(3)指令级优化 DM6446一个时钟周期内可并行运行8条指令,一次可存取64位数据,内部拥有64个32位通用寄存器,并且支持对寄存器中的4个8位字节或2个16位字节分别进行运算处理,这些使得DM6446具有很强的并行运算能力。视频图像的像素尺寸一般是4的倍数,X264中像素的值是用8位或16位数据按矩阵形式有规律的存储,这种数据存储结构与DM6446的并行处理方式很契合。因此对X264程序进行指令优化充分发挥DM6446的并行运算能力,是提高编码器速度的关键。主要分为以下两部分:①使用内联函数优化;C6000编译器提供了许多内联函数intrinsics,它们是汇编指令映射的在线函数,不宜用C语言实现其功能的汇编指令都有对应的intrinsics函数。这样就可在C语言结构中直接使用内联函数实现对多个数据的并行运算操作。如:未使用内联函数优化前X264程序调用一次双线性内插函数只能计算一个亚像素点的值,而使用内联函数_mem4()、_avgu4()等进行优化后,一次可以计算4个亚像素点的值,大大提高了运算速度。②使用线性汇编语言优化:由于线性汇编不需要考虑寄存器分配、指令延迟、并行指令安排等因素。因此可以利用CCS提供的profile分析工具将使用频率高、耗时多的函数抽取出来,根据事先已知的数据间的相关性等信息,在程序中直接改写函数汇编,人工优化。涉及的算法有:SAD、SSD的计算;DCT变换;反DCT变换、亚像素搜索等。
4 实验结果
选取具有代表性的视频序列carphone(人物运动幅度较大)、news(背景变化,人物运动幅度不大)、container(背景简单,景物运动缓慢)进行编码。视频为YUV 4:2:0格式.QCIF,量化步长定为26,共50帧,采用IPPP…编码模式。DM6446的时钟频率为600 MHz。表1为优化前后编码时钟周期对比,I帧编码速度平均提高了9倍,P帧编码速度平均提高了11倍。
以视频Miss-America为例,研究、对比移植优化后的编码器在不同的量化步长值(QP)下,图像的压缩质量,如图4所示。
5 结论
移植优化后的X264编码器在CCS环境下可正确编码,在量化步长值26下编码图像质量较高,优化后编码速度较优化前有明显提升。介绍的H.264视频编码系统的硬件设计,和X264编码器针对DM6446平台移植、优化的思路和方法,对构建高效的视频应用平台具有一定的参考价值。