基于DM642的X.264编码器优化
上执行的效率。
TI公司的DSP开发软件CCS提供了功能非常强大的编译器,编译工具可以对代码进行各种优化,以提高代码的执行速度,减小代码尺寸。这些优化包括了简化循环、软件流水、语句和表达式的顺序重排和分配变量到寄存器。利用CCS编译器进行优化后,仍然不能满足视频压缩的需求,需要继续对DM642上的X.264编码器进行优化。
(1)内联函数。内联函数是指用函数本身来代替函数调用这一过程。当调用内联函数时,C/C++源代码把此函数插入到调用点,而不采用传统的跳转。将函数设定为内联函数后,可以去掉复杂的函数调用过程来提高函数的执行效率,而付出的代价是增加了代码所占用的空间。使用关键字inline定义内联函数,在X.264编码器中的预测部分对其中一个频繁调用的函数设置为内联。代码如下:
static inline inI clip_uint8(int a)
(2)restrict关键字。为了帮助编译器确定存储器相关性,可以使用关键字restrict来限定指针、引用或数组。使用restrict关键字是为了确保其限定的指针在声明的范围内,是指向特定对象的惟一指针。编译器在读取函数的指针,数据时,采取保守的办法,认为它们是相关的。这时编译出的代码必须执行完前次写操作,才能开始下次读取操作。加入restrict关键字后,编译器将认为指针和数组没有相关性,能够并行提取数据。
(3)软件流水。软件流水式编排循环指令是能够使循环的多次迭代并行执行的技术。编译器总是力争使用软件流水技术。软件流水是DSP的关键技术,它利用的是算法中存在的指令并行性的特点,使一个循环的多次迭代同时进行。总地来说,当使用编译器优化的情况下,代码尺寸小,程序性能更优。x.264代码含有很多循环操作,故提高循环体指令的并行度使循环能够软件流水是提高编码效率的有效途径之一。
(4)函数合并。函数调用的过程中,要执行一些额外的寄存器。在编码过程中DCT、量化、zigzag、IDCT和反量化函数调用都非常频繁,但代码段都很短,部分代码只包含一个循环操作或者赋值操作。反复的调用会花费大量运行周期在函数调用上。为减少不必要的操作,提高速度,将DCT变换、量化、反量化和反DCT变化的整个过程进行优化,将几个函数合并到一个函数中。图1所示为合并结构。
(1)CACHE优化。DM642采用了两级CACHE的存储器结构,两级CACHE主要用于对程序和数据的缓存。CPU直接和一级CACHE连接,一级CACHE包括L1P(程序)和L1D(数据),大小分别为16 KB,分别占用独立的存储;一级CACHE的存储速度与CPU处理速度相同。一级CACHE与二级CACHE相连,称为L2,大小为256 kB,可以对程序和数据进行统一存取,L2 CACHE作为L1CACHE和片外存储器之间的一个桥梁,可以由设计人员自行配置大小,分为SRAM和CACHE。L2CACHE的速度为CPU的一半。经过试验对比,将L2分为128 kBCACHE和128 kB SRAM。将部分调用比较频繁的函数和数据常量放在L2SRAM中,以提高读写速度。
(2)EDMA。EDMA是增强的直接存储器访问,增加了高达64个传输通道,每个通道相互独立,且通道间的优先级可以设置。CIF格式的图像格式为352×288,一帧数据需要101 376 b,L2的CACHE容量有限,不能将所需要的参考帧和当前编码帧都放到片内CACHE中。X.264处理的最小模块为宏块16×16,将当前编码宏块保存到片内CACHE中来提速,DSP运行的同时将片外的下一编码宏块传输到片内。采用EDMA的ping-pong缓冲技术可以对X.264编码器的数据传输部分进行优化。这样既利用了DM642片内数据存储速度快的优点,又避免了使用较多的片内存储空间。ping-pong缓冲结构中EDMA与CPU的工作原理如图2所示。
3 优化结果
完成对代码的优化过后,通过CCS的编译将x2 64.out文件加载到DM642目标板上,使用了5个CIF实验序列来测试优化过后的编码速率。 CIF序列编码的帧数为100帧,量化系数为28。通过CCS所提供的clock工具记录测试序列中编码一帧图像所需要的CPU时钟数。实验测得的编码速率数据如表5所示。
将X.264简单DSP代码化移植到DM642上,编码速率很低,只有平均0.6 f/s。对比表中所示的数据可知,对于纹理简单,运动不激烈的视频序列,编码帧数可达15 f/s左右,对于运动激烈,背景纹理较复杂的视频序列,则只有10 f/s左右。通过解压图片可以看出,解码后的图像没有发生明显的失真。
- 基于DM642的视音频采集器的设计(09-01)
- 基于DM642DSP的视频编码优化方法(09-01)
- 12位串行A/D转换器MAX187的应用(10-06)
- 低功耗、3V工作电压、精度0.05% 的A/D变换器(10-09)
- 12位串行A/D转换器的原理及应用开发(10-09)
- 在射击探测器中增加口径确定功能的简单电路(11-13)