(江蘇自動化研究所 連云港 222061)
HEVC[1~2]熵編碼器的二值化是將頭信息和量化殘差系數轉化為一系列語法元素,實現對輸入數據的預處理和預壓縮過程。相比于上下文建模和二進制算術編碼[3]來說,二值化的復雜度較低,但仍然存在數據依賴性[4],會影響編碼效率以及硬件編碼器的實際性能。本文針對二值化在硬件設計過程中存在的問題,提出一種面向硬件實現的二值化模塊方案,并驗證該方案的可行性,為相應的硬件設計提供參考。
HEVC規定的一系列語法元素多以4×4子塊為單位,按照頭信息、量化殘差系數的位置信息、符號信息和幅值信息的順序依次產生。二值化過程有截斷萊斯方法(TR),k階指數哥倫布方法(EGk)和定長方法(Fixed Length)幾種,個別語法元素還采用查表或組合的方式。其中k階指數哥倫布編碼是變長碼的一種,具有很好的結構性,由前綴和后綴兩部分構成,都依賴于指數哥倫布編碼的階數k。表1列出了幀內編碼過程中相關的語法元素及其對應的二值化方式,其中coeff_abs_level_remaining[5]作為最后一個相關語法元素,采用了TR和EGk組合的方式,是二值化過程中的研究重點。
二值化的預處理作用體現在,通過掃描[6]的方式能將二維量化殘差系數轉化為一維數據,有對角、垂直和水平三種掃描方式[7],并將非零系數盡量靠近排列,為后續處理做準備。這種基于4×4子塊的掃描技術適應于所有大小的TU,有利于編碼器的模塊化[8]。二值化的預壓縮作用體現在,硬件設計中一個4×4子塊的原始數據可能需要256(16×16)bit的存儲空間,二值化后,這個數值將大大減小。經統計,一個4×4子塊轉化為二元符號bin后,其平均長度遠小于輸入數據的數據量。

表1 幀內編碼的相關語法元素
二值化的數據依賴性主要體現在語法元素coeff_abs_level_remaining的后綴部分的二值化過程中:參數param隨著非零量化殘差系數的幅值進行自適應更新,幅值越大,param值越大,具體計算公式如下,其中coeff_abs為非零量化殘差系數的絕對值:

HEVC熵編碼器的硬件設計由于其復雜性和數據依賴性等原因,一直是研究的熱點,二值化過程也同樣如此。以16并行度的硬件系統為例,雖然param的自適應更新能夠提高壓縮效率,但是硬件系統在一個cycle內要處理16個量化殘差系數,需要多次進行式(1)的計算和判斷,如果設計不合理,就會造成關鍵路徑過長,影響硬件處理速度,不僅如此,當二值化過程隨熵編碼過程不斷重復計算執行時,會進一步加劇延時的問題。
針對上述問題,本文的目標就是簡化二值化的硬件設計,提高硬件效率,基于對二值化的研究分析,提出將參數param由自適應改為固定值,以期待在不過多影響壓縮性能的前提下,降低數據依賴性,同時又利于硬件實現,提高硬件處理效率。
本文針對二值化硬件設計過程中遇到的問題提出了一種簡化方案,為驗證該方案是否可行,對系統的性能影響如何,本文基于HEVC軟件參考平臺 HM[9]開展了驗證工作。
HM采用C++語言實現HEVC的完整編解碼過程,本文重點關注其中的熵編碼部分。經分析,HEVC熵編碼器主要有兩個作用:一是計算率失真優化選出最優劃分和最佳預測模式,二是對選出的最佳組合再進行一次編碼。前者需要遍歷多種CU、PU、TU大小以及多種預測模式[10~11],針對每一個組合都要進行一次熵編碼計算,計算重復率高,如果熵編碼模塊設計不合理,將大大影響遍歷過程的速率,限制硬件編碼效率;后者通過編碼得到實際的二進制碼流,用于后續傳輸、存儲和解碼[12],該過程只需要執行一次,但是必須遵循HEVC標準,否則碼流不能被正常解碼。
通過上述分析,熵編碼算法改進需要在遍歷選擇和最終編碼上有所區分,這也為硬件設計提供一種思路:為了加快遍歷選擇過程,同時又不影響最終的碼流結構,在硬件設計時,可以犧牲一定的邏輯開銷,設計兩套熵編碼器,一套用于遍歷選擇計算率失真優化,包括本文提出的簡化方案等優化或者是算法改進都可以在此基礎上進行;一套遵循標準算法,位于整個硬件系統的最末端,用于編碼生成二進制bit流,其性能對前期過程影響較小。
本文的主要工作在于分析HM中熵編碼器的實際調用關系,構造新函數以及修改遍歷選擇過程中的二值化實現部分。我們采用HM16.0版本來進行算法的修改和性能驗證,如果方案可行,該平臺還將作為硬件設計的參考,指導硬件模塊的實現。
圖1(a)為HM中熵編碼的相關函數調用關系示意圖,HM的遍歷選擇與最終編碼分別位于函數compressSlice和encodeSlice中。compressSlice主要完成遍歷選擇過程,選出最優劃分和最佳預測模式,encodeSlice對最優劃分和最佳預測模式執行最終的編碼。兩者均調用底層函數codeCoeffNxN,二值化就位于該函數中。但是如果僅簡單修改函數codeCoeffNxN的二值化部分,會導致最終生成的二進制碼流不能被正常解碼。為了避免該問題,本文將遍歷選擇和最終編碼時的熵編碼處理區分開來,為函數encodeSlice重新構造了一系列新的子函數,具體調用關系如圖1(b)所示。

圖1 熵編碼函數調用示意圖
新構造的函數用于執行最終的實際編碼,其中底層函數codeCoeffNxN_2在二值化過程中保持采用自適應更新param參數。此外,encodeSlice過程中涉及的大量的函數遞歸調用,也可以參考原始算法實現。函數compressSlice的子函數基本不變,但是需要修改函數codeCoeffNxN的二值化部分,采用固定param值即可。函數codeCoeffNxN和codeCoeffNxN_2雖然都是底層的實際編碼函數,但是兩者算法不同,輸出結果也不同。
在對HM16.0進行配置時,采用全幀內(All Intra,AI)配置文件,其余配置參數采用默認值,QP采用標準測試組(22、27、32、37)。我們選取了幾種分辨率、紋理和運動特征不同的全灰度視頻序列進行測試,具體如表2所示。

表2 仿真測試視頻序列表
量化殘差系數是熵編碼過程的輸入數據的主要部分,而語法元素remaining_value在量化殘差系數相關的語法元素中所占的比例也較大,所以對remaining_value二值化的修改勢必會影響到二值化結果,最終將會影響到二進制bit流的長度。本文分別統計了算法修改前后不同測試序列在不同QP情況下編碼輸出的二進制bit流的總長度,具體如表3所示。

表3 仿真測試視頻序列表
由表3可以發現,采用固定參數值會增加最終的二進制bit流長度,也因此反映出了采用自適應param參數進行二值化的優勢,這種對最終的碼流長度的影響是有限的。但是僅憑二進制bit流的總量變化不足以說明系統性能影響,為了比較算法修改前后的編碼性能變化,本文通過BD-rate(Bjontegaard delta bitrate)[13]來評價該方案的整體性能。當BD-rate為正值時,表明在相同PSNR條件下,碼率增加,系統性能有所下降,負值則表示碼率減少,系統性能有所提高。統計結果如表4所示。
通過表4可以看出,相比于原始自適應更新參數,修改后的算法雖然會導致系統的性能有所下降,但是這種影響很小,在可以接受的范圍內,但是該方案卻能大大簡化硬件的實現,所以該方案具備可行性。
基于上述結論,HM平臺還將用于硬件系統的功能驗證。硬件系統的輸入數據由軟件平臺打印得到,硬件設計中熵編碼的輸出結果也將與軟件平臺進行比較,從而驗證功能的正確性。此外,參數param的修改還可能會影響到CTU的最佳劃分方式,可以通過專門的碼流分析工具來協助驗證軟硬件的劃分方式是否一致。

表4 原始算法與快速算法性能比較表
經驗證,該方案具備可行性,能夠為硬件設計提供新的設計思路。結合軟件參考平臺HM,可以從以下幾個方面為硬件設計提供參考。
硬件熵編碼器的整體架構可以參考軟件算法的修改,采用兩套熵編碼器,分別用于遍歷選擇和實際編碼。整體架構如圖2所示。

圖2 整體硬件架構圖
這種架構相比于一般設計來說額外增加了一套熵編碼器。雖然增加了邏輯資源開銷,但是能夠將遍歷選擇過程與最終編碼過程區分開,兩者可以根據各自的優化目標進行相應改進,如簡化遍歷選擇過程的二值化部分,提高編碼效率,或者是上下文建模、二進制算數編碼的優化和架構的改進等。此外,兩套熵編碼器可以共用的模塊有很多,所以在硬件整體架構的修改上,邏輯資源開銷的增加是可控的。
本文針對二值化的數據依賴性問題展開研究,提出了一種硬件友好的二值化方案,經驗證,該方案是可行的。具體到硬件實現時,基于硬件整體架構的改變,在遍歷選擇過程中,語法元素remaining value的二值化采用固定參數param,量化殘差系數之間消除了數據依賴性,只需要判斷系數是否為非零,無需考慮自適應更新的問題。以16并行度為例,一個cycle就可以快速處理16個系數的二值化,大大加快了遍歷進程。
而對于實際編碼部分,雖然保持數據依賴性,但是可以通過合理的流水線設計來降低數據依賴性帶來的影響,如采用四級流水線結構,每一級處理4個量化殘差系數,其編碼效率不會影響到前期的遍歷選擇過程,從而避免影響系統的編碼效率。
前面均以16并行度為例進行說明,實際上,在硬件設計時可以靈活滿足不同并行度的設計需求。但是由于二維量化殘差系數以4×4子塊為單位,在硬件設計時多采用8或16并行度,即一個cycle處理8或16個量化殘差系數。針對遍歷選擇過程來說,熵編碼器的并行度設計需要考慮前后模塊的實際處理速度,不同大小的TU塊的編碼往往需要的時鐘數不同,可以通過打拍的方式保持同步。
本文針對二值化的硬件設計過程中遇到的問題提出了一種簡化方案,不論是在算法修改還是在硬件設計中,都采用兩套熵編碼器,并改進遍歷選擇過程的二值化部分,同時保證實際編碼過程遵循編碼標準不能改變。隨后本文基于HEVC軟件測試平臺HM進行算法修改和性能驗證,為硬件設計提供參考。該方案的優勢在于能夠簡化硬件設計,提高編碼效率,同時對系統性能的影響基本可以忽略不計。后續還可以在本文的基礎上進一步研究:
1)param的不同取值對編碼性能的影響是否存在最佳;能否通過某種方式模擬參數param的自適應更新,如分段取值、設定動態閾值等方式。
2)在算法改進與硬件設計過程中,對遍歷選擇和最終編碼兩者的熵編碼有不同的研究目標。前者在于如何能夠更快更好地完成最佳組合的選擇,后者在于如何在遵循HEVC標準的前提下優化架構設計。上下文建模和二進制算術編碼兩部分也是研究的重點,可以基于本文開展進一步的優化研究。