多媒體編解碼】Openmax IL (一)官方文檔概述

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 (平臺不相關):

相關文章
相關標籤/搜索