《Android系統級深入開發--移植與調試》第18章OpenMax多媒體引擎,本章開始介紹編結碼較下層的标準子產品OpenMax插件。本節為大家介紹OpenMax IL層的接口。
AD:
18.2.1 OpenMax IL層的接口(2)
OMX_COMPONENTTYPE結構體實作後,其中的各個函數指針就是調用者可以使用的内容。各個函數指針和OMX_core.h中定義的内容相對應。
EmptyThisBuffer和FillThisBuffer是驅動元件運作的基本的機制,前者表示讓元件消耗緩沖區,表示對應元件輸入的内容;後者表示讓元件填充緩沖區,表示對應元件輸出的内容。
UseBuffer,AllocateBuffer,FreeBuffer為和端口相關的緩沖區管理函數,對于元件的端口有些可以自己配置設定緩沖區,有些可以使用外部的緩沖區,是以有不同的接口對其進行操作。
SendCommand表示向元件發送控制類的指令。GetParameter,SetParameter,GetConfig,SetConfig幾個接口用于輔助的參數和配置的設定和擷取。
ComponentTunnelRequest用于元件之間的隧道化連接配接,其中需要制定兩個元件及其相連的端口。
ComponentDeInit用于元件的反初始化。
提示:OpenMax函數的參數中,經常包含OMX_IN和OMX_OUT等宏,它們的實際内容為空,隻是為了标記參數的方向是輸入還是輸出。
OMX_Component.h中端口類型的定義為OMX_PORTDOMAINTYPE枚舉類型,内容如下所示:
- typedef enum OMX_PORTDOMAINTYPE {
- OMX_PortDomainAudio, /* 音頻類型端口 */
- OMX_PortDomainVideo, /* 視訊類型端口 */
- OMX_PortDomainImage, /* 圖像類型端口 */
- OMX_PortDomainOther, /* 其他類型端口 */
- OMX_PortDomainKhronosExtensions = 0x6F000000,
- OMX_PortDomainVendorStartUnused = 0x7F000000
- OMX_PortDomainMax = 0x7ffffff
- } OMX_PORTDOMAINTYPE;
音頻類型,視訊類型,圖像類型,其他類型是OpenMax IL層此所定義的四種端口的類型。
端口具體内容的定義使用OMX_PARAM_PORTDEFINITIONTYPE類(也在OMX_Component.h中定義)來表示,其内容如下所示:
- typedef struct OMX_PARAM_PORTDEFINITIONTYPE {
- OMX_U32 nSize; /* 結構體大小 */
- OMX_VERSIONTYPE nVersion; /* 版本*/
- OMX_U32 nPortIndex; /* 端口号 */
- OMX_DIRTYPE eDir; /* 端口的方向 */
- OMX_U32 nBufferCountActual; /* 為這 個端口實際配置設定的Buffer的數目 */
- OMX_U32 nBufferCountMin; /* 這個 端口最小Buffer的數目*/
- OMX_U32 nBufferSize; /* 緩沖區的位元組數 */
- OMX_BOOL bEnabled; /* 是否使能 */
- OMX_BOOL bPopulated; /* 是否在填充 */
- OMX_PORTDOMAINTYPE eDomain; /* 端口的類型 */
- union { /* 端口實際 的内容,由類型确定具體結構 */
- OMX_AUDIO_PORTDEFINITIONTYPE audio;
- OMX_VIDEO_PORTDEFINITIONTYPE video;
- OMX_IMAGE_PORTDEFINITIONTYPE image;
- OMX_OTHER_PORTDEFINITIONTYPE other;
- } 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_StateInvalid, /* 元件監 測到内部的資料結構被破壞 */
- OMX_StateLoaded, /* 元件被 加載但是沒有完成初始化 */
- OMX_StateIdle, /* 元件初 始化完成,準備開始 */
- OMX_StateExecuting, /* 元件接受了 開始指令,正在樹立資料 */
- OMX_StatePause, /* 元件接受暫停指令*/
- OMX_StateWaitForResources, /* 元件正在等待資源 */
- OMX_StateKhronosExtensions = 0x6F000000, /* 保留 */
- OMX_StateVendorStartUnused = 0x7F000000, /* 保留 */
- OMX_StateMax = 0X7FFFFFFF
- } OMX_STATETYPE;
OpenMax元件的狀态機可以由外部的指令改變,也可以由内部發生的情況改變。OpenMax IL元件的狀态機的遷移關系如圖18-6所示。
![]() |
圖18-6 OpenMax IL元件的狀态機的遷移關系 |
OMX_Core.h中定義的枚舉類型OMX_COMMANDTYPE表示對元件的指令類型,内容如下所示:
- typedef enum OMX_COMMANDTYPE
- {
- OMX_CommandStateSet, /* 改變狀态機器 */
- OMX_CommandFlush, /* 重新整理資料隊列 */
- OMX_CommandPortDisable, /* 禁止端口 */
- OMX_CommandPortEnable, /* 使能端口 */
- OMX_CommandMarkBuffer, /* 标 記元件或Buffer用于觀察 */
- OMX_CommandKhronosExtensions = 0x6F000000, /* 保留 */
- OMX_CommandVendorStartUnused = 0x7F000000, /* 保留 */
- OMX_CommandMax = 0X7FFFFFFF
- } OMX_COMMANDTYPE;
OMX_COMMANDTYPE類型在SendCommand調用中作為參數被使用,其中OMX_CommandStateSet就是改變狀态機的指令。