http://vod.cs.nthu.edu.tw/~yyma/NTHU_VC_H264/H_264_Technique_Introduction.php
流程 離散餘弦轉換 量化 運動向量補償 in-loop濾波器 位元率-誤差模組
熵編碼 畫面內預測 畫面間預測
流程 |
離散餘弦轉換 |
整數轉換避免數值誤差
量化 |
利用所謂 quantization parameter (QP)值來達到純量量化的效果
共有52種QP值
QP值每增加1會增加約12%的位元率
故約增加6個QP會達到兩倍
QSTEP = 2(QP-4)/6
QSTEP就代表位元率的增長
運動向量補償 |
multiple reference
採用七種不同的macro block大小來做運動向量的估計
variable block size
可參考前後5張FRAME
fractional pixel
利用內插法達到1/2,1/4的精準度動作向量估計
in-loop濾波器 |
避免編碼時區塊化的效應
在編碼流程中加入去區塊化濾波器
有別於編碼後再加入的濾波動作
可以達到更有效率的編碼
位元率-誤差模組 |
針對之編碼模式:
INTRA 4X4, INTRA 16X16, INTER 16X16, INTER 16X8, INTER 8X16,
INTER 8X8, INTER 8X4, INTER 4X8, INTER 4X4, SKIP and DIRECT.
利用拉格蘭日乘數法達到最佳位元分配
熵編碼 |
利用exp-Golomb code編碼所有的 syntax elements
利用Context-Adaptive Variable Length Coding (CAVLC) 或
Context-Adaptive Binary Arithmetic Coding (CABAC) 編碼
quantized transform coefficients
exp-Golomb code
CAVLC
針對非零個數,以及其值和位置獨立作編碼
以例子來作說明
7, 6, -2, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ,0 ,0.
第一步 # of nonzero coefficients (N) and “Trailing T1s“
計算非零值和所謂的 “Trailing T1s
T1s = 2, N = 5,
這兩個數字以組合的事件壓縮,從四個VLC表中,根據相鄰區塊的係數找一個使用
第二步 Encoding the value of Coefficients
對非零係數作編碼, T1s只需記錄正負號
非零係數以反序記錄 -2, 6, …
並利用不同的VLC表達到適應式編碼
六個 exp-Golomb code 表可供使用
第三步 Sign Information
傳送正負號
T1s使用一個位元表示
其餘係數之正負號則包含在 exp-Golomb codes 之中
第四步 TotalZeroes
傳送從最後一個非零數值到開始之間的的零值個數
TotalZeroes = 3
N=5意味著所有非零值介於 0-11,
有15個表可供選擇來編碼
N=16 表示沒有非零值
第五步 RunBefore
記錄上一步的零值的位置
CABAC
第一步 Binarization
Huffman tree
unary, truncated unary, kth order exp-Golomb, and fixed-length codes
第二步 Context modeling
Adaptive probability models
第三步 Binary arithmetic coding: M coder
Table-based BAC
畫面內預測 |
在Spatial domain實作
分成以下幾種方式
Intra_4×4
有9種預測模式可以選擇
Intra_16×16
適合用於平緩變化的區域
有四種模式
4 prediction modes
Vertical prediction, Horizontal prediction , DC-prediction , and Plane-prediction
對於Chrominance signals部分
因為 大多相當平滑 直接對8X 8採用 Intra_16X16
I_PCM
Bypass prediction and transform coding and, send the values of the encoded samples directly
畫面間預測 |
每張frame都可以參考(包含B slices
兩個往前以及往後的動態向量(list0, list1)
可用權重分配產生最後的動態向量
四種權重模式 [llist0], [list1], [bi-predictive], [direct prediction]或 B_Skip
每一個partition可用不同的模式.