打印
[ZLG-ARM]

directfb是Linux平台上开发机顶盒使用的一个图形系统

[复制链接]
7769|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lpczcy|  楼主 | 2009-6-22 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Lifview-D 双模机顶盒整体架构
硬件部分: 

单芯片 IP/DVB 解决方案 
丰富的外围借口:支持以太网( RJ45,10/100Mbs )、 MiniPci (支持无线网卡)、双路 DVB 输入(支持 DVB-C/T/S );具备 2 个串口, 4 个 USB 接口, 2 个 SmartCard 接口( CA ),红外输入接口; SATA 接口( PVR );丰富的音视频输出接口 CVBS , S-Video , YPbPr , L/R Radio , SPDIF
软件部分: 
嵌入式 Linux 操作系统 网络协议: TCP/IP , DHCP , RTP/RTSP , HTTP 图形系统: DirectFB ,可实现输入 / 输出管理,图形显示、硬件加速、窗口管理以及字体库等功能 
C/C++ ( GNU Tools )
Lifview-D 双模机顶盒功能及技术指标 
1 ) DVB Streaming 

MPEG-2 
Digital Front-End (Tuner and Demodulator) 
Descrambling (DVB-CA) 
Transport Stream Demultiplexing : From Front-End (C/T/S)& Middleware (for IP-STB & PVR playback) 
Single-Program Transport Stream Extraction : For PVR record& network distribution 
PVR 
2 ) IP Streaming 

IP Protocol: IPv4/IPv6 
TCP/IP,HTTP,DHCP,DNS,FTP,SSL,PPPoE,SNMP 
Streaming Protocol: 
Multicast IPTV(IGMP Control) 
Video On Demand(RTSP/RSVP control) 
Transport Protocol: ISMA & TS, RTP/RTCP 
3 )信源音视频解码器 

视频支持的解码标准: AVS 标清( 720x576,720x480) , MPEG2 标准、高清( 1080i ), MPEG4 标清 ASP@L3 , WMV9 标清 MP@L3 
音频支持的解码标准: MPEG(Layer1,2) 、 MP3 、 AAC 、 WMA 
4 ) OSD 显示 

Color: 32-bit RGB for Video 
Alpha Blending:256 level 
OSD Ficker Filter 
Picture-in-Picture 
5 ) DirectFB 中间件接口

Playback of compressed Video and Audio: 
Video Provider Interface 
Example:AVI 、 MP4 、 WMV 、 MP3 
Decode (and display) of compressed Images 
Image Provider Interface 
Example: JPEG file 
Graphics Drawing Operations: Lines / Boxes 、 Text / Fonts 、 Region copying 、 Hardware accelerated 

 
   
如何选择合适的图形系统呢?

大家知道嵌入式领域是一个很丰富的领域,包括诸多的嵌入式操作系统和嵌入式图形支撑系统,所以除了MiniGUI之外,还有一些其他的嵌入式GUI,比如QT/E,micwindows, DirectFB +GTK,fltk,openGUI,TILCON等等,我们这里重点讨论一下DirectFB,directfb是跟window下的directx类似的一套库
 
   
directfb简介

什么是directfb呢

一个新的Linux图形标准

面对嵌入式设备的特殊需求环境,我们为图形加速和图形增强支持开发了一个小巧、强大和易于使用的技术:directfb。

directfb是一个瘦函数库,为开发者提供硬件加速,输入设备处理,并在Linux FB设备之上抽象、集成了支持半透明窗口和多层显示的窗口系统。它是一个完全的硬件抽象层,在每个图形操作上都具有软件后备机制,用于那些不被底层硬件支持的功能。DFB让嵌入式系统图形功能更强大,并在Linux上建立了一个新的标准。

硬件图形加速         
DirectFB 提供以下图形操作:  
          
Rectangle filling/drawing 矩形填充/绘制
Triangle filling/drawing    三角形~~/~~
Line drawing                    画线
Flat shaded triangles       三线质素平面阴影 (平面阴影更平滑)
Simple blitting                  简单位块传输
Stretched blitting             拉伸~~~~~~~
Textured triangles (perspective correct) 三角纹理 (透视校正)
Blending with an alphachannel (per pixel alpha)  Alpha融合 单像素
Blending with an alpha factor (alpha modulation) ~~~~~~~~  全局
Nine source and destination blend functions
Porter/Duff rules are supported    算法规则,也是涉及透明的图形混合算法
Premultiplied alpha supported
Colorized blitting (color modulation)
Source color keying
Destination color keying

管理
directfb对显存实现了自我资源管理。诸如显示层,输入设备等资源在排斥存取时能通过加锁锁定,例如全屏游戏。directfb针对不同的图形对象提供抽象,如显示层,窗口和通用表层。在从窗口切换到全屏和复原的编程设计尝试上被最小化到设置预期的协作等级。

directfb的模块
# Graphics acceleration 
# Input devices 
# Image Provider 
# Video Provider 
# Font Provider
 
   
DirectFB入门的一些感悟
下面是我对Directfb刚入门时的一些感悟,应该对刚入门的朋友有好处:
在我们到www.directfb.org的官方网站上看到的API函数,刚入门的朋友可能会觉得这些函数的调用还真是麻烦,其实他一点不麻烦,比如我们需要调用一个Flip函数,像

primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC);

我们在API中可以看到在进入IDirectFBSurface的这个接口就可以看到它的子页面有Flip这个函数了。所以我们得先定义一个IDirectFBSurface *primary = NULL;然后再由这个primary surface指向它的下级:primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC)。这样这个函数调用就出来了。

另外,在API函数的首页面有三个部分:Interfaces,Types和Definitions。我们知道Interfaces在我们调用函数的时候用到,那Type和Definitions会在哪用到呢?下面我们还是看看这个Flip函数原型:

Flip ( 
  IDirectFBSurface    *  thiz,  
  const DFBRegion    *  region,  
  DFBSurfaceFlipFlags     flags  
); 

看第一个参数IDirectFBSurface型的,这个是在Interfaces中定义的,而第二、三个参数DFBRegion,DFBSurfaceFlipFlags都是在Type中出现的,他们就是指这些接口函数的变量类型,所以要调用函数就在Interfaces中调用,要查看函数参数的类型就可以到Type中查看了。这样在DirectFB官方网站www.directfb.org上有些例子,我们就可以试试了:http://www.directfb.org/docs/DirectFB_Tutorials/
交叉编译directfb

开始动手交叉编译directfb到我的arm linux平台,步骤如下:

1. 下载 DirectFB-1.2.1.tar.gz

2. 解压缩 tar xvzf   DirectFB-1.2.1.tar.gz

3. 配置交叉编译方式 :

     ./configure --prefix=/home/xinlian/rootfs/home/directfb --target=arm-linux --host=arm-linux LD=arm-linux-ld --enable-png=no --enable-freetype=no

注:其中禁止了png和freetype因为我都没有用到。

4.编译 :make

    编译时会遇到编译gfxdrivers目录的部分驱动时通不过,比如tiomap等,由于这些驱动对于我来说是用不到的,我就直接把该目录下的makefile里相应的项屏蔽掉了。

5.安装

make install
一个使用DirectFB包的简单编程示例

主要实现了3个内容:

1。surface的绘图函数
2。如何在surface中获取类似framebuffer的绘制内存地址(去掉代码中的注释)
3。eventbuffer的使用,按escape退出,移动鼠标绘点


代码:
#include “directfb.h” #include 'stdio.h'static IDirectFB          *dfb   = NULL;static IDirectFBDisplayLayer *layer = NULL;static IDirectFBSurface         *surface = NULL;static IDirectFBEventBuffer *events = NULL;int main( int argc, char *argv[]){    void *point = NULL;    int pitch;    int i,j;    int quit=0;    int x=0;    int y=0;    DirectFBInit(&argc,&argv);    DirectFBCreate(&dfb);    dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer);       dfb->CreateInputEventBuffer(dfb,DICAPS_ALL,DFB_TRUE,&events);       layer->SetCooperativeLevel(layer,DLSCL_EXCLUSIVE);    layer->GetSurface(layer,&surface);       surface->SetColor(surface,80,80,0,0xff);    surface->FillRectangle(surface,100,0,100,100);           while(!quit){           DFBEvent evt;           events->WaitForEvent(events);           while(!quit && events->GetEvent(events,&evt) == DFB_OK)           {               switch(evt.clazz){                   case DFEC_INPUT:                   switch (evt.input.type)                   {                       case DIET_KEYPRESS:                       if(evt.input.key_symbol == DIKS_ESCAPE)                           quit = 1;                       break;                       case DIET_AXISMOTION:                       if (evt.input.flags&DIEF_AXISREL)                               switch (evt.input.axis)                               {                                   case DIAI_X:                                   x+=evt.input.axisrel;                                   break;                                   case DIAI_Y:                                   y+=evt.input.axisrel;                                   break;                                   default :                                   break;                              }                              if (x<0)                                  x=0;                              if (y<0)                                  y=0;                       surface->SetColor(surface,0,0xff,0,0xff);                    surface->DrawLine(surface,x,y,x,y);                               //printf('< % d,%d>\n',x,y);                    break;                              default:                           break;                   }                   break;                   default:                   break;               }           }       }          surface->Release(surface);    layer->Release(layer);    dfb->Release(dfb);    return 0;  }

相关帖子

沙发
arminfo| | 2009-6-22 14:03 | 只看该作者

不错,谢啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

77

帖子

0

粉丝