gnash源码解析

  Gnash简介
    gnash是开源运动的产物,官方网站为http://www.gnashdev.org/,gnash是一款开源的SWF movie player,可以独立在桌面环境下运行,也可以运行在嵌入式系统上,同时也可以作为一个插件供其他的浏览器调用。swf是Macromedia公司(现 已被ADOBE公司收购)的动画设计软件Flash的专用格式,是一种支持矢量和点阵图形的动画文件格式。具有缩放不失真、文件体积小等特点,它采用了流 媒体技术,可以一边下载一边播放,目前被广泛应用于网页设计,动画制作等领域,swf文件通常也被称为Flash文件。 是shock wave flash的缩写,正如rm = real media mp3 = MPEG Layer 3 wma = Windows Media Audio 一样,按照Macromedia公司的定义,swf文件通常有v7、v8、v9三种不同的版本,具体各个版本之间的差别这里不作详细的阐述,可以查阅 Macromedia公司网站内容,而对于gnash来说,不同版本的gnash对swf文件版本的支持情况也是不一样的,在gnash0.8.5中,可 以支持全部的swf-v7的全部特性和部分的v8、v9特性,支持几乎所有的流媒体格式(FLV, H264, MP3等),同时在gui方面,加入对KDE4/QT4的支持。
gnash广泛应用在各种嵌入式平台,比如 PowerPC, AMD64, MIPS.ARM , MIPS等。
Gnash依赖的库分析
    gnash依赖于很多开源社区的库,根据gnashdev.org社区的说法,gnash依赖的情况如下:
可能依赖的库:
automake    Possibly Required        1.6.0            automake
FFMPEG    Possibly Required                     ffmpeg-dev
libtool    Possibly Required        01年5月22日        libltdl3-dev
autoconf    Possibly Required        2.59            autoconf
gettext    Possibly Required        0.14.6        gettext
gst-ffmpeg    Possibly Required                     gstreamer0.8-ffmpeg-dev
GTK        Possibly Required        2.2 or higher    libgtk2.0-dev
GtkGlExt    Possibly Required                     libgtkglext1-dev
SDL        Possibly Required                     libsdl1.2-dev
AGG        Possibly Required        2.4 or higher    libagg-dev
OpenGL    Possibly Required                     libgl1-mesa-dev
KDE        Possibly Required                     kdelibs3-dev, kdebase-dev
FLTK        Possibly Required        2.0 or higher    No distribution packages are available.
Cairo        Possibly Required                     libcairo2-dev


必须依赖的库:
GIF        Required                         libungif-dev
libxml2    Required                         libxml2-dev
PNG        Required                         libpng12-dev
JPEG        Required                         libjpeg62-dev
Boost        Required            1.32 or higher    libboost-thread-dev, libboost-date-time-dev libboost-dev

通过我们实际的需要,在取消一些不需要特性和考虑到嵌入式系统的实际需要,最小gnash需要依赖的库如下:
如上述,必须的库可以简化为:
必须依赖的库:
GIF        Required                         libungif-dev
libxml2    Required                         libxml2-dev
PNG        Required                         libpng12-dev
JPEG        Required                         libjpeg62-dev
Boost        Required            1.32 or higher    libboost-thread-dev, libboost-date-time-dev libboost-dev
libcurl    Optional                         libcurl4-gnutls  //该库与url文件获取有关 , 保留

可选库:
Gstreamer    Optional                         libgstreamer0.8-dev  //跟视频播放有关,与FFMPEG不能同时选择。可选。
FFMPEG    Possibly Required                     ffmpeg-dev   //跟视频播放有关,与Gstreamer不能同时选择。可选。
gst-ffmpeg    Possibly Required                     gstreamer0.8-ffmpeg-dev //选择Gstreamer作为视频播放时,必须加入
gst-ffmpeg    Possibly Required                     gstreamer0.8-ffmpeg-dev //选择Gstreamer作为视频播放时,必须加入
SDL        Possibly Required                     libsdl1.2-dev
AGG        Possibly Required        2.4 or higher    libagg-dev
OpenGL    Possibly Required                     libgl1-mesa-dev
FLTK        Possibly Required        2.0 or higher    No distribution packages are available.
Cairo        Possibly Required                     libcairo2-dev
(上边的这些是还没有验证的信息,还有很多库需要做验证,达到最少库的需求。)
gnash中configure 配置项解析
    在configure配置项中,有三个项目是最为重要的,分别是—enable-gui= [gtk|kde|fltk|sdl|riscos|aqua|fb|hildon|alp|qtopia|dump]、—enable- renderer=[opengl|cairo|agg]、—enable-media=[GST|ffmpeg]。
    首先,我们来看—enable-gui= [gtk|kde|fltk|sdl|riscos|aqua|fb|hildon|alp|qtopia|dump],这是选择gnash支持的gui 界面,其中我们选择的应该是qtopia[疑问:对于kde来说,他是基于qt,那kde与qtopia有什么区别],--enable- gui=gtk|sdl|kde|fltk|fb|hildon|alp|qtopia  默认的选项是gtk kde ,这个选项是gnash的gui界面,可以根据实际情况选择。需要说明的是:
GTK
    The GTK+ toolkit, which is the default GUI. Said to interwork particularly well with firefox.
Hildon
    The Hildon toolkist is based on GTK+, and is use by some mobile devices.
ALP
    The ALP "Hiker" GUI is used for the Access Linux platform.
SDL
    Simple DirectMedia Layer, a simple and portable GUI. Its sound facilities are used when --enable-media=ffmpeg regardless of whether it is also in charge of the GUI.
KDE
    An interface adapted to the KDE Desktop Environment. This must be selected when building the Konqueror plugin "klash". Furthermore, the only renderer that currently works with KDE is opengl.
FLTK
    Fast Light ToolKit, low on resource usage. Since all builds using fltk are now broken, we declare it "for developers".
FB
    The Linux Frame Buffer, also known as /dev/fb0. AGG is the only renderer that can currently be used with the framebuffer GUI.
qtopia
     support Trolltech qtopia as gui lib, if chose this option , the system must have qt lib support

    再次,来看—enable-renderer=[opengl|cairo|agg],gnash根据不同的选项,可以支持三种不同类型对图像和音频的渲染方式,通过下边的选项来设置:   
--enable-renderer=opengl
--enable-renderer=cairo d
--enable-renderer=agg (default) 注:  renderer 渲染,只能选择一个选项   
关于三种渲染方式的介绍:
OpenGL
    OpenGL (Open Graphics Library) is a standard specification defining a cross-language cross-platform API for writing applications that produce 3D and 2D computer graphics. Accelerated graphic cards usually provide OpenGL at the hardware level. Please refer to Wikipedia for availability of free software OpenGL hardware drivers. A free software implementation of the API is available (Mesa). OpenGL can be used as a renderer in Gnash.
Cairo
    Cairo is a 2D graphics library with support for multiple output devices. Can be used as a renderer in Gnash. A useful feature of Cairo is that it will automatically use graphic card acceleration when available. Cairo has an experimental OpenGL backend.
AGG
    AGG is the AntiGrain 2D graphics library, which can be used as a renderer in Gnash. It is faster than OpenGL on systems without hardware graphics acceleration. As of Gnash version 0.8.2 it is the more feature complete renderer.
对于这个选项,选用默认的是最好的了,通常情况下,我们的系统没有图形加速卡,所以只能选用agg .

    最后,让我们来分析下—enable-media=[GST|ffmpeg],这里是跟多媒体解码相关一些东西,在这次的项目当中,只希望支持最简单的swf文件格式,不会出想复杂的声音、视频等,也不需要对flv进行支持,正在考虑能否去掉对media的支持。

GNASH源码结构解读
    
    首先我们来看一些gnash的目录结构:
|-- backend
|-- cygnal
|-- depcomp
|-- extensions
|-- gnashconfig.h.in
|-- gui
|-- libamf
|-- libbase
|-- libcore
|-- libltdl
|-- libmedia
|-- libnet
|-- libsound
|-- plugin
|-- pythonmodule
|-- testsuite
`-- utilities
        在这里我们可以看到,有很多libxxx命名的文件夹,这些在编译之后会生成库函数共其他函数调用。
生成    生成的这些库文件分别libgnashsound、libgnashcore、libgnashbase、libgnashmedia、libgnashnet、libgnashamf,
而对于gnash可以生成两种文件:可执行文件、浏览器插件,这两种分别调用这些库文件。
那么我们对源代码的分析就可以从这两个文件类型出发,这两种文件分别对应于gui/、plugin/。
   
GNASH源代码分析

    通过./configure –help,我们可以获悉,对于gnash来说,可支持的gui包括:kde、kde4、gtk、fltk、sdl、riscos、aqua、fb、 hildon、alp、qtopia、dump。其中对于fb对于嵌入式 系统是最为熟悉的,fb就是framerbuffer,具体gui可以根据系统具体要求而定,这里我们需要找到整个程序的入口点,分析gui目录可以发 现,处理针对各个GUI界面分别编写的文件外,还有一些文件
是跟gui没有关系,而整个程序的入口就在文件gui/gnash.cpp中,
在这个文件的开头有这样的宏定义:# define gnash_main main
而程序的入口就成了:int gnash_main(int argc, char *argv[]) ,在这个main函数中完成了如下的操作:gnash::Player player;
     parseCommandLine(argc, argv, player);
    player.run(argc, argv, infiles.front(), url);
接 受可执行文件带入的参数,并将参数传递给    parseCommandLine(argc, argv, player);然后,开始处理参数中的信息player.run(argc, argv, infiles.front(), url);而在player.run()中可以看到init_logfile()、init_media()、init_sound()、 init_gui();

你可能感兴趣的:(嵌入式,qt,flv,代码分析,gtk,桌面环境)