趙 川,伍瑞卿,樊 豐
(電子科技大學 電子工程學院,四川 成都 611731)
網(wǎng)絡(luò)視頻傳輸?shù)玫搅嗽絹碓綇V泛的應(yīng)用,如IP可視電話、數(shù)字攝像機、網(wǎng)絡(luò)視頻會議、視頻監(jiān)控系統(tǒng),數(shù)字視頻播放器/點播機等。在很多應(yīng)用場合,都需要小型的嵌入式系統(tǒng)來實現(xiàn)[1]。通常,基于DSP的協(xié)議棧都移植自LWIP,uIP。而這些協(xié)議棧并不針對視頻傳輸設(shè)計。視頻傳輸中通常使用UDP協(xié)議以保證傳輸?shù)膶崟r性[2]。但是UDP的傳輸是無連接的,不可靠的。例如,在H.264中,如果丟掉解碼圖像需要的參數(shù)集或者IDR圖像,會造成無法解碼的結(jié)果。筆者提出了一種針對視頻流傳輸?shù)母倪M的UDP協(xié)議,在確保正確解碼的同時,保證了較小的開銷和較高的效率。
TMS320DM642(簡稱DM642)是TI公司的一款專用于數(shù)字媒體應(yīng)用的高性能32位定點DSP芯片。工作主頻高達720 MHz,處理能力可達5 760 MI/s(兆指令/秒),外部總線時鐘100MHz。DM642集成了64個32 bit的通用寄存器,能夠在一個時鐘周期內(nèi)處理4個16 bit的乘法和8個8 bit的乘法。64 bit寬度的EMIF總線,可連接大容量 SDRAM,F(xiàn)lash,ATA等存儲器資源。4路PAL/NTSC標準模擬視頻輸入,1路PAL/NTSC標準模擬視頻輸出,以及一個支持10/100 Mbit/s自適應(yīng)網(wǎng)卡的EMAC/MDIO模塊,通過寄存器配置可提供一定的QoS保證[3]。因此,該芯片非常適合視頻數(shù)據(jù)的處理和傳輸。
網(wǎng)絡(luò)接口控制芯片主要由 EMAC Control,EMAC,MDIO等模塊控制。
MAC Control:主要作為DSP與EMAC/MDIO的接口,提供4 kbyte的本地內(nèi)存空間給EMAC的包緩沖描述符;具有總線仲裁、重啟EMAC/MDIO、全局中斷使能、中斷邏輯控制等功能,與EMAC模塊一起初始化。
MDIO:使用有限狀態(tài)機配置和監(jiān)控物理層設(shè)備(PHY)。
EMAC:用于在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)包。而開發(fā)設(shè)備驅(qū)動主要是對該模塊編程。EMAC的特點是:1)作為DMA控制器,在DSP內(nèi)部和外部存儲空間之間傳送數(shù)據(jù);2)連接PHY的介質(zhì)無關(guān)接口(MII);3)8個接收和8個發(fā)送通道,提供一定的QoS支持;4)可選的發(fā)送CRC校驗;5)支持多播、廣播和混合模式;6)硬件流控制。
模塊框圖如圖1所示,其中EMAC/MDIO通過中斷映射到DSP的11號中斷,EMAC通過DSP內(nèi)存轉(zhuǎn)換控制器讀寫DSP的內(nèi)部外部存儲空間,模塊的控制寄存器通過DSP配置總線映射到DSP存儲空間。
圖1 模塊結(jié)構(gòu)框圖
EMAC使用描述符來管理接收和發(fā)送緩沖隊列。描述符是一個16 byte的內(nèi)存結(jié)構(gòu),存儲在EMACControl模塊中,包含數(shù)據(jù)包的長度,存放位置等信息[4]。每個描述符表示1個以太網(wǎng)包。每次發(fā)送或者接收操作完成,EMAC都會向DSP發(fā)送中斷,調(diào)整描述符隊列。
以太網(wǎng)包的接收和發(fā)送是通過一個緩沖描述符系統(tǒng)實現(xiàn)的。EMAC提供256個可用的描述符,每個接收或發(fā)送通道都有自己的通道描述符結(jié)構(gòu),用來維系描述符鏈表。設(shè)備驅(qū)動取出空的描述符以便EMAC能夠?qū)⑹盏降囊蕴W(wǎng)包的數(shù)據(jù)寫入對應(yīng)緩存,將緩存中的即將發(fā)送的數(shù)據(jù)送出并且清理對應(yīng)的描述符以便重復利用。
EMAC接收和發(fā)送數(shù)據(jù)的流程如圖2和圖3所示。
圖2 接收流程圖
圖3 發(fā)送流程圖
嵌入式系統(tǒng)中實現(xiàn)的協(xié)議要根據(jù)各個系統(tǒng)的特點及功能來設(shè)計其獨特的TCP/IP協(xié)議簇,實現(xiàn)與需要有關(guān)的部分,而不使用的協(xié)議則省略。在局域網(wǎng)上使用的很多功能,比如路由協(xié)議、SNMP都不需要,只使用ARP,IP,ICMP和UDP,可省略應(yīng)用層協(xié)議。在用于視頻數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)中,如果簡化協(xié)議基于TCP的話,不僅開銷較大,丟失分組將會造成播放延時的增大[2]。并且視頻流本身具有一定的錯誤恢復能力,所以本文的協(xié)議棧主要以UDP的發(fā)送和接收為設(shè)計和測試對象。
TCP/IP棧和設(shè)備驅(qū)動使用包緩沖區(qū)發(fā)送及接收網(wǎng)絡(luò)包數(shù)據(jù)。在該協(xié)議棧中,開辟32個包緩沖區(qū)構(gòu)成的緩沖池,而以太網(wǎng)幀長度限制在1 514 byte或1 518 byte(加入CRC校驗),因此設(shè)置每個緩沖為1 536 byte=(1 024+512) byte,這樣分配可以對齊Cache邊界,保證沖洗(flush)Cache時,不會與其他緩沖區(qū)發(fā)生沖突,并且節(jié)省存儲空間。32個包緩沖頭使用EMAC的EMAC_Pkt結(jié)構(gòu)。兩段緩沖均存放在片外SDRAM中。協(xié)議棧的數(shù)據(jù)處理和底層設(shè)備接口使用sk_buff的結(jié)構(gòu),編碼如下:
其中包含1個底層EMAC的數(shù)據(jù)包指針,這樣就可以方便地將EMAC接收的數(shù)據(jù)包放入?yún)f(xié)議棧的緩沖中。協(xié)議棧中的緩沖skb即是這種結(jié)構(gòu)。
在每次發(fā)送1個數(shù)據(jù)包之前,都要首先分配skb的存儲空間。從EMAC的空隊列中彈出1個EMAC_Pkt的數(shù)據(jù)包,并將skb內(nèi)的這個數(shù)據(jù)包指針指向它,然后對skb進行操作。在釋放skb時,將這個數(shù)據(jù)包壓入空隊列中以便繼續(xù)使用。
每層協(xié)議在封裝幀頭前,在數(shù)據(jù)區(qū)前預留這些幀頭的空間,而數(shù)據(jù)區(qū)域不變。這樣數(shù)據(jù)在各層協(xié)議之間傳遞都使用數(shù)據(jù)指針,從而避免了數(shù)據(jù)的重復搬移,以提高效率。當提交到下層協(xié)議時,將數(shù)據(jù)指針pskb->data向前移動1個幀頭長度。而在接收數(shù)據(jù)時,每層協(xié)議去掉幀頭,將數(shù)據(jù)指針向后移動1個幀頭長度。
由于I幀大小一般超過了1 514 byte,需要加入IP分片的功能。首先計算需要分片數(shù),預留該傳輸層需要的幀頭,填入傳輸層的幀頭數(shù)據(jù),然后從原始數(shù)據(jù)復制到pskb->data,剩下的片預留IP層需要的幀頭,填入幀頭數(shù)據(jù)后發(fā)送。
ARP的實現(xiàn)需要建立1個ARP列表,存放網(wǎng)絡(luò)中主機(DSP或PC)的ARP信息。在收到1個IP包后,DSP首先發(fā)送1個廣播包,查找該報文中源IP對應(yīng)的MAC地址,如果不在列表中,發(fā)送ARP請求,在接收到回應(yīng)后,將MAC地址和對應(yīng)的IP加入列表。
在以太網(wǎng)層,調(diào)用csl中EMAC_sendPacket發(fā)送數(shù)據(jù)。
加入類BSD套接字函數(shù),封裝底層函數(shù),包括socket,accept,bind,connect,recv,recvfrom,send,sendto 等, 便于應(yīng)用程序調(diào)用。
鑒于參數(shù)集和I幀的重要性,為了提高傳輸?shù)目煽啃?,保證正確接收端正確解碼,并盡量使協(xié)議棧簡單,采用類似TCP的重傳機制,流程如圖4所示。
圖4 改進的UDP傳輸
閾值 RTO 采用 TCP 的計算方法[5]:RTO=β×RTT,RTT為平均往返時延。RTT=α×RTTold+(1-α)×RTTnew,RTTold為上一次的平均往返時間,RTTnew為新的往返時間。往返時間可根據(jù)發(fā)送時刻的絕對時間和接收到接收報告的絕對時間來計算[5],每發(fā)送1個序列(IDR幀更新)就計算1次。在小型網(wǎng)絡(luò)中,為及時重傳關(guān)鍵的數(shù)據(jù)包,取α=0.25,β=1.5。為測試簡便,由幾次實驗估計,取RTO的值為50ms。
如果需要更可靠的傳輸,可以在接收端每收到1個數(shù)據(jù)包就發(fā)送1個IP數(shù)據(jù)包,內(nèi)容為成功接收標志位,用于發(fā)送端判斷是否重傳以及接收端剩余的緩存空間,用于發(fā)送端決定是否延遲一小段時間,等待接收端清理出足夠的緩存空間再發(fā)送數(shù)據(jù)。
視頻流的接收情況需要反饋給發(fā)送端以便客戶端和服務(wù)端的交互,發(fā)送速率需要根據(jù)接收端接收和解碼的速率來進行一些調(diào)整以達到匹配,還可以使發(fā)送端對出現(xiàn)的問題進行分析和采取一些解決措施。通常的反饋接收報告中設(shè)置固定的時間間隙發(fā)送接收報告[1],缺乏靈活性,并且該時間需要大量實驗來驗證,時間太短會導致網(wǎng)絡(luò)流量增大,時間太長可能無法及時使發(fā)送端獲得網(wǎng)絡(luò)狀況并由此控制發(fā)送端調(diào)整發(fā)送速率。因此設(shè)計在接收端成功接收到參數(shù)集和I幀后,或者解碼1個序列(下一個IDR幀到來)后,發(fā)送1個接收報告。發(fā)送端可以根據(jù)接收報告檢測網(wǎng)絡(luò)狀況及延時抖動,然后相應(yīng)的調(diào)整發(fā)送速率。如果在報文中加入各幀解碼時間,還可以調(diào)整編碼的碼率,以達到編碼和解碼的速率的匹配。
為了提高兼容性和擴展性,參照使用RTCP報文的頭部,以便其他能夠解析RTCP包的應(yīng)用程序識別。報頭格式如圖5所示。
圖5 報文頭格式
圖5中,V為版本號,用于識別報文的合法性。P為填充位,為1時表示數(shù)據(jù)包末位有填充位。RC為報告位,數(shù)據(jù)包中所含有的報告數(shù)目。PT為類型,不同的值代表不同類型的包,可針對不同的用途設(shè)計不同內(nèi)容的報文,以類型區(qū)分。例如,用于視頻監(jiān)控(基本檔次),用于流媒體播放(擴展檔次)等。Len為整個數(shù)據(jù)包的長度,不包括報頭長。每種類型的報文有固定的長度,如果不符合可以直接丟棄。報文內(nèi)容如圖6所示。
圖6中,T n為第n幀的傳輸時間。n由發(fā)送端的I幀周期決定,或者由接收端設(shè)定。丟包的序號由接收端根據(jù)發(fā)送的RTP數(shù)據(jù)包內(nèi)容決定。丟包率表示從接收到第一個數(shù)據(jù)包開始的時間內(nèi)丟掉的數(shù)據(jù)包總數(shù)與累積接收到的數(shù)據(jù)包的總數(shù)的比例??刂茦酥疚粸?時,不變;為1時,提高碼率;為2時,降低碼率;為3時,關(guān)掉此連接。
圖6 報文內(nèi)容
測試使用網(wǎng)線直連DSP和PC,如果PC網(wǎng)卡沒有自適應(yīng)交叉線/直通線功能,則必須制作交叉線來進行測試。
在PC(IP地址為192.168.1.20)上使用控制臺ping配置的DSP的IP地址(192.168.1.10),并且使用wireshark軟件抓取PC網(wǎng)卡上的數(shù)據(jù)包。測試結(jié)果如圖7所示。
圖7 wireshark測試結(jié)果
首先,PC網(wǎng)卡向DSP發(fā)送第1個ping請求,DSP接收到后發(fā)送ARP請求,PC回應(yīng)自己IP對應(yīng)的網(wǎng)卡地址,DSP回應(yīng)ping請求。表明ARP協(xié)議和ICMP協(xié)議正確實現(xiàn)。
在實際視頻序列傳輸中,采用foreman,news的QCIF以及CIF序列測試,解碼端能夠正確解碼播放,并且達到設(shè)定的幀率。對于誤碼重傳仿真測試,本文不再詳述。
基于DSP的視頻傳輸有著廣闊的應(yīng)用空間,筆者提出了一個精簡協(xié)議棧的設(shè)計和實現(xiàn)方法,以及與EMAC底層驅(qū)動的連接,并針對H.264視頻流的特點做了一些改進。實驗證明,該協(xié)議棧可滿足多種應(yīng)用需求。
[1]王力生,梅巖,曹南洋.輕量級嵌入式TCP/IP協(xié)議棧的設(shè)計[J].計算機工程,2007,33(2):246-248.
[2]畢厚杰.新一代視頻壓縮編碼標準——H.264/AVC[M].北京:人民郵電出版社,2005.
[3]Texas Instruments.TMS320C6000 DSP EMAC/MDIO module refer ence guide (Rev.A)[EB/OL].[2009-10-20].http://focus.ti.com/lit/ug/spru628a/spru628a.pdf.
[4]方懷東,陳啟美.基于TMS320DM642的嵌入式TCP/IP協(xié)議棧的實現(xiàn)[J].電子技術(shù)應(yīng)用,2006,32(9):25-29.
[5]謝希仁.計算機網(wǎng)絡(luò)[M].4版.大連:大連理工大學出版社,1989.