999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

DM6446中的Qt GUI視頻疊加顯示方法

2013-04-12 00:00:00羅國柱張涌
現代電子技術 2013年14期

摘 要: 采用Qt的嵌入式版本,即Qt/E,在DM6446的軟件系統平臺MontaVista Linux上進行視頻GUI應用程序開發,充分利用了DM6446的在屏顯示(OSD)模塊的硬件特性,實現了在視頻層上疊加GUI窗口層的視頻疊加顯示方法。視頻數據的更新主要由硬件模塊負責,避免了軟件進行視頻格式轉換的CPU耗時,提高了視頻顯示的效率。應用程序目標平臺上能夠實現視頻的實時采集和高效顯示,說明Qt/E在DM6446中進行視頻GUI開發具有實用性。

關鍵詞: 疊加顯示; DM6446; Qt/E; GUI

中圖分類號: TN911?34; TP391 文獻標識碼: A 文章編號: 1004?373X(2013)14?0085?04

Video overlay display method of Qt GUI application in DM6446

LUO Guo?zhu1, 2, ZHANG Yong1

(1. Shanghai Institute of Technical Physics, Chinese Academy of Sciences, Shanghai 200083, China;

2. University of Chinese Academy of Sciences, Beijing 100049, China)

Abstract: The Qt embedded Linux (Qt/E) is used to develop the video GUI application on the MontaVista Linux software platform on DM6446. Taking full advantage of the DM6446 OSD modules, the video is displayed by the OSD video window, and overlaid by the Qt GUI layer on OSD bitmap window. Since the video data is updated by the hardware modules, the application has no need to transform the color format, thus the video display efficiency is improved. On the target board, the GUI application has the real?time ability to capture and display the video data, which shows the practicality of the Qt/E in developing the video GUI application on DM6446.

Keywords: overlay display; DM6446; Qt/E; GUI

0 引 言

TMS320DM6446是TI公司推出的一款應用于視頻處理領域的達芬奇系列芯片,它包含一個ARM926EJ?STM的通用處理器(GPP)內核、一個C64x+TM的數字處理器(DSP)內核以及一個圖像處理子系統(VPSS),是一個高性能的數字多媒體片上系統[1]。DM6446的在屏顯示模塊(OSD)支持在視頻畫面上疊加圖片、文字、鼠標等附加信息,非常方便于視頻和位圖的疊加顯示應用[2?4]。ARM端的MontaVista Linux提供了視頻驅動V4L2和幀緩沖驅動FrameBuffer,V4L2用于視頻采集,FrameBuffer用于控制在屏顯示模塊OSD。Qt/E是應用于嵌入式圖形界面(GUI)開發的工具,其底層顯示直接構建于FrameBuffer之上,通過適當的配置移植,便能夠利用Qt/E在DM6446上進行GUI的開發[5?7]。

由于V4L2采集的視頻數據格式為YUV422,而OSD位圖窗口的數據格式為RGB565,因此若要將視頻數據通過Qt繪制于GUI位圖窗口之上,則需要視頻數據格式的轉換,這將耗費較多的CPU時間,視頻的顯示效率較低。本文結合OSD模塊的多窗口顯示特性和Qt/E在嵌入式GUI開發方面豐富的編程接口,提出了一種將視頻和Qt GUI圖層分開繪制,實現視頻層和GUI位圖層疊加顯示的方法,避免了視頻數據格式的轉換耗時,提高了視頻的顯示效率。

1 系統整體結構

整個視頻采集和疊加顯示的結構如圖1所示,從上到下依次為應用層、驅動層和硬件層。

硬件層主要包括視頻采集設備和視頻顯示視頻兩部分,視頻數據由視頻解碼芯片TVP5150從PAL制式的攝像頭解碼獲得,數據為16位YUV 422格式(UYVY);視頻的顯示由DM6446的視頻處理子系統VPSS中的在屏顯示模塊OSD和視頻編碼模塊VENC完成,在VENC進行編碼輸出之前,會對OSD各窗口模塊數據進行融合。驅動層主要涉及到Linux下的視頻采集驅動程序V4L2以及幀緩沖驅動程序FrameBuffer。V4L2主要為應用層的視頻采集線程提供視頻采集接口,而FrameBuffer主要為應用層的視頻顯示線程提供視頻顯示接口,以及為Qt/E GUI提供底層繪圖接口。應用層采用了多線程編程技術,以實現視頻的實時采集和顯示,并保證Qt/E GUI窗口能夠對用戶輸入持續響應。在Qt/E GUI主線程中提供了對視頻采集和視頻顯示子線程的控制接口,用以控制視頻采集和顯示;同時提供了對屬性窗口的控制接口,能夠控制屬性窗口的位置、大小及混合度。

圖1 視頻采集和疊加顯示整體結構

正如圖1中的數據流向所示,視頻數據采集后將被拷貝到視頻窗口VIDWIN1上,而Qt/E GUI窗口圖層則被繪制到OSDWIN0,視頻混合模塊BLEND將根據屬性窗口ATTRWIN的配置值來對視頻窗口和位圖窗口數據進行融合,最后經由視頻編碼模塊VENC送至顯示器,實現視頻和Qt/E GUI的疊加顯示。

2 在屏顯示模塊OSD及幀緩沖FrameBuffer

2.1 在屏顯示模塊OSD

DM6446的視頻處理后端VPBE主要由在屏顯示模塊OSD和視頻編碼模塊VENC組成,OSD模塊管理了多個硬件顯示窗口,而VENC則負責將窗口數據進行編碼后送至顯示設備進行顯示[2]。硬件窗口主要包含有兩個視頻窗口(VIDWIN0,VIDWIN1)、兩個位圖窗口(OSDWIN0,OSDWIN1)以及一個矩形光標窗口(Rectangular Cursor)。對于每一個視頻窗口和位圖窗口,都有相應的DDR2內存緩沖區用于保存窗口的數據,通過修改相應緩沖區便可達到直接寫屏的目的。所有的硬件窗口最終都是要顯示到同一個顯示屏幕上的,這就涉及到了窗口的顯示優先級問題。OSD硬件窗口模塊的優先級為Rectangular Cursor>OSDWIN1>OSDWIN0>VIDWIN1>VIDWIN0>Background color。當所有窗口都使能顯示時,在屏幕上重疊的窗口只有頂級窗口能夠顯示。在應用中,視頻數據顯示在VIDWIN1,GUI窗口顯示在OSDWIN0,則默認屏幕上只能顯示OSDWIN0,若要顯示VIDWIN1,則需配置屬性窗口。

OSDWIN1可以配置為屬性窗口ATTRWIN,用以控制視頻窗口和位圖窗口數據的混合度。當配置為屬性窗口時,窗口位深必須為4 b,其中最高位用以控制屬性窗口的閃爍(blink)屬性(在我們的應用中不使用,所以置零),低3位用以控制8種不同的位圖窗口和視頻窗口混合度。屬性窗口只對被其覆蓋的位圖窗口的透明設置有關,對于在屬性窗口范圍之外的其余位圖窗口則不受屬性窗口的影響。通過控制屬性窗口的像素值,使混合度在0~7之間變化,便能夠實現不同程度的視頻層和位圖層的融合。當混合度為0時,被覆蓋部分將實現視頻層的完全透明顯示,而當混合度為7時,則被覆蓋部分將僅顯示位圖數據,其余混合度下將實現視頻層的半透明顯示效果。OSD窗口的這一顯示特點,正是視頻數據和Qt GUI窗口數據疊加顯示方法的硬件基礎。

2.2 幀緩沖FrameBuffer

幀緩沖驅動程序FrameBuffer提供了應用程序控制顯示設備的方法[8]。在MontaVista Linux中提供的FrameBuffer驅動程序,將OSD的2個視頻窗口和2個位圖窗口都抽象成了設備文件。其中/dev/fb/[0,1,2,3]分別對應OSDWIN0,VIDWIN0,OSDWIN1及VIDWIN1,通過操作相應的設備文件,便可以達到操作某個具體窗口的目的。

幀緩沖驅動程序向系統申請了連續的內存緩沖區用以緩存窗口像素數據,一般緩沖區大小是窗口大小的2~3倍,在實際顯示時根據需要快速切換,以提高屏幕繪制效率和減少閃爍。應用程序對FrameBuffer操作的基本流程如圖2所示。

幀緩沖FrameBuffer提供的應用程序編程接口(API)主要有open(),close(),ioctl(),mmap()和munmap()等。函數open()和close()主要用于設備的打開和關閉;mmap()用于將內核空間地址映射到用戶空間,以加快應用程序對內核空間數據的訪問,而munmap()則用于解除這種映射關系;ioctl()是應用程序與驅動程序交互的基本接口,應用程序對驅動程序的控制基本都是通過這個接口來完成。

通過FrameBuffer正確配置OSD視頻窗口VIDWIN1、位圖窗口OSDWIN0以及屬性窗口ATTRWIN,應用程序便能夠實現視頻層和位圖層的疊加顯示。

圖2 FrameBuffer操作流程圖

3 Qt/E GUI視頻采集及疊加顯示

3.1 多線程實現方法

OSD模塊為視頻和GUI疊加顯示提供了硬件基礎,而FrameBuffer則是進行應用程序操作OSD模塊的接口,是應用開發的軟件基礎,通過它們,才能夠實現視頻數據和Qt GUI窗口的疊加顯示。視頻采集用到了Linux下的視頻設備驅動程序V4L2,通過其提供的編程接口,能夠從視頻解碼芯片中采集得到YUV422格式的視頻數據,限于篇幅,這里不做具體介紹,具體可參閱相關文檔[9?10]。為了實現視頻的實時采集和顯示,在應用層,采用了多線程編程的方法。視頻采集和顯示線程都繼承自Qt的線程類QThread,分別為CaptureThread和DisplayThread。在這里,主要是重新實現QThread的run()方法,分別為CaptureThread::run()和DisplayThread::run(),當線程類實例構建完畢之后,只需通過調用線程的start()來開啟對應線程的run()方法即可。為了實現視頻采集線程和視頻顯示線程對視頻顯示幀緩沖空間的同步訪問,這里用到了Qt提供的信號量類QSemaphore。通過信號量的控制,視頻采集線程能夠將新采集到的視頻數據正確拷貝到視頻顯示幀緩沖區的空閑區域,而不影響當前正在顯示的畫面,其過程如圖3所示。

由于分配給視頻顯示的幀緩沖數目為3,故視頻顯示幀緩沖的索引值為0~2。為此,設置QSemaphore A的初始值為2,在CaptureThread中的視頻顯示幀緩沖索引初值為1,而設置QSemaphore B的初始值為1,在DisplayThread中視頻顯示幀緩沖索引初值為0。當只有視頻采集線程啟動時,視頻采集線程將在2次視頻數據拷貝后被掛起,直到視頻顯示線程開啟為止;而當只有視頻顯示線程啟動時,它將在更新1次顯示窗口幀緩沖地址后被掛起,視頻將持續顯示舊數據,直到視頻采集線程啟動并往視頻顯示幀緩沖拷貝了新數據為止。這樣,無論視頻采集線程和視頻顯示線程哪個先啟動,都能夠實現采集和顯示的同步。

圖3 視頻采集和顯示的同步

從圖3可以看到,視頻采集線程每采集到一幀視頻數據,都會將其拷貝到OSD的視頻窗口VIDWIN1的幀緩沖區中,而通過設定系統環境變量QWS_DISPLAY=LinuxFb:/dev/fb/0,Qt/E的底層繪圖引擎將把GUI窗口繪制于OSDWIN0上,這樣,便實現了視頻和GUI的分層繪制。接下來,應用程序通過FrameBuffer控制屬性窗口,調整其大小和顯示位置,并將它的幀緩沖區全部清0,則可以在其覆蓋下的OSDWIN0上開一個透明窗口,實現視頻和Qt/E GUI的疊加顯示。

3.2 視頻和Qt/E GUI疊加顯示效果

實際的GUI運行效果如圖4所示,屏幕分辨率為720×576,視頻大小為596×390,幀頻為25 f/s。圖中,(a)為視頻層VIDWIN1畫面,其大小已設置成和采集的視頻幀大小一致;(b)為Qt/E GUI層在OSDWIN0上的畫面,在上半部分區域放置了一幅靜態背景圖片以作對比;(c)是設置屬性窗口的像素值為3時視頻和GUI的疊加畫面,此時可以透過GUI中的靜態圖片背景看到視頻畫面;(d)為設置屬性窗口的像素值為0時視頻和GUI疊加畫面,此時GUI中的視頻顯示區域將全透明顯示視頻畫面,而其他不受屬性窗口影響的區域則正常顯示GUI窗口的其余部分。

因此,通過控制屬性窗口的像素值,便能夠實現視頻和Qt/E GUI不同程度的疊加顯示。

從圖4中可以看到,將視頻數據和Qt/E GUI分層繪制VIDWIN1以及OSDWIN0后,通過控制屬性窗口ATTRWIN,確實能夠實現視頻層和Qt/E GUI層的同屏疊加顯示,并且疊加效果良好。

圖4 應用程序在目標系統中運行

4 結 語

本文結合OSD模塊的硬件特點以及V4L2,FrameBuffer等軟件模塊的支持,利用Qt/E實現了在DM6446上視頻GUI的應用開發。在目標系統中,視頻采集和顯示實時穩定,視頻窗口和GUI窗口疊加顯示效果良好,對于在DM6446中進行帶視頻顯示功能的高效GUI應用開發具有指導意義。

參考文獻

[1] Texas Instruments. TMS320DM6446 digital media system?on?chip [EB/OL]. [ 2011?2?15]. http://www.ti.com.

[2] Texas Instruments. TMS320DM644x DMSoc video processing back end (VPBE) user’s guide [EB/OL]. [ 2011?9?28]. http://www.doc88.com.

[3] 王艷艷,郅晨.基于TMS320DM6446的OSD顯示技術的研究與實現[J].中國新通信,2008,10(3):45?50.

[4] 黃益貴,王汝傳.基于DM6446的P2P機頂盒OSD研究與實現[J].計算機技術與發展,2010,20(4):220?223,227.

[5] [加]布蘭切特,[英]撒默菲兒德.C++ GUI Qt 4編程[M].閆鋒欣,曾泉人,張志強,譯.2版.北京:電子工業出版社,2008.

[6] 楊金林.基于DM6446和Qt的嵌入式圖形界面的研究與應用[D].青島:青島大學,2012.

[7] 湯偉,李強.Qt/E的嵌入式Linux GUI研究與實現[J].計算機應用與軟件,2011,28(10):260?263.

[8] Texas Instruments. LSP 1.20 DaVinci Linux VPBE frame buffer driver user’s guide [EB/OL]. [2011?10?19]. http://www.ti.com/litv/pdf.

[9] Texas Instruments. LSP 1.20 DaVinci Linux V4L2 display driver user’s guide[EB/OL]. [2008?03?03]. http:// www.ti.com.

[10] 張輝,李新華,劉波,等.基于V4L2視頻采集緩存機制應用與實現[J].現代電子技術,2010,33(20):54?56.

主站蜘蛛池模板: 就去色综合| 国产精品久久久久鬼色| 毛片视频网| 一级一级特黄女人精品毛片| 国产高清在线观看| 国产成人一区| 亚洲无码免费黄色网址| 国产在线观看人成激情视频| 国产无遮挡裸体免费视频| 国产激情在线视频| 国产精鲁鲁网在线视频| 亚洲一区精品视频在线| 亚洲全网成人资源在线观看| 伊人久久大香线蕉影院| 粗大猛烈进出高潮视频无码| 首页亚洲国产丝袜长腿综合| 全色黄大色大片免费久久老太| 99久久精品国产综合婷婷| 久久久91人妻无码精品蜜桃HD| 国产欧美日韩视频怡春院| 久久综合伊人 六十路| 国产福利大秀91| 亚洲成av人无码综合在线观看 | 免费一级α片在线观看| 中文字幕在线永久在线视频2020| 91在线视频福利| 久久国产黑丝袜视频| 欧美一级专区免费大片| 国产精品成人第一区| 国产白浆在线观看| 亚洲看片网| 亚洲人视频在线观看| 亚洲成aⅴ人在线观看| 日韩中文欧美| 91偷拍一区| 国产a网站| 久久精品国产精品青草app| 国产欧美日韩精品第二区| 2019国产在线| 国产va在线| 日本尹人综合香蕉在线观看| 在线色国产| 欲色天天综合网| 亚洲国产天堂久久九九九| 亚洲色图欧美在线| 国产天天射| 久久精品中文字幕免费| 国产成人区在线观看视频| 国产福利不卡视频| 亚洲日本www| 97se亚洲综合在线天天| 亚洲成人高清无码| 91青青草视频| 成人综合在线观看| a国产精品| 四虎永久免费地址| 国产午夜不卡| 国产xxxxx免费视频| 免费xxxxx在线观看网站| 成人无码一区二区三区视频在线观看 | 国产精品久久自在自线观看| 成人精品区| 一级毛片中文字幕| a毛片免费看| 欧类av怡春院| 欧美亚洲欧美区| 欧美成人免费午夜全| 日本尹人综合香蕉在线观看 | 永久成人无码激情视频免费| 亚洲成人一区二区三区| 欧美黄网在线| 国产福利小视频在线播放观看| 欧美不卡视频在线| 国产99欧美精品久久精品久久| 日韩欧美视频第一区在线观看| 国产精品主播| 色妺妺在线视频喷水| 欧美日韩国产在线人成app| 亚洲天堂免费| 青青草久久伊人| 欧美不卡视频一区发布| 久久亚洲高清国产|