DirectFB图形库网络透明层的分析与开发

2012-09-25 02:59王昆李众立
单片机与嵌入式系统应用 2012年3期
关键词:服务器端缓冲区应用程序

王昆,李众立

(西南科技大学 计算机科学与技术学院,绵阳 621010)

引 言

随着三网融合工程的开展,多频互动逐渐成为嵌入式厂商讨论宣传的热点。所谓多屏互动是指:电视可与电脑、智能手机等设备实现多屏互联互通,即手机可以像遥控器一样控制电视,电视能浏览播放手机,电脑上的图片和音视频文件等。这些嵌入式设备一般都通过无线路由器连接在一个局域网内,通过IP协议通信。DirectFB作为优秀的嵌入式图形库,通过新近开发的Voodoo模块作为网络透明层,为多屏互动提供了一种简洁、高效、通用的解决方案。

1 DirectFB图形库简介

DirectFB是一个轻量级的图形库,提供图形处理的硬件加速支持、输入管理、集成的窗口管理系统,支持透明窗口和多层叠加(通过alpha值)显示。它不仅仅是基于Linux Framebuffer之上的新设备,还是一个完整的支持硬件加速的封装层,对每一个不被底层硬件加速支持的操作都提供软件实现。DirectFB为嵌入式平台提供图形系统支持,建立了位于Linux Framebuffer之上的一个新的图形库标准。DirectFB由C语言开发,通过封装机制向上层应用程序开发提供接口。DirectFB为应用程序提供的主要接口有IDirectFB、IDirectFBSurface、IDirectFBWindow、IDirectFBEventBuffer等十余个,应用程序主要就是使用这些接口进行开发。

2 Voodoo的分析与设计

2.1 Voodoo模块简介

Voodoo是DirectFB的网络透明层,它能使一个平台上的DirectFB应用程序不经任何修改通过网络在另一个平台上运行,就好像这个应用程序本身就在这个平台上一样。要通过Voodoo运行DirectFB应用程序,首先在服务器端运行dfbproxy程序。这是DirectFB里面的一个新程序,它仅仅等待网络连接(Voodoo使用的端口是2323),甚至不调用最基本的DirectFBCreate()函数,直到客户端请求调用此函数。然后,在客户端运行DirectFB应用程序,只需要传递参数“--dfb:remote=<host>”即可。host为运行dfbproxy平台的IP地址。这样,服务器端就能代理运行客户端的应用程序了。

2.2 Voodoo原理分析

由于DirectFB采用模块化设计,使得上层应用程序仅依赖于其提供的十余个标准接口,每个接口都仅包含一组函数调用,这为程序的代理运行提供了可能。Voodoo的设计思想是为每一个DirectFB接口添加一组对应的接口——Requestor和Dispacher。例如,为IDirectFB添加的接口为IDirectFB_Requestor和IDirectFB_Dispatcher。对于IDirectFB的每个函数调用,在IDirectFB_Requestor和IDirectFB_Dispatcher中都有对应的函数调用,只不过函数功能发生了变化。一般而言,Requestor中的函数负责发送一个请求消息,消息中指明了Dispatcher方需要执行哪个函数,应用程序传递的参数也被封装到消息中,把请求消息发送到Dispatcher方;Dispatcher方收到请求消息后,获取消息中的参数信息,调用真正的接口执行消息中请求的函数调用,并把函数调用的返回信息封装在一个响应消息中,发送到Requestor端的对应函数。正常执行和通过Voodoo执行对比如图1所示。此图示意了一个DirectFB应用程序的一个函数调用的执行过程。

图1 DirectFB应用程序正常执行与通过Voodoo执行对比图

2.3 Voodoo中消息的编码与解码

Requestor和Dispatcher之间通过消息进行通信。一般地,Requestor方的函数发送一个请求消息然后阻塞程序,直到Dispatcher方的相应函数完成工作后返回一个响应消息为止,Requestor方的函数处理响应消息后返回,从而完成一个函数的执行。但是并不是所有请求消息都需要一个响应消息,有些不需要,例如,所有的与图像绘制相关的函数都在发送请求消息后立即返回。每个请求消息至少包含一个函数ID和消息类型,指明Dispatcher方应该执行哪个函数,以及是否需要阻塞等待Dispatcher方的响应消息,更多的数据可以附加在请求消息的尾部。每个响应消息至少包含一个结果,类型为DFBResult。更多的数据附加在响应消息的尾部。

Voodoo提供了一套简单高效的消息编解机制,通过编码把各消息块组合成一个消息数据包,消息块类型包括VMBT_ID、VMBT_INT、VMBT_UINT、VMBT_DATA、VMBT_ODATA、VMBT_STRING、VMBT_NONE,可用来添加一个整数、数据块、字符串到消息中。其中,VMBT_NONE位于最后,用于结束消息编码。消息编码使用非常方便,例如,可以使用Voodoo_manager_request函数来组合并发送请求消息。

以上函数是idirectfbimageprovider_requestor.c中RenderTo函数的主体。其中,前2个参数是固定的,第3个参数说明需要Dispatcher方调用对应的RenderTo函数,第4和第5个参数说明需要阻塞等待响应消息,后续每行在消息中添加一个消息块。

消息解码主要通过一组宏调用完成,使用也非常简单:消息解码总是以 VOODOO_PARSER_BEGIN(parser,msg)开始,以VOODOO_PARSER_END(parser)结束,中间根据消息块的添加顺序解码每个消息块。对应于以上编码的消息包的解码程序如下:

响应消息的编码和请求消息的编码方式一样,通过Voodoo_manager_respond()实现。

3 增加Voodoo对IDirectFBVideoProvider的支持

目前,Voodoo模块已经支持大多数DirectFB标准接口,但还不支持IDirectFBVideoProvider接口,而此接口是实现播放器程序的唯一接口。典型的播放器程序包含如下代码:

在CreateVideoProvider()函数中会用到IDirectFBDataBuffer接口,通过此接口访问视频文件内容。因此,要让Voodoo实现对播放器的支持,首先需要增加IDirectFB_Requestor和IDirectFBDataBuffer_Dispatcher对IDirectFBVideoProvider的支持。

3.1 增加IDirectFB_Requestor对IDirectFBVideoProvider的支持

IDirectFB是DirectFB中最基本的接口,也是应用程序最先创建的接口,通过DirectFBCreate()创建。其他接口由IDirectFB直接创建或者由IDirectFB创建的接口创建,它是唯一一个提供全局创建的接口。在多媒体方面,它提供了CreateImageProvider()、CreateVideoProvider()、CreateFont()和CreateDataBuffer()分别用于创建图像提供者、视频提供者、字体和缓冲区。

IDirectFB_Requestor是IDirectFB用于支持Voodoo的客户端接口。默认该接口不支持创建视频提供者,参考DirectFB-1.4.10\proxy\dispatcher\idirectfbdatabuffer_dispatcher.c文件中的其他函数,修改IDirectFB_Requestor_CreateVideoProvider()以提供支持。

3.2 增加IDirectFBDataBuffer_Dispatcher对IDirectFBVideoProvider的支持

IDirectFBDataBuffer是DirectFB中数据缓冲区的接口。通过该接口可以以统一的方式操作本地文件流或网络流等,包括获取缓冲区大小和当前指针位置、移动当前指针、预取数据、读取数据、等待数据、刷新数据等操作,还可以根据缓冲区数据创建字体、图像、音视频提供者等功能。

IDirectFBDataBuffer_Dispatcher 是 IDirectFBData-Buffer用于支持Voodoo功能的服务器端接口。默认该接口不支持通过缓冲区创建视频提供者,参考DirectFB-1.4.10\proxy\dispatcher\idirectfbdatabuffer_dispatcher.c文件中的其他函数,修改IDirectFBDataBuffer_Dispatcher_CreateVideoProvider()函数以提供支持。

3.3 IDirectFBVideoProvider_Requestor和IDirectFBVideoProvider_Dispatcher设计

IDirectFBVideoProvider接口用于支持音视频播放控制及相关信息提取,主要提供播放、暂停、快进、快退、播放速度控制、音量控制等操作。按照Voodoo的要求,为IDirectFBVideoProvider接口添加IDirectFBVideoProvider_Requestor和IDirectFBVideoProvider_Dispatcher两个接口,分别用于客户端和服务器端。添加源文件DirectFB-1.4.10\proxy\requestor\idirectfbvideoprovider_requestor.c、DirectFB-1.4.10\proxy\dispatcher\idirectfbvideoprovider_dispatcher.h和 DirectFB-1.4.10\proxy\dispatcher\idirectfbvideoprovider_dispatcher.c,用于实现上面两个接口。

4 实验结果

4.1 重新生成库

由于 DirectFB-1.4.10\proxy\目录下新添加了源程序文件,所以需要修改此目录下的Makefile.am,参考此文件其他部分,添加相关代码以生成新的库文件。运行“./autogen.sh && ./configure--enable-Voodoo && make&&make install”重新生成新的DirectFB库文件。新生成的库文件中对应于IDirectFBVideoProvider的库文件分别为idirectfbvideoprovider_requestor.so和idirectfbvideoprovider_dispatcher.so。

4.2 测试程序

由于测试需要涉及两个平台,选用基于嵌入式Linux的IPTV机顶盒作为服务器端,Linux主机作为客户端。分别编译安装以上经过修改的DirectFB图形库和测试用例库(包含df_video等很多简单的DirectFB应用程序),设置IP为192.168.1.10和192.168.1.11。应用 Voodoo代理运行播放器程序时,在IPTV机顶盒上运行:

即可将视频a.mp4播放到网络电视上,由于在局域网内,视频播放很流畅。

结 语

Voodoo的理念很简单,但是非常有用。作为Direct-FB的网络透明层,Voodoo可以在不修改、不复制应用程序的情况下,让应用程序运行于另一平台,为实现多屏互动提供了一个简单通用的解决方案。但Voodoo也有一些不足,例如暂不支持回调函数和指针,默认缓冲区大小为16K,这需要根据具体应用环境选择最佳缓冲区大小。

[1]The network transparency layer of DirectFB[EB/OL].http://www.directfb.org/index.php?path= Platform%2FVoodoo.

[2]Andreas Hundt.DirectFB Overview(v0.2for DirectFB 0.9.21)[OL].[2011-10].http://www.directfb/org/docs/DirectFB_overview_V0.2.pdf.2004.

[3]刘小双,李建平,郑志国.DirectFB图形加速在嵌入式系统中的应用[J].单片机与嵌入式系统应用,2009(3):65-66.

[4]刘海燕,邵立嵩,荆涛.Linux系统应用与开发教程[M].北京:机械工业出版社,2005.

[5]伍铁晟,卢延云.嵌入式Linux中图形界面硬件加速的优化设计[J].计算机工程与应用,2004(33):112-115.

猜你喜欢
服务器端缓冲区应用程序
Linux环境下基于Socket的数据传输软件设计
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
浅析异步通信层的架构在ASP.NET 程序中的应用
基于网络聚类与自适应概率的数据库缓冲区替换*
基于Qt的安全即时通讯软件服务器端设计
一类装配支线缓冲区配置的两阶段求解方法研究
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用
关键链技术缓冲区的确定方法研究
初涉缓冲区