計算前面有多少個bit位為0,記為n,後面的有效資料就是n+1位(如果n等於0後面的有效資料就是1位),這樣2n+1位就是乙個編碼,其中前面n位是0字首,後面的n+1位是有效資料。再看定義的是有符號還是無符號型的,無符號型的就是直接後面n+1位有效資料的排列的二進位制資料大小,有符號型的要將無符號型的資料稍微轉換一下,變成正數或負數(前n位表示資料,最後一位表示符號)。具體詳細介紹看h264標準文件說明。
指數哥倫布碼(exponential-golomb code, 即exp-golomb code)壓縮編碼方法過程:
用來表示非負整數的k階指數哥倫布碼可用如下步驟生成:
1. 將數字以二進位制形式寫出,去掉最低的k個位元位,之後加1
2. 計算留下的位元數,將此數減一,即是需要增加的前導零個數
3.將第一步中去掉的最低k個位元位補回位元串尾部
位元串格式為「字首1字尾」。1)1字尾=codenum+1,如codenum = 3,則1字尾=4,即為100,字尾為00;2)字首與字尾的位元數相同,且字首的各位位元為0,
下例為對不同codenum進行的編碼結果:
0 => 1 => 1
1 => 10 => 010
2 => 11 => 011
3 => 100 => 00100
4 => 101 => 00101
5 => 110 => 00110
6 => 111 => 00111
7 => 1000 => 0001000
8 => 1001 => 0001001
與此相反,這些語法元素的解析過程是由位元流當前位置位元開始讀取,包括非0 位元,直至leading_bits 的數量為0。具體過程如下所示:
leadingzerobits = ?1;
for( b = 0; !b; leadingzerobits++ )
b = read_bits( 1 )
變數codenum 按照如下方式賦值:
codenum = 2leadingzerobits ? 1 + read_bits( leadingzerobits )
這裡read_bits( leadingzerobits )的返回值使用高位在先的二進位制無符號整數表示。
如下示例:
二進位制位元數 長度 解析值
1001 1 0
001 1001 5 5
01 1010 3 2
010 3 1
000 1011 7 10
0001 001 7 8
指數哥倫布編碼
哥倫布編碼前言 在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下 十進位制二進位制 有效位元組 如數字1,原本只需要1個bit就能表示的資料,如今需要8個bit來表示,那麼其餘7個bit就可以看做是冗餘資料,在網路傳輸時,如果以原本等長的編碼方...
指數哥倫布編碼
哥倫布編碼前言 在計算機中,一般數字的編碼都為二進位制,但是由於以相等長度來記錄不同數字,因此會出現很多的冗餘資訊,如下 十進位制5 425521 二進位制00000101 00000100 11111111 00000010 00000001 有效位元組33 821 如數字1,原本只需要1個bit...
h264編碼分析 哥倫布編碼
1 首先h264為什麼選用哥倫布編碼?因為h264協議為了節省bits,沒有規定字段表示資料字段長度 資料字段可以根據自身的實際值,可長可短,這樣可以大程度上的節省bit。2 無符號指數哥倫布編碼如何編碼的?在實際資料前面有幾個0就表示,有效資料位數是多少,理解為長度字段,然後資料數值 數值 1,因...