在H.264文档中,用到了很多类似C语言的描述,但是里面的数据类型并不是C语言中的类型,u(n)表示n位的无符号整型,i(n)表示n位有符号整型,ue(v)指的是指数哥伦布编码,te(v)、se(v)、me(v)则是指数哥伦布编码的变种(见ISO/IEC-14496-10 9.1)。所以要读懂H264的语法先要掌握这些数据类型。
指数哥伦布编码(exponential-Golomb code)是指数形式的哥伦布编码,目的在于将数据的占用的位数根据数值的大小来编码,大的数值编码后的位数多,小的数值编码后的位数少。
例子:
数值=>后缀=>编码后的数据
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阶的指数哥伦布编码,在H.264和H.265中用的就是0阶的指数哥伦布编码。虽然指数哥伦布编码只能表示正整数,但是在应用上经常使用一些变种的指数哥伦布编码来表示有符号的整数(见ISO/IEC-14496-10 9.1.1)。指数哥伦布编码的数据形式如下:
{前缀}{1}{后缀}
前缀使用0个或多个0来表示后缀的比特数,在0阶指数哥伦布编码中,010的第一个0表示后缀的比特数为1个,中间的1表示前缀与后缀的分隔符,第二个0是后缀,可以计算出数值大小,具体的计算公式如下:
数值大小 = 2^(前缀比特数) + (后缀数值 - 1)
除了0阶的还有1、2、3阶的指数格伦布编码,如下表:
x | k=0 | k=1 | k=2 | k=3 |
---|---|---|---|---|
0 | 1 | 10 | 100 | 1000 |
1 | 010 | 11 | 101 | 1001 |
2 | 011 | 0100 | 110 | 1010 |
3 | 00100 | 0101 | 111 | 1011 |
4 | 00101 | 0110 | 01000 | 1100 |
5 | 00110 | 0111 | 01001 | 1101 |
… | … | … | … | … |