基于SM501的2D加速显示接口设计 - 基于linux的全彩LED显示屏脱机控制系统设计(下)
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 871057
- 性别
- 男
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
基于SM501的2D加速显示接口设计 - 基于linux的全彩LED显示屏脱机控制系统设计(下)
4.2.2基于SM501的2D加速显示接口设计 显示层的设计旨在提供一套可移植的、使用方便的2D显示接口,包括基于区域内部坐标的应用显示层接口和基于屏幕坐标而与硬件无关的底层显示接口。应用显示层给显示项目playitem提供简单的基于区域坐标的显示接口。基于屏幕坐标的底层显示直接工作在SM501硬件之上,最大化利用了SM501硬件加速能力,同时还提供了可移植的接口。在移植到其他的2D硬件上只需要重新实现底层显示接口即可。
由于硬件设计上SM501处于slave mode与S3C2440连接,SM501不能访问系统内存,所有要进行加速操作的显示内容必须存放在SM501的独立显存上,这样不方便移植 DirectFB作为底层显示接口。因此本文按照通用的2D显示接口,独立实现了一套基于屏幕坐标的通用底层2D显示接口。
在实现上通过mmap把SM501的控制寄存器和独立显存全部从内核空间映射到用户空间,这样在程序中可以直接访问SM501的寄存器和管理本地显存,避免了在显示时应用程序与内核之间的数据交换,显示加速作用得以充分发挥。基于对SM501的直接访问,底层显示层实现了一套基本接口,包括显存分配与释放和基本2D加速操作如画线(line)、矩形填充(fill_rect),位图复制(bitblt)、缩放(bitblt_stretch)、色空间转换(CSC)等。其中对视频播放性能影响最大的是缩放和色空间转换。
SM501的绘图引擎(Draw Engine)包括两个部分,2D绘图引擎和CSC颜色空间转换模块。2D绘图引擎主要用来绘制直线(基于Bresenham算法),矩形填充,复制(Bitblt),旋转复制(Rotation bitblt)。缩放与颜色空间转换功能都是通过CSC模块来实现。CSC模块可以实现YUV422,YUV420,RGB565,RGB888几种色彩空间及格式转换到RGB565和RGB888,色空间转换隐含了缩放功能。
显存分配与释放管理是对映射到用户空间的Frame buffer进行的。实现上使用空闲链表的方法,并且采用最先适应的原则。最先适应分配算法有利于保留更大的连续内存块给那些一次性内存需求量大的分配请求。由于视频解码后色空间转换和缩放必须使用硬件加速来实现,因此总是预留1M的显存空间给视频显示使用。在显存不足的情况下,通过malloc分配系统内存。相应的所有显示层接口的地址参数均被设计成为自动识别地址属于系统内存还是独立显存,如果地址属于系统内存,则表明当前显存不足,于是使用软件的方法实现绘图操作。在释放显存时,程序若识别参数地址为系统内存,将调用free去完成释放。
在多个显示区域同时显示的情况下,显存的分配与释放管理以及所有的基于硬件加速的2D操作均被互斥地调用,以避免多线程同时对SM501资源进行争用带来的与时间相关的执行错误。
由于SM501加速操作只能使用本地帧存的物理地址,而通过mmap映射得到的是进程空间的虚拟地址,显存分配得到的地址也是基于映射后的地址,因此写入SM501寄存器中作为地址的操作数必须将进程空间地址转化为实现的帧存物理地址。转化方法就是用显示分配函数得到的地址减去mmap得到的首地址。
建立在底层显示层之上,软件实现了与屏幕绝对坐标无关的基于区域内部坐标的2D加速显示接口。区域内部坐标与区域本身在屏幕上的绝对坐标相加即可得出要显示的绝对坐标。另外每个显示区域都有对齐、缩放方式的选项。缩放方式可以有不缩放,线性缩放,非线性缩放三种,对齐在X,Y方向上分别有三种对齐方式。因为实际显示的内容大小与显示区域大小往往不是相同的,因此这两种选项对实际显示效果影响极大。如区域宽高比与显示内容宽高比相差较大时,非线性缩放将导致显示内容严重畸变,而线性缩放将显示内容保持为原来的宽高比。显示层次如图4.
![](http://www.elecfans.com/uploads/allimg/130924/10353T0L-2.jpg)
图3 显示层次 4.2.3脱机系统的视频播放器设计
这部分主要介绍针对SM501显卡的解码过程优化设计,并给出优化后的性能测试数据。LED脱机播放系统目前支持MPEG-4视频格式的AVI文件播放。
MPEG-4是MPEG(运动图像专家组)制定的视频压缩标准,是目前用得最广泛的一种视频编码标准。MPEG组织于1999年1月正式公布了MPEG-4 V1.0版本。MPEG-4除采用第一代视频编码(MPEG-1,MPEG-2,H.263等)的核心技术,如变换编码、运动估计与运动补偿、量化、熵编码外,还提出了一些新的有创见性的关键技术,包括视频对象提取技术、VOP视频编码技术、视频编码可分级性技术、运动估计与运动补偿技术等。
Xvid是开源的MEPG-4码器,遵守GPL通用公共许可证,也是目前国际上公认的性能最佳的 MPEG-4编解器之一,支持MPEG-4 SP框架。本文移植了Xvidcore-1.1.3到arm-Linux环境,并且基于Xvid设计了自己的LED脱机系统视频播放器。
AVI文件格式是Windows系统下最常用的一种视频文件格式。AVI文件并不局限任何视频编码格式。AVI文件格式是基于RIFF(Resource Interchange File Format)文件格式的。RIFF基于“块”为信息单位,每个块由一个4字符组成的FOURCC字标识。整个文件由一个RIFF块构成,RIFF块和 LIST(列表)块可以包含子块。包含子块的块结构为:FOURCC+块长度+块类型+块数据。不包含子块的块结构为:FOURCC+块长度+数据。 AVI文件在RIFF的基础上定义了自己的块类型和数据。一个AVI RIFF文件由3大部分组成:RIFF文件头,hdrl列表,movi列表,除此外还有一个可选的索引idxl块。其中hdrl列表包含 avih 子块和 strl 子列表,文件中有多少个流,hdrl 列表中就有多少个strl 子列表,strl子列表在 hdrl 中的次序就是流的序号。Movi列表中是实际的MPEG-4编码流,avih子块包含了AVI视频文件的头信息,比较重要的是帧频。一般的AVI视频文件只有一个视频流。户外LED屏幕对于音频播放需求少,因此本文并不涉及音频解码。
Xvid解码过程中要不断输入MPEG-4视频编码比特流,视频流从AVI文件中的movi列表子块中提取。AVI文件存储在USB可移动存储盘上,文件IO时间延迟会导致解码过程产生间隙性的视频播放停顿,因此有必要采用单独的IO线程从AVI文件中不断提取视频流。IO线程与解码线程构成一种生产者-消费者类型的线程同步关系,需要引入同步互斥量来保证其同步工作。
由于MPEG-4视频编解码的原始颜色空间是YUV420,如果直接输出YUV420平面格式 Xvid不需要进行颜色空间转换,其余输出格式则需要经过色空间转换算法得到。Xvidcore-1.1.3解码器输出不同的颜色空间格式对整个解码时间的影响非常显着。表1是在S3C2440平台下使用Xvidcore-1.1.3解码同一MPEG-4视频文件(分辨率320x176) 使用不同输出格式的帧频比较。
表1 Xvid不同输出格式解码速率比较表 ![](http://www.elecfans.com/uploads/allimg/130924/10353WS4-3.jpg) 本文使Xvid解码直接输出YUV420平面格式,避免了Xvid使用软件算法进行色空间
转换,然后使用SM501提供的YUV420转RGBx888硬件色空间转换命令完成视频帧的显示。这种方式下SM501与Xvid解码器并行工作,发挥了最佳的效果。同时为了避免了对数据的二次复制,本文直接在SM501本地显存中申请了空间作为解码帧输出地址,这些优化使得整个解码器的性能提高了2~3倍。 图4表示了简要的视频播放软件流程。
通过硬件缩放和象素复制,本文实现了1024×768分辨率下全屏流畅视频显示和多区域视频同步显示等普通嵌入式系统难以达到显示效果。多个显示区域下脱机播放系统AVI视频文件播放性能测试结果如表2示。可以看到,由于有硬件2D加速支持,解码速率与视频实际显示速率完全相等,区域大小以及多个区域同时显示对系统性能没有显着影响。
表2 视频播放器性能测试 ![](http://www.elecfans.com/uploads/130924/1540324-13092410340J50.jpg) 测试结果表明该系统足以胜任大多数全彩类型商业广告LED大屏幕脱机视频播放。
![](http://www.elecfans.com/uploads/allimg/130924/10353U602-4.jpg)
图4 优化的视频播放流程 5 结论
本文采用高速MCU和SM501嵌入式显卡作为硬件平台,突破了嵌入式系统在显示性能上的瓶颈,接口明确。在软件上移植了Linux2.6内核作为软件平台,在效率和可移植性方面做了较好平衡,运用了良好的软件设计思想,开发出具有开放式体系结构的 LED脱机播放软件。该系统已经成功应用于全彩LED显示屏的脱机播放和控制。 |
|
|
|
|
|