在OpenCORE中,媒體引擎從編解碼的類型上可以分為3種:播放引擎(PVPlayer Engine)、記錄引擎(PVAuthor Engine)、雙向引擎(PV2way Engine)。另外適配器引擎(Adapter Engine)和元數(shù)據(jù)引擎(PV Metadata Engine)也是不可缺少的一部分,本文重點介紹的是PVPlayerInterface播放引擎。
PVPlayer Engine播放引擎
在OpenCORE中,目前支持的播放媒體格式包括MP4、3GPP、RSTP流會話和SMIL等。播放引擎依賴于OSCL、PVMF、OMX IL等組件。
下圖中描述了播放引擎的主要接口類圖,客戶端通過PVPlayerInterface獲得播放引擎進行相關(guān)的操作,而播放引擎則利用3個觀察器PVMFNodeCmdStatusObserver、PVMFNodeInfoEventObserver、PVMFNodeErrorEventObserver來為客戶端提供異步的命令完成狀況和異常信息等消息。

播放接口類圖
需要說明的是,在一般情況下,在上層應(yīng)用和播放引擎之間不需要適配器,但如果PVPlayerInterface提供的接口無法滿足上層應(yīng)用的需要,就需要在OSCL和上層應(yīng)用之間構(gòu)建一個基于新OSCL接口的適配層。在為特定平臺或者操作系統(tǒng)做OpenCORE移植時,這種設(shè)計策略常常需要。
播放引擎的實現(xiàn)主要位于external\opencore\engines\player目錄中,下圖顯示的是播放引擎的類圖。

播放引擎主要類圖
播放引擎具有較復(fù)雜的運行環(huán)境,為了便于播放引擎的運行,播放引擎引入了狀態(tài)機的設(shè)計框架。在OpenCORE中,播放引擎的狀態(tài)切換是基于PVPlayerInterface接口的,相互的狀態(tài)觸發(fā)事件由下層的PVMF組件發(fā)出。相關(guān)的狀態(tài)在pv_player_types.h文件中定義。
在完成引擎的初始化后,播放引擎將處于PVP_STATE_IDLE狀態(tài),在該狀態(tài)下,通過PVPlayerEngine::AddDataSource()方法可以將數(shù)據(jù)源添加到引擎中,在添加數(shù)據(jù)源成功后,通過PVPlayerEngine::Init()方法發(fā)送PVP_ENGINE_COMMAND_INIT命令,引擎將會轉(zhuǎn)換為PVP_STATE_INITIALIZED狀態(tài)。
在PVP_STATE_INITIALIZED狀態(tài)下,客戶端可以查詢數(shù)據(jù)源的各種信息,如媒體軌跡、元數(shù)據(jù)等。同時通過PVPlayerEngine::AddDataSink()方法可以添加播放引擎的數(shù)據(jù)槽。在完成添加數(shù)據(jù)槽的操作后,通過PVPlayerEngine::Prepare()方法發(fā)送PVP_ENGINE_ COMMAND_PREPARE命令,引擎將會轉(zhuǎn)換為PVP_ENGINE_STATE_PREPARING狀態(tài)。
在PVP_ENGINE_STATE_PREPARING狀態(tài),數(shù)據(jù)源將會為接下來的媒體播放進行一個排序方面的準(zhǔn)備,然后通過PVPlayerEngine::Start()方法發(fā)送PVP_ENGINE_ COMMAND_START命令,引擎將會轉(zhuǎn)換為PVP_STATE_STARTED狀態(tài),開始播放媒體。
在PVP_STATE_STARTED狀態(tài),用戶可以執(zhí)行暫停、停止等操作,如果執(zhí)行了PVPlayerEngine::Stop()方法操作,引擎將會轉(zhuǎn)換為PVP_STATE_INITIALIZED狀態(tài);如果執(zhí)行PVPlayerEngine::Pause()方法操作,引擎將會轉(zhuǎn)換為PVP_STATE_PAUSED狀態(tài)。
在PVP_STATE_PAUSED狀態(tài),用戶可以執(zhí)行恢復(fù)、停止等操作,如果執(zhí)行了PVPlayerEngine::Stop()方法操作,引擎將會轉(zhuǎn)換為PVP_STATE_INITIALIZED狀態(tài);如果執(zhí)行PVPlayerEngine:: Resume()方法操作,引擎將會轉(zhuǎn)換為PVP_STATE_STARTED狀態(tài)。
在執(zhí)行操作的過程中,如果發(fā)生了錯誤或者異常,系統(tǒng)將會轉(zhuǎn)為PVP_STATE_ERROR狀態(tài),并嘗試從錯誤中恢復(fù)。如果發(fā)生的是無法恢復(fù)的錯誤,引擎將會清除所有痕跡,轉(zhuǎn)為PVP_STATE_IDLE狀態(tài)。如果錯誤可以恢復(fù),在出錯前狀態(tài)為PVP_STATE_INITIALIZED、PVP_STATE_PREPARED、PVP_STATE_STARTED、PVP_STATE_PAUSED等時,引擎將會轉(zhuǎn)為PVP_STATE_INITIALIZED狀態(tài),否則引擎轉(zhuǎn)為PVP_STATE_IDLE狀態(tài)。當(dāng)出錯恢復(fù)完成時,引擎將會發(fā)送相關(guān)的異步消息通知。下圖顯示了播放引擎的狀態(tài)圖。

播放引擎狀態(tài)圖
需要說明的是,在默認情況下,播放引擎并不是多線程安全的,為了支持多線程,可以有兩種方法,一種方法是利用OSCL代理接口組件提供多線程支持,另一種方法是在適配層中為特定平臺添加多線程支持。