3 AVS-M实时视频解码在OMAP上的软件实现
3.1 在OMAP1510上的程序结构
在OMAP上开发程序通常分为两部分,一部分是ARM端,负责控制、显示等,另一端是DSP端,主要负责数据处理,我们都采用TI提供的CCS在这两端分别开发,程序流程框图如图3所示
图3 基于OMAP的AVS-M程序流程框图
ARM端的主要功能是初始化整个OMAP1510芯片,包括ARM、DSP、TC等的时钟的设置,DSP的开启关闭以及复位,LCD、定时器等各个外设的初始化。在启动完成后,ARM就一直查询共享内存中的某一标志位,当查询到一帧解码结束时,就启动LCD专用DMA,在LCD上进行显示。
DSP端的主要工作是负责AVS-M码流的解码。我们将AVS-M码流放置在SDRAM中。与基于PC的解码程序得主要的区别在于,由于DSP的片内内存有限,所以我们不可能将当前帧以及参考帧都放在片内,所以,以宏块为单位在SDRAM与片内内存之间进行数据传递。另外,由于在液晶屏上显示的时候需要转换成RGB图像显示,所以,在每一帧结束后,要通过YUV转RGB来实现实时显示
3.2 程序优化的主要过程
我们采用标准C语言,一方面是出于可移植性的考虑,另一方面是由于TI编译器效率的不断提高。但是,假如仅仅依靠编译器的优化是远远不够的,我们采用以下手段进行优化:
(1)DMA的合理利用。
对于同一段程序来说,只用片内数据与只用片外数据时速度差别相当大。所以要尽量采用片内数据,这就需要提前采用DMA将片外数据导入片内。如前文所说,我们广泛采用了DMA,用于SDRAM与片内内存之间以及SDRAM内部的数据交换。DMA不占用DSP时间,可以相当于并行操作。表1我们列出了memcpy命令与等待状态下DMA耗时,移动的数据为256个16bit数。
|
|
|
耗时(指令周期)
|
|
DMA
|
SDRAM 到 DARAM
|
1041
|
|
DARAM 到 SDRAM
|
620
|
|
SDRAM 到 SDRAM
|
1621
|
|
Memcpy()
|
SDRAM 到 DARAM
|
1893
|
|
DARAM 到 SDRAM
|
2168
|
|
SDRAM 到 SDRAM
|
3282
|
表1 DMA与非DMA方式传输耗时比
由表1可以看出,采用DMA方式只需要直接传输的时间的1/2到1/3,所以即使在传输过程中DSP完全处于等待状态,也较对内存的直接操作要高效得多。考虑到实际使用时DMA与CPU读写总线操作是并行运行的,那么采用DMA节省的时间会更多。
(2)对循环的优化策略。
我们采用restrict关键词进行编译,同时将递增改为递减,这样循环计数时将采用硬件循环计数器(RPTC),大大缩短了循环操作本身的判断耗时,得到更为高效的循环解决方案,以下面一段代码为例,功能是相同的
loop((int*)0x2600,(int *)0x2700,0x100);
void loop(int * restrict i,int * restrict j,int counter)
{while(counter--)
*(j++)=*(i++)+*(j++);
}
耗时558个时钟周期
for(i=0x2600;i<0x2700;i++)
{
*((int *)(j++))=*((int *)(i))+*((int *)(j++));
}
耗时2564个时钟周期
两者相差5倍,因此,尽量采用对循环的优化策略成为系统加速的关键。
(3)64K边界长度的问题。
由于DSP55X采用了16位的数据宽度,所以寄存器也是16位的,经常会出现64K边界的问题,例如开辟一个数组,当数组元素到达0XFFFF时,下一个并不是到达0X10000,而是回到0X0000,即是采用long型定义数组元素个数也是如此。所以,我们采用long 型指针,采用绝对地址间接寻址的方式来解决。
(4)ARM与DSP的通信机制问题。
OMAP提供了两种通信方式,一是采用MAILBOX中断方式,另外一种是采用共享内存查询方式。MAILBOX方式的优点是实时性强,缺点是数据量小,查询方式可以一次性传递大量数据,但是要通过查询某一位共享内存来实现,实时性较差,所以,一般是采用两种方法结合,兼顾效率和速度。
(5)合理设置DSP时钟。
在系统上电复位时,DSP的时钟等于晶振的固有频率,由于OMAP采用了数字倍频以及数字锁相环,所以可以通过设置频率控制寄存器来更改DSP的时钟。具体的原则是在满足系统实时要求的情况下,尽可能低的设置时钟,这是显而易见的,因为高的时钟频率必然带来大的系统能耗。
(6)LCD的DMA。
采用OMAP系统的LCD专用DMA,可以使ARM系统独立出来,可以执行操作系统的任务,同时,采用DMA也比直接移动指令更为有效。
(7)使用DSP55X内部的instrinsic 指令。
这些指令是由优化的汇编代码写成,可以显著提高代码执行的效率,包括乘法,取最大最小值等,使用instrinsic一般可以提速5%左右。
(8)注意数据格式的转换。
在DSP采用大端模式ARM端采用小端模式组织数据,所以,在采用共享内存时存在模式转换的问题,通过ARM的大小端转换模式寄存器自动转换。另外,ARM端能够处理8 位、16 位、32 位、64 位的数据,DSP端能够处理16 位、32 位、40位、64 位数据。int型变量在ARM端是32位,在DSP端是16位宽度,要注意数据格式的比较。
(9)数据宽度的考虑(16位 8位 )。DSP55X采用16位的数据总线,所以采用16位的数据宽度是最高效的。DSP55X也支持8位的数据,这样数据得到了一倍的压缩,但每次取操作数都要进行高低位选择。从这两种方式中,我们认为,以宏块为单位进行操作时,实际上用到的空间并不大,而速度是更关键的问题,所以我们将原始的8位的AVS-M码流统一以16位(高8位置零)的格式进行存放与计算。
(10)合理安排内存。
原则上,程序应该放在片外,数据应该放在片内,特别是常用的码表等要放在DARAM中,同时,使能指令Cache可以有效加速执行速度。
4 实现的性能与结果
我们在两个平台上实现了该算法。
基于闻亭公司的TDS-OMAP1510 开发板,没有采用Linux操作系统,利用串口下载AVS码流,在开发板的液晶上显示;
基于合众达公司提供的Spectrum公司的OMAP5912 OSK,采用了Linux操作系统,利用以太网口下载AVS码流,在开发板的液晶上或者远端显示器上显示。
表3给出了OMAP5910/12上的实验数据
|
序列
|
帧数
|
耗时(秒)
|
速度(fps)
|
|
5910
|
5912
|
5910
|
5912
|
|
Mobile
|
400
|
16
|
15
|
25.0
|
26.7
|
|
Foreman
|
400
|
15
|
15
|
26.7
|
26.7
|
|
News
|
400
|
11
|
10
|
36.4
|
40.0
|
|
Highway
|
400
|
10
|
10
|
40.0
|
40.0
|
表3不同测试序列的解码结果比较
注:上述序列大小均为 QCIF(176x144)
参考文献
1中华人民共和国国家标准 信息技术 先进音视频编码第7部分:移动视频 2005.3
2 TI公司 OMAP5910 Dual-Core Processor
Technical Reference Manual July 2002
3 姜超 基于OMAP 的MPEG4 实时解码器的实现
电子技术应用2004 (11)
4 虞露 AVS熵解码与DSP实现 电视技术 2004(10)