1 系统硬件结构
1.1 总体硬件架构
如图1所示,MP2530F在1个双核32位CPU处理器的基础上集成了视频处理器,专门进行硬件编解码视频的处理;集成了1个显示控制器来进行双路显示输出;集成了1个Memory控制器(包含双DDR控制器和NAND Flash/Static控制器),其中双DDR控制器的设计极大地提高了内存读/写效率,而将不同模块处理部分使用不同的内存区域,减少了内存读/写冲突的发生;集成了1个视频输入控制器,可以外接摄像头,回显模拟视频流;集成了AC 97和I。S两种方式的音频控制器,提供更为丰富的音频接口;集成了2D、3D图形加速器和PWM脉冲宽度调制器等。
此外,MP2530F提供了丰富的外围数据接口。其中包含:6路UART通道,目前1路作为调试接口,1路作为GPS模块接口,其余4路空闲;USB 1.1 HOST、USB 2.ODEVICE、SD卡读写通道;以太网控制器等。
1.2 双核硬件接口
MP2530F最大的特性是具有ARM926EJ和ARM946E的双核处理器,主频为360 MHz和300 MHz,两个处理器都能独立工作且共享部分内存区域。ARM926EJ是作为主CPU使用,而ARM946E主要作为协处理器来调用视频处理器进行硬件视频编解码。双核之间是不能直接通信的,必须通过双核接口来发送命令和数据。因此,如何使得双核协同工作来发挥芯片的最高效率就变得很重要。
如图2所示,所谓的双核接口其实为两个处理器各自分配一组寄存器,包含中断使能、数据寄存器、中断清除等。
工作流程:系统启动后,ARM926EJ作为主CPU在一开始就进行初始化,而ARM946E则是之后选择一定的时机再处理。当ARM926EJ需要ARM946E协同工作时,通过I/O控制器将命令写入双核接口中的DUAL 946寄存器过程来实现。其步骤是:先打开ARM946E并设置好基地址,然后使能946中断,再将数据命令写入DU—AL 946的16组16位寄存器;写入完毕后发一个中断信号IRQ946到ARM946E,最后清除寄存器里的挂起信号,进入中断处理。
ARM946E执行完毕后,要发送回复命令给ARM926EJ。过程类似,只是ARM926EJ作为主CPU一直是开放状态,不需要再打开它和设置它的基地址,直接进入ARM926EJ中断使能,之后步骤相同。
2 软件移植开发
媒体播放是MP2530F平台的核心功能,而充分利用双核的高效性能硬件解码播放高清视频是该平台最为突出的特点。下面详细介绍在MP2530F平台上实现硬件解码播放器的原理。
2.1 Mplayer移植
Mplayer是Linux历史上优秀的多媒体播放器,源码开放,具有可移植性,能使用众多编解码器,支持广泛的输出设备。最重要的是,Mplayer采用的是完全模块化的结构,具有一个统一的解码器插件接口和输出设备接口,并且完全使用C/C++语言编写。用户可以根据需要来编写自己的编解码器,提高播放器的执行效率。
通过直接对最新版Mplayer一1.O:re2进行配置和交叉编译,移植到MP2530F平台上,实现了基于主CPU核ARM926EJ的软解码播放功能,但发现两点问题:
①用Mplayer自带的基于浮点运算的mp3lib音频解码库解码效率很低,极度占用系统资源,所以改为使用基于定点运算的libmad音频解码库来进行音频解码。
②用Mplayer自带的ffmpeg解码器解码AVI高清视频,由于软解码处理速度缓慢,无法达到音视频同步,视频播放明显滞后于音频。
2.2 硬件解码器
由于AVI高清视频所带数据的大量性,只由主CPU进行软解码处理,不仅大大降低CPU的使用效率,同时视频解码速度滞后音频,也不能达到影片声音和图像同步正常播放的效果。需要利用MP2530F本身的硬件特性完成一个解码器。因为MP2530F本身是带有一个MPEG视频处理器,支持MPEG4.标准的视频流而拥有各个功能模块(如VLD/VLC、PCT/IDCT、量化器、预判器、运动估计、运动补偿等),并由ARM946EJ控制使用。
另外,在系统内核驱动中专门划分了一个内存区域,用于存储需要解码的媒体流数据。这样主CPU每次分离出音视频流,分别写入指定内存空间,并在需要解码视频流时,发送一条解码指令给ARM946E;而当ARM946E接到命令后,打开MPEG视频处理器,并为视频处理器解码分配足够的视频帧缓冲区。由于媒体流存储的内存空间对于两个CPU是共享的,ARM946E可以直接从内存指定区域将需要解码的视频流读取一帧下来,发送到视频处理器,由视频处理器进行硬件解码;解码完后的帧数据暂存在视频缓冲区,等待主CPU发送命令再写入frame buffer播放帧数据;而每当写完一帧数据到frame buffer,ARM946E就将帧缓冲区所存储的这帧空间释放,开始等待下一帧的解码。如此,就完成了整个硬件解码器。
2.3 Mplayer调用流程
Mplayer的播放过程,在它的核心主程序打开一个视频文件后,会自动选择对应文件格式的分离器来解析视频头,从而分离得到视频流和音频流,之后选择特定的视频和音频解码器处理分离出来的媒体流数据。而当视频解码器和音频解码器完成图像和音频的处理后,就将数据返回主程序,再由主程序指定的音视频输出设备播放数据。
基于Mplayer这样分层和完全模块化的架构,我们就可以根据上面硬件解码器的实现流程和特性,参照Mplayer给出的解码器书写规则和应用接口,把硬件解码器插入到主程序中,由Mplayer调用实现来达到硬件解码的目的。实现流程如图3所示。
由于硬件的关系,在进入解码器前,系统需要ARM946E先打开MPEG视频处理器并进行初始化,做好解码MPEG4视频流的准备。所以,我们在Mplayer使用分离器解析出AVI视频媒体文件的音视频流后,调用了ARM946E进行准备工作。
当主程序进入图3(b)所示的解码流程,每读取一帧需要解码的图像后,使用先前打开的视频处理器解码媒体流数据,并把解码完的帧数据返回到帧数据缓冲区(在初始化时分配好的缓冲区空间),等待主程序调用输出到frame buffer播放图像。
当主程序播放图像后,每播完一帧后会判断该帧是否为文件的结尾。如果不是,则转回解码器读取下一帧图像继续解码;如果是,就关闭输出设备,关闭解码器,结束播放。结果成功实现硬件解码器的开发。
3 软解码和硬解码比较
通过测试,经过优化开发的硬件解码器最高可以支持视频:WVGA格式,帧速为30 fps,码流为4 Mbps;D1格式,帧速为30 fps,码流为6 Mbps。
软硬解码比较如表1所列。
比较软解码(ffmpeg解码器)和硬解码的性能如下:
①调用软解码解码高清视频时,由于未能合理分配使用内存空间,且过分依赖主核心解码图像数据,不仅过分占用系统资源(主CPU和内存),而且播放的效果也不理想,视频播放严重缓慢,极不流畅。
②调用硬解码器时,使用从处理器调用视频处理器实现硬件解码,并分配指定内存区域存储媒体流数据,极大降低了CPU和内存的占用率,同时视频播放流畅、清晰,效果理想。
结 语
本文介绍了MP2530F平台的基本架构,分析了双核处理器的调用流程,在MP2530F开发平台上移植了Mplayer播放器,并在此基础上开发基于该平台的硬件解码器,成功实现了解码AVI高清视频及播放,体现了一个多媒体芯片的重要功能。