專利名稱:一種快速解碼CAVLC run_before碼字的硬件實現方法
技術領域:
本發明屬于數字視頻信號編解碼技術領域,具體涉及一種解碼CAVLC run_before 碼字的硬件實現方法。
背景技術:
H. 264/AVC(Advanced Video Coding)由國際電信組織(ITU)和運動圖像專家組 (MPEG)聯合制定而成的國際視頻編碼標準,目前已經在多媒體音視頻領域得到了廣泛的應用。H. 264/AVC中規定其熵編碼可以采用兩種方式下文自適應可變長編碼(CAVLC)和上下文自適應算術編碼(CABAC)。CABAC具有較高的編碼效率,但是編解碼的復雜度也大大增加,而CAVLC在編碼效率和復雜度上有著較好的均衡。與前一代視頻標準如MPEG-1,MPEG-2 相比,CAVLC的編碼效率有著顯著提升。視頻碼流中的視頻頭信息和預測信息一般采用較低復雜度的定長碼或指數哥倫布碼,而殘差系數的信息占據了視頻碼流的絕大部分,這部分信息的編碼需要采用更高效的CAVLC編碼方式。CAVLC的碼字總共有5類
1. Coeff_token 本碼字代表非零系數的數目和拖尾1的個數(TraiIingOnes)。2. Sign_trail 本碼字是拖尾1的符號。每一個符號編碼為一比特,0表示正1, 1表示負1。3. Levels 本碼字是指"TrailingOnes外的其它的非零系數的幅值。4. Totalzeros 它編碼在以反Zig-Zag掃描順序時第一個非零系數后的總的零系數的個數。5. Run_before 本碼字是指每一個非零系數前的零的個數。對于硬件解碼而言,計算非零系數的幅值和rim_bef0re碼字是整個CAVLC解碼過程中最耗費時間的過程。對于一個長度和高度都為4個像素的圖形塊,如果采用CAVLC編碼方式,有些碼字如Coeff_token、sign_trial和iTotalzero在解碼過程中只需要一次解碼, 而run_before碼字最多可以達14個。為了加快硬件處理的速度,有必要針對run_before 碼字提出一種快速的解碼方法。
發明內容
本發明的目的在于提出一種適用于H. 264視頻規范所規定的CAVLC解碼過程的快速解碼run_bef0re碼字的硬件實現方法。本發明提出的快速解碼rUn_bef0re碼字的硬件實現方法,可以在一個時鐘周期內最多完成兩個rurubefore碼字的解碼。整個碼字解碼的硬件框圖如圖1所示。本方法采用了碼表分拆和碼字合并這兩種方法,在一個時鐘周期內最多可以解碼14個值為O的 run_before碼字,或兩個值不等于O的rurubefore碼字。輸入的視頻碼流首先經過前導1 檢測器來檢測帶解碼的rurubefore碼字是否為零,前導1檢測器最多一次可以檢測14位前導1。如果當前rurubefore碼字的值不為零,我們將當前解碼位置之前所包含的O的總個數記為zerosLeft,根據zerosLeft的值可以將run_bef0re碼字分為7種類型,即將原標準中規定的rurubefore碼表分解為7個子碼表,針對每一種類型分別進行解碼。每個時鐘周期內最多可以解碼2個run_before碼字。CAVLC定義了多種碼字,在編碼一個4x4殘差數據塊時,rurubefore碼字最多可出現14次,因此這一硬件實現方法可以大大提高了硬件解碼器的數據處理能力。具體的解碼過程分為如下四個步驟 (1)碼表分拆和碼字合并。(2)檢測前導1的個數。(3)根據zerosLeft的值從7個碼表的輸出選擇出正確的值。(4)更新zerosLeft變量。每次解碼完run_before碼字后對zerosLeft變量進行更新,在下次解碼時需要使用更新后的值。H. 264視頻規范中指定了一個用于解碼rurubefore碼字的碼表,此碼表如表1所示。本發明將此碼表分解為7個較小的碼表,如表2—表8所示,并對其中的5個碼表(表3、 表4、表5、表6、表7)進行碼字合并,使得其能夠在一個時鐘周期內完成兩個碼字的解碼。CAVLC定義了 6種碼字,其中非零系數幅值的碼字和rurubefore碼字出現的頻率最高,在編碼一個4x4殘差數據塊時rurubefore碼字最多可出現14次,因此這一硬件實現方法可以大大提高硬件解碼器的數據處理能力。本發明的有益效果
現有方法在一個時鐘周期內只能解碼一個rurubefore碼字,而本發明中描述的方法可以將速度加倍,在一個時鐘周期內可以解碼得到多個rurubefore碼字的值,從而提高了 CAVLC整體的解碼速度。適用于各種具有H. 264視頻解碼功能的電子設備。
圖1 :run_before碼字的硬件解碼框圖。
具體實施例方式下面結合附圖對本發明做進一步的描述。本發明所述的快速解碼rurubefore碼字的具體實施方式
如下 (1)碼表分拆和碼字合并。H. 264視頻標準中規定用于解碼rurubefore碼字的碼表如表1所示。查詢一次此碼表只能得到一個rurubefore碼字的值。為了加速此解碼過程,我們將此碼表按照zerosLeft的值分拆成7個碼表。表2是針對zer0SLeft>6時的碼表。表3是針對 zerosLeft=6時的碼表。表4是針對zerosLeft=5時的碼表。表5是針對zerosLeft=4時的碼表。表6是針對zerosLeft=3時的碼表。表7是針對zerosLeft=2時的碼表。表8針對ZerosLeft=I時的碼表。其中表3、表4、表5、表6、表7采用了碼字合并的技巧,每次查詢這5個表可以得到2個rurubefore碼字。而表2和表8,則是從表1中直接分拆得到,每次查詢表2和表8,只能得到1個run_before碼字。(2)檢測前導1的個數。在解碼rurubefore碼字時,首先檢測當前碼流中前導1的個數。本發明中的前導1檢測器最多可以一次檢測14個前導1。如果輸入的視頻碼流第一個比特為0,那么前導1 的個數為零,說明當前rurubefore的值大于零,此過程結束,進入步驟(3)。否則,根據前導1的個數可同時解碼多個run_before碼字,這些run_before碼字的解碼值都是0。我們將前導1的個數記為N,如果zer0SLeft>6且N≥3,那么包括當前碼字在內的連續N/3個 run_before碼字的值都是0 ;如果2<zerosLeft<6且N≤2,那么包括當前碼字在內的連續 N/2個rurubefore碼字的值都是0 ;如果zerosLeft ≤ 2,那么包括當前碼字在內的連續 N個rurubefore碼字的值都是0。上述計算中,如果N不是3或2的整數倍,N/3和N/2取其運算結果的整數部分。本發明中N最大值為14,所以前導1檢測器最多一次可以解碼14 個值為零的run_before碼字。(3)根據zerosLeft的值從7個碼表的輸出選擇出正確的值。zerosLeft的取值范圍可以分為7種大于6,6,5,4,3,2,1。此時對應的碼表分別為表2、表3、表4、表5、表6、表7、表8。根據當前zerosLeft的值,選擇相應的碼表輸出作為最終的解碼結果。每查詢一次表2或表8,可以得到一個rurubefore碼字的值,而每查詢一次表3、表4、表5、表6或表7,可以得到兩個rurubefore碼字的值。(4)更新 zerosLeft 變量。如果當前zerosLeft等于1或者大于6,根據步驟(3)中解碼得到當前run_ before碼字的值,zerosLeft變量減去當前rurubefore碼字在解碼后得到的值,即為新的 zerosLeft變量;如果當前zerosLeft等于2、3、4、5、6中任意一個值,根據步驟(3)中得出的兩個rurubefore碼字解碼后的值,zerosLeft變量減去這兩個碼字值的和,即為新的 zerosLeft 變量。經過上述四個步驟,即可在一個時鐘周期內解碼兩個rurubefore碼字。此發明中提出的硬件架構可以大大加快H. 264 CAVLC的解碼速度。表1 :H. 264標準中規定用于解碼run_before碼字碼表
權利要求
1. 一種快速解碼CAVLC rim_bef0re碼字的硬件實現方法,其特征在于輸入的視頻碼流首先經過前導1檢測器檢測帶解碼的rurubefore碼字是否為零,前導1檢測器最多一次可以檢測14位前導1 ;將當前解碼位置之前所包含的0的總個數記為zerosLeft,根據 zerosLeft的值將run_before碼字分為7種類型,即將原標準中規定的run_before碼表分解為7個子碼表,針對每一種類型分別進行解碼;具體步驟為(1)碼表分拆和碼字合并;(2)檢測前導1的個數;(3)根據zerosLeft的值從7個碼表的輸出選擇出正確的值;(4)更新zerosLeft變量,即每次解碼完run_before碼字后對zerosLeft變量進行更新,在下次解碼時使用更新后的值;其中,所述碼表分拆和碼字合并,是將H. 264視頻標準中規定用于解碼rurubefore碼字的碼表分拆和合并如下表2—表8所示的7個表表2 針對zerosLeft>6時的碼表
2.根據權利要求1所述的快速解碼CAVLC rurubefore碼字的硬件實現方法,其特征在于所述檢測前導1的個數的步驟為在解碼rurubefore碼字時,首先檢測當前碼流中前導 1的個數;前導1檢測器最多可以一次檢測14個前導1 ;如果輸入的視頻碼流第一個比特為0,那么前導1的個數為零,說明當前rurubefore的值大于零,此過程結束,進入步驟(3);否則,根據前導1的個數同時解碼多個rurubefore碼字,這些run_before碼字的解碼值都是0 ;將前導1的個數記為N,如果zer0SLeft>6 且N彡3,那么包括當前碼字在內的連續N/3個rim_bef0re碼字的值都是0 ;如果 2<zerosLeft<6且N > 2,那么包括當前碼字在內的連續N/2個run_before碼字的值都是 0 ;如果zerosLeft ^ 2,那么包括當前碼字在內的連續N個run_bef0re碼字的值都是0 ; 上述計算中,如果N不是3或2的整數倍,N/3和N/2取其運算結果的整數部分。
3.根據權利要求2所述的快速解碼CAVLCrurubefore碼字的硬件實現方法,其特征在于所述根據zerosLeft的值從7個碼表的輸出選擇出正確的值的具體步驟為zerosLeft的取值范圍分為7種大于6,6,5,4,3,2,1 ;對應的碼表分別為表2、 表3、表4、表5、表6、表7、表8 ;根據當前zerosLeft的值,選擇相應的碼表輸出作為最終的解碼結果,每查詢一次表2或表8,得到一個rurubefore碼字的值,每查詢一次表3、表4、表 5、表6或表7,得到兩個rurubefore碼字的值。
4.根據權利要求3所述的快速解碼CAVLCrurubefore碼字的硬件實現方法,其特征在于所述更新zerosLeft變量的具體步驟為如果當前zerosLeft等于1或者大于6,根據步驟(3)中解碼得到當前rurubefore碼字的值,zerosLeft變量減去當前rurubefore碼字在解碼后得到的值,即為新的zerosLeft 變量;如果當前zerosLeft等于2、3、4、5、6中任意一個值,根據步驟(3)中得出的兩個run_ before碼字解碼后的值,zerosLeft變量減去這兩個碼字值的和,即為新的zerosLeft變量。
全文摘要
本發明屬于數字視頻信號編解碼技術領域,具體為一種快速解碼CAVLC run_before碼字的硬件實現方法。本方法采用碼表分拆和碼字合并這兩種方法,在一個時鐘周期內最多可以解碼14個值為0的run_before碼字,或兩個值不等于0的run_before碼字。輸入的視頻碼流首先經過前導1檢測器來檢測帶解碼的run_before碼字是否為零,前導1檢測器最多一次可以檢測14位前導1。當前run_before碼字的值不為零,如果我們將當前解碼位置之前所包含的0的總個數記為zerosLeft,根據zerosLeft的值可以將run_before碼字分為7種類型,將原標準中規定的run_before碼表分解為7個子碼表,針對每一種類型分別進行解碼。本發明可以大大提高硬件解碼器的數據處理能力。
文檔編號H04N7/26GK102572437SQ20121003497
公開日2012年7月11日 申請日期2012年2月16日 優先權日2012年2月16日
發明者曾曉洋, 沈沙, 沈蔚煒, 范益波 申請人:復旦大學