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里面有全套的。