什么是OpenMAX技术分析OpenMAX
什么是OpenMAX技術分析OpenMAX
OpenMAX是統一的抽象層,它允許訪問否則需要供應商特定API的硬件。
Broadcom的MMAL(多媒體抽象層API)。
因此,OpenMAX允許使用此類硬件的軟件的(某種)便攜式實現。本文概述Raspberry Pi的硬件媒體功能以及如何使用OpenMAX訪問它。Raspberry Pi Foundation提供的官方OpenMAX IL 1.1.2文檔和IL組件文檔構成了本文的基礎。(Khronos宣布OpenMAX為無效標準。無論如何。OpenMAX提供了對硬件的抽象,該硬件能夠對多媒體(音頻,圖像和視頻)執行操作。就像OpenGL(現在是Vulkan,所有這些都由同一個組織Khronos指定)一樣,它通過專門用于游戲等實時3D渲染的硬件進行抽象。(有趣的事實:Vulkan是星際迷航中Spock先生的家行星Vulcan的拼寫錯誤,就像Khronos聽起來像Klingon帝國的家鄉Qo’nos一樣)。硬件一次只能處于一種狀態,因此它類似于狀態機。OpenMAX映射到該狀態機,并提供一個API對其進行操作。由于它與硬件的緊密綁定,因此只有在相應的硬件處于特定狀態時才能發出許多命令。
這是根據對Raspberry Pi的觀察得出的結果,不知道它們是否適用于其他OpenMAX設備。因此更精確。有些命令以錯誤的狀態發出時會引發錯誤。其他人不會提出錯誤,但也不會執行該操作,直到滿足狀態要求為止。這導致(至少在Raspberry Pi上)一些已發布的命令(幾乎)立即(幾乎)立即調用相應的事件處理程序,而另一些則要等到首先發出更多的命令后,才會產生這樣的效果。因此,應該通過一條黃金路徑發出命令來克服OpenMAX API的異步特性。如果離開該路徑,則必須處理同步并在發出下一個命令之前等待回調處理程序被調用。使用OpenMAX
每個硬件功能都類似于OpenMAX中的一個組件。可以在Raspberry Pi Foundation的git存儲庫中全面了解Broadcom提供的所有組件。組件可視為具有輸入和/或輸出的數學函數。同樣,每個組件都可以分配到四個域之一:音頻,圖像,視頻和其他。最簡單的情況是一(1)個輸入端口和一(1)個輸出端口。可以傳入數據,處理后的數據就會出來。例如,可以是視頻編碼器。將原始圖像流傳遞到輸入端口,并在輸出上獲得h.264編碼的流。也可以將一個組件的輸出端口鏈接到另一組件的輸入端口。所謂的隧道,允許鏈接組件,并且只處理一個輸入端口和一個輸出端口,而不必處理中間結果。因此,OpenMAX允許形成一條管道并配置許多方面,以便可以通過它流傳輸數據。
在VMCS-X OpenMAX IL組件概述中,輸入端口和輸出端口必須位于同一域中(由端口的顏色指示)。該頁面顯示了Rasbian中所有可用的組件,而VideoCore IV中不是全部可用,因為并非所有組件都可以使用,因為它們需要VC作為主要SoC來運行,并且可以訪問像image_read這樣的文件系統。該文檔仍然存在,但未在index.html中鏈接。所有端口都有一些要配置的參數。帶有鏈接的鏈接指向特定于Broadcoms VideoCore IV的參數。
假設有一個網絡攝像頭,并且想要在的網站上提供多部分JPEG圖像(也稱為MJPEG)。有些網絡攝像頭可以自動執行此操作,但是有些則不能,在后一種情況下,將不得不獲取圖像并反復運行JPEG編碼。這是一項CPU繁重的任務,因為通常對每個圖像使用相同的大小和壓縮率,所以這是重復性的。使用OpenMAX,可以設置一個JPEG編碼器組件來為完成此任務,然后CPU只需將原始圖像數據鏟入并拉出編碼的JPEG圖像。
本文代碼保持在最低水平,但在更高層次上還是要討論。所有真正的C語言代碼都可以在的git存儲庫OMXPlayground中找到。當前,由于具有多個頻繁循環,因此這些實現并不理想。但是OpenMAX標準規定,調用必須在指定的毫秒數內返回。例如,回調是阻塞組件的調用,因此,客戶端(此代碼)應在5毫秒(3.1.2.9.1-3.1.2.9.3)內從回調中返回。要求未處理任何緩沖區的OpenMAX調用必須在20毫秒和5毫秒內返回(否則為3.2)。image_encode
這是較簡單的情況之一,將在以后看到。它以從Alpha格式的16/24/32位RGB到YUV和CrCbY的變體的各種格式拍攝原始圖像。輸出可以是下面列出的任何受支持的壓縮圖像格式。
該組件非常容易,因為可以完全控制輸入和輸出格式,并且支持多種格式。因此,基本上只需要配置輸入和輸出端口,就可以開始向其上扔數據了。
基本步驟:
? 獲取EmptyBufferDone和FillBufferDone的回調的句柄。
? 禁用端口340和341。
? 將手柄切換到空閑狀態。
? 為端口340配置,啟用和分配bufferX。
? 配置,啟用和分配341端口的bufferY。
? 將句柄切換為執行。
? 遍歷數據:
o 從bufferY復制壓縮的數據。
o 填充緩沖區Y。
o 將圖像數據復制到bufferX。
o 空緩沖區X。
? 將手柄切換到空閑狀態。
? 為端口340禁用和取消分配bufferX。
? 為端口341禁用和取消分配bufferY。
? 將手柄切換到已加載。
? 免費切換。
為回調EmptyBufferDone和FillBufferDone需要推動循環的數據。如果OMX_EmptyThisBuffer尚未完成處理,則無法將數據傳遞到組件中。因為此調用沒有阻止,所以必須等待EmptyBufferDone回調。OMX_FillThisBuffer通話類似。必須等待FillBufferDone回調,然后才能從組件獲取結果數據。
設置輸出端口時,如果所選數據格式支持,則可以提供所需的顏色格式。還可以為JPEG數據格式設置壓縮率或量化因子(Q因子)。對于JPEG,還可以定義使用libjpeg的IJG量化表。
通過設置端口來配置端口OMX_IndexParamPortDefinition。nBufferSize將根據改變format.image.nFrameWidth, format.image.nSliceHeight和format.image.eColorFormat(每像素的字節數)。因此,設置后,OMX_IndexParamPortDefinition應該對其進行查詢以獲取更新nBufferSize。同樣,大多數圖像組件都支持16像素切片或一次完整圖像的圖像處理。
輸入顏色格式
OMX_COLOR_Format16bitRGB565
OMX_COLOR_Format24bitBGR888
OMX_COLOR_Format24bitRGB888
OMX_COLOR_Format32bitABGR8888
OMX_COLOR_Format32bitARGB8888
OMX_COLOR_FormatYUV420PackedPlanar
OMX_COLOR_FormatYUV422PackedPlanar
OMX_COLOR_FormatYCbYCr
OMX_COLOR_FormatYCrYCb
OMX_COLOR_FormatCrYCbY
OMX_COLOR_FormatCbYCrY
輸出圖像格式 顏色格式
OMX_IMAGE_CodingGIF OMX_COLOR_Format8bitPalette
OMX_IMAGE_CodingBMP ?
OMX_IMAGE_CodingJPEG ?
OMX_IMAGE_CodingPNG ?
OMX_IMAGE_CodingPPM ?
OMX_IMAGE_CodingTGA ?
image_decode
輸入口 組件名稱 輸出口
320 image_decode 321
該組件從各種壓縮數據格式解碼圖像,并返回解壓縮的圖像。必須告訴組件使用哪個解碼器,并且輸出顏色格式取決于此。由于沒有內部轉換,因此如果解碼JPEG,則將不會獲得RGB圖像數據,因為JPEG固有的顏色格式是YUV(420?)。
如果要更改輸出顏色格式,則必須通過image_resize組件運行結果數據。可以在這兩個組件之間建立管道,因此只需處理一個輸入和一個輸出,而不必處理中間數據。但這是更高級的,將在以后看到。
由于此組件不提供輸出顏色格式的轉換,因此必須處理圖像數據,因為它會出來,因此無法配置輸出端口。輸出端口將自動配置為輸入。因此,將必須將數據傳遞到組件中,并使其相應地更改輸出。
基本步驟:
? 獲取EmptyBufferDone和FillBufferDone的回調的句柄。
? 禁用端口320和321。
? 將手柄切換到空閑狀態。
? 為端口320配置,啟用并分配bufferX [3]。
? 將端口321配置為自動檢測。
? 將句柄切換為執行。
? 將圖像數據復制到bufferX [i = 0]。
? 空bufferX [i]。
? 等待 OMX_EventPortSettingsChanged
? 為端口321啟用并分配bufferY。
? 遍歷數據:
o 從bufferY復制解碼的圖像數據
o 填充緩沖區Y
o 將壓縮的圖像數據復制到bufferX [i =(i + 1)%3]
o 空緩沖區X [i]
? 將手柄切換到空閑狀態。
? 為端口340禁用和取消分配bufferX [3]。
? 為端口341禁用和取消分配bufferY。
? 將手柄切換到已加載。
? 免費提手。
如所見,執行在配置輸出之前開始。傳遞到輸入的數據不會丟失,而是會緩沖在組件中,直到完全設置輸出為止。這就是為什么必須等待傳遞新數據的原因之一。當輸出端口準備就緒時,它將調用FillBufferDone回調并讓獲取解壓縮的圖像數據。
支持的輸入格式:?
支持的輸出格式:?_resize
輸入口 組件名稱 輸出口
60 image_resize 61
該組件可用于裁剪和調整圖像大小以及更改顏色格式。可以在輸入上配置裁剪,并為輸出指定任意大小。該組件與組件一樣直接,image_encode因為可以完全控制輸入和輸出端口,并且可以獨立設置它們。Broadcom實施中的一個特殊之處在于,它僅支持處理16像素切片或整個像素中的輸入。
基本步驟:
? 獲取EmptyBufferDone和FillBufferDone的回調的句柄。
? 禁用端口60和61。
? 將手柄切換到空閑狀態。
? 配置包括裁剪,啟用并為端口60分配bufferX。
? 為端口61配置,啟用和分配bufferY。
? 將句柄切換為執行。
? 遍歷數據:
o 從bufferY復制轉換后的圖像數據。
o 填充緩沖區Y。
o 將圖像數據復制到bufferX。
o 空緩沖區X。
? 將手柄切換到空閑狀態。
? 禁用和取消分配端口60的bufferX。
? 禁用和取消分配端口61的bufferY。
? 將手柄切換到已加載。
? 免費切換。
除了裁剪以外,其他步驟與相同image_encode。同樣,可以通過在中設置寬度和高度OMX_IndexParamPortDefinition或通過來設置輸出大小調整OMX_IndexParamResize。
支持的輸入格式:?
支持的輸出格式:?
? 端口只能在禁用的情況下進行配置。
? 只能在已啟用的端口上分配緩沖區。
? 僅當至少輸入端口已準備就緒(配置,啟用和分配)時,句柄才能進入執行狀態。
? 如果打電話給OMX_SetParameter不要使用在隨后的呼叫和計算中傳遞的數據。數據很可能會發生變化,因此請OMX_GetParameter在繼續之前先致電。
總結
以上是生活随笔為你收集整理的什么是OpenMAX技术分析OpenMAX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenMAX概述
- 下一篇: nvJPEG Codec库