H.264无符号整数指数哥伦布码编码
2015-08-11 17:36
561 查看
我在阅读x264/common/bs.h,读到如下面的一个函数时,搜到了这篇文章,因为我要在代码里把文章作为注解,所以转过来放在我博客上,如果放别人的链接,可能原文日后会不存在了。
转载:用于参考学习,望原文作者海涵!
H.264无符号整数指数哥伦布码编码
指数哥伦布码(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 (10为2个比特,所以1前面要补的0的个数为:2-1=1,所以为:0 10)
2 => 11 => 011
3 => 100 => 00100
4 => 101 => 00101
5 => 110 => 00110
6 => 111 => 00111
7 => 1000 => 0001000
8 => 1001 => 0001001 (1001为4个比特,所以前面补4-1=3个0)
与此相反,这些语法元素的解析过程是由比特流当前位置比特开始读取,包括非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
static inline int bs_read_ue( bs_t *s ) { int i = 0; while( bs_read1( s ) == 0 && s->p < s->p_end && i < 32 ) { i++; } return( ( 1 << i) - 1 + bs_read( s, i ) ); } |
H.264无符号整数指数哥伦布码编码
指数哥伦布码(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 (10为2个比特,所以1前面要补的0的个数为:2-1=1,所以为:0 10)
2 => 11 => 011
3 => 100 => 00100
4 => 101 => 00101
5 => 110 => 00110
6 => 111 => 00111
7 => 1000 => 0001000
8 => 1001 => 0001001 (1001为4个比特,所以前面补4-1=3个0)
待编码数字 | 加1 | 加1后二进制表示 | 需补的前缀0 | 其它 |
0 | 1 | 00000001 | ||
1 | 2 | 10 | ||
2 | 3 | 11 | ||
3 | 4 | 100 | ||
4 | 5 | 101 | ||
5 | 6 | 110 | ||
6 | 7 | 111 | ||
7 | 8 | 1000 | ||
8 | 9 | 1001 | ||
9 | 10 | 1010 | ||
10 | 11 | 1011 | ||
11 | 12 | 1100 |
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
相关文章推荐
- js模块化编程(二):AMD规范
- IOS第八天(7:UITableViewController新浪微博,cell 复用的简单写法优化和cell高度从模型中获取)
- NOIP2014 提高组 生活大爆炸版石头剪刀布
- adb shell pm详解
- 初学canvas,canvas.save()与canvas.restore()的作用
- HDU1301 Jungle Roads
- 秒懂命令模式
- 27-网络编程-23-网络编程(URL&URLConnection)
- 27-网络编程-24-网络编程(常见网络结构)
- JPA字段映射(uuid,日期,枚举,@Lob)
- 【连载】实用小demo连载 4 —— css3+js 大转盘 demo
- js模块化编程(一):模块的写法
- 【连载】实用小demo连载 4 —— css3+js 大转盘 demo 2015-08-11 17:35 2人阅读 评论(0) 收藏
- bash shell + python简单教程,让你的mac/linux终端灰起来~
- 数据结构_堆排序介绍
- SQL 收缩日志文件
- Sublime Text 3使用心得
- hdu1575畅通工程再续【最小生成树】cruskal&prim
- 27-网络编程-22-网络编程(模拟一个浏览器获取信息)
- http协议 telnet linux c http client 通讯