徐 蘭,呂 衛(wèi),宋 垣
(天津大學電視與圖像信息研究所,天津300072)
隨著數(shù)字化移動終端的日益普及以及地面數(shù)字多媒體廣播標準的廣泛應用,BSAC(Bit-Sliced Arithmetic Coding,比特分片算術編碼)成為目前最流行的的音頻壓縮標準之一。BSAC采用了精細粒度可分級技術,適合運用在非平穩(wěn)通信信道或多播環(huán)境中傳輸實時音頻流,為了使其優(yōu)勢得到較好實現(xiàn),且出于對開發(fā)時間的考慮,本文選擇TI DaVinci(達芬奇)平臺。
為了使BSAC能夠在DaVinci平臺上實現(xiàn),必須使其符合xDM接口標準,這也是本文的研究重點,本文還對BSAC音頻壓縮編碼在DM6446平臺上的應用程序進行了開發(fā)。
MPEG-4 BSAC是在AAC基礎上發(fā)展而來的,保留了AAC編碼中引入的心理聲學模型、尺度因子編碼,用算術編碼代替了AAC的Huffman編碼,同時改變了碼率的分級系數(shù)和量化的頻譜成分,并提供差錯復原技術,從而極大改善了在易出錯信道上傳輸?shù)囊纛l信號質量。AAC可分級性允許的典型步長為16 kbit/s,而BSAC能使每個音頻頻道以1 kbit/s的步長從16 kbit/s變化到64 kbit/s,實現(xiàn)碼率的可分級,立體聲以步長2 kbit/s實現(xiàn)分級[1]。通常情況下,噪聲和多徑傳播會引起信道容量的減少,進而影響移動通信網(wǎng)絡和數(shù)字廣播系統(tǒng)的性能,BSAC的精細粒度可分級技術可以對動態(tài)自適應糾錯編碼提供支持,因此能夠有效抑制移動通信網(wǎng)絡和數(shù)字廣播系統(tǒng)性能的降低。
TI公司開發(fā)的標準xDAIS(eXpressDSP Algorithm Interface Standard)使通過組件構建復雜系統(tǒng)的過程變得更加快捷和可靠,也使編解碼算法的改進和移植更加方便[2]。所有xDAIS標準的算法必須實現(xiàn)IALG接口[3],IALG接口函數(shù)的調(diào)用順序如圖1所示。xDM(eXpressDSP Digital Media Standard)是在xDAIS基礎上增加了一些雙核通信的協(xié)議,從而適合DaVinci技術應用的開發(fā),xDM比xDAIS增加了兩個擴展函數(shù)process()和control()。

圖1 IALG接口函數(shù)的調(diào)用順序
DaVinci的軟件架構能夠使片上系統(tǒng)的硬件和軟件無縫地組合起來,它規(guī)定了應用程序和算法庫之間統(tǒng)一、標準的API接口,從而大大縮短了系統(tǒng)研究與開發(fā)的時間。DaVinci軟件架構如圖2所示。用戶層進行Linux應用程序的開發(fā),通過EPSI(Easy Peripheral Software Interface,外圍軟件接口)API來訪問和操作I/O及控制各種外設,通過Codec Engine(編解碼引擎)提供的VISA(Video,Image,Speech,Audio)API來調(diào)用DSP側兼容xDM標準的音視頻編碼器算法[4]。

圖2 DaVinci軟件架構
TMS320DM6446是采用雙核架構(DSP+ARM)的SoC芯片,通過Codec Engine和Codec Server(編解碼服務器)來管理ARM和DSP的協(xié)同工作。DSP端通過DSP/BIOS運行高性能的BSAC音頻編碼,ARM端通過Monta Vista Linux操作系統(tǒng)實現(xiàn)對外設的管理以及音頻的采集和處理。
BSAC編碼器的開發(fā)流程如圖3所示。首先在DSP集成開發(fā)環(huán)境CCS3.3工程下將BSAC編碼器按xDM標準進行封裝,生成編碼庫文件bsacenc.l64P,加上配置文件(.xs.xdc package.bld)生成能夠被Codec Engine配置套件所用的Codec包(ti.sdo.codecs.bsacenc),然后配置DSP的操作系統(tǒng)DSP/BIOS,以及通過XDC工具配置其他組件,生成DSP端的可執(zhí)行代碼(Codec Server),最后ARM端通過Codec Engine的VISA API接口函數(shù)調(diào)用符合xDM標準的BSAC編碼算法。

圖3 BSAC編碼器開發(fā)流程
將BSAC編碼器構建成符合xDM標準的算法,IALG接口函數(shù)中的 algNumAlloc(),algActivate(),algControl(),algDeactivate()可不完成任何處理,為了減少函數(shù)的調(diào)用,節(jié)省代碼空間,本文設計的BSAC編碼器將上述函數(shù)指針置為NULL。BSAC算法實例接口函數(shù)IBSACENC_Fxns如圖4所示。IBSACENC_Fxns結構體的第一個成員表示模塊BSACENC的地址,用來標明具體模塊實例;BSACENC_TI_alloc()表示BSAC編碼器申請的內(nèi)存資源,本文申請了3塊內(nèi)存空間,分別用來存儲BSAC算法實例對象,采集的原始音頻數(shù)據(jù),編碼后的輸出碼流;BSACENC_TI_init()初始化BSAC算法實例對象,只有該函數(shù)成功返回后,算法實例才能開始處理數(shù)據(jù);BSACENC_TI_Moved()允許移動BSAC算法實例對象,重新定位存儲器資源;BSACENC_TI_process()實現(xiàn)將輸入的PCM數(shù)據(jù)進行BSAC編碼,并輸出編碼后的碼流及幀長;BSACENC_TI_control()實現(xiàn)對BSAC音頻編碼器參數(shù)(如比特率、采樣率、通道模式、量化位數(shù)等)的設置及BSAC算法狀態(tài)信息的查詢;BSACENC_TI_free()釋放BSACENC_TI_alloc()申請的內(nèi)存空間。

圖4 BSAC算法實例接口函數(shù)
為了使兼容xDM標準的BSAC音頻編碼算法能夠被編解碼引擎調(diào)用,須將該算法打包生成1個Codec,即“包”。1個包對應1個目錄,目錄中包含了1個獨立組件需要的所有文件以及相關的元數(shù)據(jù)。
本文使用TI RTSC(實時系統(tǒng)組件)編解碼器包向導來創(chuàng)建BSAC Codec包,首先下載安裝必要組件(ceutils(Codec Engine工具),cg_xml(代碼生成工具)),設置XDCPATH(具體方法如下所示),然后在xdc工具安裝路徑下執(zhí)行./xs ti.sdo.codecutils.genpackage-g,生成codec包所需的5個配置的文件:1)package.xdc定義的BSAC codec包的名稱為ti.sdo.codecs.bsacenc,包含了1個算法模塊BSACENC;2)package.xs定義了BSAC Codec包所需要的庫文件名稱(lib="lib/bsacenc.l64P");3)package.bld定義了build相關的屬性;4)BSACENC.xdc聲明和定義了模塊BSACENC,該文件名必須和package.xdc文件中定義的模塊名稱(BSACENC)一致;5)BSACENC.xs實現(xiàn)了BSACENC.xdc中聲明的方法。具體代碼為:
export XDCPATH="/home/user/dvsdk_2_00_00_22/codec_engine_2_23_01/packages;
/home/user/dvsdk_2_00_00_22/xdais_6_23/packages;/home/user/dvsdk_2_00_00_22/ceutils_1_06/packages"
在將BSAC編碼器打包成Codec后,為了支持Codec Engine調(diào)用運行在DSP上的音頻編碼算法,必須生成一個DSP端的可執(zhí)行代碼Codec Server(bsacenc.x64P),該服務器結合了Codecs,F(xiàn)ramework組件和系統(tǒng)代碼。為了生成 Codec Server,需要一些配置文件如.tcf,.cfg,main()等。Tconf腳本語言的配置文件bsacenc.tcf配置了DSP/BIOS,它分配了數(shù)據(jù)和代碼段的存儲空間、使能任務管理器和動態(tài)分配堆,創(chuàng)建和初始化其他DSP/BIOS數(shù)據(jù)對象等。main()用來初始化Codec Engine。通過XDC配置其余組件(如框架組件、DSP/BIOS Link、Codec Engine),BSAC Server配置文件(bsacenc.cfg)部分代碼如下所示,它定義了 Server的模塊屬性,獲得編碼模塊BSACENC,說明Codec Server中可用的算法bsacenc。具體代碼為:

ARM端的應用程序主要是完成Codec Engine的配置及BSAC編碼器的多線程設計。Codec Engine的配置文件是通過*.cfg文件存儲的,本文的BSAC編碼器引擎配置文件部分代碼如下所示,它定義了引擎的名字,設置了全局模塊來使配置文件生效,設置引擎的運行環(huán)境和與Codec Server相對應的名稱。BSAC應用程序的Linux多線程程序設計主要包括原始音頻信號的采集,音頻信號的壓縮編碼,最后編碼后的碼流存到本地磁盤用于解碼輸出。具體代碼為:

BSAC編碼器在封裝的過程中,進行了一些優(yōu)化操作,如浮點運算轉換為定點運算、結構的優(yōu)化、將使用頻繁的變量直接存儲到DSP的L1DSRAM中等,這樣可大大降低DSP的占用率且提高編碼算法的穩(wěn)定性。實驗表明,經(jīng)代碼優(yōu)化后,DSP的占用率從36%減少到18%,大大節(jié)約了DSP資源,為同時執(zhí)行多種編碼器提供了可能。本文的BSAC編碼器能夠支持多種采樣率(48 kHz,44.1 kHz,24 kHz),量化精度能實現(xiàn)8位或16位,并且能夠壓制出不超過96 kbit/s碼率的碼流。經(jīng)反復測試,編碼器穩(wěn)定性能相對較好,編碼速度快,能夠達到音頻編碼的實時要求,且壓縮后的碼流經(jīng)解碼器還原的聲音從主觀感覺上無法分辨與原始音頻的差別。
針對達芬奇平臺雙核架構的特點,本文采用TMS320DM6446實現(xiàn)了BSAC音頻編碼器的設計,與傳統(tǒng)的方法相比,大大縮短了開發(fā)時間。本文介紹了xDM算法接口標準及DaVinci的軟件架構,成功地將BSAC算法按照xDM接口標準進行了封裝,并且在TMS320DM6446的DSP上實現(xiàn),在ARM端開發(fā)的BSAC音頻編碼應用程序可根據(jù)用戶需求,自行設置不同的采樣率及碼率,編碼性能均較好。
[1]ISO/IEC JTC1/SC29/WG11.Information technology-coding of audiovisual objects Part3:Audio[S].2001.
[2]趙勇.DAVINCI技術原理與應用指南[M].南京:東南大學出版社,2008.
[3]劉書洋,李鳳亭.基于DSP平臺的AVS實時編碼系統(tǒng)設計[J].電視技術,2009,33(S1):60-64.
[4]張起貴.最新DSP技術:“達芬奇”系統(tǒng)、框架和組件[M].北京:國防工業(yè)出版社,2009.