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();
gnash源碼解析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.