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

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

2013-04-12 00:00:00羅國柱張涌
現(xiàn)代電子技術(shù) 2013年14期

摘 要: 采用Qt的嵌入式版本,即Qt/E,在DM6446的軟件系統(tǒng)平臺MontaVista Linux上進(jìn)行視頻GUI應(yīng)用程序開發(fā),充分利用了DM6446的在屏顯示(OSD)模塊的硬件特性,實(shí)現(xiàn)了在視頻層上疊加GUI窗口層的視頻疊加顯示方法。視頻數(shù)據(jù)的更新主要由硬件模塊負(fù)責(zé),避免了軟件進(jìn)行視頻格式轉(zhuǎn)換的CPU耗時(shí),提高了視頻顯示的效率。應(yīng)用程序目標(biāo)平臺上能夠?qū)崿F(xiàn)視頻的實(shí)時(shí)采集和高效顯示,說明Qt/E在DM6446中進(jìn)行視頻GUI開發(fā)具有實(shí)用性。

關(guān)鍵詞: 疊加顯示; DM6446; Qt/E; GUI

中圖分類號: TN911?34; TP391 文獻(xiàn)標(biāo)識碼: 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公司推出的一款應(yīng)用于視頻處理領(lǐng)域的達(dá)芬奇系列芯片,它包含一個(gè)ARM926EJ?STM的通用處理器(GPP)內(nèi)核、一個(gè)C64x+TM的數(shù)字處理器(DSP)內(nèi)核以及一個(gè)圖像處理子系統(tǒng)(VPSS),是一個(gè)高性能的數(shù)字多媒體片上系統(tǒng)[1]。DM6446的在屏顯示模塊(OSD)支持在視頻畫面上疊加圖片、文字、鼠標(biāo)等附加信息,非常方便于視頻和位圖的疊加顯示應(yīng)用[2?4]。ARM端的MontaVista Linux提供了視頻驅(qū)動V4L2和幀緩沖驅(qū)動FrameBuffer,V4L2用于視頻采集,F(xiàn)rameBuffer用于控制在屏顯示模塊OSD。Qt/E是應(yīng)用于嵌入式圖形界面(GUI)開發(fā)的工具,其底層顯示直接構(gòu)建于FrameBuffer之上,通過適當(dāng)?shù)呐渲靡浦玻隳軌蚶肣t/E在DM6446上進(jìn)行GUI的開發(fā)[5?7]。

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

1 系統(tǒng)整體結(jié)構(gòu)

整個(gè)視頻采集和疊加顯示的結(jié)構(gòu)如圖1所示,從上到下依次為應(yīng)用層、驅(qū)動層和硬件層。

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

圖1 視頻采集和疊加顯示整體結(jié)構(gòu)

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

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

2.1 在屏顯示模塊OSD

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

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

2.2 幀緩沖FrameBuffer

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

幀緩沖驅(qū)動程序向系統(tǒng)申請了連續(xù)的內(nèi)存緩沖區(qū)用以緩存窗口像素?cái)?shù)據(jù),一般緩沖區(qū)大小是窗口大小的2~3倍,在實(shí)際顯示時(shí)根據(jù)需要快速切換,以提高屏幕繪制效率和減少閃爍。應(yīng)用程序?qū)rameBuffer操作的基本流程如圖2所示。

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

通過FrameBuffer正確配置OSD視頻窗口VIDWIN1、位圖窗口OSDWIN0以及屬性窗口ATTRWIN,應(yīng)用程序便能夠?qū)崿F(xiàn)視頻層和位圖層的疊加顯示。

圖2 FrameBuffer操作流程圖

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

3.1 多線程實(shí)現(xiàn)方法

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

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

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

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

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

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

因此,通過控制屬性窗口的像素值,便能夠?qū)崿F(xiàn)視頻和Qt/E GUI不同程度的疊加顯示。

從圖4中可以看到,將視頻數(shù)據(jù)和Qt/E GUI分層繪制VIDWIN1以及OSDWIN0后,通過控制屬性窗口ATTRWIN,確實(shí)能夠?qū)崿F(xiàn)視頻層和Qt/E GUI層的同屏疊加顯示,并且疊加效果良好。

圖4 應(yīng)用程序在目標(biāo)系統(tǒng)中運(yùn)行

4 結(jié) 語

本文結(jié)合OSD模塊的硬件特點(diǎn)以及V4L2,F(xiàn)rameBuffer等軟件模塊的支持,利用Qt/E實(shí)現(xiàn)了在DM6446上視頻GUI的應(yīng)用開發(fā)。在目標(biāo)系統(tǒng)中,視頻采集和顯示實(shí)時(shí)穩(wěn)定,視頻窗口和GUI窗口疊加顯示效果良好,對于在DM6446中進(jìn)行帶視頻顯示功能的高效GUI應(yīng)用開發(fā)具有指導(dǎo)意義。

參考文獻(xiàn)

[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顯示技術(shù)的研究與實(shí)現(xiàn)[J].中國新通信,2008,10(3):45?50.

[4] 黃益貴,王汝傳.基于DM6446的P2P機(jī)頂盒OSD研究與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010,20(4):220?223,227.

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

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

[7] 湯偉,李強(qiáng).Qt/E的嵌入式Linux GUI研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,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ī)制應(yīng)用與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010,33(20):54?56.

主站蜘蛛池模板: 国产高清在线精品一区二区三区| 国内老司机精品视频在线播出| 伊人激情综合网| 一级全黄毛片| 国产精品极品美女自在线看免费一区二区| 99热免费在线| 制服丝袜在线视频香蕉| 88av在线| 四虎影视永久在线精品| 亚洲自偷自拍另类小说| 色AV色 综合网站| 国产原创演绎剧情有字幕的| 成人午夜福利视频| 国产午夜在线观看视频| 老司机久久99久久精品播放 | 久久99国产综合精品女同| 一级毛片高清| 中文字幕有乳无码| 999国内精品久久免费视频| 手机成人午夜在线视频| 中文成人在线视频| 久久综合色天堂av| 成人年鲁鲁在线观看视频| 67194亚洲无码| 精品丝袜美腿国产一区| 亚洲国产精品一区二区高清无码久久| 国产主播在线一区| 亚洲天堂网站在线| 久久6免费视频| 日韩专区第一页| 免费播放毛片| 色婷婷狠狠干| 国产成人三级| 99热这里只有精品免费| 色欲综合久久中文字幕网| 蜜臀av性久久久久蜜臀aⅴ麻豆| 国产特级毛片aaaaaaa高清| 久久婷婷色综合老司机| 五月天福利视频| 黄色国产在线| 久久人妻xunleige无码| 国产免费好大好硬视频| 国产精品jizz在线观看软件| 国产福利免费在线观看| AV网站中文| 在线观看国产一区二区三区99| 国产va欧美va在线观看| 亚洲天堂福利视频| 国产精鲁鲁网在线视频| 亚洲视频a| 欧美亚洲一二三区| 波多野结衣无码中文字幕在线观看一区二区 | 一级片免费网站| 国产高清在线精品一区二区三区| 又大又硬又爽免费视频| 就去吻亚洲精品国产欧美| 国产精品55夜色66夜色| 欧美视频免费一区二区三区| 1769国产精品视频免费观看| 欧美国产在线一区| 玖玖精品在线| 成人福利在线视频| 亚洲视频三级| 日本黄色不卡视频| 亚洲 欧美 日韩综合一区| 亚洲男人天堂2018| 热久久国产| 久热这里只有精品6| 一级看片免费视频| 福利在线免费视频| 在线免费观看a视频| 婷婷六月综合| 欧美日韩中文国产va另类| 久久黄色毛片| 亚洲美女高潮久久久久久久| 国产91成人| 日韩精品成人在线| 97视频免费看| 2021国产精品自产拍在线观看 | 亚洲国产系列| 免费va国产在线观看| 国产综合另类小说色区色噜噜|