cavlc編碼level的原理和過程

cavlc編解碼 非trailingone 非零 變換系數幅值的原理與過程:

基本原理:
1. 首先將係數幅值(level)除以某一個值(1<<suffixLenth),然後分別對商值(level_prefix)和餘數(level_suffix)進行編碼;
2. 對商值level_prefix編碼的碼流就是前綴level_prefix個0+1: 0...01
3. 對餘數level_suffix編碼的碼流就是levelSuffixSize個bit的level_suffix的二進制值。

具體解碼過程:
1. 初始化suffixLength:
   (以下條件暗示了非零幅值係數有可能比較稠密也比較大時,直接除以2,而非1)
   如果總非零係數(TotalCoeff)>10 且 TrailingOnes<3
       suffixLength = 1;
   否則(TotalCoeff<=10 or TrailingOnes==3)
       suffixLength = 0;
2. 循環解碼係數幅值:for(i=TrailingOnes; i<TotalCoeff; i++)
(1) 首先從碼流中查詢連0數,即爲level_prefix值;   
(2) 推導餘數level_suffix的bit數levelSuffixSize:
如果level_prefix==14 且 suffixLength==0  
    levelSuffixSize = 4; (注:對第一個幅值的levelCode>=14 且小於等於29(14+4bit所能表示的最大值15) 的值進行編碼的方法)
如果level_prefix>=15
    levelSuffixSize = level_prefix - 3;
以上兩個條件都不成立時
    levelSuffixSize = suffixLength;
(3) 解碼餘數level_suffix值:
如果levelSuffixSize>0, 從碼流中讀取levelSuffixSize個bit就是level_suffix的值;
否則(levelSuffixSize==0), 推導出level_suffix=0;
(4) 計算幅值碼levelCode
    levelCode = ( min(15, level_prefix) << suffixLength ) + level_suffix;
    即:商值(level_prefix與15的最小值) 乘以 除數(1<<suffixLength) 加上 餘數(level_suffix)。
(5) 如果level_prefix>=15 且 suffixLength==0
    levelCode += 15;
(6) 如果level_prefix>=16
    levelCode += ( 1<<(level_prefix-3) ) - 4096;
(7) 如果TrualingOnes<3,則解碼的第一個幅值碼還要加上2,因爲第一個幅值碼肯定大於1,爲節約bit,在編碼時就將它減去了2,故解碼時還要恢復出來。
(8) 由幅值碼計算幅值:
如果幅值碼levelCode爲偶數
    level = (levelCode+2)>>1;
否則
    level = (-levelCode-1)>>1;
(9) 更新suffixLength:
如果suffixLength==0
    suffixLength = 1;
如果abs(level) > ( 3<<(suffixLength-1) ) 且 suffixLength < 6
    suffixLength++;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章