楊 賀,楊秀芝,陳 建
(福州大學(xué)物理與信息工程學(xué)院,福建 福州 350108)
HEVC具有很高的編碼性能,在相同的圖象質(zhì)量下,相比于H.264,H.265編碼的視頻壓縮效率可以提高50%. 對(duì)硬件而言,HEVC中采用的四叉樹劃分結(jié)構(gòu)和35種預(yù)測模式需要占用大量的硬件資源和計(jì)算時(shí)間. 因此,在保證視頻編碼性能的前提下,有效降低幀內(nèi)預(yù)測硬件編碼復(fù)雜度仍是研究HEVC幀內(nèi)預(yù)測硬件實(shí)現(xiàn)的重要方向.
在硬件設(shè)計(jì)方面要做的就是平衡硬件資源和編碼復(fù)雜度. 目前,有的硬件設(shè)計(jì)編碼性能損失較大, 有的硬件資源消耗較多. 文[1]在編碼過程中使用基于Hadamard變換的率失真代價(jià)估計(jì)來限制候選模式的數(shù)量. 使用SATD來估算代價(jià)可以降低編碼復(fù)雜度,但是預(yù)測準(zhǔn)確度不高. 文[2]提出一種快速分裂和修剪的組合方法用于HEVC幀內(nèi)編碼中早期CU大小確定. 選擇SATD作為分裂和修剪的閾值,但是由于要保存每一幀的前六個(gè)CTU的每一層的SATD值,需要占用大量的硬件資源,所以硬件實(shí)現(xiàn)復(fù)雜度較高. 文[3]提出的流水線硬件架構(gòu)可以計(jì)算每個(gè)預(yù)測單元的35種模式,但是對(duì)于硬件來說處理周期較長. 另外使用統(tǒng)一參考樣本索引,造成了硬件資源利用率較低. 文[4]對(duì)角度模式的預(yù)測值計(jì)算以查表的方式選取參考像素來減少計(jì)算的消耗時(shí)間. 五條路徑并行處理,達(dá)到了較高的數(shù)據(jù)吞吐率, 但電路資源消耗較大. 選用絕對(duì)誤差和(sum of absolute differences, SAD)作為模式選擇的標(biāo)準(zhǔn),SAD只能反應(yīng)殘差時(shí)域差異,這導(dǎo)致了編碼性能明顯下降. 文[5]提出適用于所有塊大小與模式的幀內(nèi)預(yù)測架構(gòu), 但是需要耗費(fèi)大量的周期數(shù)才能得到一個(gè)PU的預(yù)測值, 無法實(shí)現(xiàn)高清視頻的編碼實(shí)時(shí)要求. 文[6]提出采用頭比特估計(jì)方法和平方差(SSD)法來計(jì)算變換系數(shù)和反量化系數(shù)的差異,可節(jié)省編碼時(shí)間,但也提高了硬件實(shí)現(xiàn)的復(fù)雜度.
通過研究HEVC幀內(nèi)預(yù)測,提出一種新的基于FPGA的HEVC幀內(nèi)預(yù)測硬件架構(gòu). 具體如下,1) 在處理PU塊時(shí),對(duì)64 × 64和32 × 32塊大小的PU采用下采樣處理,就是將64 × 64和32 × 32塊大小的PU采樣成16 × 16塊大小進(jìn)行處理, 減少了硬件面積和硬件的計(jì)算時(shí)間; 2) 在做模式選擇時(shí),選用絕對(duì)值求和(sum of absolute transformed difference, SATD)與λ×Rheader的和來估算幀內(nèi)模式預(yù)測的代價(jià)值,并用這個(gè)代價(jià)值作為模式判斷的標(biāo)準(zhǔn). 這樣可以避免高階的平方和平方誤差和(sum of squared error, SSE)的計(jì)算以及復(fù)雜的熵估計(jì), 減少計(jì)算的復(fù)雜度; 3) 另外還可采用流水線加并行的架構(gòu), 流水線的設(shè)計(jì)可以保證數(shù)據(jù)的流暢性,提高數(shù)據(jù)的吞吐量,并行的結(jié)構(gòu)設(shè)計(jì)可以避免計(jì)算過程中大量的等待時(shí)間,提高硬件運(yùn)行速度.
圖1 HEVC塊劃分結(jié)構(gòu)Fig.1 HEVC block partition structure
HEVC幀內(nèi)預(yù)測采用四叉樹的劃分結(jié)構(gòu)[7],如圖1所示. HEVC中CU塊大小的范圍是從64 × 64到8 × 8,PU塊范圍是從64 × 64到4 × 4[8].
HEVC幀內(nèi)預(yù)測中各相鄰塊之間存在著極強(qiáng)的數(shù)據(jù)依賴性,并且在HEVC標(biāo)準(zhǔn)中不同層之間的PU的處理順序是采用遞歸的方式,從 64 × 64 到 4 × 4 依次進(jìn)行處理. 由于HEVC中預(yù)測單元PU塊變換范圍從64 × 64到4 × 4,這樣一來對(duì)于幀內(nèi)預(yù)測的硬件電路就需要設(shè)計(jì)成最大PU塊尺寸支持到64 × 64,最小支持到4 × 4,而這樣的電路設(shè)計(jì)方案不僅會(huì)導(dǎo)致硬件面積過大,還會(huì)造成硬件資源利用的不充分. 若將該預(yù)測電路設(shè)計(jì)為一套最大PU塊尺寸支持到16 × 16,最小支持到4 × 4的硬件電路,并且用該電路來預(yù)測尺寸為64 × 64和32 × 32的PU塊,則該方案將會(huì)造成硬件電路的處理周期成倍增長,效率低下. 因此提出一種對(duì)預(yù)測塊大小為64 × 64以及32 × 32時(shí)的預(yù)處理方案.
當(dāng)前預(yù)測塊大小為64 × 64時(shí),對(duì)當(dāng)前預(yù)測塊的原始像素和預(yù)測當(dāng)前塊所需的上方以及左側(cè)128個(gè)參考像素進(jìn)行1/4下采樣處理;然后對(duì)下采樣后的數(shù)據(jù)進(jìn)行預(yù)測過程,此時(shí)就相當(dāng)于對(duì)一個(gè)16 × 16大小的預(yù)測塊進(jìn)行預(yù)測,得到16 × 16大小的預(yù)測值矩陣, 再與下采樣后的原始像素矩陣相減得到殘差;最后對(duì)殘差進(jìn)行Hadamard變換,將得到的SATD代價(jià)乘以16倍后再作為該64 × 64預(yù)測塊的代價(jià).
表1 全I(xiàn)幀編碼模式下采用下采樣方式對(duì)不同測試序列的編碼性能
當(dāng)預(yù)測塊大小為32 × 32時(shí),對(duì)當(dāng)前預(yù)測塊進(jìn)行1/2下采樣預(yù)處理,將其下采樣成16×16塊大小的預(yù)測塊; 然后進(jìn)行預(yù)測過程,將得到的SATD代價(jià)乘以4倍作為該32 × 32預(yù)測塊的代價(jià).
下采樣預(yù)處理后對(duì)編碼性能的影響,在HM代碼上進(jìn)行實(shí)驗(yàn)測試,在全I(xiàn)幀配置下的實(shí)驗(yàn)結(jié)果如表1所示.
結(jié)果表明,該算法對(duì)編碼器的性能影響很小,這是由于通過統(tǒng)計(jì)HM原始代碼在標(biāo)準(zhǔn)測試序列編碼的運(yùn)行結(jié)果中各種大小的CU塊各自所占的比例,發(fā)現(xiàn)只有當(dāng)視頻的內(nèi)容簡單而又變換平緩時(shí),才會(huì)出現(xiàn)64 × 64以及32 × 32的CU塊. 從對(duì)所有標(biāo)準(zhǔn)測試序列的統(tǒng)計(jì)結(jié)果得知,大塊CU所占的比例很少,因此大塊對(duì)編碼的碼流以及比特率的影響并不大. 這樣一來,幀內(nèi)預(yù)測的硬件電路只需設(shè)計(jì)成支持預(yù)測塊最大到16 × 16的情況,這樣就很大程度地減少了硬件電路的面積,提高了硬件資源的利用率.
HEVC標(biāo)準(zhǔn)中幀內(nèi)預(yù)測在選擇最佳模式時(shí)分為粗選和細(xì)選兩個(gè)步驟[9]. 首先,粗選時(shí)將SATD值作為判別標(biāo)準(zhǔn),遍歷幀內(nèi)預(yù)測35種模式,選出SATD值[10]較小的若干模式建立模式候選列表,模式候選列表的數(shù)量由當(dāng)前PU塊的尺寸決定. 其次在建立候選列表后將當(dāng)前塊的最可能模式(MPM)列表添加到模式候選列進(jìn)行更新,然后對(duì)更新后模式候選列表中的每個(gè)模式進(jìn)行基于率失真優(yōu)化(RDO)[11]的細(xì)選過程,用D+λ×R計(jì)算出各個(gè)模式的率失真代價(jià)值(RD Cost),然后選擇代價(jià)值最小的模式作為當(dāng)前PU塊的最佳模式.
圖2 HEVC幀內(nèi)預(yù)測RD Cost完整的計(jì)算過程Fig.2 Complete calculation process of HEVC intra prediction RD Cost
HEVC中幀內(nèi)預(yù)測RD Cost完整的計(jì)算過程如圖2所示. 首先,用粗選過程得到的模式對(duì)預(yù)測塊進(jìn)行預(yù)測,在得到預(yù)測值之后,用該塊對(duì)應(yīng)的原始像素值減去預(yù)測值得到殘差,再將殘差進(jìn)行變換量化、 反量化反變換等操作后,將此時(shí)的殘差與預(yù)測值相加才能得到重構(gòu)像素,之后再將原始值減去重構(gòu)值,才能得到失真D. 重構(gòu)過程復(fù)雜且耗時(shí),并且該過程得到的重構(gòu)像素值會(huì)作為后續(xù)待編碼塊幀內(nèi)預(yù)測過程中所需的參考像素. 而該過程中要得到對(duì)應(yīng)模式的幀內(nèi)比特率R,需要經(jīng)過熵編碼過程,其中包括殘差對(duì)應(yīng)的Rresi以及頭比特?cái)?shù)Rheader兩個(gè)部分,二者都需要經(jīng)過二值化,概率模型更新,查表等一系列相當(dāng)復(fù)雜的過程才能獲得,這些過程在直接硬件實(shí)現(xiàn)時(shí)會(huì)消耗大量的硬件資源.λ是一個(gè)與量化參數(shù)(quantization parameter, QP)相關(guān)的變量,并且它是一個(gè)浮點(diǎn)數(shù),而在硬件實(shí)現(xiàn)過程中,對(duì)浮點(diǎn)數(shù)的處理需要消耗較多的硬件資源和時(shí)間周期.
率失真優(yōu)化(RDO)[12]是視頻編碼中的一種重要方法,它基于拉格朗日優(yōu)化技術(shù),通過適當(dāng)選擇參數(shù),可以實(shí)現(xiàn)速率和失真之間的最佳平衡. 標(biāo)準(zhǔn)的RD Cost的計(jì)算公式如下,
(1)
其中:D代表失真,是原始像素與重構(gòu)像素之間的誤差平方和;R表示幀內(nèi)比特?cái)?shù);λ是對(duì)應(yīng)的拉格朗日因子.
此外,HEVC參考編碼器中SATD[13]計(jì)算如下式所示,
SATD=∑|HNXHN|>>(N-1)
(2)
其中:HN為哈達(dá)瑪變換矩陣;X為輸入的殘差矩陣;N為變換矩陣塊大小.
根據(jù)哈達(dá)瑪變換的定義,歸一化系數(shù)應(yīng)該是2-N, 而不是2-(N-1). 為了更好地平衡SATD和Rheader,采用2倍的sqrt(λ)作為平衡SATD和Rheader的拉格朗日系數(shù),并且經(jīng)過實(shí)驗(yàn)驗(yàn)證采用該方案的編碼性能會(huì)略有提升. 又因?yàn)棣耸且粋€(gè)與量化參數(shù)有關(guān)的變量,為使硬件最簡化,采用取整的方式,將浮點(diǎn)數(shù)的計(jì)算簡化為整數(shù)運(yùn)算. 在HM中,對(duì)Rheader的取值進(jìn)行了實(shí)驗(yàn)統(tǒng)計(jì)分析,根據(jù)上下文模型的不同,非MPM模式[14]的Rheader取值范圍為{6, 7},而MPM模式的比特?cái)?shù)取值范圍為{1, 2, 3}. 最終選用MPM模式比特為1或2,非MPM模式比特?cái)?shù)為7的方案. 采用的估計(jì)率失真代價(jià)計(jì)算如下式所示.
(3)
其中:floor是下取整運(yùn)算;Ω表示MPM列表;k∈{0, 1, 2}表示模式M在MPM列表的索引位置.
在FrameRate30-FrameNumber10條件下,使用Hadamard-SATD估算幀內(nèi)預(yù)測率失真代價(jià)算法的復(fù)雜度,如圖3所示,對(duì)應(yīng)的編碼性能如圖4所示. 從圖中可以看出,與HM16.7原始編碼器相比性能下降在可接受的范圍內(nèi),大約在3%~5%,編碼復(fù)雜度下降約有45%.
圖3 1 080 px序列不同模式下的編碼復(fù)雜度Fig.3 Coding complexity of 1 080 px sequence in different modes
圖4 1 080 px序列不同模式下的編碼性能Fig.4 Coding performance of 1 080 px sequence in different modes
基于16點(diǎn)的復(fù)用結(jié)構(gòu)提出幀內(nèi)預(yù)測模式電路,以原始像素代替重構(gòu)像素作為插值預(yù)測時(shí)的參考像素,即可打破RD Cost[15]計(jì)算的閉合環(huán)路,去除幀內(nèi)預(yù)測過程與幀內(nèi)重構(gòu)過程的數(shù)據(jù)依賴性. 而以原始像素作為參考像素,也改變了HEVC中原有的遞歸編碼方式,故選用同層預(yù)測的方法來設(shè)計(jì)幀內(nèi)預(yù)測模式選擇硬件架構(gòu). 每個(gè)預(yù)測模式每周期計(jì)算得到16個(gè)點(diǎn)的預(yù)測值,如圖5所示,對(duì)應(yīng)16 × 16的塊每周期處理一行(列)16個(gè)點(diǎn)的預(yù)測值,對(duì)應(yīng)8 × 8的塊每周期得到第0塊與第1塊的同一行(列)的8個(gè)點(diǎn)的預(yù)測值,對(duì)應(yīng)4 × 4的塊則是得到第0~3 塊的同一行(列)4個(gè)點(diǎn)的預(yù)測值,對(duì)應(yīng)64 × 64和32 × 32的塊是復(fù)用16 × 16塊的預(yù)測電路.
幀內(nèi)預(yù)測模式電路模塊主要分為下采樣模塊、 獲取參考像素模塊、 參考像素濾波投影模塊、 預(yù)測值計(jì)算模塊、 哈達(dá)瑪變換求和模塊和控制模塊,如圖6所示. 為提高硬件的吞吐率,采取流水線結(jié)構(gòu)來計(jì)算同一個(gè)模式下的16行的預(yù)測值,不同模式之間采用串行結(jié)構(gòu),這樣可以保證每個(gè)模塊行與行之間的間隔只有一個(gè)時(shí)鐘周期.
圖5 每周期預(yù)測PU的像素點(diǎn)圖示Fig.5 Pixel plot of weekly predicted PU
圖6 幀內(nèi)預(yù)測的架構(gòu)Fig.6 Intra prediction architecture
設(shè)計(jì)的幀內(nèi)預(yù)測電路是同時(shí)支持預(yù)測塊大小為64 × 64, 32 × 32, 16 × 16, 8 × 8以及4 × 4的,且采用同層結(jié)構(gòu)的方式對(duì)這5層分別進(jìn)行幀內(nèi)預(yù)測,預(yù)測過程是每周期預(yù)測16點(diǎn)的預(yù)測架構(gòu),所以每一層預(yù)測所花費(fèi)的周期數(shù)均為固定值. 但是模式選擇需要對(duì)每一個(gè)預(yù)測塊建立MPM列表,所以每一層的預(yù)測塊越多,模式選擇所花費(fèi)的周期數(shù)就越多. 若按照HM中處理順序?qū)︻A(yù)測塊進(jìn)行編碼,如圖7所示.
圖7 HEVC中預(yù)測塊編碼順序Fig.7 Predictive fast coding sequence in HEVC
圖7中P代表幀內(nèi)預(yù)測過程,M代表模式選擇過程. 從圖中可以看出當(dāng)64 × 64做完P(guān)過程,開始進(jìn)行M過程時(shí),P過程的電路就閑置下來了,通過實(shí)驗(yàn)這樣處理一個(gè)64 × 64 CTU需要大約57 × 103個(gè)時(shí)鐘周期,時(shí)鐘周期較長,而且這樣還會(huì)造成硬件資源的利用率低.
圖8提出改進(jìn)的預(yù)測塊PU處理順序. 從最小塊4 × 4層開始進(jìn)行幀內(nèi)預(yù)測,然后塊大小依次遞增. 在一層的P過程做完后開始做M過程,同時(shí)開始做另一層的P過程. 按照改進(jìn)的方案處理一個(gè)64 × 64 CTU需要30 × 103個(gè)時(shí)鐘周期,進(jìn)一步縮短了幀內(nèi)預(yù)測模式選擇過程的處理周期,提高了數(shù)據(jù)的吞吐率.
圖8 改進(jìn)的預(yù)測塊處理順序Fig.8 Improved order of prediction block processing
在Altera的Arria 10下 測試性能,最終結(jié)果如表2所示. 文[4]在硬件設(shè)計(jì)上采用5條路徑并行,并且使用移位相加的方法代替插值預(yù)測中的乘法,雖然避免了使用DSP資源,但是LUT的資源與寄存器的資源也增加了很多. 文[5]提出的結(jié)構(gòu)可以支持任意大小的PU以及所有模式的預(yù)測,但是該結(jié)構(gòu)十分耗費(fèi)周期. 文[16]提出的硬件結(jié)構(gòu)面積較小, 但是支持的PU塊只有4 × 4與8 × 8 .
HEVC采用靈活的四叉樹結(jié)構(gòu)和更多的預(yù)測模式,提高了編碼性能. 本算法在保證編碼性能的前提下,可以支持不同塊大小的幀內(nèi)預(yù)測以及所有模式的計(jì)算,采用的下采樣算法最大程度地減少了硬件面積,提高了計(jì)算速度,選用的模式選擇算法可以大大降低計(jì)算復(fù)雜度,有利于硬件的實(shí)現(xiàn). 此外流水線的結(jié)構(gòu)設(shè)計(jì)可以提高數(shù)據(jù)的吞吐量.