針對(duì)硬件實(shí)現(xiàn)的H.264視頻編碼算法改進(jìn) 作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對(duì)面交流海量資料庫(kù)查詢 收藏 摘要:從硬件實(shí)現(xiàn)的角度分析了H.264算法,重點(diǎn)研究了占用最多運(yùn)算時(shí)間的預(yù)測(cè)部分的優(yōu)化,給出了對(duì)幀內(nèi)預(yù)測(cè)、哈達(dá)馬變換以及運(yùn)動(dòng)估計(jì)算法的改進(jìn),通過(guò)簡(jiǎn)化運(yùn)算復(fù)雜、效率不高的模塊以及減少模塊間數(shù)據(jù)相關(guān)性等,對(duì)硬件進(jìn)行優(yōu)化。通過(guò)對(duì)各種測(cè)試序列的仿真,證明改進(jìn)是有效的。 關(guān)鍵詞:H.264 幀內(nèi)預(yù)測(cè) 運(yùn)動(dòng)估計(jì) 運(yùn)動(dòng)預(yù)測(cè)因子 H.264[1]最初是由ITU-T起草的,在未來(lái)將成為ITU-T和MPEG的聯(lián)合標(biāo)準(zhǔn)。H.264因?yàn)樘峁┝撕芨叩木幋a壓縮效率、友好的面向網(wǎng)絡(luò)的接口,將成為下一代新的視頻編碼標(biāo)準(zhǔn)。但是編碼效率很高的同時(shí),其算法的復(fù)雜度也提高了四倍,這在很大程序上限制了它的實(shí)現(xiàn)。因此,必須針對(duì)硬件的實(shí)現(xiàn)做改進(jìn)和優(yōu)化。 H.264的最初測(cè)試模型(JM)[2]是為了取得高的編碼效果而設(shè)計(jì)的。在這個(gè)測(cè)試模型中,有很多的算法需要很大的運(yùn)算量,但是編碼效率的提高卻不多,并且很多模擬之間是數(shù)據(jù)相關(guān)的,這一點(diǎn)限制了用并行處理加速硬件的實(shí)現(xiàn)。 以前有文章分析過(guò)這種新的視頻編碼的復(fù)雜度[3~5]。但是這些研究都是通過(guò)軟件的分析得到H.264算法的復(fù)雜度的。這些結(jié)果對(duì)在軟件中的應(yīng)用是精確的,但是當(dāng)涉及硬件設(shè)計(jì)的并行處理時(shí),就不再適用了。經(jīng)過(guò)試驗(yàn)比較可以得出,在H.264硬件實(shí)現(xiàn)上的關(guān)鍵點(diǎn)是預(yù)測(cè)部分,因?yàn)榇四K所占的計(jì)算時(shí)間幾乎是總時(shí)間的90%。所以改進(jìn)的重點(diǎn)在預(yù)測(cè)部分。 1 H.264算法 圖1是關(guān)于一幀圖像的幀內(nèi)預(yù)測(cè)間預(yù)測(cè)的算法框圖。如果采用幀內(nèi)預(yù)測(cè),幀間預(yù)測(cè)部分將不進(jìn)行判斷。在進(jìn)行幀間預(yù)測(cè)時(shí),會(huì)使用多幀預(yù)測(cè)和可變塊大小的運(yùn)動(dòng)估計(jì)。編碼模式選擇部分在所有的預(yù)測(cè)模式中選擇一個(gè)最佳的預(yù)測(cè)模式。預(yù)測(cè)之后用原始的輸入幀和預(yù)測(cè)幀相減,得到殘差數(shù)據(jù)塊。對(duì)于亮度殘差塊做4%26;#215;4整數(shù)DCT變換,對(duì)于色度殘差塊的DC系數(shù)則進(jìn)行2%26;#215;2的整數(shù)DCT變換。對(duì)變換后的系數(shù)做掃描和量化處理后,再對(duì)量化后的系數(shù)進(jìn)行熵編碼,最終成為輸出的碼流。編碼模式通過(guò)模式表,也會(huì)輸入到熵編碼器中。重建的循環(huán)過(guò)程包括反量化、反DCT變換和反塊濾波。最后,將重建幀寫(xiě)入到幀緩沖器中,準(zhǔn)備在以后運(yùn)動(dòng)估計(jì)中使用。 因?yàn)樵诳臻g預(yù)測(cè)和時(shí)間預(yù)測(cè)上幾乎花費(fèi)了所有的計(jì)算能力,所以在JM 4.0上的算法改進(jìn)主要是在這兩部分上。在實(shí)現(xiàn)過(guò)程中,這兩部分通過(guò)硬件實(shí)現(xiàn),所以要針對(duì)硬件進(jìn)行優(yōu)化。 實(shí)現(xiàn)編碼器所用的硬件系統(tǒng)是基于宏塊,也就是說(shuō)編碼器是對(duì)一個(gè)個(gè)連續(xù)的宏塊進(jìn)行操作。整個(gè)編碼系統(tǒng)可以看作一個(gè)宏塊的流水線,所以有可能在開(kāi)始編碼下一個(gè)宏塊時(shí),上一個(gè)宏塊重建過(guò)程不定期沒(méi)有完成,這就影響了流水線的進(jìn)行。很多基于宏塊的商業(yè)編碼器正是采用這種硬件實(shí)現(xiàn)模式,所以處理好這個(gè)問(wèn)題至關(guān)重要。 2 幀內(nèi)預(yù)測(cè) 圖1中的編碼方框圖與H.261、H.263和MPEG-4中的相似。H.264中包含了4%26;#215;4和16%26;#215;16兩種幀內(nèi)預(yù)測(cè)部分。幀內(nèi)預(yù)測(cè)需要圖像重建的像素值才能實(shí)現(xiàn)。在一個(gè)典型的基于宏塊的系統(tǒng)中,只有在完成整個(gè)編碼程序后,重建的像素值才能得到。這種數(shù)據(jù)之間的相關(guān)性,會(huì)給硬件的實(shí)現(xiàn)帶來(lái)很大的困難。 2.1 4%26;#215;4幀內(nèi)預(yù)測(cè) 圖2描述了4%26;#215;4塊幀內(nèi)預(yù)測(cè)中數(shù)據(jù)的相關(guān)性。從a到p的像素值是從A到N及Q的像素值預(yù)測(cè)出來(lái)的。用大寫(xiě)字母表示重建的像素值。因?yàn)橐粋€(gè)宏塊由16個(gè)4%26;#215;4的塊組成,所以當(dāng)前塊沒(méi)有完成編碼之前是不能得到重建的像素值的。在JM中用了雙通道算法實(shí)現(xiàn)這些塊的編碼。為了做一個(gè)4%26;#215;4塊的預(yù)測(cè),在JM中需要進(jìn)行變換、量化、反變換到反量化的過(guò)程。這對(duì)于一個(gè)硬件來(lái)說(shuō)太復(fù)雜了。在現(xiàn)有的硬件水平上是不可能實(shí)現(xiàn)的。對(duì)這一點(diǎn),需要對(duì)算法做如下改進(jìn):所有預(yù)測(cè)中所有的重建幀像素值用輸入幀的原始值代替。通過(guò)這樣的改進(jìn),4%26;#215;4的幀內(nèi)預(yù)測(cè)和變換可以在宏塊的流水線上順利地實(shí)現(xiàn)。 2.2 16%26;#215;16幀內(nèi)預(yù)測(cè) 圖3給出了16%26;#215;16幀內(nèi)預(yù)測(cè)的數(shù)據(jù)相關(guān)性。當(dāng)前宏塊的預(yù)測(cè)是基于重建幀中位于當(dāng)前宏塊位置上方的17個(gè)像素和左側(cè)的16個(gè)像素的。因?yàn)閷?duì)當(dāng)前宏塊進(jìn)行預(yù)測(cè)時(shí)左邊宏塊的重建可能并未完全完成,當(dāng)用到當(dāng)前宏塊位置左側(cè)的那些像素時(shí)就用原始像素代替。 2.3 編碼模式選擇 按照前面所給出的改進(jìn)算法,如果只是簡(jiǎn)單地用原始像素代替重建像素的話會(huì)造成編碼模式選擇的誤差。圖4給出了幀內(nèi)編碼的率失真改進(jìn)的曲線,仿真的序列是“Claire”、10fps。從圖4中可以看出,由編碼模式選擇的誤差引起的PSNR下降是很明顯的。原始像素是屬于同一幀的,而重建像素經(jīng)過(guò)幀間或幀內(nèi)編碼去除了冗余度,所以與重建像素相比原始像素有更高的相關(guān)性。因而用改進(jìn)后的幀內(nèi)預(yù)測(cè)算法產(chǎn)生的誤差要比用原算法大得多。為了減少編碼模式選擇的誤差,還需要對(duì)誤差代價(jià)函數(shù)(error cost function)進(jìn)行修改。現(xiàn)在的做法是增加一個(gè)誤差項(xiàng)。這個(gè)誤差項(xiàng)體現(xiàn)原始像素和重建像素之間的差值。因?yàn)榱炕瘏?shù)(QP)能夠影響原始像素和重建像素之間的不匹配,所以誤差項(xiàng)的確定與量化參數(shù)值有關(guān)。在H.264中,隨著量化參數(shù)的線性增加,量化對(duì)編碼的影響是呈指數(shù)增加的。為了符合這種影響的增長(zhǎng)趨勢(shì),誤差項(xiàng)的基本形式確定了a/b(51-Qp),其中a和b是待定系數(shù)。如何確定a和b是影響誤差消除的關(guān)鍵。 在H.264中,每級(jí)Qp的增量是12%,所以理論上與之相匹配的參數(shù)b應(yīng)該設(shè)置為1.12。但是誤差代價(jià)函數(shù)的計(jì)算是在哈達(dá)碼變換域中進(jìn)行的,對(duì)每個(gè)系數(shù)的加權(quán)系數(shù)是不同的。而且變換后的系數(shù)的概率分布是不定的。所以參數(shù)b的設(shè)定不能用理論值,應(yīng)該考慮用經(jīng)驗(yàn)值來(lái)確定。 通過(guò)實(shí)驗(yàn)仿真結(jié)果可以得出:對(duì)于4%26;#215;4幀內(nèi)預(yù)測(cè),a設(shè)為80、b設(shè)為1.07。在對(duì)不同的序列測(cè)試中,這組參數(shù)值的效果最好。從圖4中看,改進(jìn)后的幀內(nèi)預(yù)測(cè)基本消除了模式選擇誤差,其PSNR的表現(xiàn)與原幀內(nèi)預(yù)測(cè)算法接近。 3 運(yùn)動(dòng)估計(jì) 在H.264中采用了可變的塊大小、1/4像紗和多參考幀的運(yùn)動(dòng)估計(jì)。在進(jìn)行運(yùn)動(dòng)估計(jì)過(guò)程中,全局搜索的起始搜索點(diǎn)根據(jù)運(yùn)動(dòng)預(yù)測(cè)因子確定。對(duì)于整像素搜索,失真用SAD度量。如果需更好的效果,可以將SAD加上補(bǔ)償項(xiàng)。雖然全局搜索運(yùn)動(dòng)估計(jì)有各種硬件結(jié)構(gòu)支持,但是從硬件實(shí)現(xiàn)角度來(lái)看,在H.264中原始的搜索范圍和運(yùn)動(dòng)預(yù)測(cè)因子的選擇是不實(shí)用的。以下介紹相應(yīng)的改進(jìn)。3.1 搜索范圍 硬件實(shí)現(xiàn)運(yùn)動(dòng)估計(jì)過(guò)程中,一般會(huì)通過(guò)使用片內(nèi)存儲(chǔ)彌補(bǔ)片外存儲(chǔ)帶寬的不足。在圖5中給出了一種典型的搜索區(qū)域數(shù)據(jù)重復(fù)使用方法,其中搜索范圍是-16~+15。圖5中左邊的3%26;#215;3塊表示當(dāng)前宏塊運(yùn)動(dòng)估計(jì)進(jìn)行區(qū)域,右邊的3%26;#215;3表示下一個(gè)宏塊運(yùn)動(dòng)估計(jì)進(jìn)行區(qū)域,它們的重疊區(qū)域的數(shù)據(jù)可以在兩次宏塊運(yùn)動(dòng)估計(jì)中重復(fù)使用,新增加的數(shù)據(jù)是最右側(cè)的1%26;#215;3區(qū)域。 為了配合H.264這種重復(fù)使用數(shù)據(jù)的模式,搜索區(qū)域的起始點(diǎn)應(yīng)該設(shè)置在(0,0)。只有當(dāng)真正的運(yùn)動(dòng)矢量超出搜索范圍時(shí),這種改變才會(huì)造成視頻質(zhì)量的下降。 3.2 運(yùn)動(dòng)預(yù)測(cè)因子 在H.264中, 運(yùn)動(dòng)預(yù)測(cè)因子被用來(lái)確定運(yùn)動(dòng)矢量數(shù)據(jù)的比特?cái)?shù)和計(jì)算運(yùn)動(dòng)矢量數(shù)據(jù)編碼誤差的補(bǔ)償因子。補(bǔ)償因子在整個(gè)運(yùn)動(dòng)估計(jì)過(guò)程中都會(huì)被參考以進(jìn)行率失真優(yōu)化。圖6表示運(yùn)動(dòng)預(yù)測(cè)因子的相關(guān)情況。其中P1到P4是在當(dāng)前宏塊之前的宏塊。當(dāng)前宏塊的運(yùn)動(dòng)預(yù)測(cè)因子通過(guò)對(duì)P1到P4宏塊的運(yùn)動(dòng)矢量計(jì)算得到。但是因?yàn)樵谟布校陨匣诤陦K的處理過(guò)程是使用宏塊流水時(shí),P1的運(yùn)動(dòng)矢量可能是無(wú)效的。解決這個(gè)問(wèn)題需要消除運(yùn)動(dòng)預(yù)測(cè)因子計(jì)算過(guò)程中相關(guān)性。具體就是計(jì)算過(guò)程中只使用P2到P4宏塊的運(yùn)動(dòng)矢量。而改變的只是針對(duì)運(yùn)動(dòng)估計(jì)補(bǔ)償因子的計(jì)算,因此改進(jìn)算法仍然符合H.264標(biāo)準(zhǔn)。 3.3 1/4像素精度的運(yùn)動(dòng)估計(jì) 在H.264中,半像素運(yùn)動(dòng)估計(jì)是通過(guò)二維6抽頭內(nèi)插濾波實(shí)現(xiàn)的。二維濾波需要使用線路緩存實(shí)現(xiàn)轉(zhuǎn)置運(yùn)算,而線路緩存的硬件實(shí)現(xiàn)相當(dāng)復(fù)雜。不過(guò)對(duì)編碼環(huán)路中的另一個(gè)部分運(yùn)動(dòng)補(bǔ)償時(shí),該宏塊的運(yùn)動(dòng)矢量已經(jīng)確定。為了減少硬件代價(jià),可以使用更簡(jiǎn)單的方法來(lái)產(chǎn)生1/4像素精度的數(shù)據(jù)。雖然用于運(yùn)動(dòng)估計(jì)與用于運(yùn)動(dòng)補(bǔ)償?shù)?/4像紗數(shù)據(jù)沒(méi)必要相同,但是它們之間的誤差還是會(huì)對(duì)編碼效果產(chǎn)生影響。所以不能一味地簡(jiǎn)化內(nèi)插過(guò)程。使用雙線性內(nèi)插代替二維6抽頭內(nèi)插濾波能夠較好地解決這個(gè)問(wèn)題。 3.4 哈達(dá)碼變換 哈達(dá)碼變換是用簡(jiǎn)單的變換估算變換后產(chǎn)生的比特?cái)?shù)。在H.264的運(yùn)動(dòng)估計(jì)中用哈達(dá)碼變換替代SAD,如果要求設(shè)計(jì)低代價(jià)硬件可以將這部分省略。 4 仿真結(jié)果 軟件仿真是在“Foreman”、“grandma”、“salesman”和“carphone”序列上進(jìn)行的,幀率是每秒10幀。出于硬件的考慮,不采用率失真優(yōu)化模式,因?yàn)樵贘M4.0上沒(méi)有采用碼率控制,所以率失真曲線是對(duì)應(yīng)Qp的變化產(chǎn)生的。率失真曲線如圖7、圖8。從仿真結(jié)果中可以看出,在改進(jìn)的幀內(nèi)預(yù)測(cè)算法中,PSNR的下降程序是很低的。在慢速運(yùn)動(dòng)序列的整像素運(yùn)動(dòng)估計(jì)中,PSNR幾乎沒(méi)有下降。對(duì)QME算法的改進(jìn)會(huì)造成大約0.4~0.6dB的PSNR值下降。這種改進(jìn)在低代價(jià)系統(tǒng)中是可以接受的。在64kbps的環(huán)境下,每一個(gè)序列的PSNR的下降不超過(guò)0.58dB。 在基于宏塊處理的系統(tǒng)中,采用上述的改進(jìn)算法,就能實(shí)現(xiàn)并行處理。通過(guò)軟件仿真的結(jié)果表明,改進(jìn)幀內(nèi)預(yù)測(cè)和整像素運(yùn)動(dòng)估計(jì)上的算法后,其PSNR值的下降幾乎可以忽略。對(duì)低人代價(jià)系統(tǒng)來(lái)說(shuō),QME和哈達(dá)馬變換的改進(jìn)也量種可以考慮的方法。
評(píng)論