摘 要:針對H.264編碼運算量大的特點,采用快速模式選擇、快速運動搜尋、彙編優化等方法,在保證圖像品質的前提下,在Blackfin533上實作了H.264的CIF圖像的準實時編碼。實驗表明對于高、中、低各種運動複雜度的圖像,均實作了較高的壓縮比。
關鍵詞:H.264/AVC 數字信号處理器(DSP) 視訊編碼
随着計算機網絡和多媒體技術的發展,數字視訊的應用越來越廣泛,如DVD、網絡會議服務、數字電視等。在這些視訊處理與通信中,有效的視訊編碼是其關鍵技術。
H.264/AVC是ITU-T視訊編碼專家組和ISO/IEC運動圖像專家組聯合提出的最新一代的視訊編碼标準。H.264具有許多優良的性能[1]:壓縮比更高,與現有編碼标準(H.263、MPEG-4 Simple Profile)相比,在相同視訊品質下,能節省大約50%的碼流,圖像品質更好,适應性更廣,能較好地滿足實時(視訊會議)及非實時(存儲、廣播等)等各種應用。在DSP上實作H.264的實時編碼具有較大的工程意義及經濟價值。
1 H.264标準簡介及DSP平台
1.1 H.264标準簡介
H.264是ITU-T和ISO/IEC聯合制定的最新的視訊編碼标準,于1997年由ITU-T提出,2003年3月形成最終标準草案。它包含了視訊壓縮領域的許多最新研究成果,主要采用了下面的技術[1]:
(1) 将編碼分為編碼層VCL(Video Coding Layer)和傳輸層NAL(Network Abstraction Layer)。将編碼層和傳輸層分離,有利于H.264的擴充。
(2) H.264采用了空域内的幀内預測,共兩種預測模式:intra16×16和intra4×4。其中intra16×16有四種預測方式,intra4×4有九種預測方式。
(3) 對于幀間預測,增加了預測模式,共七種預測模式。預測塊從16×16可以最小細分為4×4。
(4) 增加了參考幀的數目,使預測更為準确。
(5) 将去塊效應濾波放在編碼環内,提高圖像的主觀品質。
(6) B幀可以作為參考幀,同時将圖像的解碼順序與顯示順序分離。
(7) 采用整系數變換,提高變換速度。
(8) 采用CAVLC、CABAC等新的熵編碼方法以提高編碼效果。
(9) 提高了碼流的抗誤碼能力,如對編碼資料進行分割,一幀圖像可以靈活地分為幾個slice等。
1.2 基于Blackfin533的DSP平台
Blackfin533是ADI公司Blackfin系列中的一款高性能視訊處理晶片。其主頻最高能達600MHz,每秒可處理1200M次乘加運算。具有大量針對視訊的專用指令,可以并行處理多條指令。
從總體上看,Blackfin533分為核心和系統接口兩大部分。核心指處理器、L1存儲器、事件控制器、核心定時器等;系統接口指SPORT接口、PPI接口、SPI接口、外部存儲控制器、DMA控制器及與它們接口的外部資源等。
Blackfin533開發平台原理圖如圖1所示。攝像頭輸出的模拟視訊信号經7113視訊晶片轉化為數字信号,此信号從Blackfin533的PPI接口進入Blackfin533,壓縮後的碼流由PCI橋傳給PC機。此系統通過Flash啟動,編碼過程中的原始圖像、參考幀及其他變量存儲在SDRAM中。
圖2為H.264編碼系統的視訊輸入子產品。7113晶片從視訊端子讀入攝像頭輸出的模拟信号,通過并口将數字信号輸出給Blackfin533。Blackfin533通過I2C總線對7113進行配置,使其輸出YUV模式、ITU656模式及增強ITU656模式等。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuQDN1QzNxETO1ADMy8CXxEjMxUDMwIzLcN3dl52LcNXZpJ3b0N3LcNXZnFWbp9CXnJ3bu8WZklmdh5WaoNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
圖1 Blackfin533平台總體架構圖
圖2 視訊輸入子產品
圖3 H.264編碼子產品圖
2 H.264編碼器的優化
2.1 總體優化
總體優化主要包括兩部分内容:程式子產品化的設計及資料結構的設計。
程式子產品化設計時,既要考慮子產品的獨立性,又要考慮子產品的完整性。筆者的H.264的子產品關系圖如圖3所示。視訊輸入子產品負責圖像序列的讀取,從PPI口進入的圖像首先儲存到外部存儲器,再進行編碼。讀入的圖像經幀間模式選擇和幀内模式選擇子產品,得到每個宏塊的預測模式。整系數變換、量化子產品對預測後的殘差進行整系數變換及量化處理。量化後的系數經過掃描後,在編碼子產品中進行UVLC編碼。最後由寫碼流子產品輸出。其中,去塊效應濾波子產品對反量化、整系數逆變換後的重建圖像進行濾波;圖像緩存管理子產品負責管理對參考圖像的存取。從圖3中可以看出,整系數變換與量化結合在一起作為一個子產品。主要因為:一方面H.264中,量化和整系數變換本身就部分結合在一起;另一方面這樣可以在寄存器中一起完成變換、量化,有助于減少資料的存儲次數和讀取時間。對于反量化、整系數逆變換,采用相似的設計思路。
資料結構的設計是H.264編碼的重要組成部分。合理的資料結構既有利于提高資料通路的速度又有利于程式的不同平台的移植。主要有以下原則:盡可能連續存放資料,這樣有利于用DMA方式對資料進行讀取;每種資料結構完成相對簡單的功能,這樣便于對不同資料結構的資料進行管理。如表示幀間模式的InterMode、幀内模式的IntraMode需要放在片記憶體儲器中以加快讀取速度,而參考幀的資料ImgData由于資料太大則需要放在片外存儲器中;盡可能使用短的資料類型,節省DSP的存儲空間。
2.2 各程式子產品的優化
各程式子產品的優化主要指各子產品的C代碼優化及部分代碼的彙編優化。
C代碼的優化對H.264編碼器有着重要意義,它既有利于提高編碼的速度,又有利于編碼器的跨平台移植。C代碼優化有下面的原則:
(1) 使編碼器代碼線性化,這樣有利于DSP的流水線滿負荷運作,更充分地發揮DSP的資料處理能力。
(2) 取消循環中的資料依賴。資料依賴是指後面指令的輸入資料依賴于前面指令的輸出資料。許多DSP晶片都提供了硬體循環指令,Blackfin533有兩個硬體循環器,可提供兩層的硬體循環。硬體循環實作了零開銷的循環判斷,能大大提高循環指令的執行速度,然而資料依賴的存在會阻止硬體循環的使用。是以要盡可能消除循環中的資料依賴。
(3) 将除法轉化為乘法或查表方式。Blackfin533提供了硬體乘法器,但沒有硬體除法器。執行除法指令會花費幾十或上百個指令周期。将除法轉化為乘法或查表,能大大減少這種開銷。
(4) 減少對片外存儲器的通路次數。片外存儲器相對于片記憶體儲器是低速裝置,片外存儲器的讀取時間是片記憶體儲器的幾倍至十幾倍。對于片外存儲器的資料要做到一次讀取,完成多次計算。
Blackfin晶片的開發環境VisualDSP本身已經帶有彙編器,但由于種種原因,對于某些運算量大、調用頻繁的函數仍需要進行手動彙編優化。進行彙編優化時,應注意以下幾點:
(1) 節省寄存器資源。Blackfin533提供了8個32位資料寄存器以及一系列的位址寄存器。對于這些寄存器,應盡可能做到一個寄存器多次使用;同時在能用較短的資料類型的情況下用短的資料類型,如能用short則不用int,這樣每個32位寄存器可以作為兩個16位寄存器使用,相當于增加了寄存器的數量。
(2) 使用專用指令。Blackfin533提供了求最大值、最小值、絕對值、CLIP及大量視訊專用指令,通過使用這些指令,能大大提高代碼的執行速度。
(3) 使用并行指令。對于大多數指令都存在相對應的并行指令,如一條運算指令可以并行兩條資料讀取指令。并行指令的使用能成倍提高代碼的執行速度。
(4) 将内層循環展開等。
對于不同的圖像幀(I、P),各子產品所占的比例各不相同。對于I幀,幀内模式選擇和去塊效應濾波占較大的比例;對于P幀,幀間模式選擇則占較大的比例。總之,模式選擇及去塊效應濾波是H.264編碼的瓶頸,需要對這兩部分進行優化。
進行模式選擇時會調用絕對內插補點求和函數(SAD)及hadamard變換後再絕對值求和函數(SATD)。這兩個函數雖然較簡單,但調用較頻繁,對這兩個函數進行彙編優化,能較大提高模式選擇的速度。對于絕對內插補點求和函數(SAD),通過使用Blackfin的專用視訊指令SAA,可以大大提高運算速度,具體見彙編優化統計表1和表2。
表1 優化前後函數所占時鐘周期數對比表
優化函數 | 優化前(時鐘周期數) | 優化後(時鐘周期數) | 提高倍數 |
SAD | 1385 | 55 | 25 |
SATD | 1964 | 84 | 23 |
GetStrength | 50214 | 4983 | 10 |
EdgeLoopY | 61227 | 5032 | 12 |
EdgeLoopUV | 52110 | 4173 | 12 |
表2 優化後的H.264各子產品性能
占用時間(時鐘周期數M) | 所占比例 | |
模式選擇(包含插值) | 11.26 | 53.6% |
變換、量化 | 1.87 | 8.9% |
反量化、反變換 | 1.93 | 9.2% |
編碼(UVLC) | 0.90 | 4.3% |
去塊效應濾波 | 2.73 | 13% |
其他 | 2.31 | 11% |
表3 壓縮後的CIF圖像的品質
H.264編碼器 | ||||
視訊序列 (100幀) | 平均峰值信噪比PSNR(dB) | 碼率(kbit/s) | ||
亮度Y | 色度U | 色度V | ||
Foreman | 36.57 | 41.23 | 43.39 | 503 |
Shanlin | 34.00 | 39.95 | 41.30 | 1035 |
tempete | 30.47 | 35.81 | 37.60 | 1059 |
mobile | 30.58 | 34.48 | 34.24 | 1587 |
去塊效應濾波在編碼中占有較大的比重。主要包括:計算濾波強度和行列濾波兩部分,需要針對這兩個子子產品進行優化。去塊效應濾波中有較多的判斷語句,判斷語句會打斷DSP的流水線,使DSP不能充分發揮其性能,優化時應盡可能将判斷轉移到循環外面去,以提高執行效率。同時去塊效應濾波需要頻繁地通路待濾波資料,減少對這些資料的通路次數也能較大地提高去塊效應濾波的速度。
SAD()的函數原型及其彙編代碼[2]:
for(i=0;i<16*16;i++)
result +=abs( *pSrc++ - *pRef++);
LSETUP(row_start,row_end) LC0=P1; //利用Blackfin的硬體循環實作SAD的循環
row_start:
R3 = [I1++]; //讀取資料
SAA(R1:0,R3:2) || R1= [I0++] || R2= [I1++]; //計算R1:0和R3:2的SAD
SAA(R1:0,R3:2)(R) || R0= [I0++] || R3= [I1++]; //執行SAA的同時,讀取資料
SAA(R1:0,R3:2) || R1= [I0++] || R2= [I1++];
row_end:SAA(R1:0,R3:2)(R) || R0=[I0++] || R2= [I1++];
3 實驗結果
筆者使用600MHz時鐘的Blackfin533,對于低、中運動複雜度的圖像序列,能夠實作25幀/秒的實時編碼;對于高運動複雜度的圖像序列,能實作20幀/秒左右的準實時編碼。其各子產品所占時間比例見表2。
編碼器的性能名額如下:1個參考幀;幀間模式采用16×16、16×8、8×16、8×8模式;幀内模式對16×16采用4種預測模式,對于4×4采用9種預測模式;1/4像素的運動估計;熵編碼采用CAVLC編碼方式。
表3為不同圖像序列壓縮效果的比較。每種序列壓縮100幀圖像,采用IPPPP....的編碼模式。綜上所述,在Blkfin533平台上實作了H.264的CIF圖像的準實時編碼。該系統具有碼流低、延時小、圖像品質高等優點。
參考文獻
1 Draft ITU-T recommendation and final draft international stan- dard of joint
video specification (ITU-T Rec. H.264/ISO/IEC 14 496-10 AVC. in Joint Video Team (JVT)
of ISO/IEC MPEG and ITU-T VCEG, JVTG050, 2003
2 AD Inc. Blackfin processor instruction set reference.Rev 3.0,June 2004:417~421,487~492