張 晶,戴 明,孫麗娜,趙春蕾,馮 磊
(1.中國科學(xué)院航空光學(xué)成像與測量重點(diǎn)實(shí)驗(yàn)室,吉林長春130033;2.中國科學(xué)院長春光學(xué)精密機(jī)械與物理研究所,吉林長春130033;3.中國科學(xué)院大學(xué),北京100039)
隨著經(jīng)濟(jì)和科技的不斷發(fā)展,智能視頻監(jiān)控的重要性越來越突出,對技術(shù)的要求也越來越高,數(shù)字化、功能化、集成化、小型化、網(wǎng)絡(luò)化[1]的發(fā)展趨勢對監(jiān)控系統(tǒng)核心處理器性能的要求和各種外設(shè)的要求越來越高[1-2]。
TI公司的達(dá)芬奇系列雙核片上系統(tǒng)[3]是在這種大的發(fā)展環(huán)境下催生而來,它與TI公司的傳統(tǒng)DSP相比,增加了ARM內(nèi)核,專門負(fù)責(zé)外設(shè)的控制,從而使得DSP端可以更好地集中資源進(jìn)行算法實(shí)現(xiàn)。
合眾達(dá)是TI公司在中國的第三方公司,在達(dá)芬奇系列芯片的基礎(chǔ)上開發(fā)了一系列的開發(fā)工具套件,對達(dá)芬奇芯片的應(yīng)用具有很好的指導(dǎo)意義和實(shí)用價(jià)值,專門針對本文用到的TMS320DM6467T芯片就有SEED-DVS6467T和SEED-VPM6467T兩種。
本文考慮到多路視頻同時(shí)處理的需求選擇了SEEDDVS6467T作為硬件平臺,在此基礎(chǔ)上主要進(jìn)行了GPP端多線程應(yīng)用程序設(shè)計(jì),實(shí)現(xiàn)了8路視頻實(shí)時(shí)采集,通過標(biāo)清復(fù)合視頻接口和高清YPbPr分量視頻接口(或DVI接口)實(shí)現(xiàn)實(shí)時(shí)回放。實(shí)驗(yàn)結(jié)果表明,視頻回放清晰流暢且實(shí)時(shí)性很高,該系列芯片在視頻監(jiān)控領(lǐng)域應(yīng)用廣泛。
SEED-DVS6467T是一款高性能的數(shù)字視頻服務(wù)器。該服務(wù)器可以用于8路視頻、1路音頻的采集和處理,為音視頻處理方面的研究提供了很好的借鑒,同時(shí)在視頻監(jiān)控及相關(guān)領(lǐng)域有著很大的應(yīng)用前景。
SEED-DVS6467T的硬件框圖如圖1所示,其核心芯片DM6467T是一款高性能的ARM+DSP雙核片上系統(tǒng),其中ARM端主要實(shí)現(xiàn)外部接口的控制和應(yīng)用,DSP端則主要負(fù)責(zé)音視頻處理算法的實(shí)現(xiàn)。該板卡集成了128 Mbyte Nor Flash存儲器、1 GHz主頻配置的DDR2存儲器。在視頻采集方面,通過2片TVP5158作為解碼芯片,實(shí)現(xiàn)8路復(fù)合視頻的分路采集;視頻輸出則以ADV7473為編碼芯片,實(shí)現(xiàn)標(biāo)清和高清兩種視頻輸出,其中標(biāo)清接口為CVBS復(fù)合視頻接口,高清接口則有DVI和YPbPr兩種。該平臺還配置了1路RS-232實(shí)現(xiàn)對板卡的控制,2路RS-485實(shí)現(xiàn)云臺控制,其他接口還有2路SATA硬盤接口、1路USB接口、JTAG仿真接口等。
圖1 SEED-DVS6467T硬件框圖[4](截圖)
達(dá)芬奇平臺的開發(fā)環(huán)境如圖2所示,主要包括目標(biāo)板、仿真器、Windows控制臺和Linux服務(wù)器,其中Windows控制臺通過RS-232串口與目標(biāo)板相連,通過超級終端實(shí)現(xiàn)對目標(biāo)板的控制,SEED-XDS560PLUS仿真器通過JTAG接口與目標(biāo)板相連,通過USB接口與Windows控制臺相連,程序調(diào)試和下載可在Windows中的CCS軟件下實(shí)現(xiàn)。Linux服務(wù)器可以安裝于VMware虛擬機(jī)中。通過目標(biāo)板和PC機(jī)的網(wǎng)絡(luò)接口以及PC機(jī)的虛擬網(wǎng)卡即可實(shí)現(xiàn)相互之間的網(wǎng)絡(luò)連接。
圖2 開發(fā)環(huán)境框圖
本方案中應(yīng)用程序設(shè)計(jì)主要是基于GPP端的多線程設(shè)計(jì),主要包括主線程、視頻捕獲線程1、視頻捕獲線程2、視頻復(fù)制線程、視頻顯示線程等,其中視頻捕獲線程1和視頻捕獲線程2分別負(fù)責(zé)2片TVP5158的視頻采集,視頻復(fù)制線程則負(fù)責(zé)對采集到的8路視頻進(jìn)行分路復(fù)制,視頻顯示線程則負(fù)責(zé)復(fù)制到的8路視頻的實(shí)時(shí)顯示,視頻顯示線程內(nèi)嵌于視頻復(fù)制線程中。
主線程流程圖如圖3a所示,首先將所有優(yōu)先級設(shè)置為最高,setpriority(PRIO_PROCESS,0,-20);然后初始化CMEM和DMA,并創(chuàng)建dma互斥鎖;接著利用malloc()函數(shù)為TVP5158分路線程句柄param分配內(nèi)存,該句柄貫穿程序始終,具體定義為:
圖3 線程流程圖
其中PORTNUM=2,分別代表2片視頻解碼芯片,CHN_PER_PORT=4,分別代表每片解碼芯片對應(yīng)的4路視頻;TVP5158為通道句柄demuxChanHandle分別對應(yīng)8路視頻通道;mailbox郵箱句柄cap2demux分別對應(yīng)2片TVP5158視頻解碼芯片,表示由視頻采集線程到視頻復(fù)制線程的郵箱;chroma_offset則表示視頻通過yuv格式存儲時(shí)的色度偏移量。
在為TVP5158分路線程句柄分配內(nèi)存后開始對其初始化,首先通過CHparam_create()函數(shù)創(chuàng)建通道句柄,用以初始化demuxChanHandle,然后創(chuàng)建視頻捕獲線程到視頻分路線程mailbox,對cap2demux進(jìn)行初始化。
初始化完畢后利用pthread_create()函數(shù)依次創(chuàng)建視頻捕獲線程1、視頻捕獲線程2、視頻復(fù)制線程,利用pthread_join()函數(shù)分別將3個(gè)線程掛起來,等待所有線程結(jié)束后,main()函數(shù)才返回。
本方案由于有2片視頻解碼芯片,因此包含2個(gè)視頻捕獲線程,但2個(gè)線程的基本流程相同,具體流程圖如圖3b所示。
本方案視頻采集格式為V4L2格式。首先利用init-Capture()函數(shù)對捕獲設(shè)備進(jìn)行初始化,在該函數(shù)中,首先通過open((const char*)devname,O_RDWR)打開捕獲設(shè)備,然后設(shè)置視頻采集參數(shù),通過ioctl(*capture_fd,VIDIOC_S_STD,&std)設(shè)置視頻格式為PAL制式,通過ioctl(*capture_fd,VIDIOC_G_FMT,fmt)設(shè)置視頻幀格式,接著利用 ioctl(*capture_fd,VIDIOC_REQBUFS,&reqbuf)向驅(qū)動申請8個(gè)視頻流數(shù)據(jù)幀緩沖區(qū),利用ioctl(*capture_fd,VIDIOC_QUERYBUF,&buf)查詢幀緩沖區(qū)在內(nèi)核空間的長度以及偏移量,再通過內(nèi)存映射將幀緩沖區(qū)的地址映射到用戶空間,即mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHAR ED,*capture_fd,buf.m.offset),最后通過 ioctl(*capture_fd,VIDIOC_QBUF,&buf)將視頻幀緩沖區(qū)的全部緩沖放入視頻采集輸出隊(duì)列,至此視頻采集設(shè)備初始化完畢。接著利用startCapture()函數(shù)來開始視頻數(shù)據(jù)流的采集,該函數(shù)的具體實(shí)現(xiàn)為 ioctl(*capture_fd,VIDIOC_STREAMON,&a),設(shè)備將采集到的視頻數(shù)據(jù)存入幀緩沖區(qū)后將該幀緩沖區(qū)移至采集輸出隊(duì)列。然后對TVP5158分路線程句柄中chroma_offset進(jìn)行初始化,即param->chroma_offset=capture_fmt.fmt.pix.sizeimage/2,至此,param 初始化完畢。
隨后視頻捕獲線程進(jìn)入主循環(huán):首先利用getCapture-Buffer()函數(shù)從采集輸出隊(duì)列中獲取幀緩沖區(qū),具體實(shí)現(xiàn)為ioctl(*capture_fd,VIDIOC_DQBUF,&buf);然后利用MBX_post()函數(shù)將該緩沖區(qū)信息通過mailbox發(fā)送出去,存入TVP5158分路線程句柄的cap2demux中,以便進(jìn)行視頻分路處理;然后通過putCaptureBuffer()函數(shù)返還視頻幀緩沖區(qū),使其重新排入采集輸入隊(duì)列,具體實(shí)現(xiàn)為ioctl(*capture_fd,VIDIOC_QBUF,&buf),至此,主循環(huán)結(jié)束。
退出主循環(huán)之后,通過stopCapture()函數(shù)停止視頻采集,具體實(shí)現(xiàn)為 ioctl(*capture_fd,VIDIOC_STREAMOFF,&a);然后通過releaseCapture()結(jié)束視頻采集線程,在該函數(shù)中,釋放內(nèi)存通過munmap(capture_buff_info[port][i].start,capture_buff_info[port][i].length)實(shí)現(xiàn);最后通過close(*capture_fd)關(guān)閉視頻捕獲設(shè)備,捕獲線程結(jié)束。
視頻復(fù)制線程負(fù)責(zé)對捕獲線程捕獲到的視頻信息進(jìn)行分路復(fù)制和緩存,提供給顯示線程用于視頻顯示,具體流程圖如圖3c所示。
首先利用malloc()函數(shù)為視頻顯示線程句柄displaythrd_handle分配內(nèi)存,然后通過MBX_create()函數(shù)創(chuàng)建視頻復(fù)制到視頻顯示郵箱,來對視頻顯示線程句柄中的唯一成員 cpy2dis[PORTNUM][CHN_PER_PORT]進(jìn)行初始化,然后利用pthread_create()函數(shù)創(chuàng)建視頻顯示線程,通過 DRV_dmaOpen(&dmaHndl,DRV_DMA_MO DE_DEMUX,HEIGHT*2)打開行掃描分路DMA,隨后進(jìn)入主循環(huán)。
在主循環(huán)中,首先通過MBX_pend()函數(shù)讀取視頻捕獲線程中發(fā)送到復(fù)制線程的郵箱信息cap2demux,然后利用Get_ChnParamdemux()函數(shù)提取 ChanHandle[PORTNUM][CHN_PER_PORT]中的通道參數(shù),再利用TVP5158Demux_getTable()函數(shù)獲得分路器參數(shù)列表,將同一個(gè)分路器的4路視頻按照順序存儲在一起,列表形成后通過DRV_dmaDemux(&dmaHndl,&demuxPrm)將列表信息傳遞給DMA句柄,最后通過MBX_post()函數(shù)將存儲的分路視頻信息發(fā)送給復(fù)制線程到顯示線程郵箱cpy2dis[PORTNUM][CHN_PER_PORT],退出主循環(huán)后復(fù)制線程結(jié)束。
本方案中用到的視頻顯示也是V4L2格式的,與視頻捕獲線程具體實(shí)現(xiàn)類似,流程圖如圖3d所示。
首先通過initDisplay()函數(shù)打開并初始化顯示設(shè)備,視頻輸出格式在此處進(jìn)行選擇,標(biāo)清模式參數(shù)選擇為init-Display(&display_fd,dev,&display_numbuffers,"COMPOSITE","PAL",&display_fmt),即輸出接口為復(fù)合視頻接口,視頻格式為PAL格式,高清模式參數(shù)選擇為initDisplay(&display_fd,dev,&display_numbuffers,"COMPONENT","1080I-25",&display_fmt),即輸出接口為YPbPr高清分量視頻接口,視頻格式為1 080I,幀率為25 f/s(幀/秒),通過startDisplay()函數(shù)開始進(jìn)行視頻顯示,然后通過Videocpy_init()函數(shù)進(jìn)行視頻復(fù)制初始化,具體實(shí)現(xiàn)方式是通過 DRV_dmaOpen(&dmaHndl,DRV_DMA_MODE_NORMAL,HEIGHT)打開dma通道,為后面的視頻復(fù)制做好準(zhǔn)備,隨后線程進(jìn)入主循環(huán)。
在主循環(huán)中,首先通過 MBX_pend()函數(shù)讀取cpy2dis中的郵箱信息,將待顯示的視頻緩沖區(qū)加入視頻顯示輸出隊(duì)列,再通過getDisplayBuffer()函數(shù)從視頻顯示輸出隊(duì)列中獲得視頻顯示緩沖區(qū),通過Edma_videocpy()函數(shù)實(shí)現(xiàn)視頻的復(fù)制,該函數(shù)的主要實(shí)現(xiàn)為DRV_dma-Copy2D(&dmaH ndl,&copy2D,1),其中 copy2D 的格式通過視頻輸出的模式來確定,本方案中實(shí)現(xiàn)的輸出有標(biāo)清和高清兩種模式,8路視頻同時(shí)輸出設(shè)置為3×3的模式,標(biāo)清整體輸出分辨率為720×576,每一路視頻輸出分辨率設(shè)置為238×190,高清模式整體輸出為1 920×1 080,每一路視頻輸出分辨率設(shè)置為638×358,8路視頻分別實(shí)現(xiàn)復(fù)制之后,利用putDisplayBuffer()函數(shù)返還顯示緩沖區(qū)到顯示輸入隊(duì)列中,至此,主循環(huán)結(jié)束。
退出主循環(huán)后,通過stopDisplay()函數(shù)停止視頻顯示,再通過releaseDisplay()函數(shù)釋放緩沖區(qū),關(guān)閉顯示設(shè)備。至此,視頻顯示線程結(jié)束。
程序運(yùn)行結(jié)果截圖如圖4所示。
圖4 Putty串口控制臺(截圖)
通過設(shè)置initDisplay()函數(shù)參數(shù)和Edma_videocpy()函數(shù)內(nèi)copy2D參數(shù),本方案可以分別實(shí)現(xiàn)標(biāo)清和高清視頻輸出,方案設(shè)置的視頻顯示模式都是3×3模式,同時(shí)顯示8路視頻信息,最后一塊空缺,標(biāo)清顯示通過普通標(biāo)清電視實(shí)現(xiàn),高清顯示通過高清液晶電視實(shí)現(xiàn),具體顯示效果分別如圖5a、圖5b所示。視頻顯示圖像清晰流暢,實(shí)時(shí)性很高,能夠很好地滿足視頻監(jiān)控的效果。不過與標(biāo)清視頻顯示相比,高清視頻顯示在視野和清晰度上都有更好的效果。
本方案在合眾達(dá)公司SEED-DVS6467T的硬件基礎(chǔ)上完成了GPP端軟件設(shè)計(jì),實(shí)現(xiàn)了8路視頻同時(shí)采集,并以標(biāo)清和高清兩種形式進(jìn)行回放,實(shí)驗(yàn)結(jié)果顯示,視頻回放清晰流暢且實(shí)時(shí)性很高,特別是高清視頻的回放不僅清晰度很高,而且視野更廣,在視頻監(jiān)控領(lǐng)域有著很好的應(yīng)用前景。
圖5 標(biāo)清和高清視頻顯示(截圖)
SEED-DVS6467T平臺具有2路SATA硬盤接口,可以開發(fā)應(yīng)用程序?qū)Σ杉降囊曨l信息進(jìn)行存儲,方便之后調(diào)用。另外,達(dá)芬奇系列芯片具有雙核結(jié)構(gòu),除了ARM內(nèi)核外,還有性能強(qiáng)大的DSP內(nèi)核以及高清視頻協(xié)處理器,可以實(shí)現(xiàn)復(fù)雜的視頻處理功能,而達(dá)芬奇芯片本身帶有編解碼庫,并且具有8路視頻同時(shí)編解碼的處理能力,如果能在本方案的基礎(chǔ)上結(jié)合DSP端,對采集到的8路視頻進(jìn)行編解碼或者其他處理后再返還ARM進(jìn)行回放或存儲,可以在保證視頻質(zhì)量的前提下更好地節(jié)省空間。因此該方案的實(shí)現(xiàn)對于后續(xù)達(dá)芬奇芯片的應(yīng)用開發(fā)具有很大的意義。
[1]楊明極,呂鑫淼,呂鑫磊.基于 TMS320DM6467的高清晰視頻接口的硬件設(shè)計(jì)[J].電視技術(shù),2011,35(19):43-45.
[2]文武,吳勇,張杰.基于TMS320DM6467的視頻采集系統(tǒng)設(shè)計(jì)[J].電視技術(shù),2011,35(17):39-41.
[3] Texas Instruments.TMS320DM6467T digital media System-on-Chip[EB/OL].[2013-06-23].http://www.ti.com.cn.
[4] 合眾達(dá)電子.SEED-DVS6467T 硬件用戶指南[EB/OL].[2013-06-23].http://www.seedDSP.com.