??? 摘 要:提出一種基于H.264的上下文自適應(yīng)二進(jìn)制算術(shù)編碼器硬件設(shè)計(jì)方法。本設(shè)計(jì)中包含一個(gè)由二進(jìn)制化" title="二進(jìn)制化">二進(jìn)制化以及上下文模型組成的14組并行上下文對(duì)產(chǎn)生器,一個(gè)抓取鄰近區(qū)塊數(shù)據(jù)的三級(jí)流水線結(jié)構(gòu)以及一個(gè)內(nèi)含前饋處理且融合三種模式的四級(jí)流水線結(jié)構(gòu)的算術(shù)編碼器。該算術(shù)編碼器可以一個(gè)時(shí)鐘處理一個(gè)位元" title="位元">位元;整個(gè)設(shè)計(jì)平均每個(gè)時(shí)鐘處理0.77個(gè)位元。
??? 關(guān)鍵詞:上下文自適應(yīng)? CABAC? H.264/AVC? 語法元素
?
??? 視頻編碼的最后一步是熵編碼" title="熵編碼">熵編碼,主要應(yīng)用在對(duì)量化變換系數(shù)、自適應(yīng)塊變換、運(yùn)動(dòng)向量和其他編碼信息的壓縮技術(shù)中。H.264/AVC[1]采用兩種類型的熵編碼,基于上下文自適應(yīng)的二進(jìn)制算術(shù)編碼(CABAC)和基于上下文自適應(yīng)的可變長(zhǎng)編碼(CAVLC)。而CABAC[2]是一種比任何傳統(tǒng)熵編碼效率都要高的編碼法,與CAVLC相比,CABAC能節(jié)省6%~15%的位速率。在對(duì)CABAC算法分析的基礎(chǔ)上,筆者提出一種三級(jí)流水線結(jié)構(gòu)實(shí)現(xiàn)方法,該方法充分利用高效的并行結(jié)構(gòu)優(yōu)化CABAC編碼器結(jié)構(gòu)。
1 CABAC編碼器結(jié)構(gòu)
??? 如圖1所示,結(jié)構(gòu)由三大模塊構(gòu)成:二進(jìn)制化與上下文模型(CM)模塊,算數(shù)編碼(AE)模塊,并進(jìn)串出(PISO)模塊。二進(jìn)制化與上下文模型模塊負(fù)責(zé)產(chǎn)生二進(jìn)制串及上下文建模[3],其輸出為并行的14組上下文對(duì)。CM模塊中的取鄰模塊通過取鄰地址產(chǎn)生器(AG)生成的地址,從取鄰存儲(chǔ)器中讀取出相鄰左宏塊" title="宏塊">宏塊和上宏塊中的語法元素(SE)。PISO模塊負(fù)責(zé)收集有效的上下文對(duì),在一個(gè)時(shí)鐘周期" title="時(shí)鐘周期">時(shí)鐘周期中將其輸出到AE中。PISO模塊輸入為14組并行上下文對(duì),輸出為一組上下文對(duì)。AE模塊[4]由融合三種模式的四級(jí)流水線構(gòu)成,模塊中的表存儲(chǔ)器存儲(chǔ)初始語法表,片段初始化上下文表子模塊負(fù)責(zé)上下文表的建立。transIdxLPS表和rangeTabLPS表由組合邏輯電路實(shí)現(xiàn),其中上下文表存儲(chǔ)器為雙端口存儲(chǔ)器。本編碼器編碼開始一段新片段編碼時(shí),主控制器首先聲明start_slice_cabac寄存器,編碼器開始建造上下文表,當(dāng)其完成后編碼器向主控制器發(fā)送聲明信號(hào)end_cabac_build_table,并且等待下一命令。這時(shí)編碼器開始新宏塊編碼,并分別從取鄰存儲(chǔ)器讀取相鄰區(qū)塊數(shù)據(jù)和從mb_info存儲(chǔ)中讀取宏塊SE數(shù)據(jù)。所有宏塊SE數(shù)據(jù)編碼完成后,CABAC編碼器開始從coeff_mem存儲(chǔ)器中讀取殘余SE。每完成一個(gè)宏塊,編碼器聲明一個(gè)end_mb寄存器,當(dāng)前片段的最后一宏塊處理后,編碼器則聲明一個(gè)end_slice_cabac寄存器。
?????????????????
??? 下面分別敘述編碼器的CM模塊和AE模塊。
1.1 二進(jìn)制化與上下文模型模塊(CM)
??? 當(dāng)前的語法元素通過該模塊二進(jìn)制化,并為每一個(gè)二進(jìn)制串(bin)計(jì)算相應(yīng)的上下文,得到最小的冗余碼,如圖2所示。首先在一個(gè)時(shí)鐘內(nèi)完成SE的二進(jìn)制轉(zhuǎn)換,產(chǎn)生1~14的二進(jìn)制串,為提高速度使用不查表法;然后根據(jù)先前的上區(qū)塊和左區(qū)塊編碼數(shù)據(jù)為bin,計(jì)算相應(yīng)的上下文值;最后產(chǎn)生1~14組上下文對(duì)。每一組上下文對(duì)包括1bit編碼位,9bit上下文存儲(chǔ)地址位及2bit編碼模式位。
????????????????????
??? CABAC編碼器需要從相鄰的左區(qū)塊、上區(qū)塊及當(dāng)前宏區(qū)塊中提取數(shù)據(jù)計(jì)算上下文值。圖3中取鄰模塊由3個(gè)緩沖寄存器構(gòu)成,編碼時(shí)編碼器將當(dāng)前被編碼的SE寫入當(dāng)前宏區(qū)塊(MB)緩沖寄存器中,同時(shí)將左/上區(qū)塊數(shù)據(jù)從取鄰存儲(chǔ)器中取出,預(yù)載入之前MB緩沖寄存器1和2中。
???????????????
??? 當(dāng)編碼MB是奇數(shù)地址時(shí),編碼器從取鄰存儲(chǔ)器中取出左/上區(qū)塊SE,預(yù)載入之前MB緩沖寄存器1中,同時(shí)將當(dāng)前宏區(qū)塊MB緩沖寄存器中被編碼的SE 寫入取鄰存儲(chǔ)器中。該模塊可以將之前MB緩沖寄存器2中的相鄰上區(qū)塊數(shù)據(jù)和當(dāng)前宏區(qū)塊MB緩沖寄存器中的相鄰左區(qū)塊數(shù)據(jù)輸出到二進(jìn)制化與上下文模型模塊中計(jì)算上下文對(duì)的值。
??? 相反,當(dāng)編碼MB是偶數(shù)地址時(shí),編碼器從取鄰存儲(chǔ)器中取出左/上區(qū)塊SE預(yù)載入之前MB緩沖寄存器2中,同時(shí)將當(dāng)前宏區(qū)塊MB緩沖寄存器中被編碼的SE 寫入取鄰存儲(chǔ)器中。二進(jìn)制化與上下文模型模塊可以從之前MB緩沖寄存器1和當(dāng)前宏區(qū)塊MB緩沖寄存器中獲得相鄰塊數(shù)據(jù)。
1.2 算術(shù)編碼器模塊(AE)
??? 這里提出一種融合3種模式(EncodeRegular,EncodeBypass和EncodeTerminal)的四級(jí)流水線結(jié)構(gòu)的算術(shù)編碼器,如圖4。在第一級(jí)流水線中,編碼器從上下文表存儲(chǔ)器中讀出MPS和pStateIdx;在第二級(jí)中,編碼器判定bin是否是MPS并且讀取兩組合電路表(rangeTabLPS表和transIdxLPS表),得到新的MPS和pStateIdx;在第三級(jí),編碼器計(jì)算出新的Range和Low;最后在第四級(jí)輸出編碼。同時(shí)其內(nèi)饋前向邏輯更新上下文存儲(chǔ)器。
???????????????
??? (1)對(duì)于整數(shù)算數(shù)編碼,每編碼一次后對(duì)Range和Low的值都需要再歸一化。 經(jīng)分析,EncodeRegular中儲(chǔ)存器訪問較耗時(shí),決定由單獨(dú)一級(jí)流水從上下文表儲(chǔ)存器中讀取數(shù)據(jù),并令再歸一化前沒完成的功能函數(shù)都集中到第二級(jí)流水階段完成。圖5(a)描述第一級(jí)流水線利用上下文存儲(chǔ)器地址讀取上下文存儲(chǔ)器。EncodeRegular時(shí)MPS和pStateIdx分別被存儲(chǔ)在流水線兩個(gè)寄存器中。而EncodeBypass和EncodeTerminal時(shí),這兩個(gè)寄存器被置零,并且在第二級(jí)流水中暫不使用,二進(jìn)制串和編碼模式位不做任何修改直接送入下級(jí)流水。圖5(b)為第二級(jí)流水結(jié)構(gòu)。這里使用bin、MPS和pStateIdx來決定二進(jìn)制串是否是MPS,并把得到的MPS傳送到寄存器“isMPS”中,為第三級(jí)流水做準(zhǔn)備。此級(jí)也使用pStageIdx作為索引在rangeTabLPS表中搜索得到4個(gè)RangeLPS,并將結(jié)果儲(chǔ)存到流水線寄存器中。因?yàn)镋ncodeBypass和EncodeTerminal比較簡(jiǎn)單,把它們主要集中到第一級(jí)和第二級(jí)中處理。另外,第二級(jí)中計(jì)算得到的新MPS和新pStatIdx將輸入到前向邏輯中,作為后續(xù)上下文起始判斷條件。
?????????????? ????
??? (2)為了得到期望的精確輸出,每編碼一次后對(duì)Range和Low的值都需要再歸一化。在H.264的CABAC中需要9bit和10bit分別表示Range和Low。Range值將逐漸變小,因此Range值限定在256~511之間。如果Range值小于256(0x100),Range將再歸一化,并緊接再歸一化Low。設(shè)計(jì)PutBit和bitsOutstanding位在第四級(jí)進(jìn)行更新完成重整和輸出工作。根據(jù)對(duì)Range的判斷可以得到循環(huán)(loop)次數(shù)。最大的loop次數(shù)是8次。這里對(duì)Range和Low的更新要求在一個(gè)時(shí)鐘周期完成,因此設(shè)計(jì)每循環(huán)一次,Range/Low移位一次。
??? 表1描述經(jīng)過loop1和loop2后的新Low值。根據(jù)第一次循環(huán)的結(jié)果,可以算出:僅僅當(dāng)源流串的頭兩位都為1時(shí),loop1結(jié)果的第一位才為1。loop2使用loop1的結(jié)果。這就意味:如果loop1結(jié)果的頭兩位都為1,loop2結(jié)果的第一位也為1。因此根據(jù)循環(huán)次數(shù)就可以判定Low的第一位比特和其余位。如果源流串的前(loop count+1)位都為1,新Low的第一位也將是1;否則,第一位將是0。通過使用這種方法,新Low可以在一個(gè)時(shí)鐘周期計(jì)算出來。
????????????????
??? 在第三級(jí)流水結(jié)構(gòu)中,主要完成Range和Low的更新和邏輯反饋。源流串中的old_Low值及與循環(huán)次數(shù)有關(guān)的shift值都被寫入第四級(jí)流水線寄存器中,實(shí)現(xiàn)PutBit過程。圖6(a)為第三級(jí)流水,其左框架結(jié)構(gòu)中為EncodeBypass和EncodeTerminal模式的簡(jiǎn)單運(yùn)算得到新Low。右框架結(jié)構(gòu)為EncodeRegular有關(guān)MPS和LPS的一些簡(jiǎn)單運(yùn)算,然后通過normalization shift更新Range和Low值。
????????????????????
??? 第四級(jí)流水結(jié)構(gòu)主要實(shí)現(xiàn)bit流的輸出過程。圖6(b)為第四級(jí)流水,其左框架結(jié)構(gòu)中為EncodeBypass和EncodeTerminal bit流輸出,再歸一化后根據(jù)old_Low決定下一個(gè)輸出bit為0或1。右框架結(jié)構(gòu)為EncodeRegular輸出。首先判斷shift值是否大于0,如大于0,再根據(jù)old_Low決定下一個(gè)輸出bit為0或1,同時(shí)改變old_Low值。分兩種情況:(1)如果old_Low前兩位的值為00,10或11時(shí)可以直接輸出,然后丟棄Low第一位;(2)如果old_Low前兩位的值為01,將不能直接輸出bit。使用bitsOutstanding寄存器來計(jì)算這種情況的連續(xù)出現(xiàn)次數(shù)。再根據(jù)PutBit(B)決定輸出位。每一次運(yùn)算shift值減1,重復(fù)運(yùn)算直至shift值小于0。
2 試驗(yàn)及結(jié)果分析
??? 對(duì)上述的CABAC編碼器用Verilog HDL[5]硬件設(shè)計(jì)語言進(jìn)行設(shè)計(jì),在NC-Vrerilog仿真器上進(jìn)行仿真實(shí)驗(yàn),對(duì)H.264/AVC測(cè)試序列視頻流編碼測(cè)試,并與JVT校驗(yàn)?zāi)P蚃M9.6[6]的編碼結(jié)果進(jìn)行比較,表明該CABAC編碼器可以滿足實(shí)時(shí)編碼的要求,且表現(xiàn)出色。這里使用了兩個(gè)ISO/IEC標(biāo)準(zhǔn)視頻測(cè)試片斷“Mobile”和“Tempete”對(duì)CABAC進(jìn)行測(cè)試,仿真和性能分析結(jié)果見表2、表3。
????????????????????
??? 平均計(jì)算,AE耗時(shí)190個(gè)時(shí)鐘編碼P-slice宏塊,同時(shí)耗時(shí)543個(gè)時(shí)鐘編碼I-slice宏塊。換句話說:該算術(shù)編碼器可以一個(gè)時(shí)鐘處理一個(gè)位元;而且整個(gè)設(shè)計(jì)可以平均每個(gè)時(shí)鐘處理0.77個(gè)位元。
??? 對(duì)于上述設(shè)計(jì),采用ALTERA公司的QUARTUSII5.0開發(fā)軟件,表4給出了具體的實(shí)現(xiàn)參數(shù)。
???????????????????
??? 本文提出一種高效的CABAC編碼器硬件實(shí)現(xiàn)結(jié)構(gòu)。在對(duì)H.264/AVC語法表和CABAC算法深入分析的基礎(chǔ)上設(shè)計(jì)一種內(nèi)含前饋邏輯電路三模四級(jí)流水結(jié)構(gòu)算術(shù)編碼器。該編碼器可以一個(gè)時(shí)鐘處理一個(gè)位元;整個(gè)設(shè)計(jì)綜合計(jì)算平均每個(gè)時(shí)鐘處理0.77個(gè)位元。但這并不是最優(yōu)設(shè)計(jì),下一步將去除取鄰模塊的緩沖器來減少功耗和面積,并且采用重載1-2系數(shù)的方式減少系數(shù)編碼的時(shí)鐘周期。
參考文獻(xiàn)
[1] Draft ITU-T Recommendation and final?draft international standard of joint video specification(ITU-T Rec.H.264|ISO/IEC 14496-10 AVC).
[2] MARPE D,SCHWARZ H,WIEGAND T.Context-based adaptive binary arithmetic???? coding in the H.264/AVC video compression standard.IEEE Transactions on?? Circuits and Systems for Video Technology,2003,(7).
[3] OSORIO R R,BRUGUERA J D.A new?architecture for fast arithmetic coding in H.264?advanced video coder.Euromicro symposium on?digital system design,2005.
[4] SHOJANIA H,SUDHARSANAN S.A high performance CABAC encoder.IEEE 2005 The 3rd?
International IEEE-NEWCAS Conference,2005.
[5] IEEE standard hardware description language?based on the verilog hardware description language(IEEE Std p1364-2001).
[6] JVT H.264/AVC Reference Software JM 9.6