




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、OpenMax多媒體弓I擎2011-01-1812:041944人閱讀評(píng)論(2)收藏舉報(bào)摘自Android 系統(tǒng)級(jí)深入開(kāi)發(fā)一移植與調(diào)試18.1OpenMax 系統(tǒng)結(jié)構(gòu)和移植內(nèi)容OpenMax 是一個(gè)多媒體應(yīng)用程序的框架標(biāo)準(zhǔn)。其中,OpenMaxIL(集成層)技術(shù)規(guī)格定義了媒體組件接口,以便在嵌入式器件的流媒體框架中快速集成加速編解碼器。在 Android 中,OpenMaxIL 層,通??梢杂糜诙嗝襟w引擎的插件,Android 的多媒體引擎 OpenCore和 StageFright 都可以使用 OpenMax 作為插件,主要用于編解碼(Codec)處理。在 Android 的框架層,也定義了
2、由 Android 封裝的 OpenMax 接口,和標(biāo)準(zhǔn)的接口概念基本相同,但是使用 C+類(lèi)型的接口,并且使用了 Android 的 Binde 門(mén) PC 機(jī)制。Android 封裝OpenMax 的接口被 StageFright 使用, OpenCore 沒(méi)有使用這個(gè)接口, 而是使用其他形式對(duì) OpenMaxIL層接口進(jìn)行封裝。AndroidOpenMax 的基本層次結(jié)構(gòu)如圖 18-1 所示。相抱椎架,J標(biāo)準(zhǔn)OpenMAX1L展實(shí)現(xiàn)Android硬件一媒體邊界啊硬件圖18-1Android中OpenMax勺基本層次結(jié)構(gòu)18.1.1OpenMax 系統(tǒng)的結(jié)構(gòu)(1)16. OpenMax 總體層
3、次結(jié)構(gòu)OpenMax 是一個(gè)多媒體應(yīng)用程序的框架標(biāo)準(zhǔn),由 NVIDIA 公司和 Khronos 在 2006 年推出。OpenMax 是無(wú)授權(quán)費(fèi)的,跨平臺(tái)的應(yīng)用程序接口 API,通過(guò)使媒體加速組件能夠在開(kāi)發(fā)、集成和編程環(huán)節(jié)中實(shí)現(xiàn)跨多操作系統(tǒng)和處理器硬件平臺(tái),提供全面的流媒體編解碼器和應(yīng)用程序便攜化。OpenMax 的官方網(wǎng)站如下所示:/openmax/OpenMax 實(shí)際上分成三個(gè)層次,自上而下分別是,OpenMaxDL(開(kāi)發(fā)層),OpenMaxIL(集成層)和 OpenMaxAL(應(yīng)用層)。三個(gè)層次的內(nèi)容分別如下所示。第一層:OpenMaxDL(De
4、velopmentLayer,開(kāi)發(fā)層)OpenMaxDL 定義了一個(gè) API,它是音頻、視頻和圖像功能的集合。供應(yīng)商能夠在一個(gè)新的處理器上實(shí)現(xiàn)并優(yōu)化,然后編解碼供應(yīng)商使用它來(lái)編寫(xiě)更廣泛的編解碼器功能。它包括音頻信號(hào)的處理功能, 如 FFT 和 filter,圖像原始處理, 如顏色空間轉(zhuǎn)換、 視頻原始處理, 以實(shí)現(xiàn)例如 MPEG-4、H.264、MP3、AAC 和 JPEG 等編解碼器的優(yōu)化。第二層:OpenMaxIL(IntegrationLayer,集成層)OpenMaxIL 作為音頻、視頻和圖像編解碼器能與多媒體編解碼器交互,并以統(tǒng)一的行為支持組件(例如,資源和皮膚)。這些編解碼器或許是軟
5、硬件的混合體,對(duì)用戶(hù)是透明的底層接口應(yīng)用于嵌入式、移動(dòng)設(shè)備。它提供了應(yīng)用程序和媒體框架,透明的。S 編解碼器供應(yīng)商必須寫(xiě)私有的或者封閉的接口,集成進(jìn)移動(dòng)設(shè)備。IL 的主要目的是使用特征集合為編解碼器提供一個(gè)系統(tǒng)抽象,為解決多個(gè)不同媒體系統(tǒng)之間輕便性的問(wèn)題。第三層:OpenMaxAL(ApplictionLayer,應(yīng)用層)OpenMaxALAPI 在應(yīng)用程序和多媒體中間件之間提供了一個(gè)標(biāo)準(zhǔn)化接口,多媒體中間件提供服務(wù)以實(shí)現(xiàn)被期待的 API 功能。OpenMax 的三個(gè)層次如圖 18-2 所示。OpenMaxAPI 將會(huì)與處理器一同提供, 以使庫(kù)和編解碼器開(kāi)發(fā)者能夠高速有效地利用新器件的完整加速
6、潛能,無(wú)須擔(dān)心其底層的硬件結(jié)構(gòu)。該標(biāo)準(zhǔn)是針對(duì)嵌入式設(shè)備和移動(dòng)設(shè)備的多媒體軟件架構(gòu)。在架構(gòu)底層上為多媒體的編解碼和數(shù)據(jù)處理定義了一套統(tǒng)一的編程接口,對(duì)多媒體數(shù)據(jù)的處理功能進(jìn)行系統(tǒng)級(jí)抽象,為用戶(hù)屏蔽了底層的細(xì)節(jié)。因此,多媒體應(yīng)用程序和多媒體框架通過(guò) OpenMaxIL 可以以一種統(tǒng)一的方式來(lái)使用編解碼和其他多媒體數(shù)據(jù)處理功能,具有了跨越軟硬件平臺(tái)的移植性。提示:在實(shí)際的應(yīng)用中,OpenMax 的三個(gè)層次中使用較多的是 OpenMaxIL 集成層,由于操作系統(tǒng)到硬件的差異和多媒體應(yīng)用的差異,OpenMax 的 DL 和 AL 層使用相對(duì)較少。OpenMAX|ALPiaifoimH&dtjFi
7、aatenont1MedUEngin事CPUsDSP.AccelefjtorutcOpiUAXUiyecanbeimplementedtogelhorinciepeidentlyfrom(heother總 e圖 18-2OpenMax 的三個(gè)層次17. OpenMaxIL 層的結(jié)構(gòu)OpenMaxIL 目前已經(jīng)成為了事實(shí)上的多媒體框架標(biāo)準(zhǔn)。嵌入式處理器或者多媒體編解碼模塊的硬件生產(chǎn)者,通常提供標(biāo)準(zhǔn)的 OpenMaxIL 層的軟件接口,這樣軟件的開(kāi)發(fā)者就可以基于這個(gè)層次的標(biāo)準(zhǔn)化接口進(jìn)行多媒體程序的開(kāi)發(fā)。OpenMaxIL 的接口層次結(jié)構(gòu)適中,既不是硬件編解碼的接口,也不是應(yīng)用程序?qū)拥慕涌?因此比較
8、容易實(shí)現(xiàn)標(biāo)準(zhǔn)化。OpenMaxIL 的層次結(jié)構(gòu)如圖 18-3 所示。JIHMcmb,而由portaliftdepmdortMihrnedunhorm%JcomponffiliunbeinkgotMlintoMibkBMJLI辭罅 MIM*( (kwedItruninfliitdipnaahf 六 1OpenMAX,ILDef.nM3UpjVideo“RAIpfimtilorpcrtatMiilmcndnrI 一H 祉加皿 11 端*由 WUt/OpenMAX|DLbmktpmeMLaytr才 EmMti)ndttfkMrrtftyOcMbudl.犧麻趾兇 wlayerDrfimhihIMJau
9、rvtaehandFK4rdMMn(MM圖 18-3 中的虛線(xiàn)中的內(nèi)容是 OpenMaxIL 層的內(nèi)容,其主要實(shí)現(xiàn)了 OpenMaxIL 中的各個(gè)組件(Component)。對(duì)下層, OpenMaxIL 可以調(diào)用 OpenMaxDL 層的接口, 也可以直接調(diào)用各種 Codec實(shí)現(xiàn)。對(duì)上層,OpenMaxIL 可以給 OpenMaxAL 層等框架層(Middleware)調(diào)用,也可以給應(yīng)用程序直接調(diào)用。OpenMaxIL 主要內(nèi)容如下所示??蛻?hù)端(Client):OpenMaxIL 的調(diào)用者組件(Component):OpenMaxIL 的單元,每一個(gè)組件實(shí)現(xiàn)一種功能端口(Port):組件的輸入
10、輸出接口隧道化(Tunneled):讓兩個(gè)組件直接連接的方式OpenMaxIL 的基本運(yùn)作過(guò)程如圖 18-4 所示。ILClientMultimediaFramewo*kFrameworXCorpponenFrameworkComponentFrameworkComponentFrameworkComponentTunneledCommuiicationBourneComponent圖 18-4OpenMaxIL 的基本運(yùn)作過(guò)程如圖 18-4 所示,OpenMALIL 的客戶(hù)端,通過(guò)調(diào)用四個(gè) OpenMALIL 組件,實(shí)現(xiàn)了一個(gè)功能。四個(gè)組件分別是 Source 組件、Host 組件、Acce
11、lerator 組件和 Sink 組件。Source 組件只有一個(gè)輸出端口;而 Host 組件有一個(gè)輸入端口和一個(gè)輸出端口;Accelerator 組件具有一個(gè)輸入端口,調(diào)用了硬件的編解碼器,加速主要體現(xiàn)在這個(gè)環(huán)節(jié)上。Accelerator 組件和Sink 組件通過(guò)私有通訊方式在內(nèi)部進(jìn)行連接,沒(méi)有經(jīng)過(guò)明確的組件端口。OpenMALIL 在使用的時(shí)候,其數(shù)據(jù)流也有不同的處理方式:既可以經(jīng)由客戶(hù)端,也可以不經(jīng)由客戶(hù)端。圖 18-4 中,Source 組件到 Host 組件的數(shù)據(jù)流就是經(jīng)過(guò)客戶(hù)端的;而 Host 組件到 Accelerator 組件的數(shù)據(jù)流就沒(méi)有經(jīng)過(guò)客戶(hù)端,使用了隧道化的方式;Acc
12、elerator組件和 Sink 組件甚至可以使用私有的通訊方式。OpenMaxCore 是輔助各個(gè)組件運(yùn)行的部分,它通常需要完成各個(gè)組件的初始化等工作,在真正運(yùn)行過(guò)程中, 重點(diǎn)是各個(gè) OpenMaxIL 的組件, OpenMaxCore 不是重點(diǎn), 也不是標(biāo)準(zhǔn)。 OpenMALIL的組件是 OpenMaxIL 實(shí)現(xiàn)的核心內(nèi)容,一個(gè)組件以輸入、輸出端口為接口,端口可以被連接到另一個(gè)組件上。外部對(duì)組件可以發(fā)送命令,還進(jìn)行設(shè)置/獲取參數(shù)、配置等內(nèi)容。組件的端口可以包含緩沖區(qū)(Buffer)的隊(duì)列。組件的處理的核心內(nèi)容是:通過(guò)輸入端口消耗 Buffer,通過(guò)輸出端口填充 Buffer,由此多組件相聯(lián)
13、接可以構(gòu)成流式的處理。OpenMALIL 中一個(gè)組件的結(jié)構(gòu)如圖 18-5 所示。ComponentNon-TurmeledCommunicationIPCHardwareAcceleratedCodecIPCPrcpnearyComnnurifatiCMiAcceleratorComponeniHastJComponentILGMffltOrOthercomponeni圖 18-5OpenMALIL 中一個(gè)組件的結(jié)構(gòu)組件的功能和其定義的端口類(lèi)型密切相關(guān),通常情況下:只有一個(gè)輸出端口的,為 Source組件;只有一個(gè)輸入端口的,為 Sink 組件;有多個(gè)輸入端口,一個(gè)輸出端口的為 Mux 組件;
14、有一個(gè)輸入端口,多個(gè)輸出端口的為 DeMux 組件;輸入輸出端口各一個(gè)組件的為中間處理環(huán)節(jié),這是最常見(jiàn)的組件。端口具體支持的數(shù)據(jù)也有不同的類(lèi)型。例如,對(duì)于一個(gè)輸入、輸出端口各一個(gè)組件,其輸入端口使用 MP3 格式的數(shù)據(jù),輸出端口使用 PCM 格式的數(shù)據(jù),那么這個(gè)組件就是一個(gè) MP3解碼組件。隧道化(Tunneled)是一個(gè)關(guān)于組件連接方式的概念。 通過(guò)隧道化可以將不同的組件的一個(gè)輸入端口和一個(gè)輸出端口連接到一起,在這種情況下,兩個(gè)組件的處理過(guò)程合并,共同處理。尤其對(duì)于單輸入和單輸出的組件,兩個(gè)組件將作為類(lèi)似一個(gè)使用。18. Android 中 OpenMax 的使用情況Android 系統(tǒng)的一
15、些部分對(duì) OpenMaxIL 層進(jìn)行使用,基本使用的是標(biāo)準(zhǔn) OpenMaxIL 層的接口,只是進(jìn)行了簡(jiǎn)單的封裝。標(biāo)準(zhǔn)的 OpenMaxIL 實(shí)現(xiàn)很容易以插件的形式加入到 Android 系統(tǒng)中。Android 的多媒體引擎 OpenCore 和 StageFright 都可以使用 OpenMax 作為多媒體編解碼的插件,只是沒(méi)有直接使用 OpenMaxIL 層提供的純 C 接口,而是對(duì)其進(jìn)行了一定的封裝(C+封裝)。在Android2.x版本之后, Android的框架層也對(duì)OpenMaxIL層的接口進(jìn)行了封裝定義, 甚至使用Android中的 BinderIPC 機(jī)制。Stagefright
16、 使用了這個(gè)層次的接口,OpenCore 沒(méi)有使用。提示:OpenCore 使用 OpenMaxIL 層作為編解碼插件在前,Android 框架層封裝 OpenMax 接口在后面的版本中才引入。ILCi附ntCompxiertEventBulferSent.HandlerHandlerConigurationPortCallbacks18.1.2AndroidOpenMax 實(shí)現(xiàn)的內(nèi)容Android 中使用的主要是 OpenMax 的編解碼功能。雖然 OpenMax 也可以生成輸入、輸出、文件解析-構(gòu)建等組件,但是在各個(gè)系統(tǒng)(不僅是 Android)中使用的最多的還是編解碼組件。媒體的輸入、輸
17、出環(huán)節(jié)和系統(tǒng)的關(guān)系很大,引入 OpenMax 標(biāo)準(zhǔn)比較麻煩;文件解析-構(gòu)建環(huán)節(jié)一般不需要使用硬件加速。編解碼組件也是最能體現(xiàn)硬件加速的環(huán)節(jié),因此最常使用。在 Android 中實(shí)現(xiàn) OpenMaxIL 層和標(biāo)準(zhǔn)的 OpenMaxIL 層的方式基本,一般需要實(shí)現(xiàn)以下兩個(gè)環(huán)節(jié)。編解碼驅(qū)動(dòng)程序:位于 Linux 內(nèi)核空間,需要通過(guò) Linux 內(nèi)核調(diào)用驅(qū)動(dòng)程序,通常使用非標(biāo)準(zhǔn)的驅(qū)動(dòng)程序。OpenMaxIL 層:根據(jù) OpenMaxIL 層的標(biāo)準(zhǔn)頭文件實(shí)現(xiàn)不同功能的組件。Android 中還提供了 OpenMax 的適配層接口(對(duì) OpenMaxIL 的標(biāo)準(zhǔn)組件進(jìn)行封裝適配),它作為 Android
18、本地層的接口,可以被 Android 的多媒體引擎調(diào)用。18.2OpenMax 的接口與實(shí)現(xiàn)18.2.1OpenMaxIL 層的接口(1)OpenMaxIL 層的接口定義由若干個(gè)頭文件組成,這也是實(shí)現(xiàn)它需要實(shí)現(xiàn)的內(nèi)容,它們的基本描述如下所示。OMX_Types.h:OpenMaxIl 的數(shù)據(jù)類(lèi)型定義OMX_Core.h:OpenMaxIL 核心的 APIOMX_Component.h:OpenMaxIL 組件相關(guān)的 APIOMX_Audio.h:音頻相關(guān)的常量和數(shù)據(jù)結(jié)構(gòu)OMX_IVCommon.h:圖像和視頻公共的常量和數(shù)據(jù)結(jié)構(gòu)OMX_Image.h:圖像相關(guān)的常量和數(shù)據(jù)結(jié)構(gòu)OMX_Video
19、.h:視頻相關(guān)的常量和數(shù)據(jù)結(jié)構(gòu)OMX_Other.h:其他數(shù)據(jù)結(jié)構(gòu)(包括 A/V 同步)OMX_Index.h:OpenMaxIL 定義的數(shù)據(jù)結(jié)構(gòu)索引OMX_ContentPipe.h:內(nèi)容的管道定義提示:OpenMax 標(biāo)準(zhǔn)只有頭文件,沒(méi)有標(biāo)準(zhǔn)的庫(kù),設(shè)置沒(méi)有定義函數(shù)接口。對(duì)于實(shí)現(xiàn)者,需要實(shí)現(xiàn)的主要是包含函數(shù)指針的結(jié)構(gòu)體。其中,OMX_Component.h 中定義的 OMX_COMPONENTTYPE 結(jié)構(gòu)體是 OpenMaxIL 層的核心內(nèi)容,表示一個(gè)組件,其內(nèi)容如下所示:typedefstructOMX_COMPONENTTYPE1.2.OMX_U32nSize;/*大小*/3.OMX_
20、VERSIONTYPEnVersion;/*4.OMX_PTRpComponentPrivate;/*據(jù)指針.*/5./*調(diào)用者(ILclient)設(shè)置的指針, 用于保存它的私有數(shù)據(jù),傳回給所有的回調(diào)函數(shù)*/6.OMX_PTRpApplicationPrivate;7./*以下的函數(shù)指針?lè)祷?OMX_core.h 中的對(duì)應(yīng)內(nèi)容*/8.OMX_ERRORTYPE(*GetComponentVersion)(/*獲得組件的版本*/9.OMX_INOMX_HANDLETYPEhComponent,10.OMX_OUTOMX_STRINGpComponentName,11.OMX_OUTOMX_VER
21、SIONTYPE*pComponentVersion,12.OMX_OUTOMX_VERSIONTYPE*pSpecVersion,13.OMX_OUTOMX_UUIDTYPE*pComponentUUID);14.OMX_ERRORTYPE(*SendComman(/*發(fā)送命令*/15.OMX_INOMX_HANDLETYPEhComponent,16.OMX_INOMX_COMMANDTYPECmd,17.OMX_INOMX_U32nParam1,18.OMX_INOMX_PTRpCmdData);19.OMX_ERRORTYPE(*GetParameter)(/*獲得參數(shù)*/20.OMX
22、_INOMX_HANDLETYPEhComponent,21.OMX_INOMX_INDEXTYPEnParamIndex,22.OMX_INOUTOMX_PTRpComponentParameterStructure);23.OMX_ERRORTYPE(*SetParameter)(/*設(shè)置參數(shù)*/24.OMX_INOMX_HANDLETYPEhComponent,25.OMX_INOMX_INDEXTYPEnIndex,26.OMX_INOMX_PTRpComponentParameterStructure);27.OMX_ERRORTYPE(*GetConfig)(/*獲得配置*/28.
23、OMX_INOMX_HANDLETYPEhComponent,29.OMX_INOMX_INDEXTYPEnIndex,30.OMX_INOUTOMX_PTRpComponentConfigStructure);31.OMX_ERRORTYPE(*SetConfig)(/*設(shè)置配置*/32.OMX_INOMX_HANDLETYPEhComponent,1.這個(gè)結(jié)構(gòu)體的版本號(hào)*/這個(gè)組件的私有數(shù)33.OMX_INOMX_INDEXTYPEnIndex,34.OMX_INOMX_PTRpComponentCon 巾 gStructure);35.OMX_ERRORTYPE(*GetExtensio
24、nIndex)(/*轉(zhuǎn)換成 OMX 吉構(gòu)的索引*/36.OMX_INOMX_HANDLETYPEhComponent,37.OMX_INOMX_STRINGcParameterName,38.OMX_OUTOMX_INDEXTYPE*pIndexType);39.OMX_ERRORTYPE(*GetState)(/*獲得組件當(dāng)前的狀態(tài)*/40.OMX_INOMX_HANDLETYPEhComponent,41.OMX_OUTOMX_STATETYPE*pState);42.OMX_ERRORTYPE(*ComponentTunnelRequest)(/*用于連接到另一個(gè)組件*/43.OMX_I
25、NOMX_HANDLETYPEhComp,44.OMX_INOMX_U32nPort,45.OMX_INOMX_HANDLETYPEhTunneledComp,46.OMX_INOMX_U32nTunneledPort,47.OMX_INOUTOMX_TUNNELSETUPTYPE*pTunnelSetup);48.OMX_ERRORTYPE(*UseBuffer)(/*為某個(gè)端口使用 Buffer*/49.OMX_INOMX_HANDLETYPEhComponent,50.OMX_INOUTOMX_BUFFERHEADERTYPE*ppBufferHdr,51.OMX_INOMX_U32nP
26、ortIndex,52.OMX_INOMX_PTRpAppPrivate,53.OMX_INOMX_U32nSizeBytes,54.OMX_INOMX_U8*pBuffer);55.OMX_ERRORTYPE(*AllocateBuffer)(/*在某個(gè)端口分配 Buffer*/56.OMX_INOMX_HANDLETYPEhComponent,57.OMX_INOUTOMX_BUFFERHEADERTYPE*ppBuffer,58.OMX_INOMX_U32nPortIndex,59.OMX_INOMX_PTRpAppPrivate,60.OMX_INOMX_U32nSizeBytes);
27、61.OMX_ERRORTYPE(*FreeBuffer)(/*將某個(gè)端口 Buffer 釋放*/62.OMX_INOMX_HANDLETYPEhComponent,63.OMX_INOMX_U32nPortIndex,64.OMX_INOMX_BUFFERHEADERTYPE*pBuffer);65.OMX_ERRORTYPE(*EmptyThisBuffer)(/*讓組件消耗這個(gè) Buffer*/66.OMX_INOMX_HANDLETYPEhComponent,67.OMX_INOMX_BUFFERHEADERTYPE*pBuffer);68.OMX_ERRORTYPE(*FillThi
28、sBuffer)(/*讓組件填充這個(gè) Buffer*/69.OMX_INOMX_HANDLETYPEhComponent,70.OMX_INOMX_BUFFERHEADERTYPE*pBuffer);71.OMX_ERRORTYPE(*SetCallbacks)(/*設(shè)置回調(diào)函數(shù)*/72.OMX_INOMX_HANDLETYPEhComponent,73.OMX_INOMX_CALLBACKTYPE*pCallbacks,74.OMX_INOMX_PTRpAppData);75.OMX_ERRORTYPE(*ComponentDeInit)(/*反初始化組件*/76.OMX_INOMX_HAN
29、DLETYPEhComponent);77.OMX_ERRORTYPE(*UseEGLImage)(78.OMX_INOMX_HANDLETYPEhComponent,79.OMX_INOUTOMX_BUFFERHEADERTYPE*ppBufferHdr,80.OMX_INOMX_U32nPortIndex,81.OMX_INOMX_PTRpAppPrivate,82.OMX_INvoid*eglImage);83.OMX_ERRORTYPE(*ComponentRoleEnum)(84.OMX_INOMX_HANDLETYPEhComponent,85.OMX_OUTOMX_U8*cRol
30、e,86.OMX_INOMX_U32nIndex);87.OMX_COMPONENTTYPE;18.2.1OpenMaxIL 層的接口(2)OMX_COMPONENTTYPE 結(jié)構(gòu)體實(shí)現(xiàn)后,其中的各個(gè)函數(shù)指針就是調(diào)用者可以使用的內(nèi)容。各個(gè)函數(shù)指針和 OMX_core.h 中定義的內(nèi)容相對(duì)應(yīng)。EmptyThisBuffer 和 FillThisBuffer 是驅(qū)動(dòng)組件運(yùn)行的基本的機(jī)制,前者表示讓組件消耗緩沖區(qū),表示對(duì)應(yīng)組件輸入的內(nèi)容;后者表示讓組件填充緩沖區(qū),表示對(duì)應(yīng)組件輸出的內(nèi)容。UseBuffer,AllocateBuffer,FreeBuffer 為和端口相關(guān)的緩沖區(qū)管理函數(shù),對(duì)于組件的端
31、口有些可以自己分配緩沖區(qū),有些可以使用外部的緩沖區(qū),因此有不同的接口對(duì)其進(jìn)行操作。SendCommand 表示向組件發(fā)送控制類(lèi)的命令。GetParameter,SetParameter,GetConfig,SetConfig 幾個(gè)接口用于輔助的參數(shù)和配置的設(shè)置和獲取。ComponentTunnelRequest 用于組件之間的隧道化連接,其中需要制定兩個(gè)組件及其相連的端口。ComponentDeInit 用于組件的反初始化。提示:OpenMax 函數(shù)的參數(shù)中,經(jīng)常包含 OMX_IN 和 OMX_OUT 等宏,它們的實(shí)際內(nèi)容為空,只是為了標(biāo)記參數(shù)的方向是輸入還是輸出。OMX_Component.
32、h 中端口類(lèi)型的定義為 OMX_PORTDOMAINTYPE 枚舉類(lèi)型,內(nèi)容如下所示:1. typedefenumOMX_PORTDOMAINTYPE2. OMX_PortDomainAudio,3. OMX_PortDomainVideo,4. OMX_PortDomainImage,5. OMX_PortDomainOther,6. OMX_PortDomainKhronosExtensions=0 x6F000000,7. OMX_PortDomainVendorStartUnused=0 x7F0000008. OMX_PortDomainMax=0 x7ffffff9. OMX_PO
33、RTDOMAINTYPE;音頻類(lèi)型,視頻類(lèi)型,圖像類(lèi)型,其他類(lèi)型是 OpenMaxIL 層此所定義的四種端口的類(lèi)型。端口具體內(nèi)容的定義使用 OMX_PARAM_PORTDEFINITIONTYPE 類(lèi)(也在OMX_Component.h 中定義)來(lái)表示,其內(nèi)容如下所示:10.typedefstructOMX_PARAM_PORTDEFINITIONTYPE3.OMX_VERSIONTYPEnVersion;/*版本*/*端口號(hào)*/*端口的方向*/*為這個(gè)端口實(shí)際分配的 Buffer 的數(shù)目*/*這個(gè)端口最小 Buffer 的數(shù)目*/*緩沖區(qū)的字節(jié)數(shù)*/*是否使能*/*是否在填充*/2.%2OM
34、X_PORTDOMAINTYPEeDomain;3.%2union/*端口實(shí)際的內(nèi)容,由類(lèi)型確定具體結(jié)構(gòu)*/4.%2OMX_AUDIO_PORTDEFINITIONTYPEaudio;OMX_VIDEO_PORTDEFINITIONTYPEvideo;/*音頻類(lèi)型端口*/*視頻類(lèi)型端口*/*圖像類(lèi)型端口*/*其他類(lèi)型端口*/2.OMX_U32nSize;/*結(jié)構(gòu)體大小*/18OMX_U32nPortIndex;19OMX_DIRTYPEeDir;20OMX_U32nBufferCountActual;21OMX_U32nBufferCountMin;22OMX_U32nBufferSize;2
35、3OMX_BOOLbEnabled;24OMX_BOOLbPopulated;/*端口的類(lèi)型*/14.OMX_IMAGE_PORTDEFINITIONTYPEimage;2.%2.%3 OMX_OTHER_PORTDEFINITIONTYPEother;3.%2.%3 format;4.%2.%3 OMX_BOOLbBuffersContiguous;5.%2.%3 OMX_U32nBufferAlignment;6.%2.%3 OMX_PARAM_PORTDEFINITIONTYPE;對(duì)于一個(gè)端口,其重點(diǎn)的內(nèi)容如下。端口的方向(OMX_DIRTYPE):包含 OMX_DirInput(輸入)
36、和 OMX_DirOutput(輸出)兩種端口分配的緩沖區(qū)數(shù)目和最小緩沖區(qū)數(shù)目端口的類(lèi)型(OMX_PORTDOMAINTYPE):可以是四種類(lèi)型端口格式的數(shù)據(jù)結(jié)構(gòu):使用 format 聯(lián)合體來(lái)表示,具體由四種不同類(lèi)型來(lái)表示,與端口的類(lèi)型相對(duì)應(yīng)OMX_AUDIO_PORTDEFINITIONTYPE,OMX_VIDEO_PORTDEFINITIONTYPE,OMX_IMAGE_PORTDEFINITIONTYPE 和 OMX_OTHER_PORTDEFINITIONTYPE 等幾個(gè)具體的格式類(lèi)型,分別在OMX_Audio.h,OMX_Video.h,OMX_Image.h 和 OMX_Other
37、.h 這四個(gè)頭文件中定義。OMX_BUFFERHEADERTYPE 是在 OMX_Core.h 中定義的,表示一個(gè)緩沖區(qū)的頭部結(jié)構(gòu)。OMX_Core.h 中定義的枚舉類(lèi)型 OMX_STATETYPE 命令表示 OpenMax 的狀態(tài)機(jī),內(nèi)容如下所示:7.%2.%3 OMX_StateKhronosExtensions=0 x6F000000,/*保留*/8.%2.%3 OMX_StateVendorStartUnused=0 x7F000000,/*保留*/9.%2.%3 OMX_StateMax=0X7FFFFFFF10.%2.%3 OMX_STATETYPE;15.1.typedefenu
38、mOMX_STATETYPE2.3.OMX_StateInvalid,4.OMX_StateLoaded,5.OMX_StateIdle,6.OMX_StateExecuting,7.OMX_StatePause,8.OMXStateWaitForResources/*組件監(jiān)測(cè)到內(nèi)部的數(shù)據(jù)結(jié)構(gòu)被破壞*/*組件被加載但是沒(méi)有完成初始化*/*組件初始化完成,準(zhǔn)備開(kāi)始*/*組件接受了開(kāi)始命令,正在樹(shù)立數(shù)據(jù)*/*組件接受暫停命令*/*組件正在等待資源*/OpenMax 組件的狀態(tài)機(jī)可以由外部的命令改變,IL 組件的狀態(tài)機(jī)的遷移關(guān)系如圖 18-6 所示。也可以由內(nèi)部發(fā)生的情況改變。OpenMax圖 18
39、-6OpenMaxIL 組件的狀態(tài)機(jī)的遷移關(guān)系OMX_Core.h 中定義的枚舉類(lèi)型 OMX_COMMANDTYPE 表示對(duì)組件的命令類(lèi)型,內(nèi)容如下所示:4.OMX_CommandMax=0X7FFFFFFF5.OMX_COMMANDTYPE;OMX_COMMANDTYPE 類(lèi)型在 SendCommand 調(diào)用中作為參數(shù)被使用,其中OMX_CommandStateSet 就是改變狀態(tài)機(jī)的命令。18.3.1OpenMaxIL 實(shí)現(xiàn)的內(nèi)容對(duì)于 OpenMaxIL 層的實(shí)現(xiàn),一般的方式并不調(diào)用 OpenMaxDL 層。具體實(shí)現(xiàn)的內(nèi)容就是各個(gè)不同白組件。OpenMaxIL 組件的實(shí)現(xiàn)包含以下兩個(gè)步驟。
40、組件的初始化函數(shù):硬件和 OpenMax 數(shù)據(jù)結(jié)構(gòu)的初始化,一般分成函數(shù)指針初始化、私有數(shù)據(jù)結(jié)構(gòu)的初始化、端口的初始化等幾個(gè)步驟,使用其中的 pComponentPrivate 成員保留本組件的私有數(shù)據(jù)為上下文,最后獲得填充完成 OMX_COMPONENTTYPE 類(lèi)型的結(jié)構(gòu)體。OMX_COMPONENTTYPE 類(lèi)型結(jié)構(gòu)體的各個(gè)指針:實(shí)現(xiàn)其中的各個(gè)函數(shù)指針,需要使用1.typedefenumOMX_COMMANDTYPE2.3.OMX_CommandStateSet,4.OMX_CommandFlush,5.OMX_CommandPortDisable,6.OMX_CommandPortEn
41、able,7.OMX_CommandMarkBuffer,8.OMX_CommandKhronosExtensions=0 x6F000000,/*9.OMX_CommandVendorStartUnused=0 x7F000000,/*/*改變狀態(tài)機(jī)器*/*刷新數(shù)據(jù)隊(duì)列*/*禁止端口*/*使能端口*/*標(biāo)記組件或 Buffer 用于觀(guān)察*/保留*/保留*/私有數(shù)據(jù)的時(shí)候,從其中的 pComponentPrivate 得到指針,轉(zhuǎn)化成實(shí)際的數(shù)據(jù)結(jié)構(gòu)使用。端口的定義是 OpenMaxIL 組件對(duì)外部的接口。OpenMaxIL 常用的組件大都是輸入和輸出端口各一個(gè)。對(duì)于最常用的編解碼(Codec)
42、組件,通常需要在每個(gè)組件的實(shí)現(xiàn)過(guò)程中,調(diào)用硬件的編解碼接口來(lái)實(shí)現(xiàn)。在組件的內(nèi)部處理中,可以建立線(xiàn)程來(lái)處理。OpenMax 的組件的端口有默認(rèn)參數(shù),但也可以在運(yùn)行時(shí)設(shè)置,因此一個(gè)端口也可以支持不同的編碼格式。音頻編碼組件的輸出和音頻編碼組件的輸入通常是原始數(shù)據(jù)格式(PCM 格式),視頻編碼組件的輸出和視頻編碼組件的輸入通常是原始數(shù)據(jù)格式(YUV 格式)。提示:在一種特定的硬件實(shí)現(xiàn)中,編解碼部分具有相似性,因此通??梢詷?gòu)建一個(gè) OpenMax 組件的基類(lèi)”或者公共函數(shù),來(lái)完成公共性的操作。18.3.2Android 中 OpenMax 的適配層Android 中的 OpenMax 適配層的接口在
43、frameworks/base/include/media/目錄中的 IOMX.h 文件定義,其內(nèi)容如下所示:1.classIOMX:publicIInterface2.public:3.DECLARE_META_INTERFACE(OMX);4.typedefvoid*buffer_id;5.typedefvoid*node_id;6.virtualboollivesLocally(pid_tpid)=0;7.structComponentInfo/組件的信息8.String8mName;9.ListmRoles;10.;11.virtualstatus_tlistNodes(List*li
44、st)=0;/節(jié)點(diǎn)列表12.virtualstatus_tallocateNode(13.constchar*name,constsp&observer,/分配節(jié)點(diǎn)14.node_id*node)=0;15.virtualstatus_tfreeNode(node_idnode)=0;/找到節(jié)點(diǎn)16.virtualstatus_tsendCommand(/發(fā)送命令17.node_idnode,OMX_COMMANDTYPEOMX_S3param)=0;18.virtualstatus_tgetParameter(/獲得參數(shù)19.node_idnode,OMX_INDEXTYPEinde
45、x,20.void*params,size_tsize)=0;21.virtualstatus_tsetParameter(/設(shè)置參數(shù)22.node_idnode,OMX_INDEXTYPEindex,23.constvoid*params,size_tsize)=0;24.virtualstatus_tgetConfig(/獲得配置25.node_idnode,OMX_INDEXTYPEindex,26.void*params,size_tsize)=0;27.virtualstatus_tsetConfig(/設(shè)置配置28.node_idnode,OMX_INDEXTYPEindex,29
46、.constvoid*params,size_tsize)=0;30.virtualstatus_tuseBuffer(/使用緩沖區(qū)31.node_idnode,OMX_U32port_index,constsp¶ms,32.buffer_id*buffer)=0;33.virtualstatus_tallocateBuffer(/分配緩沖區(qū)34.node_idnode,OMX_U32port_index,size_tsize,35.buffer_id*buffer,void*buffer_data)=0;36.virtualstatus_tallocateBufferWith
47、Backup(/分配帶后備緩沖區(qū)37.node_idnode,OMX_U32port_index,constsp¶ms,38.buffer_id*buffer)=0;39.virtualstatus_tfreeBuffer(釋放緩沖區(qū)40.node_idnode,OMX_U30ort_index,buffer_idbuffer)=0;41.virtualstatus_tfillBuffer(node_idnode,buffer_idbuffer)=0;/填充緩沖區(qū)42.virtualstatus_temptyBuffer(/消耗緩沖區(qū)43.node_idnode,44.buff
48、er_idbuffer,45.OMX_U32range_offset,OMX_U32range_length,46.OMX_U32flags,OMX_TICKStimestamp)=0;47.virtualstatus_tgetExtensionIndex(48.node_idnode,49.constchar*parameter_name,50.OMX_INDEXTYPE*index)=0;51.virtualspcreateRenderer(/創(chuàng)建渲染器(從ISurface)52.constsp&surface,53.constchar*componentName,54.OMX_C
49、OLOR_FORMATTYPEcolorFormat,55.size_tencodedWidth,size_tencodedHeight,56.size_tdisplayWidth,size_tdisplayHeight)=0;57.spcreateRenderer(/創(chuàng)建渲染器(從Surface)58.constsp&surface,59.constchar*componentName,60.OMX_COLOR_FORMATTYPEcolorFormat,61.size_tencodedWidth,size_tencodedHeight,62.size_tdisplayWidth,s
50、ize_tdisplayHeight);63.spcreateRendererFromJavaSurface(/從 Java 層創(chuàng)建渲染器64.JNIEnv*env,jobjectjavaSurface,65.constchar*componentName,66.OMX_COLOR_FORMATTYPEcolorFormat,67.size_tencodedWidth,size_tencodedHeight,68.size_tdisplayWidth,size_tdisplayHeight);69.;IOMX 表示的是 OpenMax 的一個(gè)組件,根據(jù) Android 的 BinderIPC
51、機(jī)制,BnOMX 繼承 IOMX,實(shí)現(xiàn)者需要繼承實(shí)現(xiàn) BnOMX。IOMX 類(lèi)中,除了和標(biāo)準(zhǔn)的 OpenMax 的GetParameter,SetParameter,GetConfig,SetConfig,SendCommand,UseBuffer,AllocateBuffer,FreeBuffer,FillThisBuffer 和 EmptyThisBuffer 等接口之外, 還包含了創(chuàng)造渲染器的接口 createRenderer(),創(chuàng)建的接口為 IOMXRenderer 類(lèi)型。IOMX 中只有第一個(gè) createRenderer()函數(shù)是純虛函數(shù),第二個(gè)的 createRenderer(
52、)函數(shù)和createRendererFromJavaSurface()通過(guò)調(diào)用第一個(gè) createRenderer()函數(shù)實(shí)現(xiàn)。IOMXRenderer 類(lèi)表示一個(gè) OpenMax 的渲染器,其定義如下所示:classIOMXRenderer:publicIInterfacepublic:DECLARE_META_INTERFACE(OMXRenderer);3.virtualvoidrender(IOMX:buffer_idbuffer)=0;/染輸出函數(shù);IOMXRenderer 只包含了一個(gè) render 接口, 其參數(shù)類(lèi)型 IOMX:buffer_id 實(shí)際上是 void*,根據(jù)不同渲
53、染器使用不同的類(lèi)型。在 IOMX.h 文件中,另有表示觀(guān)察器類(lèi)的 IOMXObserver,這個(gè)類(lèi)表示 OpenMax 的觀(guān)察者,其中只包含一個(gè) onMessage()函數(shù),其參數(shù)為 omx_message 接口體,其中包含 Event 事件類(lèi)型、FillThisBuffer 完成和 EmptyThisBuffer 完成幾種類(lèi)型。提示: Android 中 OpenMax 的適配層是 OpenMAXIL 層至上的封裝層, 在 Android 系統(tǒng)中被 StageFright調(diào)用,也可以被其他部分調(diào)用。18.3OMAP 平臺(tái) OpenMaxIL 的硬件實(shí)現(xiàn)TIOpenMaxIL 實(shí)現(xiàn)的結(jié)構(gòu)和機(jī)制
54、Android 的開(kāi)源代碼中,已經(jīng)包含了 TI 的 OpenMaxIL 層的實(shí)現(xiàn)代碼,其路徑如下所示:hardware/ti/omap3/omx/其中包含的主要目錄如下所示。system:OpenMax 核心和公共部分audio:音頻處理部分的 OpenMaxIL 組件video:視頻處理部分 OpenMaxIL 組件image:圖像處理部分 OpenMaxIL 組件TIOpenMaxIL 實(shí)現(xiàn)的結(jié)構(gòu)如圖 18-7 所示。在 TIOpenMaxIL 實(shí)現(xiàn)中,最上面的內(nèi)容是 OpenMax 的管理者用于管理和初始化,中間層是各個(gè)編解碼單元的 OpenMaxIL 標(biāo)準(zhǔn)組件,下層是 LCML 層,供
55、各個(gè) OpenMaxIL 標(biāo)準(zhǔn)組件所調(diào)用。TIOpenMaxIL 實(shí)現(xiàn)的公共部分在 system/src/openmax_il/目錄中,主要的內(nèi)容如下所示。omx_core/src:OpenMaxIL 的核心,生成動(dòng)態(tài)庫(kù) libOMX_Core.solcml/:LCML 的工具庫(kù),生成動(dòng)態(tài)庫(kù)libLCML.soTIOpenMaxIL 的視頻(Video)相關(guān)的組件在 video/src/openmax_il/目錄中,主要的內(nèi)容如下所示。prepost_processor:Video 數(shù)據(jù)的前處理和后處理,生成動(dòng)態(tài)庫(kù) libOMX.TI.VPP.sovideo_decode:Video 解碼器,
56、生成動(dòng)態(tài)庫(kù) libOMX.TI.Video.Decoder.sovideo_encode:Video 編碼器,生成動(dòng)態(tài)庫(kù) libOMX.TI.Video.encoder.so圖 18-7TIOpenMaxIL 實(shí)現(xiàn)的結(jié)構(gòu)TIOpenMaxIL 的音頻(Audio)相關(guān)的組件在 audio/src/openmax_il/目錄中,主要的內(nèi)容如下所示。g711_dec:G711 解 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g711_enc:G711 編 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g722_dec:G722 解 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g722_enc:G722 編 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g7
57、26_dec:G726 解 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g726_enc:G726 編 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g729_dec:G729 解 碼 器 , 生 成 動(dòng) 態(tài) 庫(kù)g729_enc:G720 編碼器,生成動(dòng)態(tài)庫(kù)nbamr_dec:AMR 窄帶解碼器,生成動(dòng)態(tài)庫(kù)nbamr_enc:AMR 窄帶編碼器,生成動(dòng)態(tài)庫(kù)wbamr_dec:AMR 寬帶解碼器,生成動(dòng)態(tài)庫(kù)wbamr_enc:AMR 寬帶編碼器,生成動(dòng)態(tài)庫(kù)libOMX.TI.G711.decode.solibOMX.TI.G711.encode.solibOMX.TI.G722.decode.solibOMX.TI.G722
58、.encode.solibOMX.TI.G726.decode.solibOMX.TI.G726.encode.solibOMX.TI.G729.decode.solibOMX.TI.G729.encode.solibOMX.TI.AMR.decode.solibOMX.TI.AMR.encode.solibOMX.TI.WBAMR.decode.solibOMX.TI.WBAMR.encode.somp3_dec:MP3 解碼器,生成動(dòng)態(tài)庫(kù)aac_dec:AAC 解碼器,生成動(dòng)態(tài)庫(kù)aac_enc:AAC 編碼器,生成動(dòng)態(tài)庫(kù)libOMX.TI.MP3.decode.solibOMX.TI.AA
59、C.decode.solibOMX.TI.AAC.encode.sowma_dec:WMA 解碼器,生成動(dòng)態(tài)庫(kù) libOMX.TI.WMA.decode.soTIOpenMaxIL 的圖像(Image)相關(guān)的組件在 image/src/openmax_il/目錄中,主要的內(nèi)容如下所示。jpeg_enc:JPEG 編碼器,生成動(dòng)態(tài)庫(kù) libOMX.TI.JPEG.Encoder.sojpeg_dec:JPEG 解碼器,生成動(dòng)態(tài)庫(kù) libOMX.TI.JPEG.decoder.soTIOpenMaxIL 的核心和公共內(nèi)容LCML的全稱(chēng)是LinuxCommonMultimediaLayer,是TI的
60、Linux公共多媒體層。 在OpenMaxIL的實(shí)現(xiàn)中,這個(gè)內(nèi)容在 system/src/openmax_il/lcml/目錄中,主要文件是子目錄 src 中的 LCML_DspCodec.c 文件。通過(guò)調(diào)用 DSPBridge 的內(nèi)容,讓 ARM 和 DSP 進(jìn)行通信,然 DSP 進(jìn)行編解碼方面的處理。DSP 的運(yùn)行還需要固件的支持。TIOpenMaxIL 的核心實(shí)現(xiàn)在 system/src/openmax_il/omx_core/目錄中,生成 TIOpenMaxIL 的核心庫(kù)libOMX_Core.so。其中子目錄 src 中的 OMX_Core.c 為主要文件,其中定義了編解碼器的名稱(chēng)等,其片斷如下所示:0c05-Numbered
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高速鐵路設(shè)備采購(gòu)合同終止及運(yùn)營(yíng)維護(hù)協(xié)議
- 餐飲業(yè)專(zhuān)用商業(yè)房產(chǎn)租賃協(xié)議書(shū)
- 老人兒童護(hù)理課件
- 美術(shù)課件彩虹模板
- 公司獎(jiǎng)勵(lì)規(guī)章制度
- 生產(chǎn)車(chē)間10s管理制度
- 企業(yè)金融安全
- 建筑施工vr安全體驗(yàn)館
- 安全防范系統(tǒng)報(bào)告
- 2025年上半年征兵工作總結(jié)
- 2025年 濟(jì)南綜保控股集團(tuán)有限公司招聘考試試卷附答案
- 急性胰腺炎的治療指南講課件
- 2025年 武漢市檢察機(jī)關(guān)招聘檢察輔助人員考試試題附答案
- 2025年人工智能基礎(chǔ)及應(yīng)用考試試題及答案
- NPI流程管理制度
- 2025 年湖北省中考生物地理試卷
- 天然氣公司營(yíng)銷(xiāo)管理制度
- 2025至2030中國(guó)MO(有機(jī)金屬)來(lái)源行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢(xún)研究報(bào)告
- 2025年?yáng)|航食品招聘筆試參考題庫(kù)含答案解析
- 公司業(yè)績(jī)考核管理制度
- 高中新班主任培訓(xùn)
評(píng)論
0/150
提交評(píng)論