基于内容自适应的变长编码方式用于编码zigzag顺序扫描的4x4和2x2残差变换系数块。

1、编码系数个数和零序列(coeff_token):

coeff_token = <TotalCoeff, TrailingOnes>;

TotalCoeff = 编码非零系数总数; [0 , 16]

TrailingOnes = 特殊处理的+/-1个数; [0 , 3]

2、编码每个TrailingOne的符号:

倒序,从高频开始向前编码TrailingOne符号,每个符号一位,0为正,1为负,最多为3个。

3、编码余下非零系数的幅值:

编码顺序:倒序,从高频开始向前编码直到DC系数,每个幅值码字level[i]包含一个幅值前缀level_prefix和一个幅值后缀level_suffix。

level[i]: Level为实际系数的幅值。但有个例外:

当TrailingOnes<3时,那么被编码的第一个非T1 幅值肯定不是+/-1(否则将算作T1)。这个幅值如果为负就加1(如果为正就减1),例如+/-2 被映射成+/-1, +/-3映射成+/-2进行编码,这样可以用较短的变长码.

levelCode:

如果level[i]为正, levelCode = (Level[i] << 1) - 2;

如果 level[i]为负, levelCode = -(Level[i] << 1) - 1;

计算level_prefix:

编码时:

level_prefix = levelCode / (1 << suffixLength);

根据level_prefix查标准表9-6得到码字

解码时:

从比特流的当前位置开始读取,计算为0的leading bits数量。0的长度即为level_prefix值,对应关系可察看标准文档中表9-6。

计算suffixLength:

suffixLength为0-6 比特,其长度是自适应变换的。

suffixLength 增长过程:

1、初始化suffixLength = 0 ; 如果有超过10个非零系数,并且少于3个TailingOnes,这时suffixLength = 1;

2、编码最高频的非零系数;

3、如果这个系数的幅值大于一定的阈值,则增长suffixLength

当前suffixLength

增加suffixLength的系数阈值

0

0

1

3

2

6

3

12

4

24

5

48

6

N/A

更新suffixLength函数如下:

if(suffixLength == 0)

++suffixLength;

else if(level[i] > (3<<suffixLength-1) && suffixLength < 6)

++suffixLength;

计算levelSuffixSize: (后缀是长度为levelSuffixSize的无符号整数)

除了以下两种情况levelSuffixSize等于suffixLength:

1、level_prefix == 14 && suffixLength == 0 时, levelSuffixSize = 4;

2、level_prefix >= 15 时,levelSuffixSize = level_prefix – 3;

4、编码最后一个非零系数前零的个数

使用VLC编码最高频非零系数前所有零的个数

total_zeros:既为最高非零系数前所有零的个数;编码表见标准表9-7;表9-8;表9-9

5、编码每个零游程

zerosLeft: 当前系数之前所有的零的个数

run_before: 紧接当前系数前的零个数

CAVLC算法的具体过程(参考Sunrise的总结)

编码过程:

假设有一个4*4数据块

{

0, 3, -1, 0,

0, -1, 1, 0,

1, 0, 0, 0,

0, 0, 0, 0

}

数据重排列:0,3,0,1,-1,-1,0,1,0......

1) 初始值设定:

非零系数的数目(TotalCoeffs) = 5;

拖尾系数的数目(TrailingOnes)= 3;

最后一个非零系数前零的数目(Total_zeros) = 3;

变量NC=1;

(说明:NC值的确定:色度的直流系数NC=-1;其他系数类型NC值是根据当前块左边4*4块的非零系数数目(NA)当前块上面4*4块的非零系数数目(NB)求得的,见毕厚杰书P120表6.10)

suffixLength = 0;

i = TotalCoeffs = 5;

2) 编码coeff_token:

查标准(BS ISO/IEC 14496-10:2003)Table 9-5,可得:

If (TotalCoeffs == 5 && TrailingOnes == 3 && 0 <= NC < 2)

coeff_token = 0000 100;

Code = 0000 100;

3) 编码所有TrailingOnes的符号:

逆序编码,三个拖尾系数的符号依次是+(0),-(1),-(1);

即:

TrailingOne sign[i--] = 0;

TrailingOne sign[i--] = 1;

TrailingOne sign[i--] = 1;

Code = 0000 1000 11;

4) 编码除了拖尾系数以外非零系数幅值Levels:

过程如下:

(1)将有符号的Level[ i ]转换成无符号的levelCode;

如果Level[ i ]是正的,levelCode = (Level[ i ]<<1) – 2;

如果Level[ i ]是负的,levelCode = - (Level[ i ]<<1) – 1;

(2)计算level_prefix:level_prefix = levelCode / (1<<suffixLength);

查表9-6可得所对应的bit string;

(3)计算level_suffix:level_suffix = levelCode % (1<<suffixLength);

(4)根据suffixLength的值来确定后缀的长度;

(5)suffixLength updata:

If ( suffixLength == 0 )

suffixLength++;

else if ( levelCode > (3<<suffixLength-1) && suffixLength <6)

suffixLength++;

回到例子中,依然按照逆序,Level[i--] = 1;(此时i = 1)

levelCode = 0;level_prefix = 0;

查表9-6,可得level_prefix = 0时对应的bit string = 1;

因为suffixLength初始化为0,故该Level没有后缀;

因为suffixLength = 0,故suffixLength++;

Code = 0000 1000 111;

编码下一个Level:Level[0] = 3;

levelCode = 4;level_prefix = 2;查表得bit string = 001;

level_suffix = 0;suffixLength = 1;故码流为0010;

Code = 0000 1000 1110 010;

i = 0,编码Level结束。

5)编码最后一个非零系数前零的数目(TotalZeros):

查表9-7,当TotalCoeffs = 5,total_zero = 3时,bit string = 111;

Code = 0000 1000 1110 0101 11;

6) 对每个非零系数前零的个数(RunBefore)进行编码:

i = TotalCoeffs = 5;ZerosLeft = Total_zeros = 3;查表9-10:

依然按照逆序编码

ZerosLeft =3, run_before = 1 run_before[4]=10;

ZerosLeft =2, run_before = 0 run_before[3]=1;

ZerosLeft =2, run_before = 0 run_before[2]=1;

ZerosLeft =2, run_before = 1 run_before[1]=01;

ZerosLeft =1, run_before = 1 run_before[0]不需要码流来表示

Code = 0000 1000 1110 0101 1110 1101;

编码完毕。

CAVLC中的前缀和后缀——264小生

H264中的CAVLC在对TrailingOne之后的非零系数编码时,使用了前缀(prefix)和后缀(suffix)的概念,并且用suffixlength来表示后缀的长度。具体编码过程是这样的:

一,将suffixlength初始化为0(如果超过10个非零系数,而且少于3个TrailingOnes,suffixlength初始化为1)

二,将有符号的level(系数的值),转化为无符号数,有三种情况:

(1)如果Level是正的,levelCode = (Level<<1) – 2

(2)如果Level是负的,levelCode = -(Level<<1) – 1

(3)如果TrailingOnes小于3,那么第一个非TrailingOnes的非零系数必不为 +1、-1,为了节省编码比特,将其幅值减1。也就是如果level为正,level=level-1;否则,level=level+1。然后再按(1)

(2)将level转化为levelCode。T264中,此步骤是通过直接对levelcode减2完成的,levelcode=levelcode-2,这和通过对level幅值减1得到的levelcode是一样的。

三,得到level_prefix和level_suffix。

先说明一下,在解码端,levelcode是这样被解码的:

levelcode=(level_prefix<<suffixlength)+level_suffix

知道这一点很重要。从解码levelcode的公式中可以看出,编码端的level_prefix就是将levelcode右移suffixlength位得到的,而level_suffix直接就是levelcode的低suffixlength位。比如levelcode =13,也就是二进制'1101',而且如果此时的suffixlength=1,那么level_prefix=13>>1='110',level_suffix直接就是levelcode的最低位'1';再比如levelcode=13='1101', suffixlength=3,这时level_prefix =13>>3='1', level_suffix 就是 levelcode的低3位'101'。根据level_prefix 的值查表得到输出的码字。

这里还有三种特殊情况,在解码端:

(1)如果此时发现suffixlength=0,level_prefix=14,那么认为level_suffix是4位(而不是0位)。

(2)如果此时发现level_prefix=15,那么认为level_suffix是12位的。

(3)如果此时发现suffixlength=0,level_prefix=15,那么经过使用公式levelcode=

(level_prefix<<suffixlength)+level_suffix得到的levelcode还需要再加上15。

******************************************************************

Golomb 用于运动矢量,模式类型,头信息等编码

CAVLC用于残差编码

CABAC都可以

*******************************************************************

基于内容的自适应变长编码[CAVLC]的更多相关文章

  1. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  2. Recommender Systems基于内容的推荐

    基于内容的推荐的基本推荐思路是:用户喜欢幻想小说,这本书是幻想小说,则用户有可能喜欢这本小说 两方面要求:(1)知道用户的喜好:(2)知道物品的属性 基于内容的推荐相比协同过滤方法(个人观点):协同过 ...

  3. Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐

    本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD ...

  4. 基于内容的图像检索技(CBIR)术相术介绍

    基于内容的图像检索技(CBIR)术相术介绍 kezunhai@gmail.com http://blog.csdn.net/kezunhai 近20年来,计算机与信号处理领域如火如荼地发展着,随着普通 ...

  5. 基于内容的图片检索CBIR(Content Based Image Retrieval)简介

    传统的图像检索过程,先通过人工对图像进行文字标注,再利用关键字来检索图像,这种依据图像描述的字符匹配程度提供检索结果的方法,简称“以字找图”,既耗时又主观多义.基于内容的图像检索客服“以字找图”方式的 ...

  6. 大数据算法->推荐系统常用算法之基于内容的推荐系统算法

    港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...

  7. div 内容宽度自适应、超出后换行

    div 内容宽度自适应,超出后换行 { max-width:100%;width: fit-content;width: -webkit-fit-content;width: -moz-fit-con ...

  8. 基于内容的图片检索CBIR简介

    原文地址:http://blog.csdn.net/davebobo/article/details/53171311 传统的图像检索过程,先通过人工对图像进行文字标注,再利用关键字来检索图像,这种依 ...

  9. 新闻推荐系统:基于内容的推荐算法(Recommender System:Content-based Recommendation)

    https://blog.csdn.net/qq_32690999/article/details/77434381 因为开发了一个新闻推荐系统的模块,在推荐算法这一块涉及到了基于内容的推荐算法(Co ...

随机推荐

  1. http://blog.csdn.net/luoshengyang/article/details/6651971

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6651971 在Android系统中,提供了独特 ...

  2. mvc 5 的过滤器和webapi 过滤器 对应实现的action过滤器区别

     asp.net webapi  Action过滤器实现这个: #region 程序集 System.Web.Http, Version=5.2.3.0, Culture=neutral, Publi ...

  3. asp.net mvc 访问.html文件

    把html页面放在除Views文件夹外的任意文件夹,如Htmls--123.html,url直接访问便可,如 http://yourname/htmls/123.html 可以在路由表中排出不需要路由 ...

  4. 1218.3——init自定义

    相当于构造方法,有的时候初始化的时候有一些默认值,还有就是页面加载数据的时机问题,防止加载了页面再填数据 声明: -(instancetype)initWithName:(NSString *)aNa ...

  5. C#如何解决对ListView控件更新以及更新时界面闪烁问题

    第一个问题:如何更新ListView控件内容 很多时候运行窗体程序时,由于程序中使用了多线程加之操作不当,所以在对控件操作时会出现下面这样的异常:   这是因为我们在窗体中添加的控件都有属于自己的线程 ...

  6. .C .h 和 .CCP的区别

    1.*.H:C语言规定使用一个变量或调用一个函数前必须声明,为了使用方便,经常把常用函数,例如Windows API的函数,MFC类写入头文件.h,这样每次需要引用时只要使用#include加入就可以 ...

  7. .c_str()/atoi()/

    1. c_str是把string类型强制转换为const string 2. atpi(): Convert string to integer --Parses the C-string str i ...

  8. docker镜像与容器存储结构分析

    注意:转载请注明出处:http://www.programfish.com/blog/?p=9 Docker是一个开源的应用容器引擎,主要利用linux内核namespace实现沙盒隔离,用cgrou ...

  9. deepin 2014 静态IP无法保存,临时方法

    打开终端: #临时添加静态IP ifconfig eth0 [ip] netmask [掩码] #添加默认网关 route add default gw [网关] #添加DNS vim /etc/re ...

  10. tuple只有一个元素的时候,必须要加逗号

    In [1]: a = (1) In [2]: a Out[2]: 1 In [3]: a = (1,) In [4]: a Out[4]: (1,) 这是因为括号()既可以表示tuple,又可以表示 ...