日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用sama5d4硬件解码器

發布時間:2023/12/9 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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、創建v4l2srcfbdev插件

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)、將編譯好的v4l2srcfbdev插件庫放到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.1buildroot配置

步驟一:

路徑:> 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硬件解码器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。