第三章 熵編碼模式切換演算法的設計
3.3 熵編碼的碼率預估演算法
3.3.2 CABAC碼率預估演算法
3.3.2.3 位元平行化碼率預估演算法
在前面的兩個小節中,我們利用了簡化過的適應性二元算術編碼步驟,實現了 CABAC 碼率預估演算法。但是這個方法的缺點為編碼符號的符號位元必須依序的進行 預估,如圖 3.11 的順序,因為前一個符號位元更新後的 Range 要傳遞給下一個符號位 元當作參考值。
如果要進行平行化地進行預估,即對同一個符號序列中所包含的符號位元都可以一 起預估,必須打破位元間 Range 的傳遞方式。我們想到的方式是:每個符號位元收到的 Range 值不是從前一個符號位元計算而得,而是用一個預先定義好的值,這樣就可以同 是對複數個符號位元進行碼率預估。這樣做的結果會讓預測的速度變快,但是會犧牲預 估編碼率的準確度。
Range 值在符號位元間傳遞的合理範圍為 256 到 511,而在 H.264 [8]中,查詢 表格使用的 Range 間隔為 64,所以我們以下面 5 個數值當做預先 Range 值的候選,分別為 256、320、384、448、510,彼此間的間隔為 64。因為最大值無法到 512,所以最大值設定為 510。接下來我們用這 5 個值,當作 Range 的預設值進行模擬。
模擬的目的是為了去觀察使用固定的 Range 會對預估的編碼量造成什麼影響。同樣以內 視鏡影像進行測試,影像大小為 512×480。平均單張圖片的壓縮量結果記錄在表 3.8 中。
第一列顯示使用的 Range 值,CABAC 代表實際以 CABAC 壓縮,而後面的五個值即代 表使用的 Range 預設值。第二列的數值是代表各種預設值下預估的平均單張畫面壓縮 量,第一個值是實際壓縮編碼量,而後面的五個值為預估編碼量。而第三列的誤差率則 是分別和第一行的數值計算。公式為: ((固定 Range 值預估編碼量-實際壓縮編碼量)/ 實 際壓縮編碼量)×100%。
PS codIRangeL
CABAC 256 320 384 448 510 R
(bits/frame)
258934 431507 300079 235168 189864 160919
誤差率(%) 0 66.65 15.89 -9.18 -26.67 -37.85 表 3.8 各種預設 Range 值的壓縮量模擬結果
從數據結果可以看到以 384 當作預設 Range 值時,和使用 CABAC 壓縮的編碼量最 接近,所以使用 384 當作我們設計上的 Range 預設值。而 384 剛好也是 Range 傳遞範
圍最大值和最小值的平均值。採用預設的 Range 值會改變每個符號位元碼率預估的流 程。新流程以圖 3.16 表示。原本圖 3.15 中的 ori_range 將變成 384,而 temp_range 和 new_range 即不需要計算,因為不需要傳給下一級。並且不論猜對或猜錯,都可以直接 從表 3.9 利用 pstate 查出等效的 bit_length 值。這個方法我們稱為位元平行化碼率預估演
算法。
圖 3.16 單符號位元(bin) 的平行化碼率估測
表 3.9 猜錯部份的值是直接從表 3.7 中第三行複製過來的,因為 Range 值 384 對應 的查表係數 qCodIRangeIdx 為 2,兩者換算的公式參考圖 2.9 中的第一個步驟。
猜錯的情況:
pStateIdx 0 1 2 3 4 5 6 7 8 9 10 11 12
bit_length 1 1 1 1 1 1 1 1 1 1 2 2 2
pStateIdx 13 14 15 16 17 18 19 20 21 22 23 24 25
bit_length 2 2 2 2 2 2 2 2 2 2 3 3 3
pStateIdx 26 27 28 29 30 31 32 33 34 35 36 37 38
bit_length 3 3 3 3 3 3 3 3 3 3 3 4 4
pStateIdx 39 40 41 42 43 44 45 46 47 48 49 50 51
bit_length 4 4 4 4 4 4 4 4 4 4 4 5 5
pStateIdx 52 53 54 55 56 57 58 59 60 61 62 63
bit_length 5 5 5 5 5 5 5 5 5 5 5 7
猜對的情況:
pStateIdx 0 1 2 3 4 5 6 7 8 9 10 … 63
bit_length 1 1 1 1 1 1 1 1 1 1 1 0 0
表 3.9 採用預設的 Range 值下的 bit_length 表
而表 3.9 中猜對部份的 bit_length 值計算如下。當符號位元的值和 MPS 不同,代表 猜錯。根據(3.24 式),此時的 temp_range = 384 – codIRangeLPS。 而 codIRangeLPS 的 值是由 pstate 和 qCodIRangeIdx 查表可得,而 qCodIRangeIdx 的值此時為 2,所以將導 致 temp_range 變成 pstate 的單變數函數(temp_range = f(pStateIdx))。舉例,當 pstate 等於 0 時,計算出的 temp_range 值為 176,再套用(3.24 式)可得 bit_length 值為 1。而只有在 pstate 小於 10 的值,temp_range 才會小於 256,其它的值,算出來的 temp_range 都大於 256,換算的 bit_length 即為零。
位元平行化碼率預估演算法的好處是同一個編碼符號下的所有的符號位元可以一 起編碼,但是在更新機率模型時仍必須每個符號位元分開執行。
3.3.2.4 level 查表碼率預估演算法
在[23]中,對預估 CABAC 在 level 部分的編碼量,使用了更為簡單的方法。而這也 給我們新的靈感。他們猜測 level 編碼量的方法如(2.13 式)、(2.14 式)、(2.15 式)所示。
主要的原理是針對使用不同 QP 值壓縮的畫面給定 level 門檻值 T,當 level 值小於門檻 值 T 時,則以 level 絕對值當作預估的編碼長度,當超過門檻值時,則使用前一張畫面 該 level 值的平均編碼長度。要使用這個方法必須在前一張畫面在實際壓縮時,要去計 算每個 level 值的編碼總和,以算出平均的編碼量。如果兩張畫面間的殘餘係數區塊中