摘 要: 針對(duì)視頻監(jiān)控系統(tǒng)對(duì)實(shí)時(shí)性和帶寬的高要求,,提出以達(dá)芬奇異構(gòu)雙核處理器TMS320DM6446為基礎(chǔ)的解決方案,。雙核間的通信和協(xié)作是基于編解碼器引擎機(jī)制來(lái)實(shí)現(xiàn)的。ARM子系統(tǒng)負(fù)責(zé)I/O端口控制,、算法調(diào)度,、圖形用戶界面、網(wǎng)絡(luò)傳輸?shù)炔僮鳎?a class="innerlink" href="http://wldgj.com/tags/DSP" title="DSP" target="_blank">DSP子系統(tǒng)則實(shí)現(xiàn)H.264視頻編解碼,。經(jīng)過(guò)研究,,實(shí)現(xiàn)了視頻軟件設(shè)計(jì)。該方案實(shí)時(shí)性較好,、部署方便,,在視頻監(jiān)控領(lǐng)域具有較好的應(yīng)用前景。
關(guān)鍵詞: 達(dá)芬奇,;TMS320DM6446,;編解碼器引擎;H.264
隨著計(jì)算機(jī)多媒體技術(shù),、網(wǎng)絡(luò)通信技術(shù),、微電子技術(shù)、數(shù)字信號(hào)處理技術(shù)的高速發(fā)展,,嵌入式數(shù)字視頻監(jiān)控系統(tǒng)正迅速深入到學(xué)校,、銀行、商場(chǎng),、機(jī)場(chǎng),、道路交通等領(lǐng)域的安防監(jiān)控。然而,,視頻數(shù)據(jù)量龐大,,如此廣泛的應(yīng)用,也就需要壓縮率更高的算法,。H.264是目前最先進(jìn)的視頻壓縮標(biāo)準(zhǔn),,具有高壓縮率的同時(shí)還具有更強(qiáng)的網(wǎng)絡(luò)適應(yīng)性,它提供了網(wǎng)絡(luò)抽象層,使得H.264的文件更容易在不同網(wǎng)絡(luò)上傳輸(例如互聯(lián)網(wǎng),、WCDMA,、CDMA2000等)。為了應(yīng)對(duì)強(qiáng)勁的市場(chǎng)需求,,德州儀器(TI)公司推出達(dá)芬奇[1](DaVinci)技術(shù)的TMS320DM6446處理器,,它是一種專門(mén)針對(duì)數(shù)字視頻應(yīng)用、基于信號(hào)處理的解決方案,,提供了專業(yè)的集成處理器,、軟件、工具和支持,,以簡(jiǎn)化設(shè)計(jì)過(guò)程,加速產(chǎn)品創(chuàng)新,,深受開(kāi)發(fā)者青睞,。然而,它的開(kāi)發(fā)卻非常復(fù)雜,,使得許多開(kāi)發(fā)者都未能盡可能地發(fā)揮其硬件作用,。為此,本設(shè)計(jì)采用了基于達(dá)芬奇技術(shù)的TMS320DM6446處理器為開(kāi)發(fā)平臺(tái),,介紹了達(dá)芬奇平臺(tái)的雙核通信機(jī)制,,并以H.264進(jìn)行壓縮編碼,設(shè)計(jì)實(shí)現(xiàn)視頻編碼軟件系統(tǒng),。
1 TMS320DM6446雙核通信
TMS320DM6446集成了TMS320C64x+ DSP核和ARM926EJ-S核,。在ARM端基于MontaVista Linux、相關(guān)驅(qū)動(dòng)和應(yīng)用程序來(lái)管理芯片與外設(shè)的交互,,DSP作為ARM的協(xié)處理器,,主要是基于DSP/BIOS(TI公司的實(shí)時(shí)操作系統(tǒng)內(nèi)核)來(lái)處理復(fù)雜的音視頻編解碼相關(guān)的算法。高集成度帶來(lái)了開(kāi)發(fā)的復(fù)雜性,,ARM和DSP間通過(guò)DSPLink完成通信,,同時(shí)需要編解碼引擎Codec Engine和編解碼服務(wù)器Codec Server協(xié)助完成。
1.1 Codec Engine
Codec Engine是處理器間通信的橋梁,,是介于ARM側(cè)的應(yīng)用程序和DSP側(cè)的算法之間的軟件模塊,,可以通過(guò)調(diào)用一組API集合來(lái)調(diào)用和運(yùn)行符合x(chóng)DAIS標(biāo)準(zhǔn)的算法。Codec Engine包括核心引擎(Core Engine)API和VISA(Video,,Image,,Speech,Audio)API,。其中的VISA API通過(guò)stub(ARM端)來(lái)訪問(wèn)核心引擎SPIs(System Programming Interface)和skeleton(DSP端),,skeleton訪問(wèn)核心引擎SPIs和VISA SPIs,VISA SPIs則最終調(diào)用具體的算法。因此,,Codec Engine的工作是通過(guò)完成VISA API的任務(wù)來(lái)體現(xiàn)的,。整體結(jié)構(gòu)如圖1所示。
核心引擎操作如下:
static string engine_name=“videoenc”,;//定義引擎名稱
Engine_Handle ce,;//引擎的句柄
Engine_Error errorcode;//返回引擎打開(kāi)的狀態(tài)信息
ce=Engine_open(engine_name,,NULL,,&Engine_Error);
//打開(kāi)引擎
打開(kāi)一個(gè)編解碼引擎之后,,就可以創(chuàng)建,、控制、處理,、刪除具體的算法實(shí)例,。VISA接口支持4種數(shù)據(jù)源的處理,分別是視頻,、圖像,、語(yǔ)音和音頻。
VISA API應(yīng)用如下:
Engine_Handle ce,;//引擎的句柄
static string alg_name=“h264enc”,;//定義編碼模塊名稱
VIDENC_Handle h264Handle;//編碼器句柄
H264Handle=VIDENC_create(ce,,alg_name,,NULL);
1.2 Codec Server
Codec Server是一個(gè)二進(jìn)制文件,,集成了編解碼器,、框架組件以及相關(guān)的系統(tǒng)代碼,可以使用DSP/BIOS作為內(nèi)核運(yùn)行在DSP端,。Codec Server類似于一個(gè)網(wǎng)頁(yè)服務(wù)器,,包括了對(duì)客戶請(qǐng)求(ARM端應(yīng)用程序?qū)SP端音視頻算法的調(diào)度)進(jìn)行響應(yīng)的相關(guān)DSP/BIOS任務(wù)線程,能夠用于創(chuàng)建編解碼器,,同時(shí)也提供處理器性能信息,。
Codec Engine和Codec Server間的通信就是RPC(遠(yuǎn)過(guò)程調(diào)用)原理在雙核上的實(shí)現(xiàn)。ARM端當(dāng)成客戶機(jī),,訪問(wèn)DSP服務(wù)器的算法,;而DSP端被當(dāng)成服務(wù)器,響應(yīng)ARM端應(yīng)用程序的請(qǐng)求,。
2 系統(tǒng)總體結(jié)構(gòu)
系統(tǒng)基于達(dá)芬奇平臺(tái)數(shù)字媒體處理器TMS320DM6446進(jìn)行設(shè)計(jì),,同時(shí)結(jié)合128MB DDR2 SDRAM內(nèi)存,、視頻解碼器TVP5150、CCD攝像頭,、10M/100M標(biāo)準(zhǔn)以太網(wǎng)芯片,。系統(tǒng)框圖如圖2所示。
在ARM端,,使用CCD攝像頭實(shí)時(shí)采集模擬視頻信號(hào),,傳入視頻解碼器TVP5150內(nèi)進(jìn)行A/D轉(zhuǎn)換為數(shù)字視頻信號(hào),這部分的采集工作由視頻前端VPFE負(fù)責(zé),。為了使這些數(shù)據(jù)能被DSP處理,,VPFE需要將RGB格式的原始圖像轉(zhuǎn)換為YUV格式[2]。然后使用DSPLink模塊與DSP端進(jìn)行通信,,并通過(guò)Codec Engine調(diào)度DSP端的H.264編碼算法,,從而得到已編碼的視頻數(shù)據(jù)?;赥CP/IP協(xié)議,,將編碼過(guò)的數(shù)據(jù)通過(guò)以太網(wǎng)接口EMAC傳輸至遠(yuǎn)程管理軟件管理。同時(shí)為了驗(yàn)證H.264編碼的正確性和編碼的質(zhì)量,,調(diào)用DSP端的H.264解碼算法對(duì)已編碼視頻數(shù)據(jù)進(jìn)行解碼操作,最后通過(guò)ARM側(cè)的視頻后端VPBE將解碼過(guò)的視頻數(shù)據(jù)送到LCD進(jìn)行顯示,。VPBE能將YUV格式的圖像轉(zhuǎn)換為L(zhǎng)CD支持的NTSC或者PAL格式,。UART0接口主要用于系統(tǒng)調(diào)試,DDR2則是視頻流數(shù)據(jù)的交換中心,。
3 軟件方案設(shè)計(jì)
本設(shè)計(jì)中,,以MontaVista Linux操作系統(tǒng)作為軟件開(kāi)發(fā)平臺(tái),基于Linux下視頻設(shè)備驅(qū)動(dòng)程序規(guī)范V4L2[3](Video for Linux Two),、幀緩沖機(jī)制(Frame Buffer)和多線程技術(shù)進(jìn)行視頻應(yīng)用程序的設(shè)計(jì),。多線程是一種多任務(wù)、并發(fā)的工作方式,,能夠提高程序響應(yīng)及CPU的使用率,,并能改善程序的結(jié)構(gòu)。本系統(tǒng)軟件設(shè)計(jì)為5個(gè)線程,,分別為主線程,、顯示線程、采集線程,、視頻線程和控制線程,。
3.1 主線程
主線程用于執(zhí)行必要的初始化,解析用戶程序提供的命令行參數(shù),,并根據(jù)這些參數(shù)的值產(chǎn)生其他線程,。初始化任務(wù)主要包括視頻標(biāo)準(zhǔn)檢測(cè),使用了幀緩沖設(shè)備驅(qū)動(dòng)程序的ioctl(FBIO_GETSTD);用戶命令行參數(shù)解析,;Codec Engine初始化,;創(chuàng)建顯示、采集和視頻三個(gè)線程,;調(diào)用控制線程的函數(shù)ctrlThrFxn(),,從而主線程轉(zhuǎn)變?yōu)榭刂凭€程??刂凭€程負(fù)責(zé)用戶接口,,可用于響應(yīng)鍵盤(pán)接口輸入的命令;還能在OSD(On-Screen Display,,達(dá)芬奇平臺(tái)的在屏顯示技術(shù))上顯示和更新文字,、圖形,使用setOsdTransparency()函數(shù)設(shè)置OSD窗口的透明度,;同時(shí)能夠在OSD上繪制按鈕并對(duì)文字著色,。具體的流程如圖3所示。
3.2 采集線程
ARM端的采集線程基于V4L2設(shè)備驅(qū)動(dòng)程序來(lái)獲取實(shí)時(shí)的視頻緩沖數(shù)據(jù),,并傳給視頻線程處理,。采集線程的流程如下:
(1)打開(kāi)視頻采集設(shè)備
fd=open(“/dev/video0”,,O_RDWR|O_NONBLOCK,,0);
?。?)初始化設(shè)備
首先,,查詢?cè)O(shè)備的性能,獲取視頻采集設(shè)備的capability,,辨別是否具有視頻輸入特性,。
struct v4l2_capability cap;
ret=ioctl(fd,,VIDIOC_QUERYCAP,,&cap);
然后,,選擇視頻輸入的功能,。
int input;
input=TVP5146_AMUX_SVIDEO,;
ret=ioctl(fd,,VIDIOC_S_INPUT,&input),;
設(shè)置視頻制式和幀格式,。
struct v4l2_format fmt,;
fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_UYVY,;
fmt.fmt.pix.width=IMAGE_WIDTH,;
fmt.fmt.pix.height=IMAGE_HEIGHT;
fmt.fmt.pix.field=V4L2_FIELD_INTERLACED,;
ret=ioctl(fd,,VIDIOC_S_FMT,&fmt),;
?。?)設(shè)定數(shù)據(jù)傳輸方式
采用內(nèi)存映射模式。在這種模式下,,應(yīng)用程序和驅(qū)動(dòng)程序之間只有指向視頻數(shù)據(jù)buffer的指針被交換,,數(shù)據(jù)本身不會(huì)被復(fù)制,提高了效率,。
?。?)實(shí)際的采集操作
V4L2中有兩個(gè)隊(duì)列:輸入和輸出[4]。先把映射好的內(nèi)存片段入隊(duì),,接著開(kāi)始采集視頻數(shù)據(jù)并進(jìn)入read循環(huán),,此時(shí)應(yīng)用程序等待輸出隊(duì)列被填滿時(shí)可以將內(nèi)存片段出隊(duì),出隊(duì)的數(shù)據(jù)就是攝像頭采集的視頻數(shù)據(jù),。將出隊(duì)的內(nèi)存片段處理完后重新入隊(duì)列尾,,這樣可以循環(huán)采集。入隊(duì)和出隊(duì)操作使用V4L2中的VIDIOC_QBUF和VIDIOC_DQBUF的ioctl()函數(shù)調(diào)用,。
struct v4l2_buffer v4l2buf;
ioctl(fd,,VIDIOC_DQBUF,,&v4l2buf);
//從采集的數(shù)據(jù)中獲取一個(gè)幀緩沖
ioctl(fd,,VIDIOC_QBUF,,&v4l2buf);
//將采集的幀緩沖發(fā)回到設(shè)備驅(qū)動(dòng)中
同時(shí),,應(yīng)用程序可以調(diào)用VIDIOC_STREAMON的ioctl()來(lái)啟動(dòng)視頻采集,,VIDIOC_STREAMOFF的 ioctl()則用來(lái)停止視頻采集。
type=V4L2_BUF_TYPE_VIDEO_CAPTURE,;
ret=ioctl(fd,,VIDIOC_STREAMON,&type),;
ret=ioctl(fd,,VIDIOC_STREAMOFF,,&type);
?。?)關(guān)閉設(shè)備
close(fd),;
3.3 視頻線程及其交互
視頻線程基于Codec Engine機(jī)制調(diào)用DSP端的視頻編碼算法對(duì)該數(shù)據(jù)進(jìn)行H.264編碼,經(jīng)過(guò)預(yù)測(cè),、量化,、熵編碼等一系列的操作,大幅減小視頻數(shù)據(jù)的存儲(chǔ)容量,,從而降低視頻傳輸對(duì)網(wǎng)絡(luò)帶寬的需求,。已編碼的視頻數(shù)據(jù)可以存儲(chǔ)在本地硬盤(pán)或者基于TCP/IP協(xié)議發(fā)送至遠(yuǎn)程管理軟件管理。同時(shí)為了驗(yàn)證視頻編碼算法的正確性與質(zhì)量,,調(diào)用DSP端H.264解碼算法對(duì)已編碼數(shù)據(jù)進(jìn)行解碼操作,,并且送入顯示線程,使用frame buffer機(jī)制將其顯示在LCD屏幕上,。詳細(xì)的交互流程如圖4所示,。
結(jié)合達(dá)芬奇TMS320DM6446中ARM和DSP處理器各自的優(yōu)勢(shì),提出了基于H.264壓縮算法的視頻編碼軟件系統(tǒng)的設(shè)計(jì)方案,,實(shí)現(xiàn)視頻采集,、視頻編解碼、視頻顯示和網(wǎng)絡(luò)傳輸?shù)裙δ?,在以后的工作中將加入行為分析和追蹤等功能,,以使系統(tǒng)更加智能。本設(shè)計(jì)可應(yīng)用于學(xué)校,、交通,、商業(yè)、銀行等多個(gè)領(lǐng)域,,具有較好的前景,。
參考文獻(xiàn)
[1] 王銘銘,方千山,,顏佳泉,,等.圖像處理和達(dá)芬奇技術(shù)在紡紗斷線檢測(cè)中的應(yīng)用[J].微型機(jī)與應(yīng)用,2012,,31(17):44-45.
[2] HAN Peicen,, YE Zhaohui, YANG Shiyuan. The Design and Implementation of Network Video Surveillance System Based on Davinci Chips[C]. Qingdao China:Advances in Information Technology and Education,,2011,,201:296-302.
[3] Bill Dirks. Video for Linux Two[EB/OL].(2003-6-26)http://www.thedirks.org/v4l2.
[4] 趙勇,袁譽(yù)樂(lè),,丁銳.DAVINCI技術(shù)原理與應(yīng)用指南[M].南京:東南大學(xué)出版社,,2008.