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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章