天天看點

OpenMax IL層的接口 3

《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枚舉類型,内容如下所示:

  1. typedef enum OMX_PORTDOMAINTYPE {  
  2.     OMX_PortDomainAudio,        /* 音頻類型端口 */  
  3.     OMX_PortDomainVideo,        /* 視訊類型端口 */  
  4.     OMX_PortDomainImage,        /* 圖像類型端口 */  
  5.     OMX_PortDomainOther,        /* 其他類型端口 */  
  6.     OMX_PortDomainKhronosExtensions = 0x6F000000,  
  7.     OMX_PortDomainVendorStartUnused = 0x7F000000 
  8.     OMX_PortDomainMax = 0x7ffffff 
  9. } OMX_PORTDOMAINTYPE; 

音頻類型,視訊類型,圖像類型,其他類型是OpenMax IL層此所定義的四種端口的類型。

端口具體内容的定義使用OMX_PARAM_PORTDEFINITIONTYPE類(也在OMX_Component.h中定義)來表示,其内容如下所示:

  1. typedef struct OMX_PARAM_PORTDEFINITIONTYPE {  
  2.     OMX_U32 nSize;                      /* 結構體大小 */  
  3.     OMX_VERSIONTYPE nVersion;           /* 版本*/  
  4.     OMX_U32 nPortIndex;             /* 端口号 */  
  5.     OMX_DIRTYPE eDir;                   /* 端口的方向 */  
  6.     OMX_U32 nBufferCountActual;         /* 為這 個端口實際配置設定的Buffer的數目 */  
  7.     OMX_U32 nBufferCountMin;            /* 這個 端口最小Buffer的數目*/  
  8.     OMX_U32 nBufferSize;                /* 緩沖區的位元組數 */  
  9.     OMX_BOOL bEnabled;                  /* 是否使能 */  
  10.     OMX_BOOL bPopulated;                /* 是否在填充 */  
  11.     OMX_PORTDOMAINTYPE eDomain;         /* 端口的類型 */  
  12.     union {                         /* 端口實際 的内容,由類型确定具體結構 */  
  13.         OMX_AUDIO_PORTDEFINITIONTYPE audio;  
  14.         OMX_VIDEO_PORTDEFINITIONTYPE video;  
  15.         OMX_IMAGE_PORTDEFINITIONTYPE image;  
  16.         OMX_OTHER_PORTDEFINITIONTYPE other;  
  17.     } format;  
  18.     OMX_BOOL bBuffersContiguous;  
  19.     OMX_U32 nBufferAlignment;  
  20. } 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的狀态機,内容如下所示:

  1. typedef enum OMX_STATETYPE  
  2. {  
  3.     OMX_StateInvalid,                   /* 元件監 測到内部的資料結構被破壞 */  
  4.     OMX_StateLoaded,                    /* 元件被 加載但是沒有完成初始化 */  
  5.     OMX_StateIdle,                      /* 元件初 始化完成,準備開始 */  
  6.     OMX_StateExecuting,             /* 元件接受了 開始指令,正在樹立資料 */  
  7.     OMX_StatePause,                     /* 元件接受暫停指令*/  
  8.     OMX_StateWaitForResources,      /* 元件正在等待資源 */  
  9.     OMX_StateKhronosExtensions = 0x6F000000, /* 保留 */  
  10.     OMX_StateVendorStartUnused = 0x7F000000, /* 保留 */  
  11.     OMX_StateMax = 0X7FFFFFFF 
  12. } OMX_STATETYPE; 

OpenMax元件的狀态機可以由外部的指令改變,也可以由内部發生的情況改變。OpenMax IL元件的狀态機的遷移關系如圖18-6所示。

OpenMax IL層的接口 3
圖18-6  OpenMax IL元件的狀态機的遷移關系

OMX_Core.h中定義的枚舉類型OMX_COMMANDTYPE表示對元件的指令類型,内容如下所示:

  1. typedef enum OMX_COMMANDTYPE  
  2. {  
  3.     OMX_CommandStateSet,                /* 改變狀态機器 */  
  4.     OMX_CommandFlush,                   /* 重新整理資料隊列 */  
  5.     OMX_CommandPortDisable,             /* 禁止端口 */  
  6.     OMX_CommandPortEnable,              /* 使能端口 */  
  7.     OMX_CommandMarkBuffer,              /* 标 記元件或Buffer用于觀察 */  
  8.     OMX_CommandKhronosExtensions = 0x6F000000, /* 保留 */  
  9.     OMX_CommandVendorStartUnused = 0x7F000000, /* 保留 */  
  10.     OMX_CommandMax = 0X7FFFFFFF 
  11. } OMX_COMMANDTYPE; 

OMX_COMMANDTYPE類型在SendCommand調用中作為參數被使用,其中OMX_CommandStateSet就是改變狀态機的指令。

繼續閱讀