基于網(wǎng)絡(luò)的嵌入式IP可視電話設(shè)計(jì)方案
引 言
由于成本和視頻通信質(zhì)量的因素,可視電話從推出到現(xiàn)在,一直受到用戶的冷落?,F(xiàn)在因?yàn)榧夹g(shù)的進(jìn)步和寬帶因特網(wǎng)的普及,可視電話呈現(xiàn)出新的生機(jī)。業(yè)內(nèi)專家預(yù)測(cè),未來(lái)幾年內(nèi),可視電話不僅可與電信固話、小靈通、移動(dòng)/聯(lián)通手機(jī)互聯(lián),還可與3G 手機(jī)互通??梢曤娫拰⒊蔀楠?dú)立的產(chǎn)業(yè),發(fā)展前景良好。
筆者基于TI公司的單顆600 MHz TMS320DM643(簡(jiǎn)稱為DM643)數(shù)字媒體處理器,開發(fā)了一套性能優(yōu)異、價(jià)格低廉的嵌入式IP可視電話,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)音視頻實(shí)時(shí)通信。
1 基于TMS320DM643的硬件設(shè)計(jì)
DM643數(shù)字媒體處理器[1]集成了一系列外設(shè),以適應(yīng)視頻和影像技術(shù)的發(fā)展。其中包括3個(gè)可配置視頻端口,1個(gè)10/100 Mbps的以太網(wǎng)MAC(EMAC),1個(gè)面向音頻應(yīng)用的串行口(McASP),1個(gè)串行口(McBSP)以及一些其他外設(shè)。C64x核內(nèi)有8個(gè)并行的處理單元,采用VLIW(甚長(zhǎng)指令集)結(jié)構(gòu),處理能力高達(dá)4800MIPS,并在C6OOO公共指令集的基礎(chǔ)上擴(kuò)展了88條指令。這些指令使C64x能夠更方便地執(zhí)行圖象處理中的算法。
基于單顆DM643的嵌入式IP可視電話的組成如圖1所示。從攝像機(jī)輸入的視頻信號(hào)和從麥克風(fēng)輸入的音頻信號(hào)經(jīng)A/D轉(zhuǎn)換后送入DSP,DSP對(duì)音/視頻信號(hào)進(jìn)行壓縮、編碼、合流;然后通過(guò)局域網(wǎng)或因特網(wǎng)將數(shù)據(jù)傳輸出去,同時(shí)將從網(wǎng)絡(luò)上接收的數(shù)據(jù)分流,并分別進(jìn)行視頻信號(hào)的解碼顯示和音頻信號(hào)的解碼播放。系統(tǒng)中,還通過(guò)DM643的McBSP/UART 口外接了一個(gè)鍵盤,以實(shí)現(xiàn)電話的撥號(hào)功能。
圖1 嵌入式IP可視電話的組成
1.1 視頻采集電路
本系統(tǒng)采用的視頻解碼芯片是Philips公司的SAA7l15.從攝像機(jī)輸入的全電視信號(hào)在SAA7l15內(nèi)部經(jīng)過(guò)鉗位、抗混疊濾波、A/D轉(zhuǎn)換、YuV分離電路之后,在YuV到Y(jié)CrCb的轉(zhuǎn)換電路中轉(zhuǎn)換成BT.656視頻數(shù)據(jù)流,通過(guò)DM643的視頻口VPo輸入到壓縮核心單元DM643中。視頻數(shù)據(jù)的行/場(chǎng)同步信號(hào)包含在BT.656數(shù)字視頻數(shù)據(jù)流的EAV(End of Active Video)和SAV(Startof Active Video)時(shí)基信號(hào)中,視頻口只需視頻采樣時(shí)鐘和采樣使能信號(hào)。SAA7l15內(nèi)部寄存器參數(shù)的配置和狀態(tài)的讀出通過(guò)1 C總線進(jìn)行。視頻采集接口的原理如圖2所示。
圖2 視頻采集接口原理
DM643將解碼后的視頻數(shù)據(jù)通過(guò)視頻口VP1通道送給SAA7121顯示輸出。SAA7121是Philips公司的一款視頻編碼芯片,可實(shí)現(xiàn)數(shù)字視頻的D/A 變換。SAA7121的工作模式由其內(nèi)部的控制寄存器決定,控制寄存器的初始化通過(guò)1 C總線完成。DM643利用自身具有的1 C總線模塊,作為主控制器,對(duì)SAA7121進(jìn)行參數(shù)編程控制。
1.2音頻輸入/輸出電路
本系統(tǒng)采用TI的高性能立體聲編/解碼器TI V320AIC23(簡(jiǎn)稱AIC23),實(shí)現(xiàn)音頻信號(hào)的采集和播放。AIC23與DM643的I/0電壓兼容,可實(shí)現(xiàn)與DM643的McASP接口無(wú)縫連接。
在本系統(tǒng)中,AIC23工作于主模式,左右聲道的采樣字寬均為16位。數(shù)據(jù)接口為DSP mode模式。通過(guò)12 C總線設(shè)置內(nèi)部寄存器的工作參數(shù)和反饋狀態(tài)信息。
由于網(wǎng)絡(luò)傳輸?shù)墓逃刑攸c(diǎn),音頻數(shù)據(jù)和視頻數(shù)據(jù)傳輸?shù)浇邮辗綍r(shí)不可能是均勻的。如果發(fā)送方不作任何糾正處理,則很難保證音/視頻的同步輸出。為了實(shí)現(xiàn)音頻和視頻的采樣同步,利用鎖相環(huán)PI I 1708.從SAA7115的U C引腳輸出27 MHz時(shí)鐘,經(jīng)PLI 1708的SCKO 3引腳輸出默認(rèn)時(shí)鐘頻率18.433 MHz,作為AIC23的輸入主時(shí)鐘MCI K.AIC23內(nèi)部采用的時(shí)鐘可通過(guò)設(shè)置寄存器由主時(shí)鐘MCLK分頻得到。由于音視頻采樣信號(hào)采用同一個(gè)時(shí)鐘源,因此不會(huì)出現(xiàn)音/視頻不同步的問(wèn)題。
1.3 以太網(wǎng)接口電路
本系統(tǒng)用LXT971作為快速以太網(wǎng)物理層自適應(yīng)收發(fā)器。LXT971支持IEEE 802.3標(biāo)準(zhǔn),提供MII(MediaIndependent Interface)接口,可以支持MAC;而DM643內(nèi)部正好集成有MAC控制器,所以LXT971可與DM643實(shí)現(xiàn)無(wú)縫連接。連接電路如圖3所示,其中BH1102為1:1的隔離變壓器。
圖3 網(wǎng)絡(luò)接口原理
1.4存儲(chǔ)器擴(kuò)展電路
DM643通過(guò)EMIF接口擴(kuò)展了2片32 MB的SDRAM來(lái)存放原始圖像數(shù)據(jù),1片4 MB的Flash來(lái)存放應(yīng)用程序。二者都映射到DM643的外部數(shù)據(jù)空間。
2 軟件實(shí)現(xiàn)和優(yōu)化
在本系統(tǒng)中,視頻編/解碼算法采用H.264標(biāo)準(zhǔn)[2],音頻編解碼算法采用G.723.1a,回音消除采用G.167,媒體協(xié)議采用RTP/RTCP,網(wǎng)絡(luò)協(xié)議采用TCP/UDP/IP,通信協(xié)議采用H.323v.4;另外還軟件實(shí)現(xiàn)了靜音、電話功能,并運(yùn)用抖動(dòng)緩沖媒體同步技術(shù)實(shí)現(xiàn)了各種網(wǎng)絡(luò)狀況下的音唇一致。操作系統(tǒng)采用基于DSP/B10S的TI參考架構(gòu)5(RF5)?;赗F5操作系統(tǒng)的應(yīng)用程序模塊主要包括:音/視頻采集模塊、音/視頻編解碼模塊、UART控制模塊和網(wǎng)絡(luò)傳輸模塊。
本系統(tǒng)采用的H.264編/解碼可大大提高圖像質(zhì)量或降低像通信帶寬。同等圖像質(zhì)量,H.264算法比H.263算法碼流降低了5O ;但同時(shí)H.264算法比H.263算法復(fù)雜得多,需要更強(qiáng)的處理能力,以及做更多的軟件優(yōu)化工作。H.264算法在DM643上的實(shí)現(xiàn)和優(yōu)化是整個(gè)系統(tǒng)軟件設(shè)計(jì)的難點(diǎn)和重點(diǎn)。下面以它為例說(shuō)明軟件的開發(fā)、優(yōu)化工作。
DM643上的軟件開發(fā)過(guò)程可分為3個(gè)階段:
第1階段是開發(fā)C代碼,然后使用profiling工具確定代碼可能存在的低效率段。為進(jìn)一步改進(jìn)代碼性能,需進(jìn)入第2階段。
第2階段是優(yōu)化C代碼。利用內(nèi)聯(lián)函數(shù)、編譯器的外殼選項(xiàng)等方法進(jìn)一步優(yōu)化C代碼。再次使用profiling工具檢查其性能,如果代碼仍達(dá)不到所期望的效果,須進(jìn)入第3階段。[!--empirenews.page--]
第3階段是編寫線性匯編代碼 從C代碼中抽出對(duì)性能影響很大的代碼段,用線性匯編重新編寫這段代碼,然后使用匯編優(yōu)化器優(yōu)化該代碼。
2.1 C代碼的開發(fā)和優(yōu)化
開發(fā)過(guò)程中要充分利用Tl公司為用戶提供的功能強(qiáng)大的函數(shù)庫(kù),比如IMAGE.LIB庫(kù)中就包含許多常用函數(shù),可以實(shí)現(xiàn)DCT/IDCT變換、DCT量化、自適應(yīng)濾波等功能。這些函數(shù)都是優(yōu)化過(guò)的,完全能夠?qū)崿F(xiàn)軟件流水,效率很高。另外,開發(fā)C語(yǔ)言代碼還需要考慮的要點(diǎn)包括:① 使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)- - 對(duì)定點(diǎn)乘法,應(yīng)盡可能使用short型數(shù)據(jù);對(duì)循環(huán)計(jì)數(shù)器應(yīng)使用int或者無(wú)符號(hào)int 類型。②使用查找表或常數(shù)值代替通過(guò)直接計(jì)算得到結(jié)果的語(yǔ)句或函數(shù)。
代碼分析結(jié)果顯示DCT、IDCT 、運(yùn)動(dòng)估計(jì)占程序總運(yùn)算量的比重很大,因此這部分是程序優(yōu)化的重點(diǎn)。優(yōu)化C 代碼包括使用編譯器選項(xiàng)、使用內(nèi)聯(lián)函數(shù)、使用軟件流水等。
(1)向編譯器指明不相關(guān)的指令。
為使指令并行操作,編譯器必須確定指令間的相關(guān)性,只有不相關(guān)的指令才可并行執(zhí)行。若編譯器不能確定兩條指令是不相關(guān)的,則只能安排它們串行執(zhí)行。用戶可通過(guò)如下方法指明相關(guān)的指令:
①關(guān)鍵字cons t 表示一個(gè)變量或一個(gè)變量的存儲(chǔ)單元保持不變,使用const 可提高代碼的性能和適應(yīng)性。
②使用-mt 選項(xiàng)向編譯器說(shuō)明在代碼中不存在存儲(chǔ)器相關(guān)性,即允許編譯器在無(wú)存儲(chǔ)器相關(guān)性的假設(shè)下進(jìn)行優(yōu)化。
(2)使用內(nèi)聯(lián)函數(shù)(intrinsics)。
可用內(nèi)聯(lián)函數(shù)快速優(yōu)化C 代碼。如在算術(shù)操作中,常對(duì)計(jì)算的結(jié)果做飽和(saturation)處理,使用intrinsics只須調(diào)用SADD, 一個(gè)指令周期便可得到最終結(jié)果。比花費(fèi)兩個(gè)嵌套的條件判斷語(yǔ)句來(lái)判斷結(jié)果是否溢出,最后得到結(jié)果效率要高得多。
(3)使用軟件流水。
在編譯時(shí),使用-o2 選項(xiàng)和-o3 選項(xiàng),編譯器可對(duì)循環(huán)代碼實(shí)現(xiàn)軟件流水。為填滿軟件流水線,軟件流水結(jié)構(gòu)需要執(zhí)行的最小循環(huán)迭代次數(shù)稱為最小循環(huán)次數(shù)。循環(huán)總數(shù)小于最小循環(huán)次數(shù)時(shí),執(zhí)行不流水形式循環(huán); 循環(huán)總數(shù)大于最小循環(huán)次數(shù)時(shí),執(zhí)行軟件流水形式循環(huán)??梢允褂?ms 選項(xiàng),使編譯器根據(jù)循環(huán)次數(shù)僅產(chǎn)生一種循環(huán)形式; 可使用-o3 和-pm 選項(xiàng),使優(yōu)化器訪問(wèn)整個(gè)程序,了解循環(huán)次數(shù)信息; 使用-nassert 內(nèi)聯(lián)函數(shù),防止冗余循環(huán)產(chǎn)生;使用-mh 選項(xiàng),消除軟件流水循環(huán)的排空,從而減小代碼尺寸。
由于在嵌套循環(huán)中編譯器僅對(duì)最里面的循環(huán)執(zhí)行軟件流水,因此對(duì)于執(zhí)行周期很少的內(nèi)循環(huán)進(jìn)行循環(huán)展開,對(duì)外循環(huán)進(jìn)行軟件流水。
使用軟件流水應(yīng)當(dāng)注意的問(wèn)題: 盡管軟件流水循環(huán)可以包含內(nèi)聯(lián)函數(shù),但不能包含函數(shù)調(diào)用; 在循環(huán)中不使用break 語(yǔ)句; 循環(huán)控制變量不能與循環(huán)體內(nèi)的語(yǔ)句有關(guān); 如果循環(huán)體內(nèi)復(fù)雜的條件代碼需要超過(guò)5 個(gè)條件寄存器或者32 個(gè)以上寄存器,則這個(gè)循環(huán)不可進(jìn)行軟件流水。
(4)片內(nèi)存儲(chǔ)器的分配及DMA技術(shù)的運(yùn)用。
DM643 內(nèi)部有16 KB 的一級(jí)程序緩存、16 KB 的一級(jí)數(shù)據(jù)緩存和256 KB 的程序數(shù)據(jù)共享二級(jí)緩存,遠(yuǎn)小于執(zhí)行程序和待處理圖像數(shù)據(jù),不可能將程序和圖像數(shù)據(jù)都在片內(nèi)RAM 中緩存,因此合理地配置和使用存儲(chǔ)空間,對(duì)系統(tǒng)整體效率影響很大。
提高算法程序執(zhí)行速度的關(guān)鍵是使核心循環(huán)代碼和要訪問(wèn)的數(shù)據(jù)在第1 次訪問(wèn)之后全部發(fā)生L1P 和L1D 命中。核心循環(huán)代碼占的空間很小,執(zhí)行過(guò)一次之后,完全可以全部在L1P 中緩存,因此,不用考慮代碼如何在存儲(chǔ)器中存放,主要問(wèn)題是圖像數(shù)據(jù)的存放。
由于L1D 采取LRU (Least Recently Used)分配機(jī)制,因此對(duì)于小于等于16 KB 的連續(xù)存放的數(shù)據(jù)塊可完全在L1D 中命中。以解碼過(guò)程為例,IDCT 和運(yùn)動(dòng)補(bǔ)償模塊都是以宏塊為單位進(jìn)行運(yùn)算的,IDCT 數(shù)據(jù)類型為short型,運(yùn)動(dòng)補(bǔ)償中的預(yù)測(cè)幀和當(dāng)前幀的數(shù)據(jù)類型為unsignedchar 型。計(jì)算一個(gè)宏塊(420 格式)的IDCT 和運(yùn)動(dòng)補(bǔ)償要訪問(wèn)的數(shù)據(jù)大小共需1 536 字節(jié),運(yùn)動(dòng)補(bǔ)償?shù)臄?shù)據(jù)包括預(yù)測(cè)宏塊和當(dāng)前宏塊的數(shù)據(jù),實(shí)際解碼中以6 個(gè)宏塊(10 KB)作為1 次處理對(duì)象。待處理的數(shù)據(jù)要從外部存儲(chǔ)器搬到L2 中連續(xù)的存儲(chǔ)空間,可利用EDMA 與CPU 并行工作的特點(diǎn),采取Ping??Pong 技術(shù),使CPU 在處理Ping空間數(shù)據(jù)的同時(shí),由EDMA 將下次要處理的數(shù)據(jù)搬到Pong 空間中; 當(dāng)CPU 處理Pong 空間數(shù)據(jù)時(shí),再由EDMA將Ping 空間已處理好的數(shù)據(jù)搬回外部存儲(chǔ)器,并將下次要處理的數(shù)據(jù)搬到Ping 空間,這樣就可達(dá)到CPU 的最大計(jì)算能力。Ping、Pong 空間各占用的大小為20 KB, 兩個(gè)總共約40 KB.L2 中的剩余空間分出64 KB 留給數(shù)據(jù)空間,用于解碼中常用的解碼表、量化步長(zhǎng)、輸入壓縮碼流緩沖區(qū)和輸出碼流緩沖區(qū)等。64 KB 的程序空間用于存儲(chǔ)H. 264 算法中的運(yùn)動(dòng)預(yù)測(cè)、運(yùn)動(dòng)補(bǔ)償和中斷服務(wù)程序等關(guān)鍵代碼。L2 其余部分配置為Cache, 操作與L1D 類似。
2. 2 編寫線性匯編代碼
為了提高代碼性能,對(duì)影響處理速度的關(guān)鍵C 代碼段可以用線性匯編重新編寫。線性匯編代碼類似于匯編代碼,不同的是線性匯編代碼中不需要給出匯編代碼必須指出的所有信息(如所使用的寄存器、指令的并行與否、指令的延遲周期和指令使用的功能單元等),匯編優(yōu)化器會(huì)根據(jù)代碼的情況確定這些信息。當(dāng)然,如果能夠事先確定一些信息(如循環(huán)的執(zhí)行次數(shù)、存儲(chǔ)區(qū)的地址等),則編寫的線性匯編代碼的效率更高。具體的優(yōu)化措施如下:
①使用偽指令向匯編優(yōu)化器提供較為詳細(xì)的信息。
②畫出指令的相關(guān)圖,根據(jù)相關(guān)圖合理分配邏輯單元,最大限度地保證指令的并行執(zhí)行。
③充分使用C64x DSP 提供的強(qiáng)大包處理指令處理數(shù)據(jù)(包處理指令可同時(shí)處理2 個(gè)l6 位數(shù)據(jù)和4 個(gè)8 位數(shù)據(jù))。本系統(tǒng)中使用了AVGU4、MIN2、M AX2、SPACKU4、PACK2、D0T P2、D0T PN2 和UNPKLU4 等指令。C64x DSP 還提供了STDW(STNDW)、LDDW(LDNDW)指令,可一次存取連續(xù)的64 位數(shù)據(jù)??衫肔DDW 指令,將作1 次行變換所需數(shù)據(jù)1 次取來(lái),并將處理后的結(jié)果利用STDW 指令一次存好。這樣大大縮短了代碼長(zhǎng)度,提高了代碼效率。
④利用Schedule Table 確定循環(huán)的重復(fù)間隔,合理安排功能單元,進(jìn)行軟件的流水。
[!--empirenews.page--]⑤對(duì)于兩重循環(huán)嵌套,可將內(nèi)層循環(huán)展開為外層循環(huán)內(nèi)部的條件指令。這樣可減小由內(nèi)層循環(huán)所帶來(lái)的循環(huán)前后的prolog 和epilog 的開銷。
3 性能分析
設(shè)計(jì)、調(diào)試好硬件系統(tǒng),并在DM643 上對(duì)整個(gè)系統(tǒng)軟件進(jìn)行設(shè)計(jì)和優(yōu)化后,視/ 音頻編/ 解碼的處理速度及系統(tǒng)功能得到了很大提高。IP 可視電話基本做到話音清晰并實(shí)時(shí)傳輸,在網(wǎng)絡(luò)速度為30 kbps 以上時(shí)能實(shí)現(xiàn)CIF 圖像25~ 30 幀/ s, 并可以音唇同步。
結(jié)語(yǔ)
該系統(tǒng)能在一顆DM643 芯片上實(shí)現(xiàn)網(wǎng)絡(luò)可視電話的幾乎全部功能,能對(duì)音/ 視頻進(jìn)行實(shí)時(shí)的編解碼和網(wǎng)絡(luò)傳輸,圖像質(zhì)量高且易于升級(jí),是一種比較理想的網(wǎng)絡(luò)可視電話解決方案。下一步的工作是把短信、電子郵件等其他功能整合進(jìn)來(lái)。這樣,網(wǎng)絡(luò)IP 可視電話必將成為家庭或辦公室的真正桌面通信中心。