(四)DirectFB 接口
桌面GUI系统涉及很多图像运算,比如画点、画线、填充、透明度处理、平滑度处理、层的叠加、字体处理、贴图等等。如果这些运算都由CPU来处理,那这将是对CPU的一个很大的负载。
DirectFB是一个专门针对Linux图形库设计的图形加速中间层。它的上层直接面向图形库比如QT,提供如显示、画图、输入设备控制等服务,他的下层直接面向GFX加速硬件,要求硬件驱动实现全部或部分预定的画图函数。
3.1 主要接口
. IDirectFBScreen 显示屏幕
. IDirectbFBDisplayLayer 显示层
. IDirectFBSurface 显示表面
三者之间的关系如下:
显示屏幕 <-- Output(connector) <-- IDirectFBScreen <-- (mixer)DisplayLayers <--DisplayLayer's IDirectFBSurface <-- gfx Accelarator <--- 显卡/或CPU运算画图
首先,用户在显示屏幕上看到一个Screen的输出,这个Screen由多个画面组成(比如同时包含:背景图片,前景视频/字幕/图片)。组成Screen的每个画面,都由一个单独的DisplayLayer来处理。多个DisplayLayers由Mixer来决定叠加的顺序/位置/以及透明度等。单独一个显示层DisplayLayer,可自由控制输出大小(放大/缩小)、背景颜色、翻转等。DisplayLayer所显示的数据(比如解析JPEG产生的RGB数据),则需要在DisplayLayer上生成一个Surface来显示,Surface控制实际的贴图操作,比如:画点/线/框/填充/变换位数、色深、分辨率,等等, Surface可直接和硬件加速打交道(gfxcard)。
DisplayLayers和Surface都是Screen的后端,Screen的前端(就是输出部分),还有Encoder,Output等概念。Encoder着重描述输出信号的编码参数,Output着重描述输出接口. 它们有以下重要成员:
Standards :配置输出制式(标清/高清/PAL/NTSC/>>扩展<<)
Signals :配置输出信号(VGA/YC/CVBS/RGB/YCBCR/HDMI/656/>>扩展<<)
Connectors :配置输出接口(VGA/SCART/YC/CVBS/SCART2/COMPONENT/HDMI/>>扩展<<)
Resolution :配置输出分辨率(directfb.h中所列举的常见分辨率/>>扩展<<)
从Screen到Encoder,再从Encoder到Output的connector,最后到显示屏幕,DirectFB的底层实现者需要做的就是根据目标硬件的特性,实现这条路线中各条通路,DirectFB的使用者需要做的就是通过Screen的成员函数配置、使用这些通路。
3.2 Provider 类型接口
IDirectFBImageProvider
IDirectFBVideoProvider
IDirectFBFont
此类接口提供特殊的图形输出,图像,视频,字体
以下医视频输出主要步骤如下:
DirectFBCreate( &dfb )
dfb->CreateVideoProvider( dfb, url, &provider )
provider->GetSurfaceDescription( provider, &desc );
dfb->CreateSurface( dfb, &desc, &dest );
provider->PlayTo( provider, dest, NULL, Frame_Callback, dest );
3.3 其它接口
IDirectFBEventBuffer
IDirectFBDataBuffer
IDirectFBInputDevice
IDirectFBEventBuffer: 事件同步机制,一端接入产生事件的设备,使用PostEvent之类的接口递交事件,另一端使用WaitForEvent之类的接口等待事件,使用GetEvent之类的接口获取事件。
IDirectFBDataBuffer: 数据DataBuffer缓冲,提供同步等待功能,并提供CreateXXXProvider(XXX=Image/Video)功能,在原代码中被广泛使用.
IDirectFBInputDevice: 输入设备接口