DIY编程器网
标题:
基于TMS320DM642 的X264 视频编码器的优化
[打印本页]
作者:
liyf
时间:
2012-1-16 17:25
标题:
基于TMS320DM642 的X264 视频编码器的优化
????? 【摘要】简单介绍了TMS320DM642 数字信号处理器的硬件构成, 简要给出了DSP 平台的程序优化一般流程。着重研究了TMS320DM642 平台优化X264 视频编码器,包括算法与系统结构优化,乒乓缓存优化,循环体的优化以及DSP 汇编实现。
1 引言
在数字视频应用方案中,视频编码器是核心,其中编码器的硬件运算能力是系统实时性的保证,而视频压缩标准的高压缩比为编码器适应各种传输带宽信道提供了必要的保障。视频编码工程X264 是一款开源的、按照H.264 标准在PC 平台开发的视频编码器, 如果直接移植到TMS320DM642(以下简称DM642)平台,则实际的编码速度一般低于视频应用方案所需要的实时性要求。为了提高编码工程的编码速度, 需要对移植到DM642 平台的X264 进行优化, 整个优化的流程如图1所示。
在上面示例中,伪指令MUST_ITERATE 主要是告诉编码器,本次循环总共要执行396 次,这样编译器就可以进行软件流水来优化这个循环。
3.4 编译器优化选项
在完成上述的手工优化后,接下来通过设置编译器选项来使用编译器优化,本文采用的编译器优化选项有:-pm(在程序级别进行优化),-o3(对文件级别进行最强的优化),-op3(速度最重要),-ml3(缺省情况下将全部数据和函数作为far 型)。
3.5 DSP 汇编优化
假如使用上述优化策略对编码工程进行优化后,编码器的速度还不能达到应用要求,就需要编写手工汇编程序。编写手工汇编程序之前, 首先要用CCS 的profile工具对编码工程进行剖析, 找出比较耗时或频繁调用的函数部分,把这些部分改写成汇编函数。
DSP 采用的是哈佛体系结构, 将数据和程序分开存放。大体上来说,编写汇编语言函数主要步骤为:把操作数从内存中取出来放到CPU 的寄存器中, 然后在CPU内部用不同的运算单元对寄存器里的操作数进行运算,最后把运算的结果存到内存中。其中,函数参数传递、函数返回值寄存器、条件寄存器、栈指针寄存器的保存都必须按照规定使用相应的寄存器,否则会出现错误。
在编写汇编语言的过程中要考虑下方面:1) 充分理解待编写的函数的逻辑功能。只有真正理解了函数实现的功能和具体的数据流程图, 才能使汇编语言的构架比较高效;2) 数据结构的选择和安排。由于DM642 允许数据打包处理,即一条指令可以同时对几个字节进行操作,这对于图像和视频处理非常有益, 所以能够打包处理的就尽可能打包处理;3) 寄存器的分配和指令的先后顺序。DM642 的CPU 有2 套完全对称的运算单元和寄存器。只要把操作数分别存、取到隶属于不同套的寄存器里面,采用不同的运算单元,合理安排指令的先后顺序,保证在资源不冲突的条件下尽量在一个周期内安排更多的指令,实现指令运行的高效性、并行性。
下面举一个SAD_4×4 的例子来说明上述各项是如何实现的。SAD_4×4 的C 语言版本的代码为:
完成汇编指令的编写后,进行汇编语言的调试。由于X264 工程比较大,如果直接在工程中调试,难度较大,所以在调试过程中建立一个小工程, 从文件中读出一段数据来测试汇编语言功能的正确性。具体的步骤是:采用单步调试的同时, 开启调试器CCS 里面的view memory 和view core registers 选项来观察相应的memory 和寄存器里面的值是否按照逻辑设计进行改变。如果结果不对,则考虑是否错误地使用了寄存器, 或者是没有等待足够多的延时周期, 或者是出于软件流水的目的错误地安排了指令的顺序,直到找出错误的地方。
4 小结
笔者首先分析了从PC 平台移植到DSP 平台后的X264 编码工程,其编码速率低,满足不了视频压缩实时性要求。接着从提高编码器的编码速度角度出发,对编码工程进行了优化,介绍了在实际中用到的几种DSP 平台优化方法:算法与程序系统结构的优化,EDMA 与乒乓缓存优化,循环体的优化,编译器优化和DSP 汇编。对CIF格式图像采用BASE_LINE 进行编码, 优化前X264 编码速度约为5~8 f/s(帧/秒),优化后的编码速度为20 f/s 左右,速度得到明显提升,基本能够实现实时编码。
欢迎光临 DIY编程器网 (http://diybcq.com/)
Powered by Discuz! X3.2