,本發(fā)明提出一種新的熵編碼方法,將傳統(tǒng)CABAC編碼流程分兩步實(shí)現(xiàn):
[0035]第一步,將待編碼數(shù)據(jù)進(jìn)行基于JPEG的哈夫曼編碼。輸入是殘差系數(shù)、宏塊類型等語法元素,輸出是哈夫曼碼流。
[0036]第二步,將第一步輸出的哈夫曼碼流進(jìn)行解碼,得到待編碼數(shù)據(jù),再將數(shù)據(jù)進(jìn)行CABAC編碼。輸入是哈夫曼碼流,輸出是CABAC碼流。
[0037]在采用以上熵編碼方法后,本發(fā)明提出一種高吞吐率的編碼電路設(shè)計(jì),可實(shí)現(xiàn)對量化系數(shù)的基于H.264的高速CABAC熵編碼。本電路設(shè)計(jì),包含兩條數(shù)據(jù)通路,如圖2所示,分別是:哈夫曼熵編碼數(shù)據(jù)通路,CABAC編碼數(shù)據(jù)通路。兩條數(shù)據(jù)通路均實(shí)現(xiàn)宏塊級的并行運(yùn)算,通路之間實(shí)現(xiàn)條帶級并行運(yùn)算。
[0038]其中,哈夫曼熵編碼數(shù)據(jù)通路,以下簡稱第一數(shù)據(jù)通路,包含鋸齒形掃描和游程編碼模塊,哈夫曼編碼模塊,第一數(shù)據(jù)多路選擇器、DMA模塊。
[0039]第一數(shù)據(jù)通路中,所述鋸齒形掃描和游程編碼模塊是基于乒乓存儲結(jié)構(gòu)的系數(shù)重排序模塊,用于并行執(zhí)行系數(shù)掃描和游程編碼,以及非殘差系數(shù)語法元素的打包。其輸入為編碼器前端DCT/量化部分輸出的量化系數(shù)信號,編碼模式信號,與當(dāng)前宏塊相關(guān)的狀態(tài)信號(如CBP、QP_delta、MV、MB_TYPE等)。模塊內(nèi)部包含兩個(gè)乒乓存儲結(jié)構(gòu)、掃描地址產(chǎn)生電路、語法元素打包電路等。輸出為經(jīng)過重排序的非零系數(shù)信號,非零系數(shù)游程長度信號,非零系數(shù)標(biāo)志信號(色度/亮度標(biāo)志、AC/DC標(biāo)志、初始標(biāo)志)和打包之后的語法元素字(SEwords)信號。
[0040]第一數(shù)據(jù)通路中,所述哈夫曼編碼模塊是基于JPEG典型哈夫曼表的可變長編碼模塊,對用于CABAC編碼或JPEG編碼的殘差(Residual)系數(shù)進(jìn)行可變長編碼。模塊的輸入是鋸齒形掃描和游程編碼模塊除語法元素字之外的輸出信號。該模塊內(nèi)部預(yù)置有固定的多個(gè)查找表,通過對不同表項(xiàng)的查找,得到不同系數(shù)的可變長編碼(VLC)比特,所有VLC比特經(jīng)過字節(jié)打包操作后輸出。模塊中所用的哈夫曼表遵從ITU T.81標(biāo)準(zhǔn)所提供的典型哈夫曼表。輸出為哈夫曼編碼字節(jié)信號。
[0041]第一數(shù)據(jù)通路中,所述第一數(shù)據(jù)多路選擇器是用于控制數(shù)據(jù)的流向。在本發(fā)明中,用于CABAC編碼的語法元素中,只需將殘差(Residual)數(shù)據(jù)進(jìn)行哈夫曼編碼,而非殘差語法元素?zé)o需哈夫曼編碼。因此該模塊的作用是,控制語法元素字信號和哈夫曼編碼字節(jié)信號在不同的時(shí)刻進(jìn)入DMA模塊。
[0042]第一數(shù)據(jù)通路中,所述的DMA模塊用于將語法元素字信號和哈夫曼編碼字節(jié)信號存儲到外部Memory中,數(shù)據(jù)的存儲空間按照Slice進(jìn)行劃分,同一 Slice的數(shù)據(jù)不會同時(shí)被讀寫。在存儲第一數(shù)據(jù)通路的數(shù)據(jù)時(shí),從外部存儲器中讀出不同于當(dāng)前寫入數(shù)據(jù)所在Slice的數(shù)據(jù),并送入第二數(shù)據(jù)通路。
[0043]其中,CABAC編碼數(shù)據(jù)通路,以下簡稱第二數(shù)據(jù)通路,包含第二數(shù)據(jù)多路選擇器、哈夫曼解碼模塊,二值化模塊,CABAC編碼模塊。
[0044]第二數(shù)據(jù)通路中,所述第二數(shù)據(jù)多路選擇器是用于控制數(shù)據(jù)的流向,將DMA模塊輸出的數(shù)據(jù)中的哈夫曼字節(jié)信號送入后級哈夫曼解碼模塊,將語法元素字信號送入后級的二值化模塊。
[0045]第二數(shù)據(jù)通路中,所述哈夫曼解碼模塊的功能與哈夫曼編碼模塊相反,是從接收到的哈夫曼字節(jié)信號中截取出VLC比特,并通過哈夫曼表的反向查找,得出相應(yīng)的殘差系數(shù)和游程長度。得到的殘差系數(shù)被存入一個(gè)后入先出緩存(LIFO)中。同時(shí),根據(jù)解碼得到的游程長度,可計(jì)算出每個(gè)4x4系數(shù)矩陣中,按鋸齒掃描順序排列的非零系數(shù)標(biāo)志位,并將標(biāo)志位寫入先入先出緩存(FIFO)中。等待后級二值化模塊從LIFO或者FIFO中讀取相應(yīng)數(shù)據(jù)。
[0046]第二數(shù)據(jù)通路中,所述二值化模塊完成H.264中的slice_data語法元素的二值化過程。模塊的輸入是語法元素字信號、相鄰塊信息信號、殘差系數(shù)信號和非零系數(shù)標(biāo)志信號。模塊內(nèi)部按照H.264標(biāo)準(zhǔn)所規(guī)定的語法元素編碼順序,從輸入信號中選取當(dāng)前所需語法元素信號,并送入內(nèi)部的多個(gè)二值化引擎,不同的二值化引擎實(shí)現(xiàn)H.264標(biāo)準(zhǔn)所規(guī)定的不同二值化過程。二值化引擎輸出語法元素二值化后的bin值以及上下文模型的索引值CtxIdx0 Bin值和CtxIdx值會輸出到下一級做進(jìn)一步的CABAC編碼。
[0047]第二數(shù)據(jù)通路中,所述CABAC編碼模塊完成H.264標(biāo)準(zhǔn)所規(guī)定算術(shù)編碼過程。該模塊內(nèi)部包含以下特征:使用RAM構(gòu)建上下文模型查找表;三級編碼流水線;用于CABAC編碼的范圍寄存器和下限寄存器;用于保存重整輸出的outstanding比特的移位寄存器。其中,第一級流水線完成上下文模型RAM的查找;第二級完成上下文模型的更新以及寄存器的重整移位;第三級完成重整移位輸出比特與outstanding比特的字節(jié)打包。該流水線以恒定的Ibin每周期速度進(jìn)行編碼。流水線的輸出即為CABAC熵編碼輸出字節(jié)流信號。
[0048]如圖2所示,本發(fā)明的一個(gè)具體實(shí)施實(shí)例中,包含以下功能模塊:鋸齒形掃描和游程編碼模塊、哈夫曼編碼模塊、DMA模塊、哈夫曼解碼模塊、二值化模塊、CABAC編碼模塊以及若干多路選擇器。根據(jù)這些模塊之間的數(shù)據(jù)流動關(guān)系,可將這些模塊劃分成兩條數(shù)據(jù)通路。第一條數(shù)據(jù)通路的輸入為H.264編碼器中DCT變換和量化模塊的輸出,包括視頻殘差的量化系數(shù)、以及得到該殘差所使用的參數(shù)信息;輸出為經(jīng)過哈夫曼編碼的輸入信息,被存儲到外部的SDRAM類存儲器當(dāng)中。第二條數(shù)據(jù)通路的輸入為第一數(shù)據(jù)通路存儲在外部memory中的哈夫曼編碼數(shù)據(jù),輸出為經(jīng)過CABAC編碼的符合H.264標(biāo)準(zhǔn)的字節(jié)流信息,該信息被緩存在內(nèi)部的小尺寸memory上,以備系統(tǒng)的進(jìn)一步處理。
[0049]如圖3所示,第一數(shù)據(jù)通路進(jìn)行MB級流水線熵編碼,單位slice所需處理時(shí)間Tl與前端DCT模塊單位slice輸出時(shí)間一致;第二數(shù)據(jù)通路單位slice處理時(shí)間T2則與當(dāng)前slice的類型有關(guān)。那么在采用本熵編碼器的產(chǎn)品中,假設(shè)編碼時(shí)每個(gè)slice包含固定值N個(gè)MB,則其可編碼的視頻的最大速率為N/T MB每秒,其中T等于Tl和T2的最大值。如果在同樣的產(chǎn)品中,不采用本設(shè)計(jì),而是全部MB級流水并行,其最大速率為N/T’ MB每秒。若不進(jìn)行特殊處理,由于流水線的停滯問題,其中T’必然大于T。因此本發(fā)明提高了編碼器的吞吐率。
[0050]在第一數(shù)據(jù)通路中,包含一個(gè)鋸齒形掃描和游程編碼模塊。圖4為本發(fā)明實(shí)施例的鋸齒形掃描和游程編碼模塊電路結(jié)構(gòu)圖。其輸入信號包括:
[0051]l.coeff_in[13:0]:前端DCT量化模塊輸出的變換系數(shù),包括DC、AC、亮度、色度系數(shù);
[0052]2.cbp[5:0]:已編碼塊模式信號,表示每個(gè)宏塊中的8x8塊是否包含非零系數(shù);
[0053]3.qp_delta[5:0]:當(dāng)前變換系數(shù)的量化參數(shù)與預(yù)設(shè)量化參數(shù)的差值;
[0054]4.mv[14:0]:當(dāng)前塊的運(yùn)動矢量或者運(yùn)動矢量殘差;
[0055]5.mb_inter, mb_intra等與當(dāng)前宏塊相關(guān)的狀態(tài)信號。
[0056]模塊內(nèi)部包含兩個(gè)用于存儲數(shù)據(jù)的乒乓緩存:變換系數(shù)乒乓緩存,非零系數(shù)標(biāo)志乒乓緩存。前者包含408個(gè)存儲單元,每個(gè)單元位寬14,用于存儲亮度和色度變換系數(shù);后者包含28個(gè)存儲單元,每個(gè)單元位寬16,用于存儲每個(gè)4x4系數(shù)塊的非零標(biāo)志。輸入的同一宏塊的系數(shù)按照光柵掃描順序存儲在兵兵緩存中的兩個(gè)bank中的一個(gè),同時(shí)另一 bank中的非零系數(shù)按照鋸齒形掃描的順序被讀出緩存。系數(shù)的讀出地址產(chǎn)生過程如下:
[0057]1.4x4塊序號block_num[4:0]計(jì)算,按照光柵掃描順序,4x4塊被依次讀出,block_num從O到26逐漸增大;
[0058]2.非零系數(shù)游程長度Ζθ?.ΟΓιιη[5:0]計(jì)算,讀出每一塊的非零系數(shù)標(biāo)志位,并按照鋸齒形掃描順序進(jìn)行位重排,然后計(jì)算每一個(gè)非零系數(shù)在塊內(nèi)的游程長度;
[0059]3.4x4塊內(nèi)系數(shù)偏移coeff_num[5:0]計(jì)算,根據(jù)已重排的非零系數(shù)標(biāo)志位,計(jì)算每一個(gè)非零系數(shù)在塊內(nèi)的按照掃描順序上的偏移量;
[0060]4.根據(jù)系數(shù)偏移和塊序號計(jì)算出其在bank中的實(shí)際存儲地址,并輸出系數(shù)的標(biāo)
[0061]鋸齒形掃描和游程編碼模塊內(nèi)部還包含語法元素打包模塊,將輸入的每一宏塊的狀態(tài)信號打包成 4 個(gè)語法元素字 se_w0[31:0],se_wl[31:0], se_w2[31:0], se_w3[31:0],并通過一個(gè)多路選擇器依次輸出,表示為se_word[31:0]。
[0062]在第一數(shù)據(jù)通路中,包含一個(gè)哈夫曼編碼模塊,圖5為本發(fā)明實(shí)施例哈夫曼編碼模塊的電路結(jié)構(gòu)圖。模塊的輸入包含鋸齒形掃描和游程編碼模塊的輸出信號,輸出包括已編碼系數(shù)信號hufT_WOrd[31:0]。具體實(shí)現(xiàn)過程分為3部分:
[0063]1.實(shí)現(xiàn)輸入系數(shù)的VLI編碼。Vli_code[13:0]表示VLI編碼之后的碼字,vli_size [3:0]表示碼字中的有效比