本發(fā)明屬于視頻編碼領域,具體涉及一種基于fpga的hevc變換系數(shù)碼率估計裝置及方法。
背景技術:
1、隨著視頻流媒體的迅速發(fā)展以及移動通信技術5g的普及,人們對視頻質(zhì)量需求越來越大,各大流媒體平臺開始提供更高清和更高幀率的視頻,為了更高效的壓縮高清、高幀率視頻,視頻編碼聯(lián)合協(xié)作小組jct-vc(joint?collaborative?team?on?video?coding)提出了新一代高效視頻編碼標準(hevc)。
2、視頻傳輸和存儲過程中,低碼率r(rate)的視頻更利于傳輸和存儲,但失真度d(distortion)會大大增加,相反,低失真度的高質(zhì)量視頻則會使碼率增加,增大網(wǎng)絡傳輸?shù)膲毫?。為了在一定碼率的限制下使得失真度最低,視頻編碼采取的一項技術是率失真優(yōu)化rdo(rate?distortion?optimization),這項技術在滿足一定碼率限制下,尋找失真最小的一組參數(shù)集作為最優(yōu)的視頻編碼參數(shù),在現(xiàn)有混合編碼框架下,通常以編碼單元為單位獨立地進行率失真優(yōu)化,以保證單個編碼單元內(nèi)數(shù)據(jù)編碼最優(yōu)。
3、目前在hevc中常用的描述失真和碼率關系的率失真模型為r-λ模型,利用拉格朗日乘數(shù)法,通過引入拉格朗日系數(shù)λ將約束性求最值問題轉(zhuǎn)為非約束性求最值問題:minj?j=d+λr。
4、其中,j表示率失真代價,d和r分別表示失真和碼率,可運用在ctu(coding?treeunit,編碼樹單元)、cu(coding?unit,編碼單元)、pu(prediction?unit,預測單元)和tu(transform?unit,變換單元)等當中。
5、在變換單元的率失真優(yōu)化過程中,需要找到合適大小的塊來數(shù)據(jù)編碼最優(yōu),對于幀內(nèi)預測而言,需要從4×4、8×8、16×16中計算并選擇出最優(yōu)塊組合來存儲和編碼數(shù)據(jù),對于幀間預測而言,需要從4×4、8×8、16×16、32×32中計算并選擇出最優(yōu)塊組合來存儲和編碼數(shù)據(jù)。為了減少率失真優(yōu)化計算的周期代價和提高吞吐率,一種思路是將率失真優(yōu)化計算展開成4×4、8×8、16×16、32×32這4個尺寸的計算模塊同時計算來提高吞吐率,碼率計算模塊的設計應滿足并行化計算以及適應多種大小尺寸變換塊的需求。
6、此外,為了獲得碼率r,在hevc正常熵編碼中,需要經(jīng)過上下文自適應二進制算術編碼(context-adaptive?binary?arithmetic?coding,cabac)得到碼率,這個過程需要經(jīng)過語法元素二進制化、從上下文模型獲取概率、更新上下文模型和算術編碼。其中更新上下文模型和算術編碼這兩個步驟中每個語法元素一個碼字的數(shù)值會影響下一個碼字的編碼結(jié)果,也就是說不同變換塊組合計算出來的碼率會不一樣,這種情況讓率失真優(yōu)化計算過程只能逐個計算上下文模型然后才能獲得精確的碼率,這與并行化計算理念相悖。
技術實現(xiàn)思路
1、為解決上述技術問題,本發(fā)明提供了一種基于fpga的hevc變換系數(shù)碼率估計裝置及方法,可以快速估計碼率,以滿足并行化計算以及適應多種大小尺寸變換塊的需求的前提下獲得與精確碼率計算接近的性能,從而更適用于基于fpga的hevc編碼器等需要高吞吐率的場合。
2、本發(fā)明采用的技術方案為:一種基于fpga的hevc變換系數(shù)碼率估計裝置,包括:系數(shù)掃描模塊、緩沖模塊、取絕對值模塊、語法元素處理模塊、碼率估計模塊。
3、系數(shù)掃描模塊分別于緩沖模塊、語法元素處理模塊連接,緩沖模塊與取絕對值模塊連接,取絕對值模塊與語法元素處理模塊連接,語法元素處理模塊與碼率估計模塊連接。
4、所述碼率估計裝置輸入為變換塊,即經(jīng)過變換和量化后的系數(shù)塊,變換塊大小為4×4、8×8、16×16、32×32共四種尺寸,每次固定輸入四個變換系數(shù)直到完成一個完整大小變換塊。
5、所述系數(shù)掃描模塊包括:計數(shù)器、輸出緩沖模塊、掃描序號模塊,5個或計算模塊,4個比較模塊;系數(shù)掃描模塊用于掃描輸入系數(shù),得到變換塊內(nèi)的最后一個非零系數(shù)的坐標位置。
6、系數(shù)掃描模塊中的計數(shù)器分別于輸出緩存模塊與掃描模塊連接,輸入的系數(shù)與5個或計算模塊or0~or4連接,掃描序號模塊與或計算模塊連接到4個比較模塊當中,所有結(jié)果最終連接到輸出緩沖模塊。計數(shù)器模塊用于記錄每個輸入數(shù)據(jù)的順序與個數(shù),掃描序號模塊將計數(shù)值轉(zhuǎn)換成輸入數(shù)據(jù)的掃描順序,輸出緩存模塊用于暫時存儲數(shù)據(jù)。5個或計算模塊中or0~or3用于計算當前輸入系數(shù)是否為零,or4用于計算所有輸入系數(shù)是否為零。4個比較器中的comp0~comp3用于計算四個系數(shù)中坐標最大的系數(shù),comp4用于計算新舊系數(shù)之中坐標最大的系數(shù)。
7、所述緩沖模塊用于克服輸入順序與掃描順序不一致問題,將輸入的變換數(shù)據(jù)暫時存儲,然后在輸出數(shù)據(jù)時,按掃描順序輸出數(shù)據(jù)。
8、所述取絕對值模塊用于計算變換系數(shù)的正負符號與絕對值大小。
9、所述語法元素處理模塊用于將非零變換系數(shù)的位置信息和數(shù)值信息轉(zhuǎn)換為特定的語法元素信息,用作后續(xù)估計碼率,語法元素處理模塊用一個狀態(tài)機來實現(xiàn)。用狀態(tài)機將非零系數(shù)位置信息和系數(shù)數(shù)值信息轉(zhuǎn)換為語法元素信息,語法元素信息包括:語法元素數(shù)值syntax_value、語法元素模型起始編號syntax_id和語法元素模型類型syntax_type。
10、所述碼率估計模塊包括:二進制化模塊、寄存器、概率估計表模塊、本地上下文模型模塊、累加器、選擇器;用于估計每一個語法元素的碼率。
11、碼率估計模塊中的二進制化模塊連接到寄存器中,寄存器分兩路,一路進行線性估計連接到選擇器,另一路進行查表估計連接到本地上下文模型模塊與概率估計表模塊,概率估計表連接到選擇器,選擇器連接到累加器中。
12、二進制化模塊用二進制化方法將語法元素轉(zhuǎn)換成二進制串,寄存器用于暫時存儲二進制串并輸出二進制串的每一位,本地上下文模型模塊用于同步全局上下文模型的狀態(tài),概率估計表模塊存儲碼率表以供查表得到碼率,選擇器用于選擇查表估計或者線性估計的碼率,累加器則將所有語法元素估計后碼率進行累加,輸出最終的碼率。
13、進一步地,所述語法元素處理模塊中,所述狀態(tài)機轉(zhuǎn)換過程具體如下:
14、a1、初始處在idle狀態(tài),若系數(shù)全為0,則進入步驟a9,即進入end狀態(tài)結(jié)束當前變換塊的碼率估計,若系數(shù)不全為0,則進入步驟a2開始處理非零系數(shù)位置信息;
15、a2、按順序進入last_x_prefix和last_y_prefix兩個狀態(tài),處理坐標的前綴last_sig_coeff_x_prefix和last_sig_coeff_y_prefix,若坐標后綴不為0,則進入last_suffix,處理坐標后綴last_sig_coeff_x_prefix和last_sig_coeff_y_prefix,若坐標后綴為0則不用處理后綴,處理完坐標后進入步驟a3開始處理系數(shù)絕對值信息;
16、a3、進入csbf狀態(tài),從最后一個非零系數(shù)所在的子塊開始進行處理,若當前系數(shù)子塊的csbf為0,則仍處于csbf狀態(tài)并處理下一個系數(shù)子塊,若當前為1或者到最后一個子塊,即csbf==1orlast_cg==1,進入步驟a4,進一步處理當前子塊的系數(shù)信息;
17、a4、進入sig_coeff_flag狀態(tài),按掃描順序處理子塊中16個變換系數(shù),若系數(shù)為0則當前位置上的sig_coeff_flag標志為0,否則sig_coeff_flag為1,且在后續(xù)只對sig_coeff_flag=1的系數(shù)進行進一步處理,若系數(shù)全為0并且在最后一個子塊,即csbf==0&last_cg==1,則結(jié)束所有處理進入步驟a9,其余情況進入步驟a5;
18、a5、進入coeff_g1_flag狀態(tài),若系數(shù)大于1則coeff_abs_level_greater1_flag為1,若等于1則為0,且僅對前8個不為0的系數(shù)進行標記,沒標記的默認為0;
19、a6、若系數(shù)絕對值小于等于2則直接進入步驟a7,否則若存在系數(shù)絕對值大于2的情況,則先進入coeff_g2_flag狀態(tài),僅對第一個大于2的系數(shù)進行標記,令coeff_abs_level_greater2_flag=1,沒標記的默認為0,再進入步驟a7;
20、a7、進入coeff_sign_flag狀態(tài),對當前所有系數(shù)的符號進行標記,若標記為正數(shù)則coeff_sign_flag為0,為負數(shù)則為1,若有一個系數(shù)有剩余值,即coeff_remain?。?,進入步驟a8,即進入coeff_abs_remain狀態(tài),若所有系數(shù)無剩余值并且不是最后一個子塊,即last_cg==0,則返回步驟a3的csbf狀態(tài)進行下一個子塊處理,若所有系數(shù)無剩余值且是最后一個子塊,即last_cg==1,進入步驟a9;
21、a8、進入coeff_abs_remain狀態(tài),對剩余值進行標記,且不會標記為零剩余值,若當前子塊不是最后一個,即last_cg==0,則處理完所有系數(shù)返回步驟a3的csbf狀態(tài)進行下一個子塊處理,若當前子塊是最后一個,即last_cg==1,進入步驟a9;
22、其中,剩余值coeff_abs_remain的數(shù)值表達式如下:
23、coeff_abs_remain=|v|-1-coeff_abs_level_greater1_flag-coeff_abs_level_greater2_flag其中,v表示系數(shù)值。
24、a9、進入end狀態(tài),該狀態(tài)不進行操作和輸出,等待所述碼率估計裝置其他模塊所有操作完成返回idle狀態(tài)等待下一個變換塊。
25、進一步地,所述語法元素處理模塊中,所有語法元素具體如下:
26、last_sig_coeff_x_prefix:共有18個語法元素模型,使用查表估計。
27、last_sig_coeff_y_prefix:共有18個語法元素模型,使用查表估計。
28、last_sig_coeff_x_suffix:無語法元素模型,使用線性估計。
29、last_sig_coeff_y_suffix:無語法元素模型,使用線性估計。
30、coded_sub_block_flag:共有4個語法元素模型,使用線性估計。
31、sig_coeff_flag:共有42個語法元素模型,使用線性估計。
32、coeff_abs_g1_flag:共有24個語法元素模型,使用線性估計。
33、coeff_abs_g2_flag:共有8個語法元素模型,使用線性估計。
34、coeff_sign_flag:無語法元素模型,使用線性估計。
35、coeff_abs_level_remain:無語法元素模型,使用線性估計。
36、本發(fā)明還提供了一種基于fpga的hevc變換系數(shù)碼率估計方法,應用于所述碼率估計裝置,具體步驟如下:
37、s1、所述碼率估計裝置輸入端輸入變換塊,進入系數(shù)掃描模塊進行系數(shù)掃描,獲得最后一個非零系數(shù)坐標位置;
38、每次固定輸入四個變換系數(shù)直到完成一個完整大小變換塊,輸入的系數(shù)進行自身位或計算,檢測當前系數(shù)是否為0,收到使能信號en后計數(shù)器開始記錄輸入變換系數(shù)的次數(shù)與順序,根據(jù)計數(shù)值生成掃描序號,將檢測值與對應的掃描序號進行拼接得到比較值,然后與其余系數(shù)的比較值對比,選出最大的一個,直到輸入結(jié)束,取出最大比較值中的掃描序號轉(zhuǎn)換成最后一個非零系數(shù)坐標last_sig_x與last_sig_y,掃描后變換系數(shù)根據(jù)掃描序號來按生成地址w_addr與數(shù)據(jù)本身w_coeff,所有數(shù)據(jù)會暫時存到輸出緩沖模塊當中,最終輸出數(shù)據(jù)由輸出緩沖模塊輸出。
39、系數(shù)掃描方法包括:由右往左的水平掃描、由下往上的垂直掃描與右下往左上的對角掃描。
40、其中,每完成輸入一個4×4子塊,計算當前子塊的csbf,若子塊的16個系數(shù)全為0,則csbf等于0,否則為1。
41、s2、系數(shù)掃描模塊掃描后的系數(shù)w_coeff按掃描序號生成的地址w_addr存到緩沖模塊中,后續(xù)數(shù)據(jù)按掃描順序從緩沖模塊中取出變換系數(shù)輸出到取絕對值模塊,對系數(shù)取絕對值,獲取系數(shù)的幅值和符號;
42、其中,取絕對值模塊通過讀取地址r_addr到緩沖模塊中讀取系數(shù)r_coeff,之后將變換系數(shù)符號sign和系數(shù)絕對值abs_coeff輸出到語法元素處理模塊。
43、s3、語法元素處理模塊將非零系數(shù)位置信息和其余系數(shù)數(shù)值信息轉(zhuǎn)換為語法元素信息;
44、s4、碼率估計模塊對步驟s3得到的語法元素進行二進制化,得到二進制串bin,對bin進行碼率估計得到語法元素的碼率;
45、語法元素數(shù)值syntax_value經(jīng)過二進制化后得到二進制串bin,syntax_id決定二進制化的方式,定長編碼在fpga不用轉(zhuǎn)換,但截斷萊斯碼會將語法元素轉(zhuǎn)換成前綴和后綴。
46、隨后開始對bin的每一位進行碼率估計,包括查表估計和線性估計,具體如下:
47、(1)查表估計:將bin的每一位取出,在寄存器中根據(jù)bin長度獲取對應的上下文模型偏移值,與syntax_id相加后得到索引,用索引從本地上下文模型模塊得到概率狀態(tài)值和最有可能符號mpm,用概率狀態(tài)值從碼率估計表查找得到兩個一長一短的碼率,然后mpm與bin進行比較,若bin等于mpm,則選短的碼率,若bin不等于mpm,選長的碼率。
48、(2)線性估計:獲取bin的長度,然后碼率=bin的長度×1。
49、s5、碼率累加器對步驟s4得到的所有語法元素的碼率累加最后舍入,輸出總的碼率作為當前變換塊碼率估計值,即得到一個變換塊的碼率估計。
50、本發(fā)明的有益效果:本發(fā)明所述裝置包括:系數(shù)掃描模塊、緩沖模塊、取絕對值模塊、語法元素處理模塊、碼率估計模塊。本發(fā)明為hevc編碼器率失真優(yōu)化計算提供一種并行度高、效率高的碼率估計方法,可以快速估計碼率,以滿足并行化計算以及適應多種大小尺寸變換塊的需求的前提下獲得與精確碼率計算接近的性能,采用基于查表和線性估計的兩種方法,免去了熵編碼中更新上下文模型和算術編碼過程,既減少了資源消耗也提升了碼率計算速度,且支持并行計算,適用于多個不同大小尺寸變換塊同時進行碼率估計,適用于基于fpga的hevc編碼器等需要高吞吐率的場合。