閒話
知道ffmpeg很久了,可是一直沒有深入研究。最近在研究SM768的ffmpeg下的硬解,因此想記錄下自己研究所得。關於ffmpeg的基本知識,推薦雷神博客,感謝雷神。廢話少說,開始填坑。
思路
1.ffmpeg中如何實現硬件解碼接口;
2.編譯deb包;
3.編譯sm768硬解驅動庫;
4.測試總結;
ffmpeg硬解框架
開始幹之前一定要有一個總體框架,有了指導思想,方向就不會錯。sm768支持硬件解碼,怎麼將硬件解碼接口提供給ffmpeg,讓其支持硬件解碼。接下來用smi_h264爲例,梳理下流程。如下圖所示,一開始將smi_h264註冊成h264,那麼一旦格式是h264的視頻就會調用sm768的硬解。隨後打開解碼器對其初始化,就會調用ff_smi_h264_init對硬解初始化。讀入視頻包後,開始調用硬件解碼smi_decode_frame,最後解碼器關閉後,也會對硬件解碼關閉。梳理完整個流程後,對硬件解碼一定會豁然開朗。
開始編包
既然思路方向有了,just do it。我的需求是將smi硬件接口封裝成庫,供ffmpeg調用,最後生成deb包供用戶使用。由於ffmpeg的源碼製作成了deb的方式,所以採用dpkg去編包。
1.解壓源碼:dpkg-source -x
2.安裝依賴:
sudo apt-get update
sudo apt-get install fakeroot
安裝依賴的包在安裝的時候會有提示,照提示安裝。
3.編包:dpkg-buildpackage -b -j4
在編包的時候會遇到test過不去,折騰了好久,最後才發現編包的時候不能插sm768顯卡,不然測試通不過,在此記錄下,希望大家可以避免踩坑。如下圖,生成如下的包。dev的包是開發者除了有庫還會有有些頭文件,開發者可以用此包。
4.安裝包:dpkg -i
製作庫
需要將以下文件打包成一個庫,打包時一定要將另外一個庫libVideoDecoderLib64.a打入新庫中,否則程序運行時會找不到定義的函數。最後形成新的庫libsm768.a, 放入ffmpeg源碼中編譯。
測試
最後用mplayer 播放視頻測試,可以看出當硬件解碼時CPU佔用率較低。