摘 要: 針對光電經緯儀高幀頻和高分辨率圖像實時壓縮難以實現的問題,在TI公司提供的H.264單核編碼開源工程和多核并行算法的基礎上,提出了基于TMS320C6678多核處理器的H.264并行算法。在單核編碼開源工程實現多核并行視頻編碼,將每幀圖像平均劃分成多個Slice,每個DSP核處理一個Slice。實驗結果表明,與單核視頻編碼相比,多核并行視頻編碼的加速與比核數的增加呈線性增長,在TMS320C6678多核處理器上實現光電經緯儀的實時圖像壓縮具備較強的工程實踐性。
關鍵詞: 光電經緯儀;H.264;TMS320C6678;實時壓縮;Slice
隨著高幀頻、高分辨率成像傳感器技術在光電經緯儀領域的廣泛應用,光電經緯儀圖像在傳輸和存儲過程中將占用更大帶寬和更多存儲資源,因此有必要對圖像進行實時壓縮。
在當前眾多視頻編碼標準中,H.264因其高數據壓縮率和友好的網絡親和性得到廣泛應用[1-2]。但是,H.264更高的計算復雜度帶來了更長的編碼時間,參考文獻[3]以x264為基礎,僅僅實現了時域可伸縮的編碼方案,也只能支持最大分辨率QVGA的實時編碼,這一困境使得H.264很難在光電經緯儀實時圖像傳輸系統(tǒng)中應用。
本文立足多核DSP和H.264編碼層次結構的研究,在TMS320C6678多核DSP上實現H.264的多核并行壓縮編碼,在TI公司提供的H.264開源工程單核編碼的基礎上,實現對光電經緯儀圖像的實時壓縮。
1 H.264多核并行算法分析
基于Slice級的并行算法是將每幀圖像劃分為多個Slice[4],因為同一幀的各個Slice之間沒有數據依賴,所以可以實現并行編碼。當把一幀圖像分成多個Slice后,降低了圖像內部相關性,但過多的Slice劃分會對圖像質量產生影響,因此不能無限制地進行Slice劃分[5]。
在同一幅圖像上,不同的區(qū)域其內容復雜度也可能各不相同[6],使得各個Slice的編碼時間各不相同,直接導致了整個編碼器的均衡程度降低。另一方面,在編碼下一幀圖像之前,各個核必須完成對應Slice的編碼,因此各個Slice必須在編碼下一幀圖像之前進行同步,同步的時間直接取決于各個核對Slice編碼的均衡程度。
2 H.264核心代碼結構分析
本文基于H.264單核編碼實現多核并行壓縮, H.264單核編碼的流程圖如圖1所示。H.264工程對編碼參數和存儲空間初始化后,循環(huán)調用Encode_one_frame部分,對每一幀圖像進行編碼,直至最后一幀。在H.264開源工程的基礎上,給出了基于Slice的多核并行壓縮編碼,流程圖如圖2所示。編碼前先對一幀圖像進行Slice劃分,當所有內核完成相應Slice編碼后進行多核同步,然后才能進行下一幀圖像的編碼。依此類推,直至最后一幀圖像編碼完成。
3 H.264的DSP實現
本文選擇TI codec庫提供的H.264開源工程[7],該程序在作者實驗室的DSP+FPGA圖像處理開發(fā)板上實現,運行頻率為1 GHz,編譯環(huán)境為CCS v5.0。
多核并行編碼的實現是把一幀圖像分為多個Slice,由多個處理器核來實現每個Slice的壓縮算法。經過對H.264工程的研究,Slice劃分算法的實現可以由以下兩種方式來實現:
?。?)按照宏塊數目平均劃分(這里宏塊大小為16宏塊數),如式(1)所示:
其中,image_height為圖像的高度,ncores為參與編碼并行核數,m[ncores]為每個Slice的邊界(單位為行)。ncores個核并行處理的Slice邊界分別為:
核0:(0~m[ncores])(表示核0處理第0~m[ncores]行的數據)
核1:(m[ncores]~2×m[ncores])
…
核7:(7×m[ncores]~8×m[ncores])
單核并行處理時只調用核0,雙核時調用核0~1,四核時調用核0~3。
?。?)按照宏塊計算復雜度平均劃分(這里的宏塊大小為16×16)。首先計算出一幀圖像中每個宏塊的計算復雜度,記為cost[i],i為宏塊的序列號;其次,計算所有宏塊的總計算復雜度,記為Total_cost;最后,按照Total_cost來平均劃分Slice邊界:
其中,M[j]為宏塊的序列號,j為實現次數。計算Slice邊界步驟如下:
①當式(2)中的條件首次實現時,記錄M[1],并將M[1]帶入式(3)中,計算出第一個Slice的行數N[1];
?、趎cores變?yōu)閚cores-1,i由0變?yōu)镸[1],Total_cost減去式(2)的左值,得到新的Total_cost;
?、坜D到步驟①,計算下一個新的M[2]值,直到ncores為0,停止計算,可以得到ncores個核并行處理的Slice邊界為:
核0:(0~M[1])
核1:(M[1]~M[2])
…
核7:(M[7]~M[8])
4 實驗結果分析
為了測試H.264編碼算法在TMS320C6678多核處理器上的并行實現,實驗中將相同YUV視頻序列分別使用(1)、(2)兩種Slice劃分算法實現,這兩種算法均經過單核、雙核、四核分別運行。本文實驗對象為YUV420P格式10幀圖像,幀排序方式為IPPP,輸出為H.264格式。對比不同劃分算法的多核并行處理結果如表1、2所示。
從表1、2可看出,第1幀的處理時間為剩余9幀的一半,這是因為第1幀編碼為I幀,是幀內預測;而第2~10幀圖像都是P幀,是幀間預測。劃分算法(1)單核情況下每幀圖像的處理時間與劃分算法(2)單核情況下的處理時間相同,這是因為單核情況下,每幀圖像都為一個Slice;在雙核情況下,劃分算法(2)相對于劃分算法(1)在處理上有5%的提升;四核情況下,劃分算法(2)相對于劃分算法(1)在時間上有很小的提升。
劃分算法(2)相對于算法(1)在性能上能有所提升是因為本實驗所選擇的圖像的計算復雜度分布不均勻,算法(2)是以一幀圖像的宏塊復雜度為基礎來平均劃分一幀圖像的,因此對于一幀圖像來說,每片Slice所分配的計算負載更加平均,比算法(1)的按行數平均劃分處理時間要減少。
單核、雙核、四核并行處理加速比對比結果如表3所示。
從表3可以看出,在四核處理情況下,劃分算法(1)的加速比是單核處理的3.6倍,劃分算法(2)相對于劃分算法(1)性能上有很小的提升;在雙核情況下,劃分算法(1)的加速比約為單核處理的1.84倍,而劃分算法(2)相對于劃分算法(1)的性能有6%的提升。
單核、雙核、四核的處理加速比沒有與并行核數完全成線性關系的原因是:(1)每幀圖像劃分的每個Slice的計算復雜度不同,因此編碼所需的時間也不同,每幀圖像需要等到編碼最慢的Slice完成,才算一幀圖像編碼結束;(2)每個Slice都包含獨立的頭信息,在編碼時會有額外的讀取頭信息的時間消耗。
由表1、2可以得出,單核處理的幀率為82 f/s,雙核處理的幀率達到150~160 f/s,四核處理的幀率達到了300 f/s,可以看出多核并行用于實現光電經緯儀圖像實時壓縮的潛能。
本文針對光電經緯儀高幀頻和高分辨率圖像實時壓縮難以實現的問題,對H.264算法在TMS320C6678上的多核并行進行了研究,在H.264單核編碼的基礎上實現了兩種Slice級多核并行壓縮編碼算法,分別實現了光電經緯儀圖像實時壓縮的功能。
本文的試驗驗證了多核并行壓縮算法在實時壓縮方面的可行性,對Slice劃分算法的優(yōu)化沒有進行詳細研究,這是下一步研究的重點。
參考文獻
[1] 張紀鈴,夏超,黃富良.一種基于H264編碼標準的快速運動估計算法[J].電子測量技術,2009,32(8):69-73.
[2] 許春冬,姚萌,廖薇.基于DM642的T264視頻編碼器優(yōu)化[J].新特器件應用,2009,11(12):11-13,17.
[3] 孔群娥,曾學文.基于x264實現H.264的時域可伸縮編碼[J].微計算機應用,2011,32(3):24-28.
[4] 黃亮.基于多核處理器的SVC高清實時編碼[J].計算機工程與應用,2013,49(13):170-174.
[5] 夏齡,舒濤.一種H.264/AVC視頻編碼并行算法[J].計算機工程,2013,39(4):314-317.
[6] 陳曉娟,陳淑榮.實時視頻圖像的清晰度檢測算法研究[J].微型機與應用,2010,29(17):36-38.
[7] 彭旭鋒,劉文怡,李金力.基于DSP和FPGA的實時圖像壓縮系統(tǒng)設計[J].微型機與應用,2019,29(11):17-20.