H.264无符号整数指数哥伦布码编码

来源:互联网 发布:太原市知达常青藤学校 编辑:程序博客网 时间:2024/05/16 23:45
我在阅读x264/common/bs.h,读到如下面的一个函数时,搜到了这篇文章,因为我要在代码里把文章作为注解,所以转过来放在我博客上,如果放别人的链接,可能原文日后会不存在了。

 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     

与此相反,这些语法元素的解析过程是由比特流当前位置比特开始读取,包括非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

01 1010                       3                                  2

010                                                                1

  000 1011                                                      10

 0001 001                                                       8

0 0
原创粉丝点击