openmax il層的介面定義由若干個標頭檔案組成,這也是實現它需要實現的內容,它們的基本描述如下所示。
omx_types.h:openmax il的資料型別定義
omx_core.h:openmax il核心的api
omx_other.h:其他資料結構(包括a/v 同步)
omx_index.h:openmax il定義的資料結構索引
omx_contentpipe.h:內容的管道定義
其中,omx_component.h中定義的omx_componenttype結構體是openmax il層的核心內容,表示乙個元件,其內容如下所示:
typedef struct omx_componenttype
omx_componenttype;
omx_componenttype結構體實現後,其中的各個函式指標就是呼叫者可以使用的內容。各個函式指標和omx_core.h中定義的內容相對應。
emptythisbuffer和fillthisbuffer是驅動元件執行的基本的機制,前者表示讓元件消耗緩衝區,表示對應元件輸入的內容;後者表示讓元件填充緩衝區,表示對應元件輸出的內容。
usebuffer,allocatebuffer,freebuffer為和埠相關的緩衝區管理函式,對於元件的埠有些可以自己分配緩衝區,有些可以使用外部的緩衝區,因此有不同的介面對其進行操作。
sendcommand表示向元件傳送控制類的命令。getparameter,setparameter,getconfig,setconfig幾個介面用於輔助的引數和配置的設定和獲取。
componenttunnelrequest用於元件之間的隧道化連線,其中需要制定兩個元件及其相連的埠。
componentdeinit用於元件的反初始化。
omx_component.h中埠型別的定義為omx_portdomaintype列舉型別,內容如下所示:
typedef enum omx_portdomaintype omx_portdomaintype;
埠具體內容的定義使用omx_param_portdefinitiontype類(也在omx_component.h中定義)來表示,其內容如下所示:
typedef struct omx_param_portdefinitiontype format;
omx_bool bbufferscontiguous;
omx_u32 nbufferalignment;
} omx_param_portdefinitiontype;
對於乙個埠,其重點的內容如下。
埠的方向(omx_dirtype):包含omx_dirinput(輸入)和omx_diroutput(輸出)兩種
埠分配的緩衝區數目和最小緩衝區數目
埠的型別(omx_portdomaintype):可以是四種型別
埠格式的資料結構:使用format聯合體來表示,具體由四種不同型別來表示,與埠的型別相對應
omx_audio_portdefinitiontype,omx_video_portdefinitiontype,omx_image_portdefinitiontype 和omx_other_portdefinitiontype等幾個具體的格式型別,分別在 omx_audio.h,omx_video.h,omx_image.h和omx_other.h這四個標頭檔案中定義。
omx_bufferheadertype是在omx_core.h中定義的,表示乙個緩衝區的頭部結構。
omx_core.h中定義的列舉型別omx_statetype命令表示openmax的狀態機,內容如下所示:
typedef enum omx_statetype
omx_statetype;
openmax元件的狀態機可以由外部的命令改變,也可以由內部發生的情況改變。openmax il元件的狀態機的遷移關係如圖18-6所示。
圖18-6 openmax il元件的狀態機的遷移關係
omx_core.h中定義的列舉型別omx_commandtype表示對元件的命令型別,內容如下所示:
typedef enum omx_commandtype
omx_commandtype;
omx_commandtype型別在sendcommand呼叫中作為引數被使用,其中omx_commandstateset就是改變狀態機的命令。
對於openmax il層的實現,一般的方式並不呼叫openmax dl層。具體實現的內容就是各個不同的元件。openmax il元件的實現包含以下兩個步驟。
元件的初始化函式:硬體和openmax資料結構的初始化,一般分成函式指標初始化、私有資料結構的初始化、埠的初始化等幾個步驟,使用其中的 pcomponentprivate成員保留本元件的私有資料為上下文,最後獲得填充完成omx_componenttype型別的結構體
omx_componenttype型別結構體的各個指標:實現其中的各個函式指標,需要使用私有資料的時候,從其中的pcomponentprivate得到指標,轉化成實際的資料結構使用
android中openMax的實現
2.source 主要是和協議打交道,demux 分解容器部分,大多數的容器格式的分解是不需要通過硬體來支援。只是ts流這種格式最可能用到硬體的支援。因為ts格式比較特殊,單包的大小太小了,只有188位元組。所以也是為什麼現在常見的解碼晶元都會提供硬體ts demux 的支援。所以openmax 中...
介面實現與配置實現
在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...
介面實現與配置實現
在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...