新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 基于ADSP-BF561的H.264視頻編碼器的實現

        基于ADSP-BF561的H.264視頻編碼器的實現

        作者:崔海燕,王卿 時間:2008-07-03 來源:電子元器件應用 收藏

          3.2從機到的程序移植

        本文引用地址:http://www.104case.com/article/85224.htm

          要將端精簡的程序移植到A-BF561的開發環境Visual 下,以使其能夠初步運行,所需考慮的主要是語法規則和內存分配等問題。 (1)除去所有編譯環境不支持的函數

          主要是除去某些與時間相關的函數、將文件操作修改為讀取文件數據緩存的操作、刪除SNR信息收集等DSP平臺實現不需要的代碼。還要注意:函數的聲明、數據結構的類型要符合DSP的C語言格式。

          (2)添加與硬件相關的代碼

          該代碼包括系統初始化、輸出模塊代碼、中斷服務程序和碼速率控制程序等。

          (3)配置LDF文件

          因為剛移植的代碼往往數據和程序都非常大,SRAM里面肯定是放不下的,這時鏈接就會有問題。剛開始的時候,最好把所有的程序和數據都放在SDRAM里,這樣鏈接就不會有問題了。Stack和heap情況類似,都先放到SDRAM。一般在開始時,往往需要的是一個可以正確運行的程序,而速度倒在其次。

          (4) Malloc問題的解決

          DSP下的開發,malloc是一個需要解決的問題。如果動態申請內存,就算可以運行,其結果往往也是不對的。所以,最好進行靜態分配,可用數組的形式分配。

          移植完畢后,即可實現基于ADSP-BF561的H_264編碼,此時如果速度達不到實時編碼的要求,還可以進一步進行優化。

          4 DSP平臺上的代碼優化

          在Visual DSP開發環境下對代碼進行優化的主要方法有C語言級優化和匯編級優化。

          4.1 C語言級優化

          通過VC6的profile分析工具發現:移植與優化的重點應在運動估計部分。筆者通過比較各種算法后選擇了菱形(DS)搜索法。DS算法可采用兩種搜索模板,分別是有9個檢索點的大模板LD-SP(Large Diamond Search Pattern)和有5個檢索點的小模板SDSP(Small Diamond Search Pattern)。其菱形搜索示意圖如圖3所示。搜索時,先用大模板計算,當最小塊誤差SAD點出現在中心點處時,再將大模板LDSP換為SDSP進行匹配運算,這時,5個點中具有最小SAD者若為中心點,則該點即為最優匹配點,然后結束搜索,否則將繼續以此點為搜索中心進行SPSS搜索。

          經JM實驗證實,采用此種方法,可以節約大約10%的運行時間,且代碼量無太大增長。

          針對DSP的特點和相關的硬件指令,設計時可對代碼進行如下優化:

          ◇對程序結構進行調整。對不適合DSP執行的語句進行改寫,以提高代碼的并行性。
          ◇宏的使用。也就是將有些較短,執行單一、調用次數多的函數改為宏。
          ◇循環優化是將C語言中的for循環打開,排流水線,提高并行性。
          ◇計算表格化是將運行時計算的參數做成便于查找的表格常數數值,從而將運行計算轉化為編譯運算。如在量化和反量化程序中進行移位位數的處理時,可先計算出所有可能的值,而后來的運算就可以通過查表得到數值。
          ◇浮點數定點化。因為Blackfin561并不支持浮點運算,但原始程序代碼卻是浮點運算的格式,所以必須改成定點運算,而其修改后的執行速度也會加快很多。
          ◇盡量用邏輯運算代替乘除運算。由于乘除運算指令的執行時間要遠遠大于邏輯移位指令,尤其是除法指令,故應盡量用邏輯移位運算來代替乘除運算,以加快指令的運行速度。
          ◇盡量少進行函數調用。對一些小的函數,最好是用適當的內聯函數將其直接寫入主函數中進行替代,而對于一些調用不多的函數,也可以直接寫入主函數內,這樣可減少不必要的操作以提高速度。
          ◇減少判斷轉換。
          ◇盡量靜態分配內存。
          ◇調用系統提供的豐富的內聯函數。

          此外,為了充分發揮DSP的運算能力,還必須從它的硬件結構出發,最大限度地利用它的8個功能單元,使用軟件流水線盡量讓程序無沖突地并行執行。也可將最耗時的函數抽取出來,用線性匯編改寫,從而最大限度的利用DSP的并行性。

          4.2匯編級優化

          匯編級優化主要指如下幾點操作:

          (1)使用寄存器資源

          Blackfin561提供了8個32位數據寄存器以及一系列的地址寄存器。使用寄存器代替局部變量時,若局部變量用來保存中間結果,那么用寄存器代替局部變量可省掉很多訪問內存的時間。

          (2)使用專用指令

          Blackfin561提供有求最大值、最小值、絕對值、CUP及大量視頻專用指令,應可能用多位的指令來訪問少位的數據。通過使用這些指令能大大提高代碼的執行速度。如用int型(32位)訪問2個short(16位)型數據時,可將其分別放在32位寄存器的高16位和低16位字段。這樣,數據讀取效率可以提高1倍,從而減少內存訪問次數。

          (3)使用并行指令和向量指令

          ADSP-BF561中每條通用指令都可以和一條或兩條存儲器訪問指令并列執行,這樣有利于ADSP-BF561的流水線滿負荷運行,更充分發揮ADSP-BF561的數據處理能力。

          (4)合理存放反復調用的程序段

          把被反復調用的程序段(如DCT變換和IDCT變換)放在片內程序存儲區中,把頻繁用到的數據段(如編碼表)放在片內數據存儲器中,而把不常用到的程序和數據段放在片外存儲器中,以避免對程序或數據進行不必要的反復搬移。

          (5)合理使用內外存儲器

          BF561片內只有256KB的存儲空間,因此當前幀、參考幀和當前幀的重建幀都必須放至片外存儲器,壓縮碼流若被主機讀取,也可放至片外。其它數據如程序代碼、全局變量、VLC碼表、各編碼模塊產生的中間數據等均可放至片內。

          (6)DMA的使用

          由于CPU訪問片外存儲器的速度通常要比訪問片內慢幾十倍,片外數據的傳輸通常成為程序運行時的瓶頸,這樣,即使代碼效率很高,流水線也會因為等待數據而被嚴重阻塞。解決這一問題的有效方法是用DMA傳送數據。程序是逐個宏塊進行編碼的,在編碼當前宏塊的同時,先由DMA將下一個宏塊的數據、用到的參考幀數據由片外傳送至片內,當前宏塊做完運動補償后,DMA又將重建后的宏塊由片內傳送至片外。這樣CPU只對片內數據進行操作,從而使流水線可以順利進行,而壓縮碼流按逐個碼字有時間間隔地寫入,可由CPU直接寫至片外。

          5 結束語

          經過用ADSP-BF561匯編語言改寫的對應函數的優化程序經調試運行后,DCT,IDCT部分效率提高了大約15倍,去塊濾波部分效率提高了大約6~7倍。對于模塊中的其它部分函數,也同樣取得了良好的優化結果。說明其優化工作確實達到了良好的效果。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 明溪县| 太康县| 肃宁县| 天等县| 长治市| 南木林县| 南雄市| 博兴县| 临泽县| 闽清县| 洪雅县| 互助| 德惠市| 花垣县| 双桥区| 油尖旺区| 游戏| 巴林右旗| 佳木斯市| 凌海市| 井冈山市| 葫芦岛市| 宜黄县| 梁山县| 农安县| 城固县| 平武县| 罗田县| 武穴市| 澜沧| 大方县| 南召县| 托克逊县| 宁陵县| 萨迦县| 金湖县| 江永县| 湟中县| 景谷| 绥化市| 石嘴山市|