本發(fā)明涉及視頻編解碼技術(shù)領(lǐng)域,特別是涉及一種cabac解碼方法。
背景技術(shù):
h.264是由iso/iec和itu-t兩大國際標(biāo)準(zhǔn)組織聯(lián)合制定的視頻編碼標(biāo)準(zhǔn)。與以往的視頻標(biāo)準(zhǔn)相比,它具有更高的壓縮比,更好的網(wǎng)絡(luò)親和性和信道適應(yīng)性,同時具有較強(qiáng)的抗誤碼能力,能夠滿足非常廣泛的業(yè)務(wù)需求。cabac(context-basedadaptivebinaryarithmeticcoding)是一種基于上下文的自適應(yīng)二進(jìn)制算術(shù)編碼,是h.264標(biāo)準(zhǔn)提出的熵編碼模式之一。cabac能夠充分考慮和利用視頻流的上下文信息,并且能夠自適應(yīng)視頻流的統(tǒng)計特性,因此能夠帶來極高的視頻壓縮比。
cabac在對一些語法元素解碼,特別是對指數(shù)哥倫布碼解碼時,一般需反復(fù)調(diào)用旁路解碼函數(shù),而旁路解碼一次只能解碼1比特,且后面比特的解碼要依賴當(dāng)前比特解碼后更新的信息,這將會降低硬件cabac解碼的流水效率。特別是在大分辨率視頻幀與幀之間的時間相關(guān)性較差時,上述問題帶來的負(fù)面效應(yīng)更加明顯。
綜上所述,傳統(tǒng)對cabac編碼的解碼方式解碼效率較低。
技術(shù)實現(xiàn)要素:
基于此,有必要針對解碼效率較低的問題,提供一種cabac解碼方法。
一種cabac解碼方法,包括以下步驟:
在一個解碼周期中將當(dāng)前待解碼序列左移兩位,并從待解碼的位流中讀入兩比特置于左移后的當(dāng)前待解碼序列的低兩位,得到第一待解碼序列;
將第一待解碼序列與第一解碼區(qū)間值進(jìn)行比較,根據(jù)第一待解碼序列與第一解碼區(qū)間值的大小獲取第一比較值;其中,第一解碼區(qū)間值為當(dāng)前解碼區(qū)間值左移一位對應(yīng)的值;
將第一待解碼序列與第二解碼區(qū)間值進(jìn)行比較,根據(jù)第一比較值以及第一待解碼序列與第二解碼區(qū)間值的大小獲取第二比較值;其中,第二解碼區(qū)間值為當(dāng)前解碼區(qū)間值與第一解碼區(qū)間值之和;
根據(jù)所述第一比較值和第二比較值確定前綴部分的解碼返回值和信息后綴的解碼返回值,根據(jù)所述前綴部分的解碼返回值和信息后綴的解碼返回值對待解碼的位流進(jìn)行解碼。
上述cabac解碼方法,一次讀入兩比特待解碼的數(shù)據(jù),并對該兩比特待解碼的數(shù)據(jù)進(jìn)行并行解碼,提高了解碼效率。特別地,上述解碼過程中第一比較值和第二比較值的輸出可以提前預(yù)測得知,所以硬件在對兩比特并行解碼的過程中,可以快速對解碼序列進(jìn)行更新,以供后續(xù)比特解碼使用,避免了原始旁路解碼方案中比特間解碼的依賴,進(jìn)一步提高了解碼的流水效率。
附圖說明
圖1為一個實施例的cabac的ue部分的解碼流程圖;
圖2為一個實施例的cabac的旁路解碼流程圖;
圖3為一個實施例的cabac的多bin旁路解碼流程圖;
圖4為一個實施例的cabac的ue部分多bin解碼流程圖;
圖5為一個實施例的ue前綴部分經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖;
圖6為一個實施例的ue信息后綴經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖;
圖7為一個實施例的cabac解碼系統(tǒng)的模塊圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明的技術(shù)方案進(jìn)行說明。
cabac整個編碼流程主要包含以下幾個步驟:語法元素的二進(jìn)制化,上下文概率模型的選擇和更新,二進(jìn)制算術(shù)編碼。其中二進(jìn)制算術(shù)編碼包括常規(guī)編碼和旁路編碼兩種方式。旁路編碼分支,主要是語法元素二值化后比特流中“0”和“1”概率相當(dāng)?shù)谋忍匚恢茫幋a過程中“0”和“1”的概率固定為1/2,以此固定概率分配進(jìn)行算術(shù)編碼。對語法元素的二進(jìn)制化,是cabac編碼的重要前提。每種語法元素根據(jù)各自的概率分布特性來選擇二值化方法。指數(shù)哥倫布編碼(exp-golomb)是語法元素二進(jìn)制化的一種方式。exp-golomb又分為無符號指數(shù)哥倫布編碼ue(v)、有符號指數(shù)哥倫布編碼se(v)、截斷指數(shù)哥倫布編碼te(v)和映射指數(shù)哥倫布編碼me(v)。任何語法元素值x在進(jìn)行哥倫布編碼前都要先轉(zhuǎn)化為編碼索引值codenum:
ue(v):從語法元素值x到codenum的轉(zhuǎn)換公式為:codenum=x;
se(v):從語法元素值x到codenum的轉(zhuǎn)換公式為:codenum=2x–1(x>0),codenum=-2x(x≤0);
te(v):從語法元素值x到codenum的轉(zhuǎn)換規(guī)則為:首先判斷x值的位數(shù)范圍v,如果v大于1,則x到codenum的轉(zhuǎn)換過程和ue(v)相同;如果v等于1,則x等于0或1,此時codenum與x的值相同,但最終的編碼值是codenum取反后的值;
me(v):從語法元素值x到codenum的轉(zhuǎn)換采用h.264規(guī)定的映射方式。
k階指數(shù)哥倫布編碼的公式如下:m=floor(log2(codenum+2k)),info=codenum+2k-2m。k階指數(shù)哥倫布碼的結(jié)構(gòu)可以表示為[m-k0][1][minfo],即碼字的前綴部分由m-k位0組成,信息后綴由m位的信息(info)組成,中間部分為1比特的1。在實際運(yùn)用的時候,k階指數(shù)哥倫布碼的結(jié)構(gòu)形式也可以是[m-k1][0][minfo],即碼字前綴部分是m-k位1,信息后綴是m位的info,而中間位是0。在一個實施例中,為了便于說明,下面以第二種形式為例對本發(fā)明的技術(shù)方案進(jìn)行說明,但本領(lǐng)域技術(shù)人員可以知道,在實際應(yīng)用中,本發(fā)明不限于這種形式,也可以采用第一種形式。
cabac編碼中語法元素mvd(運(yùn)動矢量殘差)的絕對值大于9的部分,其二進(jìn)制化采用了3階ue編碼;語法元素coeff_abs_level_minus1(殘差絕對值減去1的值)大于14的部分,其二進(jìn)制化采用了0階ue編碼。本發(fā)明以語法元素coeff_abs_level_minus1的ue部分的解碼為例,提出一種針對ue的cabac多bin解碼方法。
cabac對k階ue進(jìn)行解碼時,首先從比特流中尋找第一個零比特所在的位置,并將找到的前綴部分連“1”的比特個數(shù)記為leadingbits,則:codenum=2leadingbits+k-2k+value,其中value為第一個零比特后(leadingbits+k)個比特的值。根據(jù)ue的編碼規(guī)則,再將codenum反映射為對應(yīng)的語法元素值。
語法元素coeff_abs_level_minus1的ue部分的解碼流程如圖1所示,分為三個階段,第一階段是求取前綴比特“1”的個數(shù)cnt,第二階段根據(jù)cnt解碼ue的信息后綴值level_minus1,第三階段根據(jù)level_minus1確定解碼的殘差值level。其中,前兩個階段都是通過反復(fù)調(diào)用cabac的旁路解碼函數(shù)decode_bypass()來實現(xiàn)的。旁路解碼的流程如圖2所示,其方法是依據(jù)codioffset(當(dāng)前待解碼序列)和codirange(解碼區(qū)間值)的大小關(guān)系,確定codioffset的值落入的子區(qū)間,進(jìn)而輸出“0”和“1”的二進(jìn)制符號。落入的子區(qū)間就作為下一步譯碼過程所使用的概率區(qū)間,如果codioffset的值落在了大概率符號(moreprobablesymbol,mps)的編碼區(qū)間,則codioffset的值不變;如果codioffset的值落在了小概率符號(lessprobablesymbol,lps)的編碼區(qū)間,則codioffset要減去mps編碼區(qū)間的長度。codioffset的值來源于編碼生成的比特流,每解碼一比特,就要對codioffset進(jìn)行更新,方法是codioffset左移1位(移出最高位),然后通過read_bit(1)從待譯碼數(shù)據(jù)中讀取1比特作為codioffset二進(jìn)制形式的最低位。
由上面的分析,可以看到cabac對k階ue解碼的流程存在以下問題:第一階段獲取前綴比特“1”的個數(shù)cnt和第二階段求取信息后綴level_minus1的過程都是通過反復(fù)調(diào)用旁路解碼函數(shù)decode_bypass()來實現(xiàn)的,而旁路解碼一次只能解碼1比特,且后面比特的解碼要依賴當(dāng)前比特解碼后更新的信息codioffset,這將會降低硬件cabac解碼的流水效率。特別地,當(dāng)大分辨率視頻幀與幀之間的時間相關(guān)性較差時,上述問題帶來的負(fù)面效應(yīng)也會隨之增加。
為了克服現(xiàn)有技術(shù)存在的缺陷和不足。本發(fā)明的目的是提供一種cabac解碼方法,具體講,是一種針對h.264中cabac的指數(shù)哥倫布(exp-golomb)多bin解碼方法,用以避免比特間解碼的依賴帶來的流水效率低的問題,包括ue前綴部分的多bin解碼和信息后綴的多bin解碼。本發(fā)明的多bin解碼所依賴的旁路解碼,每次解碼兩比特。
為了方便后面的闡述,在此說明一下解碼過程中使用的幾個變量的含義,a_eat:用以標(biāo)志解碼第一比特時,是否需要從待解碼位流里重新讀取新的一字節(jié)數(shù)據(jù),需要時a_eat=1,否則a_eat=0。這里說明一下,旁路解碼前,首先從待解碼位流中讀取一字節(jié)數(shù)據(jù)c_data,然后每解碼一比特,就從c_data讀取一比特置于codioffset的低位,當(dāng)c_data的一字節(jié)解碼完畢后,就要從待解碼位流中讀取新的一字節(jié)數(shù)據(jù)賦與c_data;b_eat:用以標(biāo)志解碼第二比特時,是否需要從待解碼位流里面重新讀取新的一字節(jié)數(shù)據(jù),需要時b_eat=1,否則b_eat=0;a_flag:即第一比較值,表示codioffset1與(codirange<<1)大小關(guān)系的比較結(jié)果;b_flag:即第二比較值,表示codioffset1與((codirange<<1)+codirange)大小關(guān)系的比較結(jié)果。codirange<<1:即第一解碼區(qū)間值,表示codirange左移一位對應(yīng)的值,codirange表示當(dāng)前解碼區(qū)間值;codioffset1:即當(dāng)前待解碼序列codioffset左移兩位,并從待解碼的位流中讀入兩比特置于左移后的當(dāng)前待解碼序列的低兩位得到的序列;(codirange<<1)+codirange,即第二解碼區(qū)間值,表示第一解碼區(qū)間值與當(dāng)前解碼區(qū)間值之和;cnt表示前綴部分的比特數(shù);level_minus1表示解碼得到的信息后綴值;level表示解碼殘差值;ret_pre為前綴部分的解碼返回值;ret_suf為信息后綴的解碼返回值;codioffset2為當(dāng)前待解碼序列的更新值。binval是cabac旁路解碼1比特的返回值。
本發(fā)明的cabac解碼方法可包括以下步驟:
步驟1:在一個解碼周期中將當(dāng)前待解碼序列左移兩位,并從待解碼的位流中讀入兩比特置于左移后的當(dāng)前待解碼序列的低兩位,得到第一待解碼序列;
在一個實施例中,將當(dāng)前待解碼序列表示為codioffset,將第一待解碼序列表示為codioffset1。如圖3為本發(fā)明cabac的多bin旁路解碼流程圖。旁路解碼開始后,codioffset連續(xù)左移兩次,通過兩次調(diào)用read_bit(1),讀入待解碼的兩比特,置于codioffset的低兩位,得到codioffset1,并分別得到a_eat和b_eat的值。
步驟2:將第一待解碼序列與第一解碼區(qū)間值進(jìn)行比較,根據(jù)第一待解碼序列與第一解碼區(qū)間值的大小獲取第一比較值;其中,第一解碼區(qū)間值為當(dāng)前解碼區(qū)間值左移一位對應(yīng)的值;
在一個實施例中,將當(dāng)前解碼區(qū)間值表示為codirange,將第一解碼區(qū)間值表示為codirange1。在本步驟中,比較codioffset1與(codirange<<1)的大小關(guān)系,具體地,如果codioffset1≥(codirange<<1),a_flag=1;否則,a_flag=0。
步驟3:將第一待解碼序列與第二解碼區(qū)間值進(jìn)行比較,根據(jù)第一比較值以及第一待解碼序列與第二解碼區(qū)間值的大小獲取第二比較值;其中,第二解碼區(qū)間值為當(dāng)前解碼區(qū)間值與第一解碼區(qū)間值之和;
在本步驟中,根據(jù)a_flag的取值情況,進(jìn)一步對codioffset1和codirange的關(guān)系作比較。具體地,在a_flag=1的情況下,比較codioffset1與((codirange<<1)+codirange)的大小關(guān)系,如果codioffset1≥((codirange<<1)+codirange),b_flag=1;否則b_flag=0。在a_flag=0的情況下,比較codioffset1與codirange的大小關(guān)系,如果codioffset1≥codirange,b_flag=1;否則b_flag=0。
步驟4:根據(jù)所述第一比較值和第二比較值確定前綴部分的解碼返回值和信息后綴的解碼返回值,根據(jù)所述前綴部分的解碼返回值和信息后綴的解碼返回值對待解碼的位流進(jìn)行解碼。
在本步驟中,根據(jù)a_eat,b_eat,a_flag,b_flag的取值情況,確定兩比特旁路解碼后ue前綴部分的解碼返回值ret_pre和ue信息后綴的解碼返回值ret_suf。然后根據(jù)前綴部分的解碼返回值ret_pre和信息后綴的解碼返回值ret_suf對待解碼位流進(jìn)行解碼。具體地,根據(jù)返回值ret_pre確定前綴部分的比特數(shù)cnt;其中,所述前綴部分的比特數(shù)與信息后綴的比特數(shù)相等;根據(jù)cnt和返回值ret_suf解碼得到信息后綴值;根據(jù)解碼得到的信息后綴值計算解碼殘差值;根據(jù)所述解碼殘差值對待解碼位流進(jìn)行解碼。
在一個實施例中,如果當(dāng)前處于ue前綴部分的cabac解碼,兩比特旁路解碼后的解碼返回值ret_pre確定如下:如果a_flag=1且b_flag=1,則解碼返回值ret_pre為2;如果a_flag=1且b_flag=0,則解碼返回值ret_pre為1,此時ue前綴部分解碼結(jié)束;如果a_flag=0,無論b_flag的值為多少,解碼返回值ret_pre為0。這種情況下,a_flag=0意味著第一比特解碼完成后,ue前綴部分的解碼實際已經(jīng)結(jié)束,而第二比特屬于額外多解碼的一比特,因此要根據(jù)a_eat和b_eat的取值情況對多解碼的第二比特進(jìn)行還原。進(jìn)一步地,將每次旁路解碼后的返回值ret_pre進(jìn)行累加,得到無符號哥倫布碼前綴部分連“1”的個數(shù)cnt。由于哥倫布碼的前綴部分的比特數(shù)與信息后綴的比特數(shù)相同,因此,可以得到信息后綴的比特數(shù)cnt。
在一個實施例中,如果當(dāng)前處于ue信息后綴的cabac解碼,兩比特旁路解碼的解碼返回值ret_suf確定如下:如果a_flag=1且b_flag=1,則解碼返回值ret_suf為3;如果a_flag=1且b_flag=0,則解碼返回值ret_suf為2;如果a_flag=0且b_flag=1,則解碼返回值ret_suf為1;如果a_flag=0且b_flag=0,則解碼返回值ret_suf為0。進(jìn)一步地,每調(diào)用一次旁路解碼,cnt的值減2,直至cnt等于0,信息后綴解碼完畢,將每次旁路解碼的返回值ret_suf做累加,得到level_minus1。
特別地,當(dāng)對ue信息后綴進(jìn)行解碼時,有以下幾種考慮:(1)當(dāng)ue前綴部分解碼得到的cnt為偶數(shù)時,直接按照上述信息后綴的解碼規(guī)則對每一次解碼返回值ret_suf進(jìn)行累加,將累加的結(jié)果作為level_minus1的值;(2)當(dāng)ue前綴部分解碼得到的cnt=0時,信息后綴無需再進(jìn)行旁路解碼,直接得到level_minus1=0;(3)當(dāng)ue前綴部分解碼得到的cnt為奇數(shù)時,由于cnt每經(jīng)過一次旁路解碼就會減2,所以循環(huán)解碼完畢的標(biāo)志是cnt值遞減為-1。但當(dāng)cnt值等于0時,信息后綴的解碼實際已經(jīng)結(jié)束。此時,要根據(jù)a_eat及b_eat的值對多解碼的一比特進(jìn)行還原,而后將每一次解碼的返回值ret_suf做累加,得到level_minus1。
最后,對信息后綴解碼后得到的level_minus1執(zhí)行:level_minus1+1+14,可得到解碼殘差值level的絕對值,即|level|=level_minus1+1+14。
上述cabac解碼方法,codioffset在一個解碼周期里首先左移兩位,并從待解碼的位流里讀入兩比特置于codioffset的低兩位,得到codioffset1。然后分別判斷codioffset1與(codirange<<1)的大小關(guān)系a,codioffset1與((codirange<<1)+codirange)的大小關(guān)系b。根據(jù)確定后的關(guān)系a和關(guān)系b的不同組合,并依據(jù)ue解碼所處的是前綴部分階段還是信息后綴階段,得到多bin旁路解碼返回值,再根據(jù)多bin旁路解碼返回值得到cabac解碼后的語法元素值。
本發(fā)明的有益效果是:在對語法元素coeff_abs_level_minus1的ue部分進(jìn)行cabac解碼時,將ue解碼所依賴的旁路解碼部分,一次讀入兩比特,并對兩比特進(jìn)行并行解碼,提高了硬件的流水效率。
進(jìn)一步地,還可以根據(jù)確定后的關(guān)系a和關(guān)系b的不同組合,來更新codioffset值,以供后續(xù)比特解碼使用。特別地,由于上述解碼過程中關(guān)系a和關(guān)系b的組合情況可以提前預(yù)測得知,所以硬件在對兩比特并行解碼的過程中,可以快速對codioffset的值進(jìn)行更新,以供后續(xù)比特解碼使用,避免了原始旁路解碼方案中比特間解碼的依賴,進(jìn)一步提高了ue解碼的流水效率。
其中,如果當(dāng)前處于ue前綴部分的cabac解碼,兩比特旁路解碼后codioffset的更新值確定如下:如果a_flag=1且b_flag=1,則codioffset2=codioffset1-(codirange<<1)-codirange;如果a_flag=1且b_flag=0,則codioffset2=codioffset1-(codirange<<1),此時ue前綴部分解碼結(jié)束;如果a_flag=0,無論b_flag的值為多少,codioffset2=codioffset1>>1。這種情況下,a_flag=0意味著第一比特解碼完成后,ue前綴部分的解碼實際已經(jīng)結(jié)束,而第二比特屬于額外多解碼的一比特,因此要根據(jù)a_eat和b_eat的取值情況對多解碼的第二比特進(jìn)行還原。
其中,如果當(dāng)前處于ue信息后綴的cabac解碼,兩比特旁路解碼codioffset的更新值確定如下:如果a_flag=1且b_flag=1,則codioffset2=codioffset1-(codirange<<1)-codirange;如果a_flag=1且b_flag=0,則codioffset2=codioffset1-(codirange<<1);如果a_flag=0且b_flag=1,則codioffset2=codioffset1-codirange;如果a_flag=0且b_flag=0,將codioffset1左移兩位對應(yīng)的序列作為codioffset的更新值。
如圖4為本發(fā)明關(guān)于語法元素coeff_abs_level_minus1的cabac的ue部分的多bin解碼流程圖。根據(jù)ue解碼所處的階段以及a_eat,b_eat,a_flag,b_flag的取值情況,確定兩比特旁路解碼后codioffset的更新值、前綴部分的解碼返回值ret_pre,以及信息后綴的解碼返回值ret_suf,然后經(jīng)過后續(xù)處理得到解碼后的語法元素值。特別需要說明的是,a_flag和b_flag輸出組合的情況在旁路解碼前已經(jīng)可以預(yù)測得知,所以硬件在設(shè)計的時候,可以根據(jù)a_flag和b_flag的不同組合,提前計算出codioffset在不同組合下的更新值,這樣在實際進(jìn)行多bin解碼的時候更加有利于硬件的流水。
ue前綴部分經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖以及ue信息后綴經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖分別如圖5和圖6所示。上述cabac解碼方法,一次讀入兩比特待解碼的數(shù)據(jù),并對該兩比特待解碼的數(shù)據(jù)進(jìn)行并行解碼,提高了解碼效率。
如圖7所示,本發(fā)明還提供一種cabac解碼系統(tǒng),可包括:
位移模塊10,用于在一個解碼周期中將當(dāng)前待解碼序列左移兩位,并從待解碼的位流中讀入兩比特置于左移后的當(dāng)前待解碼序列的低兩位,得到第一待解碼序列;
在一個實施例中,將當(dāng)前待解碼序列表示為codioffset,將第一待解碼序列表示為codioffset1。如圖3為本發(fā)明cabac的多bin旁路解碼流程圖。旁路解碼開始后,codioffset連續(xù)左移兩次,通過兩次調(diào)用read_bit(1),讀入待解碼的兩比特,置于codioffset的低兩位,得到codioffset1,并分別得到a_eat和b_eat的值。
第一比較模塊20,用于將第一待解碼序列與第一解碼區(qū)間值進(jìn)行比較,根據(jù)第一待解碼序列與第一解碼區(qū)間值的大小獲取第一比較值;其中,第一解碼區(qū)間值為當(dāng)前解碼區(qū)間值左移一位對應(yīng)的值;
在一個實施例中,將當(dāng)前解碼區(qū)間值表示為codirange,將第一解碼區(qū)間值表示為codirange1。在本步驟中,比較codioffset1與(codirange<<1)的大小關(guān)系,具體地,如果codioffset1≥(codirange<<1),a_flag=1;否則,a_flag=0。
第二比較模塊30,用于將第一待解碼序列與第二解碼區(qū)間值進(jìn)行比較,根據(jù)第一比較值以及第一待解碼序列與第二解碼區(qū)間值的大小獲取第二比較值;其中,第二解碼區(qū)間值為當(dāng)前解碼區(qū)間值與第一解碼區(qū)間值之和;
在本模塊中,根據(jù)a_flag的取值情況,進(jìn)一步對codioffset1和codirange的關(guān)系作比較。具體地,在a_flag=1的情況下,比較codioffset1與((codirange<<1)+codirange)的大小關(guān)系,如果codioffset1≥((codirange<<1)+codirange),b_flag=1;否則b_flag=0。在a_flag=0的情況下,比較codioffset1與codirange的大小關(guān)系,如果codioffset1≥codirange,b_flag=1;否則b_flag=0。
解碼模塊40,用于根據(jù)所述第一比較值和第二比較值確定前綴部分的解碼返回值和信息后綴的解碼返回值,根據(jù)所述前綴部分的解碼返回值和信息后綴的解碼返回值對待解碼的位流進(jìn)行解碼。
在本模塊中,根據(jù)a_eat,b_eat,a_flag,b_flag的取值情況,確定兩比特旁路解碼后ue前綴部分的解碼返回值ret_pre和ue信息后綴的解碼返回值ret_suf。然后根據(jù)前綴部分的解碼返回值ret_pre和信息后綴的解碼返回值ret_suf對待解碼位流進(jìn)行解碼。具體地,根據(jù)返回值ret_pre確定前綴部分的比特數(shù)cnt;其中,所述前綴部分的比特數(shù)與信息后綴的比特數(shù)相等;根據(jù)cnt和返回值ret_suf解碼得到信息后綴值;根據(jù)解碼得到的信息后綴值計算解碼殘差值;根據(jù)所述解碼殘差值對待解碼位流進(jìn)行解碼。
在一個實施例中,如果當(dāng)前處于ue前綴部分的cabac解碼,兩比特旁路解碼后的解碼返回值ret_pre確定如下:如果a_flag=1且b_flag=1,則解碼返回值ret_pre為2;如果a_flag=1且b_flag=0,則解碼返回值ret_pre為1,此時ue前綴部分解碼結(jié)束;如果a_flag=0,無論b_flag的值為多少,解碼返回值ret_pre為0。這種情況下,a_flag=0意味著第一比特解碼完成后,ue前綴部分的解碼實際已經(jīng)結(jié)束,而第二比特屬于額外多解碼的一比特,因此要根據(jù)a_eat和b_eat的取值情況對多解碼的第二比特進(jìn)行還原。進(jìn)一步地,將每次旁路解碼后的返回值ret_pre進(jìn)行累加,得到無符號哥倫布碼前綴部分連“1”的個數(shù)cnt。由于哥倫布碼的前綴部分的比特數(shù)與信息后綴的比特數(shù)相同,因此,可以得到信息后綴的比特數(shù)cnt,然后繼續(xù)解碼cnt個比特。
其中,如果當(dāng)前處于ue信息后綴的cabac解碼,兩比特旁路解碼的解碼返回值ret_suf確定如下:如果a_flag=1且b_flag=1,則解碼返回值ret_suf為3;如果a_flag=1且b_flag=0,則解碼返回值ret_suf為2;如果a_flag=0且b_flag=1,則解碼返回值ret_suf為1;如果a_flag=0且b_flag=0,則解碼返回值ret_suf為0。進(jìn)一步地,每調(diào)用一次旁路解碼,cnt的值減2,直至cnt等于0,信息后綴解碼完畢,將每次旁路解碼的返回值ret_suf做累加,得到level_minus1。
特別地,當(dāng)對ue信息后綴進(jìn)行解碼時,有以下幾種考慮:(1)當(dāng)ue前綴部分解碼得到的cnt為偶數(shù)時,直接按照上述信息后綴的解碼規(guī)則對每一次解碼返回值ret_suf進(jìn)行累加,將累加的結(jié)果作為level_minus1的值;(2)當(dāng)ue前綴部分解碼得到的cnt=0時,信息后綴無需再進(jìn)行旁路解碼,直接得到level_minus1=0;(3)當(dāng)ue前綴部分解碼得到的cnt為奇數(shù)時,由于cnt每經(jīng)過一次旁路解碼就會減2,所以循環(huán)解碼完畢的標(biāo)志是cnt值遞減為-1。但當(dāng)cnt值等于0時,信息后綴的解碼實際已經(jīng)結(jié)束。此時,要根據(jù)a_eat及b_eat的值對多解碼的一比特進(jìn)行還原,而后將每一次解碼的返回值ret_suf做累加,得到level_minus1。
最后,對信息后綴解碼后得到的level_minus1執(zhí)行:level_minus1+1+14,可得到解碼殘差值level的絕對值,即|level|=level_minus1+1+14。
上述cabac解碼系統(tǒng),codioffset在一個解碼周期里首先左移兩位,并從待解碼的位流里讀入兩比特置于codioffset的低兩位,得到codioffset1。然后分別判斷codioffset1與(codirange<<1)的大小關(guān)系a,codioffset1與((codirange<<1)+codirange)的大小關(guān)系b。根據(jù)確定后的關(guān)系a和關(guān)系b的不同組合,并依據(jù)ue解碼所處的是前綴部分階段還是信息后綴階段,得到多bin旁路解碼返回值,再根據(jù)多bin旁路解碼返回值得到cabac解碼后的語法元素值。
本發(fā)明的有益效果是:在對語法元素coeff_abs_level_minus1的ue部分進(jìn)行cabac解碼時,將ue解碼所依賴的旁路解碼部分,一次讀入兩比特,并對兩比特進(jìn)行并行解碼,提高了硬件的流水效率。
進(jìn)一步地,還可以根據(jù)確定后的關(guān)系a和關(guān)系b的不同組合,來更新codioffset值,以供后續(xù)比特解碼使用。特別地,由于上述解碼過程中關(guān)系a和關(guān)系b的組合情況可以提前預(yù)測得知,所以硬件在對兩比特并行解碼的過程中,可以快速對codioffset的值進(jìn)行更新,以供后續(xù)比特解碼使用,避免了原始旁路解碼方案中比特間解碼的依賴,進(jìn)一步提高了ue解碼的流水效率。
其中,如果當(dāng)前處于ue前綴部分的cabac解碼,兩比特旁路解碼后codioffset的更新值確定如下:如果a_flag=1且b_flag=1,則codioffset2=codioffset1-(codirange<<1)-codirange;如果a_flag=1且b_flag=0,則codioffset2=codioffset1-(codirange<<1),此時ue前綴部分解碼結(jié)束;如果a_flag=0,無論b_flag的值為多少,codioffset2=codioffset1>>1。這種情況下,a_flag=0意味著第一比特解碼完成后,ue前綴部分的解碼實際已經(jīng)結(jié)束,而第二比特屬于額外多解碼的一比特,因此要根據(jù)a_eat和b_eat的取值情況對多解碼的第二比特進(jìn)行還原。
其中,如果當(dāng)前處于ue信息后綴的cabac解碼,兩比特旁路解碼codioffset的更新值確定如下:如果a_flag=1且b_flag=1,則codioffset2=codioffset1-(codirange<<1)-codirange;如果a_flag=1且b_flag=0,則codioffset2=codioffset1-(codirange<<1);如果a_flag=0且b_flag=1,則codioffset2=codioffset1-codirange;如果a_flag=0且b_flag=0,將codioffset1左移兩位對應(yīng)的序列作為codioffset的更新值。
如圖4為本發(fā)明關(guān)于語法元素coeff_abs_level_minus1的cabac的ue部分的多bin解碼流程圖。根據(jù)ue解碼所處的階段以及a_eat,b_eat,a_flag,b_flag的取值情況,確定兩比特旁路解碼后codioffset的更新值、前綴部分的解碼返回值ret_pre,以及信息后綴的解碼返回值ret_suf,然后經(jīng)過后續(xù)處理得到解碼后的語法元素值。特別需要說明的是,a_flag和b_flag輸出組合的情況在旁路解碼前已經(jīng)可以預(yù)測得知,所以硬件在設(shè)計的時候,可以根據(jù)a_flag和b_flag的不同組合,提前計算出codioffset在不同組合下的更新值,這樣在實際進(jìn)行多bin解碼的時候更加有利于硬件的流水。
ue前綴部分經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖以及ue信息后綴經(jīng)過一次多bin旁路解碼后的輸出結(jié)果圖分別如圖5和圖6所示。上述cabac解碼系統(tǒng),一次讀入兩比特待解碼的數(shù)據(jù),并對該兩比特待解碼的數(shù)據(jù)進(jìn)行并行解碼,提高了解碼效率。
在流程圖中表示或在此以其他方式描述的邏輯和/或步驟,例如,可以被認(rèn)為是用于實現(xiàn)邏輯功能的可執(zhí)行指令的定序列表,可以具體實現(xiàn)在任何計算機(jī)可讀介質(zhì)中,以供指令執(zhí)行系統(tǒng)、裝置或設(shè)備(如基于計算機(jī)的系統(tǒng)、包括處理器的系統(tǒng)或其他可以從指令執(zhí)行系統(tǒng)、裝置或設(shè)備取指令并執(zhí)行指令的系統(tǒng))使用,或結(jié)合這些指令執(zhí)行系統(tǒng)、裝置或設(shè)備而使用。就本說明書而言,“計算機(jī)可讀介質(zhì)”可以是任何可以包含、存儲、通信、傳播或傳輸程序以供指令執(zhí)行系統(tǒng)、裝置或設(shè)備或結(jié)合這些指令執(zhí)行系統(tǒng)、裝置或設(shè)備而使用的裝置。
計算機(jī)可讀介質(zhì)的更具體的示例(非窮盡性列表)包括以下:具有一個或多個布線的電連接部(電子裝置),便攜式計算機(jī)盤盒(磁裝置),隨機(jī)存取存儲器(ram),只讀存儲器(rom),可擦除可編輯只讀存儲器(eprom或閃速存儲器),光纖裝置,以及便攜式光盤只讀存儲器(cdrom)。另外,計算機(jī)可讀介質(zhì)甚至可以是可在其上打印所述程序的紙或其他合適的介質(zhì),因為可以例如通過對紙或其他介質(zhì)進(jìn)行光學(xué)掃描,接著進(jìn)行編輯、解譯或必要時以其他合適方式進(jìn)行處理來以電子方式獲得所述程序,然后將其存儲在計算機(jī)存儲器中。
應(yīng)當(dāng)理解,本發(fā)明的各部分可以用硬件、軟件、固件或它們的組合來實現(xiàn)。在上述實施方式中,多個步驟或方法可以用存儲在存儲器中且由合適的指令執(zhí)行系統(tǒng)執(zhí)行的軟件或固件來實現(xiàn)。例如,如果用硬件來實現(xiàn),和在另一實施方式中一樣,可用本領(lǐng)域公知的下列技術(shù)中的任一項或他們的組合來實現(xiàn):具有用于對數(shù)據(jù)信號實現(xiàn)邏輯功能的邏輯門電路的離散邏輯電路,具有合適的組合邏輯門電路的專用集成電路,可編程門陣列(pga),現(xiàn)場可編程門陣列(fpga)等。
在本說明書的描述中,參考術(shù)語“一個實施例”、“一些實施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個實施例或示例中。在本說明書中,對上述術(shù)語的示意性表述不一定指的是相同的實施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任何的一個或多個實施例或示例中以合適的方式結(jié)合。
以上所述實施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡潔,未對上述實施例中的各個技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實施例僅表達(dá)了本發(fā)明的幾種實施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。