Android一詞的本義指“機器人”,同時也是Google于2007年11月5日宣布的基于Linux平臺的開源手機操作系統的名稱,該平臺由操作系統、中間件、用戶界面和應用軟件組成,號稱是首個為移動終端打造的真正開放和完整的移動軟件。目前,最新版本為Android 2.4 Gingerbread和Android 3.0 Honeycomb.Android是基于Linux內核的操作系統,是Google公司在2007年11月5日公布的手機操作系統。它采用了軟件堆層(software stack,又名軟件疊層)的架構,主要分為三部分。底層Linux內核只提供基本功能,其他的應用軟件則由各公司自行開發,部分程序以Java編寫。我們可以通過本文介紹的Android多媒體框架的源碼解讀,來具體分析一下這方面的基本知識。
重力感應裝置包括感應器、處理器和控制器三個部分。感應器負責偵測存儲器的狀態,計算存儲器的重力加速度值;處理器則對加速度值是否超出安全范圍進行判斷;而控制器則負責控制將磁頭鎖定或者釋放出安全停泊區。一旦感應器偵測并經處理器判斷當前的重力加速度超過安全值之后,控制器就會通過硬件控制磁頭停止讀寫工作,并快速歸位,鎖定在專有的磁頭停泊區。這一系列動作會在200毫秒內完成。當感應裝置探測到加速度值恢復到正常值范圍之后,產品才會恢復工作。
Android多媒體框架的代碼在以下目錄中:external/opencore/。這個目錄是Android多媒體框架的根目錄,其中包含的子目錄如下所示:
* android:這里面是一個上層的庫,它基于PVPlayer和PVAuthor的SDK實現了一個為Android使用的Player和Author.
* baselibs:包含數據結構和線程安全等內容的底層庫
* codecs_v2:這是一個內容較多的庫,主要包含編解碼的實現,以及一個OpenMAX的實現
* engines:包含PVPlayer和PVAuthor引擎的實現
* extern_libs_v2:包含了khronos的OpenMAX的頭文件
* fileformats:文件格式的據具體解析(parser)類
* nodes:編解碼和文件解析的各個node類。
* oscl:操作系統兼容庫
* pvmi: 輸入輸出控制的抽象接口
* protocols:主要是與網絡相關的RTSP、RTP、HTTP等協議的相關內容
* pvcommon:pvcommon庫文件的Android.mk文件,沒有源文件。
* pvplayer:pvplayer庫文件的Android.mk文件,沒有源文件。
* pvauthor:pvauthor庫文件的Android.mk文件,沒有源文件。
* tools_v2:編譯工具以及一些可注冊的模塊。
Splitter的定義與初始化
以wav的splitter為例,在fileformats目錄下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目錄下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。
我們由底往上看,vwavfileparser.cpp中的PV_Wav_Parser類有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成員函數,此類應該就是最終的解析類。我們搜索PV_Wav_Parser類被用到的地方可知,在PVMFWAVFFParserNode類中有PV_Wav_Parser的一個指針成員變量。
再搜索可知,PVMFWAVFFParserNode類是通過PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成員函數生成的。而CreatePVMFWAVFFParserNode()函數是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()類構造函數中通過PVPlayerNodeInfo類被注冊到Oscl_Vector 的vector中,在這個構造函數中,AMR,mp3等node也是同樣被注冊的。
由上可知,Android多媒體框架中對splitter的管理也是與ffmpeg等類似,都是在框架的初始化時注冊的,只不過Opencore注冊的是每個splitter的factory函數。
綜述一下splitter的定義與初始化過程:
每個splitter都在fileformats目錄下有個對應的子目錄,其下有各自的解析類。
每個splitter都在nodes目錄下有關對應的子目錄,其下有各自的統一接口的node類和node factory類。
播放引擎PVPlayerEngine類中有PVPlayerNodeRegistry iPlayerNodeRegistry成員變量。
在PVPlayerNodeRegistry的構造函數中,將 AMR, AAC, MP3等splitter的輸入與輸出類型標示和node factory類中的create node與release delete接口通過PVPlayerNodeInfo類push到Oscl_Vector iType成員變量中。
當前Splitter的匹配過程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector& aUuids)函數的功能是根據輸入類型和輸出類型,在已注冊的node vector中尋找是否有匹配的node,有的話傳回其唯一識別標識PVUuid.
從QueryRegistry這個函數至底向上搜索可得到,在android中splitter的匹配過程如下:
android_media_MediaPlayer.cpp之中定義了一個JNINativeMethod(JAVA本地調用方法)類型的數組gMethods,供java代碼中調用MultiPlayer類的setDataSource成員函數時找到對應的c++函數
1.{“setDataSource”, “(Ljava/lang/String;)V”, (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函數中先得到當前的MediaPlayer實例,然后調用其setDataSource函數,傳入路徑
3.status_t MediaPlayer::setDataSource(const char *url)
此函數通過調getMediaPlayerService()先得到當前的MediaPlayerService, const sp& service(getMediaPlayerService());
然后新建一個IMediaPlayer變量, sp player(service-》create(getpid(), this, fd, offset, length));
在sp MediaPlayerService::create(pid_t pid, const sp& client, const char* url)中
調status_t MediaPlayerService::Client::setDataSource(const char *url)函數,Client是MediaPlayerService的一個內部類。
在MediaPlayerService::Client::setDataSource中,調sp MediaPlayerService::Client::createPlayer(player_type playerType)
生成一個繼承自MediaPlayerBase的PVPlayer實例。
以上就是對Android多媒體框架的源代碼的解讀。
-
處理器
+關注
關注
68文章
19485瀏覽量
231516 -
控制器
+關注
關注
113文章
16508瀏覽量
179968 -
Android
+關注
關注
12文章
3946瀏覽量
128181
發布評論請先 登錄
相關推薦
CEVA推出用于高能效多內核系統的AMF - Android多媒體框架
基于ARM Linux QT的掌上多媒體系統的設計和實現 (1)
多媒體空中鼠標
多媒體空中鼠標
采用Au1200實現多媒體播放終端設計
怎么實現在嵌入式環境下使用QT多媒體框架?
ART-PI重力感應無線智能小車設計實現
HarmonyOS多媒體框架介紹
凌陽多媒體獲授權采用CEVA MM2000多媒體解決方案開發
Viosoft推出針對MIPS-Based數字多媒體設計的A
基于JMF的多媒體遠程監控系統的設計

評論