Openmax 框架圖:緩存
openmax il API概述框架
openmax il API 是基於組件的的多媒體API,包括core API和conponent API
core :函數
動態的加載和卸載conponent,容許用戶層和conponent直接通訊,容許用戶在兩個conponent之間創建隧道化通訊(tunnel
communication)學習
component:優化
在il層,conponent表明獨立的功能模塊,能夠有四種角色:sources,sinks,codecs,filters,splitters,mixers或者其餘的數據處理模塊,具體取決於其實現。可是在咱們的多媒體處理當中,一個組件,極可能是
某個硬件,軟件編解碼器,處理器或者以上組合。 系統組件概述。 參數描述包括 Buffer狀態,錯誤,一系列的回調函數等。
組件之間的通訊接口,稱之爲Port,表明組件和數據流之間的連接,以及保持連接所須要維護的buffers。code
主要包含四種組件:component
Sink :只有一個input port
Souece:只有一個output port
host: 徹底在主機上運行,有一個input和一個output
accelerator : 運行在鬆散耦合的加速器上,有一個inputblog
組件之間的三種通訊方式:接口
Non-tunneled:IL client和conponent之間進行數據交換的機制>Tunneling :組件之間的數據交換
Proprietary:組件之間可選的通訊方式圖片
通訊方式參考以下截圖:
組件狀態(OMX_STATETYPE)
組件的狀態變化,以下圖:
須要注意的是:
1,每一個組件的初始狀態都是 ubloaded
2,LOADED->IDLE 狀態遷移,須要申請全部須要的資源,資源不夠就會發生LOADED->WAIT FOR RESOURCES 狀態遷移。系統中存在一個廠商定製的resource manager來監控資源的變化而且發出通知,而且控制狀態遷移。處於IDLE意味着組件已經得到全部須要的資源。IL client會發出除了INVALID之外的狀態遷移控制。
3,EXECUTING 意味着組件正在等待接收buffer以處理數據,IDLE不會處理數據
4,PAUSED :維護緩衝區執行的上下文,而且不處理數據或交換緩衝區。 從PAUSED->EXECUTING 使緩存處理恢復到組件中止的位置。
5,PAUSED->IDLE EXECUTING->IDLE會致使數據處理所在的上下文確實
6,IDLE->LOADED 會致使操做資源的丟失,好比communication buffers丟失
通訊行爲:
和組件的數據通訊是非阻塞的,而且一旦ports的數量被配置,通訊就被使能。每一個port被配置特定的數據格式,而且組件也被置於正確的狀態。組件port的通訊方式都是不同的,好比:IL Client經過OMX_EmptyThisBuffer調用input port;經過OMX_FillThisBuffer 調用output port,相應的OMX_EmptyBufferDone OMX_FillBufferDone 回調函數在調用返回以前被觸發,以下圖示意:
關於port,須要明白:
1,每一個port都有基於組件定義的須要申請(Allocate)和使用(use)的最小buffer數。
2,一個port 將一個buffer header和buffer關聯。一個buffer header 指向buffer中間的數據,而且提供和buffer內容相關的metadate(元數據)。
tunneled buffer的申請和共享:
在一個tunnel中,一個port 把buffer提供給另外一個non-supplier port而且傳遞給它。提供者也會申請buffer。在某些正常狀況下,隧道組件能夠選擇從另外一個端口從新使用緩衝區,以免內存複製並優化內存使用。 這種作法是buffer共享。
在buffer共享的狀況下,一個組件經過OMX_EmptyThisBuffer從output port端向input port端傳輸buffer。
conponent profiles
base profile :只支持Proprietary 通訊,不支持tunnled
interop profile:和base的區別在於,支持tunnled 通訊。
一些專業術語:
supplier port:在一對tunneling中的兩個port之間,在鄰居port上調用UseBuffer的是 supplier
port,這個buffer supplier不須要申請新的buffer,而是重用其餘port的buffer。
tunneling port :
sharing port :
tunneling component:
關於所需的buffer要求,查閱結構體OMX_PORTDEFINITIONTYPE,port經過OMX_GetParameter。
在以後的學習中間,要解決的問題以下:
問題1:如何集成一個新的編解碼器?
問題2:如何肯定使用那個編解碼器?
問題3:openmax解碼流程?
集成到平臺商的自定義框架:如QCOM 集成到Android (平臺不相關):