(江蘇自動化研究所 連云港 222061)
HEVC[1~2]熵編碼器的二值化是將頭信息和量化殘差系數(shù)轉(zhuǎn)化為一系列語法元素,實現(xiàn)對輸入數(shù)據(jù)的預處理和預壓縮過程。相比于上下文建模和二進制算術(shù)編碼[3]來說,二值化的復雜度較低,但仍然存在數(shù)據(jù)依賴性[4],會影響編碼效率以及硬件編碼器的實際性能。本文針對二值化在硬件設(shè)計過程中存在的問題,提出一種面向硬件實現(xiàn)的二值化模塊方案,并驗證該方案的可行性,為相應的硬件設(shè)計提供參考。
HEVC規(guī)定的一系列語法元素多以4×4子塊為單位,按照頭信息、量化殘差系數(shù)的位置信息、符號信息和幅值信息的順序依次產(chǎn)生。二值化過程有截斷萊斯方法(TR),k階指數(shù)哥倫布方法(EGk)和定長方法(Fixed Length)幾種,個別語法元素還采用查表或組合的方式。其中k階指數(shù)哥倫布編碼是變長碼的一種,具有很好的結(jié)構(gòu)性,由前綴和后綴兩部分構(gòu)成,都依賴于指數(shù)哥倫布編碼的階數(shù)k。表1列出了幀內(nèi)編碼過程中相關(guān)的語法元素及其對應的二值化方式,其中coeff_abs_level_remaining[5]作為最后一個相關(guān)語法元素,采用了TR和EGk組合的方式,是二值化過程中的研究重點。
二值化的預處理作用體現(xiàn)在,通過掃描[6]的方式能將二維量化殘差系數(shù)轉(zhuǎn)化為一維數(shù)據(jù),有對角、垂直和水平三種掃描方式[7],并將非零系數(shù)盡量靠近排列,為后續(xù)處理做準備。這種基于4×4子塊的掃描技術(shù)適應于所有大小的TU,有利于編碼器的模塊化[8]。二值化的預壓縮作用體現(xiàn)在,硬件設(shè)計中一個4×4子塊的原始數(shù)據(jù)可能需要256(16×16)bit的存儲空間,二值化后,這個數(shù)值將大大減小。經(jīng)統(tǒng)計,一個4×4子塊轉(zhuǎn)化為二元符號bin后,其平均長度遠小于輸入數(shù)據(jù)的數(shù)據(jù)量。
表1 幀內(nèi)編碼的相關(guān)語法元素
二值化的數(shù)據(jù)依賴性主要體現(xiàn)在語法元素coeff_abs_level_remaining的后綴部分的二值化過程中:參數(shù)param隨著非零量化殘差系數(shù)的幅值進行自適應更新,幅值越大,param值越大,具體計算公式如下,其中coeff_abs為非零量化殘差系數(shù)的絕對值:
HEVC熵編碼器的硬件設(shè)計由于其復雜性和數(shù)據(jù)依賴性等原因,一直是研究的熱點,二值化過程也同樣如此。以16并行度的硬件系統(tǒng)為例,雖然param的自適應更新能夠提高壓縮效率,但是硬件系統(tǒng)在一個cycle內(nèi)要處理16個量化殘差系數(shù),需要多次進行式(1)的計算和判斷,如果設(shè)計不合理,就會造成關(guān)鍵路徑過長,影響硬件處理速度,不僅如此,當二值化過程隨熵編碼過程不斷重復計算執(zhí)行時,會進一步加劇延時的問題。
針對上述問題,本文的目標就是簡化二值化的硬件設(shè)計,提高硬件效率,基于對二值化的研究分析,提出將參數(shù)param由自適應改為固定值,以期待在不過多影響壓縮性能的前提下,降低數(shù)據(jù)依賴性,同時又利于硬件實現(xiàn),提高硬件處理效率。
本文針對二值化硬件設(shè)計過程中遇到的問題提出了一種簡化方案,為驗證該方案是否可行,對系統(tǒng)的性能影響如何,本文基于HEVC軟件參考平臺 HM[9]開展了驗證工作。
HM采用C++語言實現(xiàn)HEVC的完整編解碼過程,本文重點關(guān)注其中的熵編碼部分。經(jīng)分析,HEVC熵編碼器主要有兩個作用:一是計算率失真優(yōu)化選出最優(yōu)劃分和最佳預測模式,二是對選出的最佳組合再進行一次編碼。前者需要遍歷多種CU、PU、TU大小以及多種預測模式[10~11],針對每一個組合都要進行一次熵編碼計算,計算重復率高,如果熵編碼模塊設(shè)計不合理,將大大影響遍歷過程的速率,限制硬件編碼效率;后者通過編碼得到實際的二進制碼流,用于后續(xù)傳輸、存儲和解碼[12],該過程只需要執(zhí)行一次,但是必須遵循HEVC標準,否則碼流不能被正常解碼。
通過上述分析,熵編碼算法改進需要在遍歷選擇和最終編碼上有所區(qū)分,這也為硬件設(shè)計提供一種思路:為了加快遍歷選擇過程,同時又不影響最終的碼流結(jié)構(gòu),在硬件設(shè)計時,可以犧牲一定的邏輯開銷,設(shè)計兩套熵編碼器,一套用于遍歷選擇計算率失真優(yōu)化,包括本文提出的簡化方案等優(yōu)化或者是算法改進都可以在此基礎(chǔ)上進行;一套遵循標準算法,位于整個硬件系統(tǒng)的最末端,用于編碼生成二進制bit流,其性能對前期過程影響較小。
本文的主要工作在于分析HM中熵編碼器的實際調(diào)用關(guān)系,構(gòu)造新函數(shù)以及修改遍歷選擇過程中的二值化實現(xiàn)部分。我們采用HM16.0版本來進行算法的修改和性能驗證,如果方案可行,該平臺還將作為硬件設(shè)計的參考,指導硬件模塊的實現(xiàn)。
圖1(a)為HM中熵編碼的相關(guān)函數(shù)調(diào)用關(guān)系示意圖,HM的遍歷選擇與最終編碼分別位于函數(shù)compressSlice和encodeSlice中。compressSlice主要完成遍歷選擇過程,選出最優(yōu)劃分和最佳預測模式,encodeSlice對最優(yōu)劃分和最佳預測模式執(zhí)行最終的編碼。兩者均調(diào)用底層函數(shù)codeCoeffNxN,二值化就位于該函數(shù)中。但是如果僅簡單修改函數(shù)codeCoeffNxN的二值化部分,會導致最終生成的二進制碼流不能被正常解碼。為了避免該問題,本文將遍歷選擇和最終編碼時的熵編碼處理區(qū)分開來,為函數(shù)encodeSlice重新構(gòu)造了一系列新的子函數(shù),具體調(diào)用關(guān)系如圖1(b)所示。
圖1 熵編碼函數(shù)調(diào)用示意圖
新構(gòu)造的函數(shù)用于執(zhí)行最終的實際編碼,其中底層函數(shù)codeCoeffNxN_2在二值化過程中保持采用自適應更新param參數(shù)。此外,encodeSlice過程中涉及的大量的函數(shù)遞歸調(diào)用,也可以參考原始算法實現(xiàn)。函數(shù)compressSlice的子函數(shù)基本不變,但是需要修改函數(shù)codeCoeffNxN的二值化部分,采用固定param值即可。函數(shù)codeCoeffNxN和codeCoeffNxN_2雖然都是底層的實際編碼函數(shù),但是兩者算法不同,輸出結(jié)果也不同。
在對HM16.0進行配置時,采用全幀內(nèi)(All Intra,AI)配置文件,其余配置參數(shù)采用默認值,QP采用標準測試組(22、27、32、37)。我們選取了幾種分辨率、紋理和運動特征不同的全灰度視頻序列進行測試,具體如表2所示。
表2 仿真測試視頻序列表
量化殘差系數(shù)是熵編碼過程的輸入數(shù)據(jù)的主要部分,而語法元素remaining_value在量化殘差系數(shù)相關(guān)的語法元素中所占的比例也較大,所以對remaining_value二值化的修改勢必會影響到二值化結(jié)果,最終將會影響到二進制bit流的長度。本文分別統(tǒng)計了算法修改前后不同測試序列在不同QP情況下編碼輸出的二進制bit流的總長度,具體如表3所示。
表3 仿真測試視頻序列表
由表3可以發(fā)現(xiàn),采用固定參數(shù)值會增加最終的二進制bit流長度,也因此反映出了采用自適應param參數(shù)進行二值化的優(yōu)勢,這種對最終的碼流長度的影響是有限的。但是僅憑二進制bit流的總量變化不足以說明系統(tǒng)性能影響,為了比較算法修改前后的編碼性能變化,本文通過BD-rate(Bjontegaard delta bitrate)[13]來評價該方案的整體性能。當BD-rate為正值時,表明在相同PSNR條件下,碼率增加,系統(tǒng)性能有所下降,負值則表示碼率減少,系統(tǒng)性能有所提高。統(tǒng)計結(jié)果如表4所示。
通過表4可以看出,相比于原始自適應更新參數(shù),修改后的算法雖然會導致系統(tǒng)的性能有所下降,但是這種影響很小,在可以接受的范圍內(nèi),但是該方案卻能大大簡化硬件的實現(xiàn),所以該方案具備可行性。
基于上述結(jié)論,HM平臺還將用于硬件系統(tǒng)的功能驗證。硬件系統(tǒng)的輸入數(shù)據(jù)由軟件平臺打印得到,硬件設(shè)計中熵編碼的輸出結(jié)果也將與軟件平臺進行比較,從而驗證功能的正確性。此外,參數(shù)param的修改還可能會影響到CTU的最佳劃分方式,可以通過專門的碼流分析工具來協(xié)助驗證軟硬件的劃分方式是否一致。
表4 原始算法與快速算法性能比較表
經(jīng)驗證,該方案具備可行性,能夠為硬件設(shè)計提供新的設(shè)計思路。結(jié)合軟件參考平臺HM,可以從以下幾個方面為硬件設(shè)計提供參考。
硬件熵編碼器的整體架構(gòu)可以參考軟件算法的修改,采用兩套熵編碼器,分別用于遍歷選擇和實際編碼。整體架構(gòu)如圖2所示。
圖2 整體硬件架構(gòu)圖
這種架構(gòu)相比于一般設(shè)計來說額外增加了一套熵編碼器。雖然增加了邏輯資源開銷,但是能夠?qū)⒈闅v選擇過程與最終編碼過程區(qū)分開,兩者可以根據(jù)各自的優(yōu)化目標進行相應改進,如簡化遍歷選擇過程的二值化部分,提高編碼效率,或者是上下文建模、二進制算數(shù)編碼的優(yōu)化和架構(gòu)的改進等。此外,兩套熵編碼器可以共用的模塊有很多,所以在硬件整體架構(gòu)的修改上,邏輯資源開銷的增加是可控的。
本文針對二值化的數(shù)據(jù)依賴性問題展開研究,提出了一種硬件友好的二值化方案,經(jīng)驗證,該方案是可行的。具體到硬件實現(xiàn)時,基于硬件整體架構(gòu)的改變,在遍歷選擇過程中,語法元素remaining value的二值化采用固定參數(shù)param,量化殘差系數(shù)之間消除了數(shù)據(jù)依賴性,只需要判斷系數(shù)是否為非零,無需考慮自適應更新的問題。以16并行度為例,一個cycle就可以快速處理16個系數(shù)的二值化,大大加快了遍歷進程。
而對于實際編碼部分,雖然保持數(shù)據(jù)依賴性,但是可以通過合理的流水線設(shè)計來降低數(shù)據(jù)依賴性帶來的影響,如采用四級流水線結(jié)構(gòu),每一級處理4個量化殘差系數(shù),其編碼效率不會影響到前期的遍歷選擇過程,從而避免影響系統(tǒng)的編碼效率。
前面均以16并行度為例進行說明,實際上,在硬件設(shè)計時可以靈活滿足不同并行度的設(shè)計需求。但是由于二維量化殘差系數(shù)以4×4子塊為單位,在硬件設(shè)計時多采用8或16并行度,即一個cycle處理8或16個量化殘差系數(shù)。針對遍歷選擇過程來說,熵編碼器的并行度設(shè)計需要考慮前后模塊的實際處理速度,不同大小的TU塊的編碼往往需要的時鐘數(shù)不同,可以通過打拍的方式保持同步。
本文針對二值化的硬件設(shè)計過程中遇到的問題提出了一種簡化方案,不論是在算法修改還是在硬件設(shè)計中,都采用兩套熵編碼器,并改進遍歷選擇過程的二值化部分,同時保證實際編碼過程遵循編碼標準不能改變。隨后本文基于HEVC軟件測試平臺HM進行算法修改和性能驗證,為硬件設(shè)計提供參考。該方案的優(yōu)勢在于能夠簡化硬件設(shè)計,提高編碼效率,同時對系統(tǒng)性能的影響基本可以忽略不計。后續(xù)還可以在本文的基礎(chǔ)上進一步研究:
1)param的不同取值對編碼性能的影響是否存在最佳;能否通過某種方式模擬參數(shù)param的自適應更新,如分段取值、設(shè)定動態(tài)閾值等方式。
2)在算法改進與硬件設(shè)計過程中,對遍歷選擇和最終編碼兩者的熵編碼有不同的研究目標。前者在于如何能夠更快更好地完成最佳組合的選擇,后者在于如何在遵循HEVC標準的前提下優(yōu)化架構(gòu)設(shè)計。上下文建模和二進制算術(shù)編碼兩部分也是研究的重點,可以基于本文開展進一步的優(yōu)化研究。