本篇記錄Intel E3 1275處理器集成顯卡的硬編碼預研過程。異步
步驟以下:ide
(1)環境搭建工具
(2)demo編譯,測試源碼分析
(3)研究demo源碼,Media SDK API使用學習
(4)編寫so動態庫封裝RGB,YUV的編碼接口測試
下面記錄每一個過程的主要事項以及遇到的一些重要問題。ui
1. 環境搭建編碼
(1)首先在intel官網下載 MediaServerStudioEssentials2017.tar.gz, 主要考慮這個版本的SDK最適合 CentOS7.2.1511, 也能夠下載R2版本。spa
(2)安裝CentOS7.2.1511。命令行
(3)安裝Media SDK,具體步驟參考media_server_studio_getting_started_guide.pdf文檔。這裏要說明的是media sdk安裝過程當中會依賴不少基礎庫,好比libdrm, libva,X11, libGL等等,可是在install_sdk_script.sh腳本中安裝的rpm包依賴的這些基礎庫的版本可能比CentOS7.2.1511中的低,這時候會安裝失敗,提示依賴錯誤。解決辦法是在install_sdk_script.sh腳本中的yum命令參數加上--oldpackage參數,強制安裝舊版本,使依賴關係經過。
第二個問題是依賴衝突,出現過一個問題是kernel-tools安裝了兩個不一樣版本rmp包,這時候會依賴衝突,致使安裝失敗,解決方法是刪掉一個rpm包。對於yum如何處理兩個不一樣版本依賴庫的問題後面再考慮。(這裏我是對比一個安裝正確的環境,刪掉了一個高版本的庫)
2. demo編譯,測試
環境搭建好以後,能夠根據文檔中的說明驗證media sdk安裝的正確性。而後根據Sample_guide.pdf文檔,使用cmake程序編譯,再使用每個demo目錄下的文檔中參數的說明測試demo。這一步沒什麼好說的,若是環境安裝正確的話,一切順利。須要提一下的是,用sample_encode 把yuv數據編碼成h264後不能用VLC直接播放,須要在命令行加--demux h264參數啓動vlc才能播放。關於cmake的使用,後續要學習一下,跨平臺的編譯工具,還能夠用來寫測試用例自動測試程序。
3. 源碼分析, SDK API使用
對照着demo和media_sdk.pdf文檔看,基本上沒啥問題。須要關注的幾個點是:
(1)VPP,Encoder參數初始化
(2)輸入輸出緩衝區是如何分配與管理的(有一個」異步深度」的概念,主要關係到分配的輸入緩衝區個數)
(3)VPP, Encoder的異步處理流程(編碼RGB數據源須要用到VPP模塊)
(4)編碼結果數據的獲取。
(5)RGBA的編碼處理: 把VPP的輸入格式改爲RGB4, 輸出改爲NV12,把rgb視頻數據拷貝pData.R, 而後賦值pData.G = pData.R+1, pData.B=pData.R+2, pData.A = pData.R+3,利用VPP完成RGB到yuv顏色空間的轉換。
4. so動態庫
因爲不會cmake,因此這裏我把源碼直接拿過來寫makefile編譯的,須要注意的幾個問題:
(1)makefile裏面須要定義幾個與libVA有關的宏,使硬編碼生效。( -DLIBVA_SUPPORT -DLIBVA_DRM_SUPPORT -DLIBVA_X11_SUPPORT)
(2)so連接的靜態庫不是libmfx.a, 而是libdispatch_shared.a, 這個靜態庫須要本身在/opt/intel/mediasdk/opensource/mfx_dispatch目錄下用cmake編譯出來,具體過程看dispatch的相關文檔。若是使用libmfx.a連接,so會產生符號衝突,致使崩潰。
(3)在虛擬機中搭建環境,安裝media-sdk,編譯libdispatch_shared.a,而後生成本身的so動態庫,把動態庫放到物理機中連接運行致使出錯的問題,是由於不一樣環境下編譯出來的靜態庫不能通用致使的,此處的問題是libdispatch_shared.a.