新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于TMS320DM3730的H.264编码器移植与优化方法研究

基于TMS320DM3730的H.264编码器移植与优化方法研究

作者:时间:2013-05-18来源:网络收藏
2.1 CCS工程的建立
在CCS环境下分别建立两个工程:静态库工程Libx264.pjt和可执行工程x264.pjt。静态库工程Libx264.pjt包含x.264编码所需要的绝大部分的函数,编译链接生成可进行调用的Libx264.lib文件。可执行工程x264.pjit工程是x264编码程序的主体的框架,包括编码参数的初始化、文件的输入输出以及图像的编码循环等主函数实现部分。该工程添加对Libx264.lib文件的引用,最终编译链接生成x264.out可执行文件。
2.2 CCS中编译选项的设置
在CCS4.2平台下必须对Libx264.pjt和x264.pjt工程设置合适编译选项:
1)DM3730的DSP核为C64x+版本,故目标处理器版本选项选择为-mv64004+
2)编译器默认的内存模式为Near模式,而在Near模式下要求.BSS段必须小于32 kB,.BSS段存取的是工程中的全局变量和静态变量,x264工程中的全局变量和静态变量已经远大于32 kB,故将Data access model和Const access model设置为Far。
3)在DM3730中使用的是小端模式的字节存储即低位字节先存储,故在CCS4.2中Device Endianess(设备字节存储次序)设置为little-endian。
2.3 算法的剪裁
1)MMX、SSE汇编指令的去除
在x264中有很多计算量大的函数例如DCT变换、运动估计、量化等都是使用MMX、SSE汇编指令进行实现的,但是这些汇编都是针对X86平台、AMD平台,在DSP的结构下不能用,需要删除这些汇编实现文件,并将宏定义_HAVE_MMX_进行删除。
2)精简代码
考虑到x264的编码的效率,采用了中的baseline级别进行编码,去除了CABAC(基于内容的自适应二进制编码)和B帧(双向预测帧)这两个特性。这样虽然一定程度上增加了编码的码率,但是对编码速度的提高很明显。编码采用固定量化参数,不使用码率控制,保留所有帧内预测模式和帧间预测分块模式进行编码,同时去除x264的多余的打印信息和help信息以提高编码速度。
2. 4 函数、数据类型的修改
在编译过程中函数名为isfinite的函数会出现重定义的错误,原因是在CCS4.2包含的头文件中对该函数名有定义的,而x264中也有对其的定义,只需要将函数名进行修改一些即可。
同时由于硬件平台的差异,C语言中有些数据类型对应的字节长也会有差异的,为了让程序更好的兼容硬件平台,x264程序使用了通用的数据类型定义。通用数据类型一般在stdint.h中定义,VC++中并没有提供通用数据类型,而CCS中则提供了stdint.h,同时它包含于intty pe.h中,故移植到CCS中时应该包含#includeinttype.h>。
2.5 内存的分配
x264程序中存在很多使用malloc进行动态的内存分配,这样会大大提高占用堆栈的大小,应该尽量的将动态内存分配使用静态的数组进行替代。同时在嵌入式系统中,合理的分配堆栈的大小对一个程序也是相当重要的。由于x264中动态内存的申请、静态的表格数组和全局变量比较多,故在cmd文件中对堆栈的大小定义设为:
-stack 0x8000
-heap 0x400000
同时将x264程序中的代码和数据的段地址全部放置到外部寄存器中。

3 x264的优化
x264成功移植后在DM3730上进行CIF(通用影像传输格式)格式图像编码测试,平均编码速度只有1fps(帧每秒)左右,离实时编码差距很大,需要对x264进行优化工作。优化的方法包括编译器优化、内存优化、C语言优化和汇编优化。
3.1 编译器优化
在使用C编译器连接和生成最终DSP可执行代码时,CCS上的C编译器拥有非常出色的优化性能,可以通过设置编译优化选项进行编译器的自我优化。表1所示是CCS4.2中一些优化选项及其功能列表。

c.JPG


通过对程序速度性能的要求和代码结构的考虑,最终选择的编译选项为:-mv6400+ -pm -o3 -op3 -mf3 -mt。
3.2 内存优化
DSP的内部存储器和外部存储器由于总线频率的限制所以存在较大的读取速度差异,DM3730中片上内存的访问频率为300 MHZ,而对SDRAM的访问频率最高为133 MHZ,若利用静态地址分配将一些使用频繁而比较大的结构体或数组指定到片上内存中,那样程序的运行速度将会得到很大的提高。故可以将一些使用频繁的动态内存分配改为静态内存分配,然后将静态分配的常用的数据结构比如帧存储区利用DATA_SECTION指定段地址,通过.cmd文件将指定的段放置到片上内存中。
3.3 C语富代码的优化
1)使用内联函数
CCS的C6000编译器提供了一些经过汇编优化的C内联函数,可以使用这些内联函数替换x264中的相应函数,提高程序的运行速度。在x264中使用的内联函数有:_abs()、_amem4()、_amem4_const()、_pack2()、_paek14()、_min2()、_max2()、_dotpu4()等。
2)使用数据对齐指令DATA_ALIGN
数据对齐指令的完整的语法是:
#pragma DATA_ALIGN(symbol,constant)



评论


相关推荐

技术专区

关闭