H.264---指数哥伦布编码

转自:http://www.cnblogs.com/DwyaneTalk/p/4035206.html

 

一、哥伦布码

  哥伦布码就是将编码对象分能成等间隔的若干区间(Group),每个Group有一个索引值:Group Id。

  》对于Group Id采用二元码编码;

  》对于Group内的编码对象采用定长码。

  如下图:

  

  对于编码对象n:  n = q * m + r = low(n/m) * m + r。其中q = low(n/m),表示取下整,对应是Group Id; 余数r对应是Group内编码对象。

  例如:对于m=5的哥伦布编码如下表

  

二、指数哥伦布码

  对于哥伦布码,编码对象分成等间隔区间。而对于指数,编码区间长度是按照指数增长的,如下图:同样

  》组号采用二元码编码

  》组内编码对象采用定长码编码

  

  编码结果如下:

三、K阶指数哥伦布码

  在H.264中,使用CABAC需要进行二值化处理,而指数哥伦布编码就是CABAC的一种二值化处理的方法。k阶指数哥伦布编解码具体过程如下:

A、编码过程:假设待编码数字为CodeNum(必须非负整数)

  指数哥伦布编码后的形式为[MZeors][1][Info],MZero表示M个0。

    1、将CodeNum以二进制形式表示(若不足k位,前面补0),去掉后面k位(若刚好是k位,去掉k位后得0),将结果(数值)加1,得到二进制数T1;

    2、M为二进制数T1的二进制位数减一;

    3、然后将第一步中舍去的k位接到T1结尾,就得到[1][Info]。

  设[Info]的二进制位数为I,编码过程也可以如下描述:

    [1 Info] 是CodeNum+2^k的二进制表示,MZeros中0的个数M = I - k。

    于是就有总的编码长度CodeLen = M + 1 + I =2M+k+1。

B、解码过程:

  1、读入连续0,连续0的个数就是M;

  2、计算CodeLen = 2M+k+1,得到[1 Info]的位数是 I=CodeLen - M =M+K+1;

  3、读入I位二进制码字,转换成10进制,假设为W。由W = CodeNum + 2^k,得CodeNum = W-2^K。

C、示例:

  对于 k =0时:CodeNum=3。编码如下:

    二进制表示为11,去掉k=0位后加1得100;

    所以M=2;

    所以编码后结果为[MZeros][1][Info] = [MZeros][1 Info] = 00100

  解码如下:

    读入连续2个0,所以M=2;CodeLen=2M+1+k=5;所以需要再读入3个码流100,[1 Info]就是100,转成十进制结果W为4,所以CodeNum = W-2^K=4-1=3;

  同样对于k=0,CodeNum=6时,编码为:00111;

  同样对于k=3,CodeNum=3时,编码为:1011;

  同样对于k=3,CodeNum=6时,编码为:1110;

  同样对于k=3,CodeNum=10时,编码为:010010;

原文地址:https://www.cnblogs.com/qing1991/p/10122161.html

时间: 2024-10-08 20:10:11

H.264---指数哥伦布编码的相关文章

H.264学习笔记6——指数哥伦布编码

在H.264中,使用CABAC需要进行二值化处理,而指数哥伦布编码就是CABAC的一种二值化处理的方法.k阶指数哥伦布编解码具体过程如下: A.编码过程:假设待编码数字为CodeNum(必须非负整数) 指数哥伦布编码后的形式为[MZeors][1][Info],MZero表示M个0. 1.将CodeNum以二进制形式表示(若不足k位,前面补0),去掉后面k位(若刚好是k位,去掉k位后得0),将结果(数值)加1,得到二进制数T1: 2.M为二进制数T1的二进制位数减一: 3.然后将第一步中舍去的k

Golomb及指数哥伦布编码原理介绍及实现

本文主要有以下三部分内容: 介绍了Golomb编码,及其两个变种:Golomb-Rice和Exp-Golomb的基本原理 C++实现了一个简单的BitStream库,能够方便在bit流和byte数字之间进行转换 C++实现了Golomb-Rice和Exp-Golomb的编码,并进行了测试. 在文章的最后提供了本文中的源代码下载. Golomb编码的基本原理 Golomb编码是一种无损的数据压缩方法,由数学家Solomon W.Golomb在1960年代发明.Golomb编码只能对非负整数进行编码

(转)指数哥伦布编码

在H.264中,使用CABAC需要进行二值化处理,而指数哥伦布编码就是CABAC的一种二值化处理的方法.k阶指数哥伦布编解码具体过程如下: A.编码过程:假设待编码数字为CodeNum(必须非负整数) 指数哥伦布编码后的形式为[MZeors][1][Info],MZero表示M个0. 1.将CodeNum以二进制形式表示(若不足k位,前面补0),去掉后面k位(若刚好是k位,去掉k位后得0),将结果(数值)加1,得到二进制数T1: 2.M为二进制数T1的二进制位数减一: 3.然后将第一步中舍去的k

【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H.264的标准协议中,不同的语法元素指定了不同的熵编码方法.在协议文档中共指定了10种语法元素的描述符,这些描述符表达了码流解析为语法元素值的方法,其中包含了H.264标准所支持的所有熵编码方法: 语法元素描述符 编码方法 b(8) 8位二进制比特位串,用于描述rbsp_byte() f(n) n位

0阶 无符号指数哥伦布编码

指数哥伦布编码与哈夫曼编码一样都属于变长编码 但二者也有显著的区别: 1>信源相关性: 哈夫曼编码依赖于信源的概率分布,而指数哥伦布编码与信源无关 2>额外信息: 哈夫曼编码必须携带与该信源匹配的码表,指数哥伦布编码无需携带额外信息 h264官方协议文档中定义了4类指数哥伦布编码分为: ue(v)无符号指数哥伦布编码 .se(v)有符号指数哥伦布编码. te(v)截断指数哥伦布编码 和 me(v)映射指数哥伦布编码 下面我们截取了协议文档中 ue(v)无符号指数哥伦布编码的部分作为例子来分析,

C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServer,可

使用VideoToolbox硬编码H.264<转>

文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. =========================================== 使用VideoToolbox硬编码H.264 前言 H.264是目前很流行的编码层视频压缩格式,目前项目中的协议层有rtmp与http,但是视频的编码层都是使用的H.264.在熟悉H.264的过程中,为更好的了解H.264,尝

C++实现RTMP协议发送H.264编码及AAC编码的音视频

转自:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Me

(转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP