Android Media Framework(一)OpenMAX 框架簡介

青山渺渺發表於2024-05-28

學習開原始碼最快的方式是先閱讀它的文件,再檢視它的標頭檔案,最後研讀程式碼實現並進行編譯除錯。Android早期引入OpenMAX IL作為使用音影片編解碼器的標準介面,瞭解Android Media框架的底層執行原理要從OMX IL開始。在這一節,我們將閱讀整理OpenMAX IL Spec中的介紹和架構部分,以便對整個框架有一個初步的概念。

閱讀材料openmax_il_spec_1_0.pdf可在khronos官網下載,也可在公眾號後臺回覆ILSpec獲取下載連結。

1、OMX IL簡介

OpenMAX Integration Layer(OMX IL,整合層)是由Khronos Group開發的一套低層級標準介面,旨在為編解碼器提供一定程度的抽象,使得嵌入式或移動裝置能夠統一呼叫音訊、影片和影像編解碼器,從而實現編解碼器實現程式碼和呼叫程式碼的跨平臺性。

OMX IL API由兩大主要部分組成,分別是Core API和Component API。

  • OMX IL Component:在OMX IL中元件表示獨立的功能模組,元件可能是source(源)、sinks(接收器)、codecs(編解碼器)、filters(過濾器)或任何其他資料處理模組,元件需要依據Component API來實現。與元件之間的資料通訊是透過稱為埠的介面進行的,使用者可以透過輸入埠向元件傳送資料,也可以透過輸出埠接收資料。
  • OMX IL Core:Core API主要用於動態載入解除安裝元件,呼叫元件方法;

將OMX IL API封裝並向上層提供高層級介面的部分被稱為IL Client(客戶端),IL Client使用OMX Core來載入元件,解除安裝元件,呼叫元件的方法。

為什麼Android要引入OMX IL?

  • Android系統可以跑在多種型別的裝置上,比如說手機、電視、平板或者是現在的車機上,這些裝置會有不同的晶片,手機用的比較多的是海思、高通、聯發科,電視見的比較多的是AML、RTK,這些晶片廠商會有自己編解碼器的實現(VPU API),Android作為一個通用平臺為了呼叫不同晶片的編解碼器引入了OMX IL框架,各大vendor(廠商)實現OMX IL提供的介面之後,開發者就可以用統一的介面使用硬體編解碼了。

2、OMX Component States

OMX IL為元件定義了一些狀態,元件使用過程中會經歷一系列的狀態轉換。OMX IL定義的狀態有Unloaded、Loaded、Idle、Executing、Paused、WaitForResources、Invalid,但Android中實際用到的只有Loaded、Idle、Executing、Invalid,因此後文中我們只介紹這麼多。

  • Loaded:元件建立後就會進入Loaded狀態,表示元件已經載入完成。
  • Idle:元件獲取到執行所需要的資源,但是還沒開始處理資料,這時候處在Idle(空閒)狀態。
  • Executing:元件正在執行、處理資料,這時候處在Executing狀態。
  • Invalid:元件執行或配置過程中出現錯誤進入到Invalid狀態。

3、OMX Component Architecture

spec中有一個OMX IL元件的架構圖,看懂它大致就能瞭解一個OMX元件應該如何實現了,這裡對架構圖做簡單描述:

  • OMX IL Client或其他元件需要使用元件控制代碼操作元件,元件操作可以劃分為三類:
    • 引數、配置的設定與獲取,這些操作是同步執行的,呼叫完即返回結果;
    • 命令的傳送,OMX元件需要維護一個Command Queue,OMX IL API使用非同步程式設計的思想,應用層可能會連續下發多個命令,因此使用佇列處理命令事務;
    • input、output buffer的傳送,input buffer填充完成後送給編解碼器使用,output buffer使用完成後送給編解碼器重新填充;
  • 在Android中元件會有兩個input、output port,每個port維護有一個佇列,佇列中儲存的是Buffer Header的指標,Buffer Header是一個結構體,指向真正的資料緩衝區。
  • OMX元件的資料輸出透過Callback完成,總共有三個callback:
    • input port callback:將用完的input buffer送回給IL Client;
    • output port callback:將填充好的output buffer送回給IL Client;
    • event callback:將OMX元件生成的事件傳送給IL Client;

4、Communication Behavior

這一節對port有更多的描述,port儲存有元件定義的要用的buffer的最小數量,buffer可能是由OMX元件自己分配,也有可能是使用預先分配的。port中的每一個buffer都會關聯到一個Buffer Header,Buffer Header除了指向緩衝區外還儲存有與緩衝區關聯的metadata(後設資料)。

5、Tunneled Buffer Allocation and Sharing

關注公眾號《青山渺渺》 獲取更多音影片開發內容

image

相關文章