連成哲,翟東奇,蔣沅嵩,孫建華,李家齊
(華中光電技術研究所-武漢光電國家研究中心,湖北 武漢 430223)
高清視頻與圖形控制界面的疊加顯示技術在很多領域有所應用[1],如直升機的視頻監(jiān)控中,不僅要求實時顯示偵察目標的狀況,并且需要同時顯示直升機在飛行過程中的速度、位置、高度等信息,并提供人機操作控制[2],此時就需要視頻圖形疊加顯示技術。此外,在艦船、海軍光電、汽車等領域的顯控終端也需要此項技術[3]。
傳統(tǒng)的顯示與控制系統(tǒng)在有高清視頻顯示需求時,往往采用專用的圖形處理硬件如顯卡、GPU或者專用于視頻顯示的芯片滿足高清視頻顯示的需求[4],顯示與控制軟件通常部署在工控機中,在桌面操作系統(tǒng)環(huán)境下開發(fā)和運行人機交互界面。
ZYNQ是Xilinx公司推出的一款可擴展處理平臺,其結合了處理器系統(tǒng)(Processing System)以及可編程邏輯(Programmable Logic)兩部分,是一款ARM+FPGA的異構芯片,通過AXI數(shù)據(jù)交互協(xié)議進行片內處理器與可編程邏輯的高速互聯(lián)[5],PS部分支持Linux、VxWorks、μCos等多種嵌入式操作系統(tǒng),可以很方便地使用圖形庫提供人機交互界面,同時通過PL部分對圖像、視頻等進行處理、顯示?;赯YNQ SoC的高清視頻與圖形界面疊加方案相較于傳統(tǒng)方式,將圖形采集、人機交互、視頻與圖形界面疊加、高清視頻顯示等功能集成在一個芯片上,具有靈活、低功耗、體積小等優(yōu)勢。
基于ZYNQ SoC平臺,該文研究了高清視頻與圖形界面疊加的關鍵技術,包括Video DMA視頻直接內存訪問技術、DRM顯示子系統(tǒng)技術、DMA-buf內存共享技術等。通過ZYNQ的PS端Linux系統(tǒng)下基于Qt產(chǎn)生圖形界面,在PL端進行高清圖像的采集、與Qt圖形界面進行疊加并通過PL端HDMI接口進行顯示輸出,采用DRM顯示框架對顯示設備進行驅動和控制,進行同屏圖層切換、多屏互動。
在多個領域都有視頻監(jiān)控的需求,如海軍光電顯控終端,需要實時采集攝像頭傳感器的圖像數(shù)據(jù)進行顯示,并提供操控界面供用戶使用,同時,需要在實時圖像上疊加波門、目標信息等圖形和文字[6],這需要在保證圖像流暢度和清晰度的基礎上進行多個顯示圖層的疊加。
基于ZYNQ SoC的高清視頻與圖形界面疊加顯示技術的原理如圖1所示。在數(shù)據(jù)流中,由PL端資源VDMA進行高清圖像的實時采集,并緩存在PS端的DDR中;同時,由Qt圖形界面庫生成圖像上的疊加圖形與文字,以及鼠標、按鈕等人機交互圖形界面,通過幀緩存(FrameBuffer)對圖形幀數(shù)據(jù)進行存儲。在顯示階段,通過PL端的兩路VDMA分別對圖形和圖像數(shù)據(jù)進行搬運,并在PL端的OSD(Video on Screen Display)IP核進行硬件疊加,通過編/解碼IP進行HDMI編碼后顯示輸出。而在PS端運行集成了VDMA控制驅動VDMA Driver、內存零拷貝驅動DMA-buf、顯示設備管理驅動DRM以及圖形庫Qt的嵌入式Linux操作系統(tǒng),并通過libdrm應用接口庫對多個圖層進行管理。該方案中,高清圖像的采集、圖像和圖形數(shù)據(jù)的輸出以及多圖層疊加和顯示編碼都通過ZYNQ的可編程邏輯部分實現(xiàn),ARM處理器僅需對PL端初始化與配置即可實現(xiàn)高清圖像與人機交互界面的顯示,大大減輕了CPU的負載,提高視頻的顯示幀率與人機交互界面的流暢度。
圖1 疊加顯示技術原理
AXI Video Direct Memory Access(VDMA)是一個IP軟核,提供了存儲器與AXI-Stream視頻類型目標外圍設備之間的高帶寬的直接內存訪問。許多視頻應用程序都需要幀緩沖區(qū)來處理幀速率變更或圖像縮放和裁剪,AXI VDMA旨在允許視頻接口和AXI接口之間進行高效的高帶寬訪問[7]。
其結構如圖2所示,VDMA分為S2MM寫通道和MM2S讀通道,分別表示將stream視頻流數(shù)據(jù)通過AXI總線寫入內存和將視頻數(shù)據(jù)通過AXI總線從內存中讀出,而不需要CPU過多的參與[8],從而降低CPU的開銷。
圖2 VDMA結構框圖
DRM是Linux下的圖形渲染架構,是一種對GPU顯卡等顯示設備的管理和封裝技術。DRM驅動架構主要包括以下幾個元素:畫布(FrameBuffer)、顯示控制器(CRTC)、編碼器(ENCODER)、連接器(CONNECTOR)和平面(PLANES)[9]。其關系如圖3所示。
圖3 DRM驅動架構
(1)DRM FrameBuffer。
FrameBuffer是一片用戶程序和驅動都能訪問的內存的抽象定義,表示了單個圖層顯示的內容,是與硬件無關的基本元素。DRM顯示架構與傳統(tǒng)的FrameBuffer顯示架構在Linux系統(tǒng)正常加載后都會在設備節(jié)點下生成/dev/fb*節(jié)點,從而為用戶應用提供接口,Linux常用的圖形界面庫如GTK、Qt等都是基于FrameBuffer接口實現(xiàn)的[10]。
(2)CRTC。
CRTC是CRT Controller的縮寫,是掃描輸出緩沖的抽象表示,負責讀取幀緩沖中的數(shù)據(jù)。CRTC可以連接多個編碼器(ENCODER),用于復制屏幕,并管理各種顯示時序參數(shù),是顯示器配置的中心環(huán)節(jié)。
(3)ENCODER。
ENCODER將從CRTC中取得的像素數(shù)據(jù)轉換為目標CONNECTOR支持的格式。
(4)CONNECTOR。
CONNECTOR是與物理顯示設備的連接器,如HDMI、DisplayPort、DSI總線。
(5)PLANES。
PLANE代表一個可合成掃描輸出緩沖的圖像源,也稱為硬件圖層,用以實現(xiàn)Overlay的應用。
高清圖像的采集與顯示需要將系統(tǒng)中采集到的圖像緩存拷貝至顯示設備的緩存buffer中,當針對高清圖像這種大數(shù)據(jù)量的應用來說,簡單地依靠memcpy會消耗CPU大量的負載,DMA-buf為不同設備、子系統(tǒng)之間進行內存共享提供了統(tǒng)一的機制[11]。典型的DMA-buf應用框圖如圖4所示。
圖4 DMA-buf應用框圖
DMA-buf框架下主要有兩個角色對象,一個是exporter,相當于buffer緩存的生產(chǎn)者,對應的是importer,即buffer的使用者。各主要功能如下:
Exporter:
實現(xiàn)DMA-buf驅動框架中緩存管理回調函數(shù);
允許其他使用者通過DMA-buf的API來使用共享緩存;
管理共享緩存的分配、包裝等細節(jié)工作;
決策共享緩存的實際后端內存的來源;
管理scatterlist的遷移工作。
Importer:
是共享緩存的使用者之一;
訪問共享緩存的scatterlist,并提供將共享緩存映射到自己地址空間的機制。
在ZYNQ SoC中,高清圖像采集、編碼、圖形圖像疊加與顯示在PL端具體實現(xiàn),PS端則通過圖形庫生成人機交互界面與疊加圖形和文字,并通過AXI總線控制PL端軟核對各功能進行配置?;赯YNQ SoC的高清視頻與圖形界面疊加顯示方案程序設計原理圖如圖5所示。
對圖5所示程序中各功能模塊做簡單介紹。在高清圖像采集中,由Video in to AXI4-stream的IP核將視頻圖像信息轉換為AXI總線類型的視頻流,通過AXI Video Direct Memory Access(VDMA0)寫入至ARM端的緩存地址中。在圖形界面生成模塊中,由ARM中Qt圖形界面庫生成對應的人機交互圖形界面和圖像的疊加圖形與文字,也存儲在緩存中。在DRM顯示子系統(tǒng)中,由兩路VDMA組成DRM系統(tǒng)的多層PLANES,分別從對應緩存區(qū)中讀取圖形和圖像數(shù)據(jù),并在Video on Screen Display的IP核中進行硬件疊加,并通過HDMI或DVI接口輸出顯示。
圖5 ZYNQ SoC程序設計
圖像采集驅動主要通過控制VDMA將視頻流數(shù)據(jù)寫入緩存中,驅動流程如圖6所示。
圖像采集驅動對VDMA的操作在file_operation結構體中實現(xiàn),通過axicdma_ioctl函數(shù)對VDMA支持的配置如表1所示。
圖6 圖像采集驅動框架 表1 圖像采集驅動支持的功能
參數(shù)功能RD_S2MM_VSIZE/RD_S2MM_HSIZE/RD_S2MM_FRAME_STRIDE讀取S2MM通道行/列/跨度WR_S2MM_VSIZE/WR_S2MM_HSIZE/WR_S2MM_FRAME_STRIDE設置S2MM通道行/列/跨度START_MM2S_TX/STOP_AXIVDMA_TX開始/停止讀出圖像START_S2MM_RX/STOP_AXIVDMA_RX開始/停止采集圖像RD_MM2S_VSIZE/RD_MM2S_HSIZE/RD_MM2S_FRAME_STRIDE讀取MM2S通道行/列/跨度WR_MM2S_VSIZE/WR_MM2S_HSIZE/WR_MM2S_FRAME_STRIDE設置MM2S通道行/列/跨度WR_MM2S_WROKMODE/RD_MM2S_WROKMODE設置/讀取MM2S通道工作模式WR_S2MM_WROKMODE/RD_S2MM_WROKMODE設置/讀取S2MM通道工作模式READ_BUFFER/WRITE_BUFFER讀取/寫入緩存
Xilinx為DRM相關的硬件IP核提供了驅動,并集成在了Linux內核中,相關驅動代碼在Linux內核目錄的drivers/gpu/drm/xilinx路徑下。在3.1節(jié)SoC程序設計的基礎上,需要配置DRM設備樹,為Linux正常使用該設備提供支持。
DRM的設備樹配置如下,對應2.2節(jié)所述,兩路VDMA對應DRM顯示系統(tǒng)的PLANES,xlnx,encoder-slave節(jié)點對應ENCODER,xlnx,connector-type節(jié)點對應CONNECTOR。
xilinx_drm {
compatible = "xlnx,drm";
xlnx,vtc = <&v_tc_0>;
xlnx,connector-type = "HDMIA";
xlnx,osd = <&v_osd_0>;
xlnx,encoder-slave = <&hdmi_encoder_0>;
clocks = <&axi_dynclk_0>;
planes {
xlnx,pixel-format = "argb8888";
plane0 {
dmas = <&axi_vdma_1 0>;
dma-names = "axi_vdma_1";
};
plane1 {
dmas = <&axi_vdma_2 0>;
dma-names = "axi_vdma_2";
};
};
};
操作系統(tǒng)與運行環(huán)境移植主要包含以下步驟:
操作系統(tǒng)制作:
PetaLinux工具提供在Xilinx處理系統(tǒng)上定制、構建和調配嵌入式 Linux 解決方案所需的所有組件,簡化Linux產(chǎn)品的開發(fā)[12]。在Linux內核中將3.2節(jié)所述的圖像采集驅動添加進內核并修改對應的配置文件,同時修改system-user.dtsi設備樹文件,對圖像采集驅動與DRM顯示系統(tǒng)進行配置后,經(jīng)過編譯生成對應的系統(tǒng)鏡像。
Qt圖形庫移植:
Qt是一個開源的跨平臺C++圖形界面應用程序框架[13],源碼可在官網(wǎng)獲取,通過賽靈思提供的交叉編譯鏈進行交叉編譯后,將對應的庫文件拷貝至嵌入式Linux的文件系統(tǒng)中,并配置Qt庫的環(huán)境變量從而支持Qt程序的運行。
libdrm庫移植:
libdrm庫是DRM系統(tǒng)的應用層封裝,提供圖層配置、顯示鏈路配置、顯存管理等,通過libdrm,用戶可以間接調用DRM系統(tǒng)[14]。libdrm源碼可在https://dri.freedesktop.org/libdrm/下載,交叉編譯后存儲在linux的文件系統(tǒng)中,并配置環(huán)境變量從而支持libdrm程序的運行。
以光電跟蹤設備為例,在光電跟蹤設備中,通常有圖像傳感器接收的真實圖像數(shù)據(jù)并在圖像上疊加對應的目標識別信息、波門、目標狀態(tài)等信息,并提供設備操控界面[15]。在上述設計搭建的顯示方案基礎上,測試用例通過Qt生成圖形數(shù)據(jù),與實時采集的高清圖像數(shù)據(jù)進行疊加顯示,并動態(tài)的配置多個圖層的顯示關系,程序設計流程如圖7所示。
圖7 測試程序設計流程
測試程序將采集的圖像層作為DRM子系統(tǒng)的plane1,Qt產(chǎn)生的圖形界面作為plane0,同時配置plane0作為Overlay疊加圖層,并禁用了該圖層的全局透明度,從而支持各個像素點透明度的配置,在Qt中將需要顯示視頻圖像的像素部分Alpha通道設置為0。程序運行現(xiàn)場如圖8所示。其中,屏幕上半部分1 920*512像素位置底圖為實時仿真海面圖像數(shù)據(jù),標尺與刻度、波門以及狀態(tài)信息文字等由Qt產(chǎn)生,并將1 920*512位置背景像素的透明度置為0,下半部分同樣由Qt產(chǎn)生的人機操控界面,背景不透明。
圖8 程序運行現(xiàn)場圖
基于ZYNQ SoC提出了一種高清視頻與圖形界面疊加的顯示技術。通過dma-buf機制共享圖像采集設備與DRM顯示設備之間的圖像幀緩存,且圖像的采集、圖像緩存區(qū)至硬件顯示接口的數(shù)據(jù)傳輸、圖像編碼都通過SoC的PL端完成,不需要CPU過多的參與,大大減少了CPU的負擔,提高了高清圖像的顯示速率。通過實測,在顯示同一分辨率的圖像下,通過該疊加方案顯示時與通過CPU直接疊加顯示時CPU占用率從89%降至13%,幀率從11 fps提升至30 fps左右,滿足常用的顯示需求。