1 首先h264爲什麼選用哥倫布編碼?
因爲h264協議爲了節省bits,沒有規定字段表示數據字段長度/數據字段可以根據自身的實際值,
可長可短,這樣可以大程度上的節省bit。
2 無符號指數哥倫布編碼如何編碼的?
在實際數據前面有幾個0就表示,有效數據位數是多少,理解爲長度字段,
然後數據數值 = 數值 + 1,因爲如果不+ 1 ,0 無法表示。
因此得到下面這個對應關係。
codeNum bitStream
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
3 有符號指數哥倫布編碼
codeNum value
0 0
1 1
2 -1
3 2
4 -2
5 3
6 -3
k (-1)^(k+1) Ceil(k + 2)
Ue解碼實現
static int ue(char *buf,int len,int& startbit)
{
int zero_num = 0;
while(startbit < len * 8)
{
if(buf[startbit/8]&(0x80>>(startbit%8)))
{
break;
}
zero_num ++;
startbit ++;
}
startbit ++;
int ret = 0;
for(int i = 0;i<zero_num;i++)
{
ret *= 2;
if(buf[startbit/8]&(0x80 >> (startbit%8)))
{
ret +=1;
}
startbit ++;
}
return (1<<zero_num) -1 + ret;
}
static inline int get_se(GetBitContext *s, const char *file, const char *func,
int line)
{
int show = show_bits(s, 24);
int pos = get_bits_count(s);
int i = get_se_golomb(s);
int len = get_bits_count(s) - pos;
int bits = show >> (24 - len);
return i;
}
以上解碼代碼,ffmpeg裏面有全套的。