專利名稱:一種h.264標準cavlc殘差系數(shù)的解碼方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一見頻及圖像編解碼的領(lǐng)域,特別涉及一種H.264的上下文 自適應(yīng)變長編碼(CAVLC)殘差系數(shù)的解碼方法。
背景技術(shù):
最新國際視頻編碼標準H.264規(guī)定其熵編碼可以采用CAVLC或者上 下文自適應(yīng)的算術(shù)編碼(CABAC),其中,CAVLC的效率比MPEG-l、 MPEG-2標準中采用的變長編碼提高許多,而計算復雜度比CABAC低了 許多,在編碼效率和復雜度之間取得了很好的折中,H.264協(xié)議標準特別 推薦在面向視頻監(jiān)控、視頻會議等基本層應(yīng)用中采用該技術(shù)。這些應(yīng)用要 求碼流實時解碼,而在CAVLC中,對不同語法元素采用不同的解碼方法 對宏塊類型、運動矢量等采用直接或間接的指數(shù)哥倫布碼進行解碼,而殘 差系數(shù)的解碼由于需要對編碼中產(chǎn)生的所有碼字逐一解析,比較復雜從而 速度較低。碼字具體包含非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組 coeff—token <TotalCoeff,TrailingOnes>、拖尾系數(shù)的符號位、非拖尾的非零 系數(shù)的幅值、最后一個非零系數(shù)前0的數(shù)目和每個非零系數(shù)前0的個數(shù)。
殘差系數(shù)解碼時間主要消耗在非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目的 二元組的解碼上,該碼字的解碼不僅需要進行碼表切換,更主要的是受H.264 協(xié)議標準提供的一維碼表限制,在碼字解析過程中,需要逐比特讀入碼字, 每讀入一個比特就要在碼表中遍歷,以判定已經(jīng)讀入的部分是否為 一個有效 碼字,直到已經(jīng)讀入的比特串能夠與碼表中某個碼字匹配為止,從而導致在 解碼過程中需要反復進行讀操作和比較操作,效率纟艮低。
對于非拖尾的非零系數(shù)的幅值解碼,前導0的個數(shù)的確定也消耗了大 量時間,因為只能逐比特判斷是否為0,直到讀到l為止。
鑒于以上問題,CAVLC算法自2003年確定采用之后,已經(jīng)出現(xiàn)了一 些實現(xiàn)方案。文獻1 (Hsiu-Cheng Chang, Chi en-Chang Lin and Jhm-In Guo, "A Novel Low-Cost High-Performance VLSI Architecture for MPEG國4 AVC/H.264 CAVLC Decoding" ,Proc. ISCAS 2005,pp.6110-6113,23-26 May
2005 )公開了 CAVLC解碼的VLSI ( Very Large Scale Integration,超大規(guī)模 集成)設(shè)計,文獻2 ( Xing Qin,Xiaolang Yan, "A memory and Speed Efficient CAVLC Decoder" , Proc. VCIP 2005,pp.l418-1426,Ju1.2005 )公開了 一個可 編程的VLSI設(shè)計,文獻3 (清華大學申請的專利"一種基于上下文自適 應(yīng)變長解碼的方法,,,7>開號200610041780.X)在此基礎(chǔ)上提出了一種存 儲要求更低、速度更快的面向集成電路的CAVLC解碼設(shè)計方法。以上各 方法都是針對CAVLC的集成電路設(shè)計而提出的,依賴于集成電路設(shè)計這 一平臺,并不適用于通用CPU或者DSP等平臺上的軟件實現(xiàn)。文獻4(韓 國C&S技術(shù)有限公司申請的專利"用于快速上下文自適應(yīng)可變長編碼的 H.264解碼方法,,,公開號200610002800.2)公開了一種三維碼表,可用于 CAVLC軟件解碼實現(xiàn)。然而,此方法無論內(nèi)存開銷,還是運算量都比較 大,從而運算速度較慢,存在進一步優(yōu)化的可能。
同時,以上文獻都是針對早期版本的碼表進行優(yōu)化設(shè)計,在最新的 H.264標準中,對原有碼表進行調(diào)整,還特別增加了 nC-;2的碼表。本發(fā) 明針對新H.264協(xié)議標準制定的碼表設(shè)計了 CAVLC解碼方法。
發(fā)明內(nèi)容
本發(fā)明的目的對現(xiàn)有解碼方法所存在運算量較大,運算速度較慢的問 題予以改進,提供一種高效率的上下文自適應(yīng)編碼系數(shù)的可編程解碼方 法。
為實現(xiàn)上述目的,根據(jù)本發(fā)明的一個方面,提供了一種H.264標準 CAVLC殘差系數(shù)的解碼方法,在對殘差系數(shù)進行由高頻向低頻的Z字形 掃描之后,對所有碼字順序逐一解析,包括下列步驟
基于碼表解碼非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組,其中碼表包 含前導O的個數(shù)、信息位長度和信息的三維;
解碼拖尾系數(shù)的符號位;
解碼非拖尾的非零系數(shù)的幅值;
解碼最后一個非零系數(shù)前0的數(shù)目;
解碼每個非零系數(shù)前0的個數(shù)。
根據(jù)本發(fā)明的另 一 方面,基于碼表的非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目 的二元組解碼進一步包含下列步驟 根據(jù)上下文選擇碼表;
讀取前導0的個數(shù);
根據(jù)選擇的碼表和前導O的個數(shù),讀取信息位,確定非零系數(shù)的數(shù)目 和拖尾系數(shù)數(shù)目的二元組信息。
根據(jù)本發(fā)明的再一方面,讀取前導0個數(shù)進一步包含以下步驟 讀取2個字節(jié)碼流;
在此2個字節(jié)碼流中讀取值為1的最高位數(shù),則之前的位數(shù)即為前導 0個數(shù)。
本發(fā)明的優(yōu)點在于有效減少了讀碼流操作次數(shù);有效減少了碼表存儲 空間;有效減少了碼字匹配次數(shù),對于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù) 目二元組至多進行一次匹配,大部分情況下不需要匹配就可確定碼字,提 高了碼流的解碼速度。
以下,結(jié)合附圖來詳細說明本發(fā)明的實施例,其中
圖1殘差系數(shù)編碼采用的反向Z字形掃描。
圖2 nC與nA、 nB的位置關(guān)系。
圖3 H.264協(xié)議標準中用于編碼的碼表。
圖4指數(shù)哥倫布碼碼字構(gòu)造方法。
圖5用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(0=<nC<2)解 碼的碼表。
圖6用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(2=<nC<4)解 碼的碼表。
圖7用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(4=<nC<8)解 碼的碼表。
圖8用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(8=<nC)解碼 的碼表。
圖9用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(nC==-l)解碼 的碼表。
圖10用于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組(nC==-2)解 碼的碼表。
圖11非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組解碼流程圖。
圖12另一個非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組解碼流程
圖。
具體實施例方式
基于H.264協(xié)議標準的上下文的自適應(yīng)變長編碼的殘差系數(shù)解碼過程 是一個復雜的過程,在對殘差系數(shù)進行由高頻向低頻的反向Z字形掃描(如 圖l所示)之后,對所有碼字逐一解析?,F(xiàn)有的解碼方法通常包含如下步 驟
第一步對非零系數(shù)的數(shù)目以及拖尾系數(shù)數(shù)目的二元組進行解碼,其 中,拖尾系數(shù)數(shù)目,具體是指由低頻向高頻掃描得到的一維系數(shù)矩陣中非 0,絕對值為1的連續(xù)系數(shù)個數(shù)。拖尾系數(shù)數(shù)目最大為3,超過3個的士1 系數(shù)視作普通系數(shù),解碼方式采用每個非零系數(shù)前0的個數(shù)解碼的方式。 具體解碼步驟包含
(1 )根據(jù)上下文選擇碼表非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二 元組解碼所使用碼表的選擇需要根據(jù)周圍塊殘差系數(shù)的分布情況,取決于 nC的取值。nC的具體計算步驟如下如果是色度DC系數(shù)解碼,貝'J 4:2:0 格式時nC=-l, 4:2:2格式時nC=-2, 4:4:4格式時nO0;否則,nC根據(jù)上邊 塊系數(shù)個數(shù)nA和左邊塊的系數(shù)個數(shù)nB來計算(nA、 nB、 nC位置關(guān)系如 圖2所示)如果nA和nB都可用,則nC=(nA+nB+l)/2;否則,如果nA 可用,則nC-nA,如果nB可用,貝'J nC^A,否則nOO。非零系數(shù)的數(shù)目以 及拖尾系數(shù)的^:目二元組解碼H.264標準碼表如圖3所示;
(2)逐比特位讀取碼流,直到已經(jīng)讀入的比特串能夠與碼表中某個 碼字匹配;取出這個碼字對應(yīng)的非零系數(shù)的數(shù)目和拖尾系數(shù)的數(shù)目內(nèi)容。
第二步對拖尾系數(shù)的符號位解碼,每個符號解碼l位,根據(jù)正負分 別解碼為0或1。
第三步按照掃描順序?qū)Ψ峭衔驳姆橇阆禂?shù)的幅值使用映射的指數(shù)哥 倫布碼解碼,這是一種結(jié)構(gòu)化的解碼方式,碼字構(gòu)造方式如圖4所示,具 體步驟包括
(1) 讀取前導O的個數(shù)逐比特位讀取,如果為0,則繼續(xù)讀取下一 比特;如果為1,則進行下一步驟;
(2) 計算非拖尾的非零系數(shù)的幅值
level =(-1)(2前導鵬+信飾分).^1「(2前導晚數(shù)—1+信息部分長度)+ 2
其中信息部分是碼表(如圖4所示)內(nèi)碼字中代表幅值的部分,其長
度等于前導0位數(shù),Ceil表示向上取整函數(shù)。
第四步對最后 一個非零系數(shù)前0的數(shù)目使用自適應(yīng)的碼表進行解碼; 第五步根據(jù)已編碼信息自適應(yīng)選擇碼表,對每個非零系數(shù)前0的個
數(shù)進行解碼。
從上述解碼過程可以看出,由于非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目 二元組解碼過程涉及到的逐比特位讀取和碼字比較的操作非常多,會導致 解碼速度嚴重降低。此解碼過程中存在的缺陷本質(zhì)上是由H.264標準碼表 的一維特性決定的。為此,本發(fā)明設(shè)計了一種新的碼表,利用前導0位數(shù)、 信息位長度以及信息部分三維參量設(shè)計了三維碼表,由此可直接確定非零 系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組。
具體地,針對非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組解碼本發(fā)明 設(shè)計了基于碼字特征的三維碼表。通過對圖3中H,264標準碼表的觀察, 分割為0=<nC<2、 2=<nC<4、 4=<nC<8、 nC>=8、 nC==-l和nC==-2共6 個碼表。針對這六個碼表,分別進行重組,構(gòu)建如圖5、圖6、圖7、圖8、 圖9和圖IO所示的六個三維表。碼表中留空部分表示沒有對應(yīng)的碼字。 在本發(fā)明碼表中,確定上下文及前導O個數(shù)之后,信息位的長度最多只有 兩種,長度數(shù)值最多相差1,這對于壓縮碼字的保存空間非常有效,利用 這一點可以有效壓縮存儲空間。在解碼過程中,如果前導O的個數(shù)對應(yīng)的 信息位長度有兩種,則首先考慮長度大的情況,讀入相應(yīng)位的數(shù),在能與 碼表匹配時,則確定為該信息位長度;在不能與碼表匹配時,則認為信息 位為長度小的情況。特別的,當110=8時(如圖8所示),碼表是定長的, 無須進行多次比較就可獲得碼字,本發(fā)明將其前導0長度直接置為0,后 面6位全部^見為信息位。
在碼表中,信息既可以是非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組 的索引index,也可以直接是非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組 具體內(nèi)容,前者可以減少碼表所占空間,但是需要根據(jù)索引計算非零系數(shù) 的數(shù)目以及拖尾系數(shù)的數(shù)目二元組,后者則可以直接獲得所需元素值???根據(jù)不同平臺資源的限制,選擇其中之一。如果在碼表中存放索引,按照 如下方式計算非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組
如果(index〈6)( 如果(index',O) 那么index+=3;
如果(index〉二3)那么index+=2; TotalCoeff = (index 2)&3; TrailingOnes = index&3;
否則{
TotalCoeff=3+(index-6)/4; TrailingOnes=(index-6)&3;
為了在非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組和非拖尾的非零 系數(shù)的幅值解碼過程中減少獲取前導0個數(shù)所需時間,本發(fā)明設(shè)計了 一種 快速取得前導0個數(shù)的方案。考慮到前導0最長可達12比特位,同時盡 可能減少讀碼流的次數(shù),在讀取前導0位數(shù)操作時,每次讀取2個字節(jié)長 度。此外許多特定平臺有專門指令實現(xiàn)這一功能,充分利用這些指令就可 以進一步降低讀取前導0位數(shù)所需周期。
在上述三維碼表和快速取得前導0的個數(shù)的方案的基礎(chǔ)上,本發(fā)明提 出一種H.264標準CAVLC殘差系數(shù)的解碼方法,具體步驟如下
1、非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組解碼
假設(shè),當前碼流指向"00000000010110110...,,。
第一根據(jù)上下文選擇碼表
按照H.264標準規(guī)定計算nC,根據(jù)nC確定應(yīng)選用的碼表。假設(shè)nC=l, 那么此時非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組解碼對應(yīng)的碼表應(yīng) 該選擇對應(yīng)于0=<nC<2的碼表(圖5 )。
笫二,讀取前導0的個數(shù)
從碼流當前位置開始讀取前導0的個數(shù)。方法如下讀取2個字節(jié)的 碼流,然后讀取值為1的最高位數(shù),之前的位數(shù)即為前導O的個數(shù)。本例
中,讀入"oooooooooioiioir,前導o的個數(shù)為9。
第三,讀取信息位,確定非零系數(shù)的數(shù)目以及拖尾系數(shù)的數(shù)目二元組信
自
根據(jù)選擇的碼表和前導o的個數(shù),確定可能信息位長度,并通過移位
方法讀取。本例中,可確定信息位長度為4,通過移位方式讀入4比特 "1011"。 二進制"1011"對應(yīng)十進制11。如果碼表中直接存放非零系數(shù) 的數(shù)目以及拖尾系數(shù)的數(shù)目二元組內(nèi)容,則直接獲得拖尾系數(shù)的數(shù)目為0,
非零系數(shù)的數(shù)目為7 (如圖11所示);如果表中存放的是碼字的索引,則 可獲得22,據(jù)此計算獲得拖尾系數(shù)的數(shù)目為0,非零系數(shù)的數(shù)目為7(如 圖12所示)。
2、 拖尾系數(shù)的符號位解碼,根據(jù)碼字0或1分別解碼為正負;
3、 非拖尾的非零系數(shù)的幅值解碼
假設(shè),當前碼流指向"000101101101100101111001..."。
第一步,讀取前導o的個數(shù)
從碼流當前位置開始讀取前導O的個數(shù)。方法如下讀取2個字節(jié)的 碼流,然后讀取值為1的最高位數(shù),之前的位數(shù)即為前導O的個數(shù)。本例 中,讀入"0001011011011001",前導0的個數(shù)為3。
第二步,計算非拖尾的非零系數(shù)的幅值
<formula>formula see original document page 9</formula>
4、 解碼反向掃描的第一個非零系數(shù);
5、 解碼每個非零系數(shù)前O的個數(shù)。
權(quán)利要求
1.一種H.264標準CAVLC殘差系數(shù)的解碼方法,包括下列步驟對殘差系數(shù)進行由高頻向低頻的Z字形掃描;基于碼表解碼非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組,其中碼表包含三維參量前導0個數(shù)、信息位長度和信息;解碼拖尾系數(shù)的符號位;解碼非拖尾的非零系數(shù)的幅值;解碼最后一個非零系數(shù)前0的數(shù)目;解碼每個非零系數(shù)前0的個數(shù)。
2. 如權(quán)利要求1所述的方法,其特征在于所述基于碼表非零系數(shù)的 數(shù)目和拖尾系數(shù)數(shù)目的二元組解碼進一步包含下列步驟根據(jù)上下文選擇碼表; 讀取前導0的個數(shù);根據(jù)選擇的碼表和前導0的個數(shù),讀取信息位,確定非零系數(shù)的數(shù)目 和拖尾系數(shù)數(shù)目的二元組信息。
3. 如權(quán)利要求1所述的方法,其特征在于所述信息是非零系數(shù)的數(shù) 目和拖尾系數(shù)數(shù)目的二元組。
4. 如權(quán)利要求1所述的方法,其特征在于所述信息是非零系數(shù)的數(shù) 目和拖尾系數(shù)數(shù)目的二元組的索引值,能夠依據(jù)此值計算coeff一token。
5. 如權(quán)利要求1所述的方法,其特征在于所述解碼非拖尾的非零系 數(shù)進一步包含下列步驟讀取前導0的個數(shù);根據(jù)讀取的前導0個數(shù)計算非拖尾的非零系數(shù)。
6. 如權(quán)利要求2或5所述的方法,其特征在于所述讀取前導0的個 數(shù)進一步包含以下步驟讀取2個字節(jié)碼流;在此2個字節(jié)碼流中讀取值為l的最高位數(shù),則之前的位數(shù)即為前導 0的個數(shù)。
全文摘要
本發(fā)明公開了一種H.264上下文自適應(yīng)編碼殘差系數(shù)的解碼方法,包含以下步驟首先根據(jù)設(shè)計的一種三維碼表,解碼非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組;再解碼拖尾系數(shù)的符號位;然后解碼非拖尾的非零系數(shù)的幅值;最后解碼最后一個非零系數(shù)前0的數(shù)目和每個非零系數(shù)前0的個數(shù)。其中的非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組解碼,根據(jù)三維碼表,通過預(yù)取特定比特位數(shù),至多進行一次比較就可以確定碼字信息位長度,進而確定二元組內(nèi)容。其中的非零系數(shù)的數(shù)目和拖尾系數(shù)數(shù)目的二元組解碼和非拖尾的非零系數(shù)的幅值解碼采用每次讀取兩個字節(jié)的方法取得前導0的個數(shù)。本方法可以有效提高CAVLC碼流的解碼速度。
文檔編號H04N7/30GK101370138SQ20071012044
公開日2009年2月18日 申請日期2007年8月17日 優(yōu)先權(quán)日2007年8月17日
發(fā)明者張冬明, 張勇東, 李錦濤 申請人:中國科學院計算技術(shù)研究所