使用sama5d4硬件解码器
第一章 解碼器模塊簡介
1.1、背景
1.2、簡介
第二章 gstreamer-0.10版本解碼器
2.1、buildroot使用自己的交叉編譯工具
2.2、配置gstreamer和x170?
2.3、gstreamer環境搭建
2.4、gst-inspect-0.10使用
2.5、新增插件與調試方法
2.5.1、創建v4l2src和fbdev插件
2.5.2、兩種調試方法
2.6、使用硬件解碼器
第三章 gstreamer1版本解碼器
3.1、交叉編譯gstreamer1.x?
3.1.1、buildroot配置
3.1.2、搭建gst環境
3.2、交叉編譯g1_decoder?
3.3、交叉編譯g1插件
?
第一章 解碼器模塊簡介
1.1、背景
? ? ? ? usb攝像頭采集圖像(格式為jpeg)通過LCD顯示的過程中,存在cpu占有率很高的現象,特別是在高分辨率圖像的格式下(最低640*480開始)cpu占有率基本維持100%,而且是在最優cpu占有率方案下成立的。在致力于ffmpeg軟件解碼的時候偶然發現了板上的vdec設備,于是查看了d4的芯片手冊,發現了集成在板上的硬件解碼器(video decoder),并在源碼中發現了vdec的驅動源碼。本文檔旨在使用硬件解碼器減少攝像頭畫面顯示中的cpu占有率,并測試其有效性和優化性能。
1.2、簡介
? ? ? ? Sama5d44比sama5d3x系列多了NEON(SMID)指令集和720p硬件解碼器,此類芯片更適用于做圖像/數字信號處理等相關的多媒體設備。硬件解碼器類型為Hantro g1 decoder,集成在處理器內部。開發板為MYD-JA5D4X,其定制的內核3.18.0-linux4sam_5.0-alpha7中已靜態鏈接了硬件解碼器的驅動,所以只需要用應用程序調用就可以使用硬件解碼器。硬件解碼器的應用程序源碼庫由其公司提供,g1相關的解碼器基本上都是集成在gstreamer中,解碼器則以插件的形式集成在gstreamer上。Gstreamer是以plugin的方式來加載硬件解碼器的,也就是需要加載解碼器的相關庫。由以下三種方式生成gstreamer插件(可能還有更好的方式,這些都是自己查閱了很多資料得出的):
1)、自定義插件:通過gst-template創建,此方法需要自己從頭到尾編寫解碼器的代碼。實際上官方有給出plugin源碼,所以不選用此類方法。
2)、buildroot:buildroot是用來生成文件系統的一款很功能十分強大的開源包,誰用誰知道。在buildroot的開源包中有gstremaer兩個版本,分別是gstreamer(0.10)和gstreamer1(1.x)。gst-0.10基本功能完善且很成熟,但是現在已經不再維護了,所以現在使用的gstreamer一般都是1.x版本的。巧的是硬件解碼器的源碼只在buildroot中的gstreamer0-10中存在,對應的包是gst-plugin-x170-1.0,而在1.x版本中并沒有解碼器相關的包。
其實在gstreamer1版本上也有對應的解碼器插件,后面會講到。
?????? 第二章主要講的是解碼器的gstreamer-0.10版本,包含了一些實用的基本使用方法和調試方法以及介紹。第三章主要講解碼器的gstreamer-1.x版本,為本文重點,不再敘述理論,所以第二章的法同樣適用在第三章
?
第二章 gstreamer-0.10版本解碼器
? ? ? ? 我們將使用buildroot來編譯解碼器。buildroot是一個功能十分強大的開源包,專門用于生成文件系統,可以編譯出自己的交叉編譯工具也可以使用自己的交叉編譯工具,還提供了豐富的資源包,詳情見根目錄下的package。它的目錄結構和內核很相像,都可以使用make menuconfig去配置,但是它的源碼并不集成在源碼包中,而是通過地址去鏈接下載,然后編譯,安裝。最常用的目錄有output(編譯輸出),其下的target為目標平臺輸出目錄,也就是對應的開發板的目錄結構;其下的build存放解壓好的包源碼;其下的host存放交叉編譯工具和環境。還有dl目錄存放的就是下載的源碼包。之前打算手動下載源碼包的,下載不下來才選擇了buildroot。
環境:ubuntu-16.01
源碼版本:buildroot 2019.02.2
交叉編譯工具:arm-linux-gnueabihf-gcc(4.7.3)??????????????????????????????????????
源碼地址:https://buildroot.org/download.html
開發板型號:MYD-JA4D4X(米爾科技)
2.1、buildroot使用自己的交叉編譯工具
1)、下載buildroot源碼包(我的版本是Buildroot 2019.02.2)
2)、進入源碼根目錄,make menuconfig
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.1.1 Buildroot根目錄結構
3)、選擇target options,配置如下:(僅針對sama5d44板子哦)
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.1.2 平臺設置
4)、退出,選擇Toolchain,配置如下:
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.1.3 編譯工具設置
?
注意:① Toolchain path為你自己的交叉編譯工具路徑
② External toolchain kernel headers series如果你選錯了的話,在編譯的時候會提醒你類似set 3.2.x,expect 4.2.x的錯誤,你只需要重新選擇它認定的版本就可以了。
2.2、配置gstreamer和x170
1)、進入buildroot源碼根目錄,make menuconfig
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.2.1 包配置
????? 2)、進入target packages--->Audio and video applications,配置gstreamer0.10如下:
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.2.2 使能gstreamer 0.10和相關插件
?
注意:gstreamer0.10下的base/good/bad/ugly提供了豐富的多媒體處理插件,穩定高效。在使用gstreamer0.10中,如果需要什么插件去這四個成熟的插件中添加配置。
3)、進入源碼根目錄,gedit package/gstreamer/Config.in,添加以下內容:
?????? source "package/gstreamer/gst-plugin-x170/Config.in"
? ? ? ?source "package/on2-8170-libs/Config.in"
4)、gedit package/gstreamer/gst-plugin-x170/Config.in,添加如下所示:
? ? ? ?depends on BR2_TOOLCHAIN_USES_GLIBC # on2-8170-libs
?????? depends on BR2_LINUX_KERNEL # on2-8170-libs
?????? select BR2_PACKAGE_ON2_8170_LIBS
5)、gedit package/gstreamer/gst-plugin-x170/gst-plugin-x170.mk,修改如下所示:
? ? ? GST_PLUGIN_X170_DEPENDENCIES = gstreamer libglib2 on2-8170-libs
?6)、make
?7)、查看output/target/usr/lib/gstreamer-0.10目錄,是否生成了libgstx170.so。如果沒有生成成功,則手動添加配置,修改.config文件,添加如下:
? ? ? BR2_PACKAGE_GST_PLUGIN_X170=y
? ? ? BR2_PACKAGE_ON2_8170_LIBS=y
?8)、make,再次查看output/target/usr/lib/gstreamer-0.10目錄是否生成libgstx170.so
2.3、gstreamer環境搭建
在output/target/usr/lib下存放了gstreamer和x170運行時運要調用的庫,其體積較大,放在開發板上不合適,所以建議采用NFS服務使用。詳情見“SAMA5D27__sqlite3數據庫.docx->第二章->NFS的搭建和配置。”
接下來是在開發板上部署gstreamer和x170:
1)、掛載文件系統
? ? ? ? mount –t nfs –o nolock 172.16.54.122:/home/southgnss/work? /mnt/nfs
2)、將編譯好的庫文件放到共享文件下
?????? mkdir /home/southgnss/work/0.10
?????? cp ./output/target/usr/lib /home/southgnss/work/0.10/ -r
? ? ? ?cp ./output/target/usr/bin/gst-inspect-0.10 /home/southgnss/work/0.10/
? ? ? ?cp ./output/target/usr/bin/gst-launch-0.10 /home/southgnss/work/0.10/
?
3)、配置動態庫環境
?????? export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/nfs/0.10/lib
?????? 注:在MYD-JA5D4X的板上是有gstreamer1版本的,為了避免沖突,建議將/usr/lib中相關gstreamer庫不要放在LD_LIBRARY_PATH路徑中。
?
4、配置插件搜索環境
?????? export GST_PLUGIN_PATH=/mnt/nfs/0.10/lib/gstreamer-0.10
?????? 說明:gatreamer是根據GST_PLUGIN_PATH去搜索插件庫的,所以這個宏必須被正確配置。否則gstreamer找不到任何插件。還有相關的宏GST_PLUGIN_SCANNER(掃描路徑,與GST_PLUGIN_PATH類似,不過這個一般為用戶自己的插件庫路徑)。這些非常重要啊,我在這上面曾經糾結了好久!!!
2.4、gst-inspect-0.10使用
gst-inspect-0.10的作用在于檢查插件是否可用,就如上面所說的可能環境沒搭建好都可能導致檢查不到插件;它還有一個作用是能檢查插件的屬性,這個就很重要了,當你在使用gst-launch-0.10時,插件相關的屬性就非常重要了。所以可以把gst-inspect理解成輔助gst-launch的命令。
1)、查看x170硬件解碼插件是否可用
?????? gst-inspect-0.10? x170
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.4.1 x170插件簡介
?????? 注:若插件無法搜索到或者沒有這個插件,會出現No such element or plugin ‘x170’;若搜索到此插件,會顯示該插件的全部信息。
2)、屬性特性
?????? ①帶sink標志的為該插件的輸入,其下為輸入格式
?????? ②帶src標志的為該插件的輸出,其下為輸出格式
?????? ③Properties為該插件的屬性,可設置
2.5、新增插件與調試方法
gst-launch-0.10工具是gstreamer的發起者,是真正運行程序的可執行文件。Gstreamer是通過插件進行據流通的,每個插件有輸入輸出特性,根據這些特性將一個或者多個插件相接,形成了一條流水線,比如我們本文想做的攝像頭畫面顯示,那么它的流水線就是從攝像頭到LCD,對應的就是v4l2src->x170->lcd。那我們就需要v4l2src、x170和lcd的插件,x170插件我們已經編譯好了,那么v4l2src和lcd的插件怎么弄?
?
2.5.1、創建v4l2src和fbdev插件
1)、> Target packages > Audio and video applications > gst-plugins-bad,選中fbdev
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.5.1 使能fbdev
2)、> Target packages > Audio and video applications > gst-plugins-good,選中v4l2
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.5.2 使能v4l2src
3)、先刪除源碼包,重新make
?????? rm –rf ./output/build/gst-plugins-bad
?????? rm –rf ./output/build/gst-plugins-good
?????? make
?????? 注:這樣buildroot才會重新編譯
4)、將編譯好的v4l2src和fbdev插件庫放到plugin搜索路徑上
?????? cd output/target/usr/lib/gstreamer-0.10
?????? cp? libgstvideo4linux2.so /home/southgnss/work/0.10/lib/gstreamer-0.10
?????? cp libgstfbdevsink.so /home/southgnss/work/0.10/lib/gstreamer-0.10
?
2.5.2、兩種調試方法
1)、通過debug-level來調試
Gstreamer擁有超級大的日志文件,用來統計調試信息,平常的gst-launch只會打印error和warning,因為其日志量太多影響程序運行效率,但通常可以使用這些信息來調試程序。--gst-debug-level值與打印消息等級表如下:
表一 level與調試等級
| ??????? Gst-debug-level值 | ??????? 調試等級 |
| ??????????????? 1 | ??????????? error |
| ??????????????? 2 | ??????????? error +warning |
| ???????????????? 3 | ??????????? error+warning+FIXM |
| ???????????????? 4 | ??????????? error +warning+info |
| ???????????????? 5 | ??????????? error +warning+info+debug |
調試小技巧:非gstreamer原本的插件調試等級都比較高,想要打印出源碼中的調試信息,那么程序執行時間就會很長也會產生很多的垃圾信息。如果你覺得那些地方可能出問題了,可以將調試等級降低。比如說將源碼中的GST_DEBUG_OBJECT改為GST_WARNING_OBJECT,這樣調試信息少,便于調試。
?????? 2)、生成鏈接圖
????????????? ①運行gst-launch前添加:
GST_DEBUG_DUMP_DOT_DIR=$PWD
?
? ? ? ? ? ? ? ? ? ? ? ? ?圖2.5.2.1 生成狀態dot
?????? ②利用dot命令生成png圖片,如:
????????????? dot –Tpng 0.00.02.596378272-gst-launch.error.dot –o xxx.png
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.5.2.2 png圖片顯示鏈接狀態
這樣可以查看各個插件在各個狀態之前的鏈接情況,圖片還會顯示當前插件的輸入輸出屬性和格式,可以根據這些信息再去配置gst-launch。
2.6、使用硬件解碼器
? ? ? ? 從上面幾節我們知道要使用d44的硬件解碼器,我們就要學習怎么使用gst-launch工具。在最開始使用的時候可能會出現很多很多的錯誤,這是不可避免的。而且這些錯誤并不是一定是環境配置問題,比如說動態庫沒有鏈接,原板的庫存在導致編譯的庫無法加載等等錯誤,這都是一些比較痛苦的過程。以下是我總結出來的gst-launch用法,給出一個例子:
./gst-launch-0.10 --gst-debug-level=2 v4l2src ! video/x-raw-yuv, width=640, height=480 ! ffmpegcolorspace? ! video/x-raw-rgb,width=640,height=480 ! fbdevsink
1)、--gst-debug-level=2這個上面說過了,調試等級為2,只會打印錯誤和警告。
2)、gst-launch-0.10后面跟第一個插件,不用!分開。
3)、插件Properties這類屬性與插件在同兩個!號之間,并且用空格分開。如何獲取Properties信息,請看2.4節第一點。
4)、src和sink屬性緊跟在插件后面,與插件用!分開;屬性下的各詳細值用逗號分開,如上面v4l2src ! video/x-raw-yuv, width=640, height=480。
5)、當報不能創建兩個插件之間的鏈接的錯誤時,請用gst-inspect 插件名 來確定插件屬性是否設置正確。
?
最終使用x170:
./gst-launch-0.10? -v --gst-debug-level=2 v4l2src ! image/jpeg,width=640,height=480? ! x170 codec=AUTO output=RGB32 ! fbdevsink
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第三章 gstreamer1版本解碼器
第二章提到MYD-JA5D44上面已經有了gstreamer1所需要的庫和工具了,現在只需要添加上硬件解碼器gst1的庫就可以使用了。在gstreamer-0.10版本中,解碼器對應的兩個庫是on2-8170-libs(解碼器官方庫)和gst-plugin-x170(非官方);在gstreamer-1.x中,解碼器對應的兩個庫為g1_decoder(官方源碼)和gst1-hantro-g1-gstreamer1.0-plugins-hantro_1.5(gst源碼),需要自己交叉編譯。本文還要涉及到gstreamer1.x版本和其擴展插件的編譯,與0.10版本相同,我們可以采用Buildroot來編譯gstreamer1。
3.1、交叉編譯gstreamer1.x
工具:buildroot 2019.02.2
環境:ubuntu16.04
交叉編譯工具:arm-linux-gnueabihf
3.1.1、buildroot配置
步驟一:
路徑:> Target packages > Audio and video applications
介紹:配置gstreamer 1.x
如圖:
?
圖3.1.1.1 使能gstreamer 1.x
步驟二:
?????? 路徑:> Target packages > Audio and video applications > gst1-plugins-good
?????? 介紹:配置v4l2
?????? 如圖:
?
圖3.1.1.1 使能v4l2src
3.1.2、搭建gst環境
?????? 1)、將編譯好的gstreamer 1.x相關拷貝到共享目錄下
| cp ./output/target/usr/lib/libgst* /home/southgnss/work/1.0/lib cp ./output/target/usr/bin/gst-inspect-1.0 ./output/target/usr/bin/gst-launch-1.0 /home/southgnss/work/1.0 |
?????? 2)、開發板上掛載文件系統
| mount –t nfs –o nolock 172.16.54.122:/home/southgnss/work /mnt/nfs |
?????? 3)、配置gstreamer 1.x運行環境
| export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/nfs/1.0/lib export GST_PLUGIN_PATH=/mnt/nfs/1.0/lib/gstreamer-1.0 |
3.2、交叉編譯g1_decoder
?????? G1_decoder是官方的硬件解碼器源碼,我們需要編譯它。
?1)、獲取g1_decoder源碼
| git https://github.com/linux4sam/g1_decoder.git |
?2)、進入g1_decoder源碼根目錄
| cd g1_decoder |
3)、得到common,自動配置生成configure
| cp common/* ./common ./autogen.sh |
?4)、配置
| ./configure --prefix=/usr/local/x170_decoder/gst1/install? \ host=arm-linux-gnueabihf? \ G1_CFLAGS=-I/usr/local/x170_decoder/gst1/g1decoder/include/g1decoder ?\ G1_LIBS=-L/usr/local/x170_decoder/gst1/g1decoder/lib ?\ CC=/usr/local/arm/4.7.3/bin/arm-linux-gnueabihf-gcc |
?5)、編譯安裝
| make make install |
3.3、交叉編譯g1插件
源碼地址:https://github.com/linux4sam/gst1-hantro-g1/releases/tag/gstreamer1.0-plugins-hantro_1.5
交叉編譯工具:arm-linux-gnueabihf-gcc(4.7.3)
環境:ubuntu 16.04
1)、進入解壓目錄
| cd gst1-hantro-g1-gstreamer1.0-plugins-hantro_1.5 |
2)、配置
| ./configure --prefix=/usr/local/x170_decoder/gst1/install? \ ?--host=arm-linux-gnueabihf? \ ?G1_CFLAGS=-I/usr/local/x170_decoder/gst1/g1decoder/include \ G1_LIBS=-L/usr/local/x170_decoder/gst1/g1decoder/lib \ CC=/usr/local/arm/4.7.3/bin/arm-linux-gnueabihf-gcc \ LDFLAGS=-L/usr/local/x170_decoder/gst1/g1decoder/lib \ -ldecx170h \ -ldecx170m \ ?-ldecx170p \ ?-ldecx170vp8 \ ?-ldwlx170 \ ?-lx170j \ GLIB_CFLAGS=-I/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/host/usr/include/glib-2.0 \ GLIB_LIBS=-L/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/target/usr/lib\ ?PKG_CONFIG_PATH=/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/host/armeb-buildroot-linux-gnueabihf/sysroot/usr/lib/pkgconfig ?\ GST_CFLAGS=-I/usr/local/x170_decoder/install/include/gstreamer-1.0 ?\ GST_LIBS=-L/usr/local/x170_decoder/install/lib \ CPPFLAGS=-I/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/host/usr/include/glib-2.0 \ -I/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/host/armeb-buildroot-linux-gnueabihf/sysroot/usr/lib/glib-2.0/include \? -I/usr/local/x170_decoder/buildroot-2019.02.2/buildroot-2019.02.2/output/host/armeb-buildroot-linux-gnueabihf/sysroot/usr/include/gstreamer-1.0/ |
3)、編譯安裝
| make make install |
4)、將編譯好的庫放到插件搜索路徑去
| cp /usr/local/x170_decoder/gst1/install/lib/* /home/southgnss/work/1.0/lib cp /usr/local/x170_decoder/gst1/install/lib/gstreamer-1.0/* /home/southgnss/work/1.0/lib/gstreamer-1.0 |
5)、解碼jpg圖片
| ./gst-launch-1.0 --gst-debug-level=4 filesrc location=x170.jpg ! jpegparse ! g1jpegdec use-drm=false ! imagefreeze ! video/x-raw,format=BGRx,width=800,? height=480 ! g1fbdevsink |
6)、解碼攝像頭
| ./gst-launch-1.0 v4l2src do-timestamp=true ! image/jpeg,width=640,height=480,framerate=30/1 ! g1jpegdec use-drm=false ! video/x-raw,format=BGRx,width=800,height=480,framerate=30/1? ! g1fbdevsink max-lateness=-1 async=false enable-last-sample=false |
?
總結
以上是生活随笔為你收集整理的使用sama5d4硬件解码器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作323:uni-获取时间参数
- 下一篇: 【如何注销CSDN账号】说容易也容易,说