目录
. 指数哥伦布编码原理 2
. 零阶指数哥伦布解码标准实现 2
. FFmpeg实现 3
零阶指数哥伦布码解码原理和实现
指数哥伦布编码属于变长编码,其基本原理是用短码字表示出现频率较高的信息,用长码字表示出现频率较低的信息。
指数哥伦布编解码原理
指数哥伦布编码也是变长编码的一种,指数哥伦布编码也是由前缀和后缀组成。K阶指数哥伦布码的组成如图1(a)所示:分为m个前缀0,一个比特1和m+k个后缀。解析时首先从比特流当前位置开始寻找第一个非零比特,并将找到的0比特个数记为m,第一个非零比特之后的m+k个二进制串的十进制值记为Value,如图1(b)所示。由于k阶指数哥伦布码中有一步是:去掉最低的k个比特,之后加1,然后将最低k比特恢复,相当于Value的值中包含了一个额外添加的2^k;同时,在进行码流解析时,m个前导0之后的第一个非零比特没有被计算在Value值内。
(a) 指数哥伦布解析形式(b) 指数哥伦布值的计算
图1. 指数哥伦布编码
因此解码值CodeNum的计算方式如下:
CodeNum = 2^(m+k) – 2^(k) + Value
在H264/AVC和HEVC在参数集的变长编码中常用的是0阶指数哥伦布编码,分为无符号0阶哥伦布指数编码和有符号数0级哥伦布指数编码,如表1-1所示,其中CodeNum表示解码值,有符号所对应的列表示无符号编码是所对应的值,有符号表示采用有符号0阶指数哥伦布编码时所对应的十进制数。
表1-1 0阶有符号和无符号指数哥伦布编码
码字
CodeNum
无符号
有符号
1
0
0
0
010
1
1
1
011
2
2
-1
00100
3
3
2
00101
4
4
-2
00110
5
5
3
00111
6
6
-3
…
…
…
…
零阶指数哥伦布解码标准实现
零阶指数哥伦布解码时,k=0,所以标准中的实现如下图2所示。从中可以看出,标准中的实现方法是采用一个比特一个比特地进行操作。
leadingZeroBits = .1
for( b = 0; !b; leadingZeroBits++ )
b = read_bits( 1 )
codeNum = 2leadingZeroBits -1 + read_bits( leadingZeroBits )
图2. 标准零阶指数哥伦布解码实现
零阶指数哥伦布解码FFmpeg实现
在FFmpeg中采用了查表和计算相结合的方法,对码长不超过9比特的码字制作了ff_golomb_vlc_len和ff_ue_golomb_vlc_code查找表计算码长和码字,如图3和4所示,否则通过计算的方式得出码长和码字。
const uint8_t ff_golomb_vlc_len[512]={
19,17,15,15,13,13,13,13,11,11,11,11,11,11,11,11,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
5,5,5,5,5,5,5,5,5,5
指数哥伦布 来自淘豆网m.daumloan.com转载请标明出处.