九、上下文自適應的變長編碼CAVLC

H264H265視頻編解碼算法文章匯總

  1. 熵編碼回顧:利用信息的統(tǒng)一冗余來進行數據壓縮的無損編碼方法
  • 熵編碼:

    • 無損編碼:解碼后可無失真還原信源信息;

    • 利用信源符號的概率特性(不同的信源符號概率不等),使編碼后的信息盡可能接近信源的熵;

  • 常見熵編碼方法:

    • 變長編碼:哈夫曼編碼、香農-費諾編碼泽西、指數哥倫布編碼;(已經實現的解析H264碼流結構中使用的大多數是定長編碼和指數哥倫布編碼)

    • 算數編碼缰趋;

預測殘差數據必須要使用比指數哥倫布編碼壓縮效率更高的編碼方法CABAC( Context-based Adaptive Arithmatic Binary coding),CAVLC( Context-based Adaptive Variable Length Coding)

熵編碼的輸入為幀內幀間預測的殘差經過變換量化后的系數矩陣

對于一個4x4的矩陣捧杉,變換量化后通常呈現以下特性

大部分為0 ,不為0的只是少數部分

2.CAVLC

  • 上下文自適應的變長編碼:

    • 用于亮度和色度預測殘差的編碼秘血,以量化后的變換系數的形式味抖;

    • 變換系數矩陣的特征:

      • 稀疏:矩陣元素以0為主;

      • 非零系數集中于低頻灰粮;

      • 高頻部分的非零系數大部分為±1仔涩;

      • 非零系數個數同相鄰塊有關;

  • CAVLC的上下文模型:

    • 編碼非零系數的表格索引粘舟;

    • 更新編碼非零系數時的后綴長度

CAVLC的輸入通常是4x4的系數矩陣熔脂,8x8用的較少,針對一整個像素塊的編碼

  1. CALVC的編碼過程
  • 編碼需要的重要元素:

    • 非零系數的個數(TotalCoeffs):取值范圍為[0, 16]柑肴,即當前系數矩陣中包括多少個非0值的元素霞揉;

    • 拖尾系數的個數(TrailingOnes):取值范圍為[0, 3],表示最高頻的幾個值為±1的系數的個數晰骑。

    • 拖尾系數的符號:以1 bit表示适秩,0表示+,1表示-硕舆;

    • 當前塊值(numberCurrent):用于選擇編碼碼表秽荞,由上方和左側的相鄰塊的非零系數個數計算得到。普通非0系數的幅值(level):幅值的編碼分為prefix和suffix兩個部分進行編碼抚官。編碼過程按照反序編碼扬跋,即從最高頻率非零系數開始。(高頻到低頻反序來編碼)

    • 最后一個非0系數之前的0的個數(TotalZeros);

    • 每個非0系數之前0的個數(RunBefore):按照反序編碼耗式,即從最高頻非零系數開始胁住;對于最后一個非零系數(即最低頻的非零系數)前的0的個數趁猴,以及沒有剩余的0系數需要編碼時刊咳,不需要再繼續(xù)進行編碼彪见。

系數矩陣Z形掃描

  • CAVLC對一個固定大小的系數矩陣進行編碼,例如:

  • {

        3,    2, -1,    0,
    
        1,    0,    1,    0,
    
        -1,    0,    0,    0,
    
        0,    0,    0,    0,
    
    }
    
image.png

掃描重排之后得到一維數組:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

4.編碼過程

  1. 確定當前塊值nC娱挨,選擇coeff_token的碼表余指;

  2. 根據非零系數個數TotalCoeffs和拖尾系數個數TrailingOnes,編碼coeff_token跷坝;

  3. 編碼拖尾系數的符號酵镜;(拖尾系數總共可能有0,1柴钻,2淮韭,3)個

  4. 編碼拖尾系數之外的普通非零系數;(從最高頻到最低頻反向編碼除了拖尾系數之外的普通的每一個非0系數,每一個普通非零系數都需要按照前綴和后綴兩部分來進行編碼)這一部分是整個編碼過程中相對麻煩的

  5. 編碼最末非零系數之前0的總個數贴届;

  6. 編碼每個非零系數之前的0的個數靠粪;(兩個特殊情況:a,所有的0都被編碼完成毫蚓,b,最低頻的非零系數前面所有的0都是不需要進行編碼的)

還是不清楚普通的非零系數是如何進行編碼實現的占键,level,前綴和后綴如何進行編碼元潘,以下通過實例寫代碼看看編碼后產生什么結果

image.png
image.png

如何求最后一個非零系數前面的零系數的個數畔乙?

掃描重排之后得到一維數組:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

從后往前遍歷,得到最后一個不為零的非零系數的下標idx翩概,此處要求的是最后一個非零系數前面的零系數的個數:可以列出1個方程式

//coeff[idx]左邊的零系數的個數為totalZeros,coeff[idx]右邊的零系數的個數為16-idx-1,全部的零系數的個數=16-全部的非零系數的個數totalCoeffs

//16 - totalcoeffs = 16 - idx - 1 + totalZeros

=====> totalZeros = idx - totalCoeffs + 1;

編碼過程:

  1. 確定當前塊值nC牲距,選擇coeff_token的碼表;(在H264官方文檔的236頁,先編碼非零系數)

  2. 根據非零系數個數TotalCoeffs和拖尾系數個數TrailingOnes钥庇,編碼coeff_token牍鞠;

  3. 編碼拖尾系數的符號;

  4. 編碼拖尾系數之外的普通非零系數上沐;

  5. 編碼最末非零系數之前0的總個數皮服;

  6. 編碼每個非零系數之前的0的個數;

image.png

分為兩種情況参咙,totalCoeffs的值大于等于3或小于3龄广,值的大小為0-16

image.png
image.png

編碼前綴和后綴

前綴和codeword的關系在標準文檔Table 9-6 239頁

前綴:是幾后面就補多少個0

image.png

體現上下文自適應的閾值公式在標準文檔239頁

//為什么叫做上下文自適應的二進制編碼,除了coeffTokenMap蕴侧,此處會對后綴長度進行更新择同,體現了上下文的思想

//更新的原則是剛剛編碼的levels[idx]大于某一個閾值公式在標準文檔239頁,就suffixLength ++ 自增1

image.png

編碼TotalZeros

VlcIndex的值是TotalCoeff(非零系數的個數)

Let the variable tzVlcIndex be equal to TotalCoeff( coeff_token ).

image.png
image.png

編碼runBefore净宵,也是由協議中定義的表格Table9-10來實現的

image.png

矩陣編碼后的碼流輸出結果為

image.png

以上是CAVLC的編碼過程敲才,但是還未解決如何在H264碼流中使用CAVLC對系數矩陣進行解析裹纳,以及如何完整的解析一個宏塊

添加類Residual使CMacroblock類可以對殘差數據進行解析和保存

在碼流解析器中繼續(xù)依賴解析residual,官方文檔的76頁

image.png

使用CAVLC將一個4x4亮度塊變換矩陣從碼流中解析成原始yuv

色度塊、Intra16x16模式的解析

  • 色度塊紧武、Intra16x16模式塊的解析思想類似4x4亮度塊:

    • 依次解析numCoeff剃氧、trailingOnes、trailingSigns阻星、levels朋鞍、totalZeros、runBefore妥箕;
  • 不同之處:

    • 每個單元內系數數量最大值滥酥;

    • AC/DC是否分別解析;

nC值的計算方法畦幢;

不同分割模式的比較

image.png

不同顏色分量的比較

image.png

解析色度部分16x16,依據標準文檔236頁坎吻,nC=-1,nC=-1針對的不是4:2:0格式

DC模式

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末宇葱,一起剝皮案震驚了整個濱河市瘦真,隨后出現的幾起案子,更是在濱河造成了極大的恐慌贝搁,老刑警劉巖吗氏,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異雷逆,居然都是意外死亡弦讽,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門膀哲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來往产,“玉大人,你說我怎么就攤上這事某宪》麓澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵兴喂,是天一觀的道長蔼囊。 經常有香客問我,道長衣迷,這世上最難降的妖魔是什么畏鼓? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮壶谒,結果婚禮上云矫,老公的妹妹穿的比我還像新娘。我一直安慰自己汗菜,他們只是感情好让禀,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布挑社。 她就那樣靜靜地躺著,像睡著了一般巡揍。 火紅的嫁衣襯著肌膚如雪痛阻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天吼肥,我揣著相機與錄音录平,去河邊找鬼麻车。 笑死缀皱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的动猬。 我是一名探鬼主播啤斗,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赁咙!你這毒婦竟也來了钮莲?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彼水,失蹤者是張志新(化名)和其女友劉穎崔拥,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體凤覆,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡链瓦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了盯桦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈俯。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拥峦,靈堂內的尸體忽然破棺而出贴膘,到底是詐尸還是另有隱情,我是刑警寧澤略号,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布刑峡,位于F島的核電站,受9級特大地震影響玄柠,放射性物質發(fā)生泄漏突梦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一随闪、第九天 我趴在偏房一處隱蔽的房頂上張望阳似。 院中可真熱鬧,春花似錦铐伴、人聲如沸撮奏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜吊。三九已至泽疆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玲献,已是汗流浹背殉疼。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捌年,地道東北人瓢娜。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像礼预,于是被迫代替她去往敵國和親眠砾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容