`
jubincn
  • 浏览: 242574 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

CAVLC和CABAC简介

 
阅读更多

CABAC/CAVLCin H.264

什么是熵编码?

熵编码压缩是一种无损压缩,其实现原理是使用新的编码来表示输入的数据,从而达到压缩的效果。常用的熵编码有游程编码,哈夫曼编码和CAVLC编码等。

CAVLC

CAVLC(Context Adaptive VariableLength Coding)是在H.264/MPEG-4AVC中使用的熵编码方式。在H.264中,CAVLCzig-zag顺序用于对变换后的残差块进行编码。CAVLCCABAC的替代品,虽然其压缩效率不如CABAC,但CAVLC实现简单,并且在所有的H.264profile中都支持。

CAVLC的编码过程如下:

  1. 计算非零系数(TotalCoeffs)和拖尾系数(TrailingOnes)的数目。

    拖尾系数指值为+1/-1的系数,最大数目为3。如果超过3个,那么只有最后三个被视为拖尾系数。拖尾系数的数目被赋值到变量TrailingOnes
    非零系数包括所有的拖尾系数,其数目被赋值到变量TotalCoeffs)

  2. 计算nC(numberCurrent,当前块值)

    nC值由左边块的非零系数nA和上面块非零系数nB来确定,计算公式为:nC=round((nA+nB)/2);若nA存在nB不存在,则nC=nA;若nA不存在而nB存在,则nC=nB;若nAnB都不存在,则nC=0
    nC值用于选择VLC编码表,如下图所示。这里体现了上下文相关(contextadaptive)的特性,例如当nC值较小即周围块的非零系数较少时,就会选择比较短的码,从而实现了数据压缩。
  1. 查表获得coff_token的编码。

    根据之前编码和计算过程所得的变量TotalCoeffsTrailingOnesnC值可以查H.264标准附录CAVLC码表,即可得出coeff_token编码序列。

  2. 编码每个拖尾系数的符号,按zig-zag的逆序进行编码。

    每个符号用1bit位来表示,0表示“+”,1表示“—”。
    当拖尾系数超过三个时只有最后三个被认定为拖尾系数,引词编码顺序为从后向前编码。

  3. 编码除拖尾系数之外非零系数的levelLevels)。

    每个非零系数的level包括signmagnitude,扫描顺序是逆zig-zag序。
    level的编码由前缀(level_prefix)和后缀(level_suffix)组成。前缀的长度在06之间,后缀的长度则可通过下面的步骤来确定:
    将后缀初始化为0。(若非零系数的总数超过10且拖尾系数不到3,则初始化为1)。
    编码频率最高(即按扫描序最后)的除拖尾系数之外的非零系数。
    若这个系数的magnitude超过某个门槛值(threshold),则增加后缀的长度。下表是门槛值的列表:

  4. 编码最后一个非零系数之前0的个数(totalZeos)。

    TotalZeros指的是在最后一个非零系数前零的数目,此非零系数指的是按照正向扫描的最后一个非零系数
    根据TotalCoeffs值,H.264标准共提供了25个变长表格供查找,其中编码亮度数据时有15个表格供查找,编码色度DC2×2块(42:0格式)有3个表格、编码色度DC2×4块(42:2格式)有7个表格。

  5. 编码每个系数前面0的数目(run_before)。

    扫描顺序为zig-zag的逆序。
    [run_before]== total_zeros,则不需再计算run_before
    扫描序中的最后一个元素不需要计算run_before
    每个run_beforeVLC编码取决于run_before自身及未编码的0的个数ZerosLeft。例如若ZerosLeft== 2,那么run_before只可能是0,12,因此使用两个bit即可表示。

CAVLC之手把手教你编码

转自:http://blog.csdn.net/sunshine1314/article/details/1685948

这篇博客使用实例对上述过程做了详细的说明,尤其是有关Levels的计算方面做了重要的补充。下面是全文的转载:

首先声明本文并不是我写的,文章来自本人同学(Sunrise),都是一起做的H264,比较了解,文章内容都是自己整理的,比较可信,因此整理到一起,我也偷个懒哈

再次声明:文中用的标准是BS的正式标准,如果大家发现序号不对,参考着改过来就是了!

编码过程:
假设有一个4*4数据块
{
0,3,-1,0,
0,-1,1,0,
1,0,0,0,
0,0,0,0
}
数据重排列:0301-1-1010……

1
初始值设定:
非零系数的数目(TotalCoeffs=5
拖尾系数的数目(TrailingOnes=3
最后一个非零系数前零的数目(Total_zeros=3
变量NC=1;
(说明:NC值的确定:色度的直流系数NC=-1;其他系数类型NC值是根据当前块左边4*4块的非零系数数目(NA)当前块上面4*4块的非零系数数目(NB)求得的,见毕厚杰书P1206.10
suffixLength=0

i=TotalCoeffs=5;
2
)编码coeff_token
查标准(BSISO/IEC14496-10:2003Table9-5,可得:
If(TotalCoeffs==5&&TrailingOnes==3&&0<=NC<2)
coeff_token=0000100;
Code=0000100;
3
)编码所有TrailingOnes的符号:
逆序编码,三个拖尾系数的符号依次是+(0),-(1),-(1);
:
TrailingOnesign[i--]=0;
TrailingOnesign[i--]=1;
TrailingOnesign[i--]=1;
Code=0000100011;
4
)编码除了拖尾系数以外非零系数幅值Levels
过程如下:
1)将有符号的Level[i]转换成无符号的levelCode
如果Level[i]是正的,levelCode=(Level[i]<<1)–2;
如果Level[i]是负的,levelCode=-(Level[i]<<1)–1;
2)计算level_prefixlevel_prefix=levelCode/(1<<suffixLength)
查表9-6可得所对应的bitstring
3)计算level_suffixlevel_suffix=levelCode%(1<<suffixLength)
4)根据suffixLength的值来确定后缀的长度;
5suffixLengthupdata
If(suffixLength==0)
suffixLength++

elseif(levelCode>(3<<suffixLength-1)&&suffixLength<6)
suffixLength++;

回到例子中,依然按照逆序,Level[i--]=1;(此时i=1
levelCode=0
level_prefix=0
查表9-6,可得level_prefix=0时对应的bitstring=1
因为suffixLength初始化为0,故该Level没有后缀;
因为suffixLength=0,故suffixLength++
Code=00001000111

编码下一个LevelLevel[0]=3
levelCode=4
level_prefix=2;查表得bitstring=001
level_suffix=0
suffixLength=1;故码流为0010
Code=000010001110010

i=0
,编码Level结束。
5
)编码最后一个非零系数前零的数目(TotalZeros):
查表9-7,当TotalCoeffs=5total_zero=3时,bitstring=111
Code=000010001110010111

6
)对每个非零系数前零的个数(RunBefore)进行编码:
i=TotalCoeffs=5
ZerosLeft=Total_zeros=3;查表9-10
依然按照逆序编码
ZerosLeft=3,run_before=1run_before[4]=10;
ZerosLeft=2,run_before=0run_before[3]=1;
ZerosLeft=2,run_before=0run_before[2]=1;
ZerosLeft=2,run_before=1run_before[1]=01;
ZerosLeft=1,run_before=1run_before[0]
不需要码流来表示
Code=000010001110010111101101

编码完毕。

CABAC

简介

CABAC(ContextAdaptive Binary Arithmatic Coding)也是H.264/MPEG-4AVC中使用的熵编码算法。CABAC在不同的上下文环境中使用不同的概率模型来编码。其编码过程大致是这样:首先,将欲编码的符号用二进制bit表示;然后对于每个bit,编码器选择一个合适的概率模型,并通过相邻元素的信息来优化这个概率模型;最后,使用算术编码压缩数据。

CABAC编码详情

CABAC编码之所以能取得很高的压缩比,是因为:a)根据每一个语法元素的上下文来选取预测模型;b)使用本地的统计数据来估计概率;c)使用算术编码而不是变长编码。编码一个符号需要经过下面几步:

  1. 二值化。CABAC使用的算术编码是基于二进制的算术编码,因此非二进制形式的编码首先要转化为二进制的形式表示。

下面的234

  1. 选择上下文模型。“上下文模型”是指对二值化后的符号中的bit位进行编码时使用的概率模型。概率模型与最近编码的符号相关,会有多个概率模型可供选择。

  2. 算术编码。算术编码器根据第2步选择的概率模型对每个bit进行编码。需要注意的是每个bit的子范围只有两个数:01

  3. 更新预测模型。根据实际编码的值来更新所选择的预测模型。例如,如果所编码的二进制bit1,则预测模型中的1计数要增加。

编码过程

下面将以mxdx为例解释编码过程,mxdxmotionvector difference in the x-direction的简写,通过宏块的子块之间运算获得。

  1. 二值化。对于|mvdx|<9的数,使用下表进行编码,超过9的数使用Exp-Golomb编码。在这里,我们称编码后的第一个bitbin1,第二个bitbin2,以此推之,可以得到bin3,bin4等。


  1. 为每个bin选择一个上下文模型。bin1可以在三个模型之间进行选择,选择的依据是相邻的两个mxdx的绝对值之和,ek:

ek = mxdxA+ mxdxB(AB分别是当前块的上方块和左边块)

根据ek值从下表中为bin1选择上下文模型:


bin1之外的其它bit的上下文模型的选择根据下表进行:


  1. 编码每个bin。所选的预测模型中有01的概率,从而为算术编码器提供了概率范围,算术编码器使用这个概率范围对此bin进行算术编码。

  2. 更新上下文模型。例如,若bin1使用上下文模型2,而bin1的值是1,那么上下文模型21的计数就要增加,1的概率和0的概率需要重新计算。当上下文模型中的总数超过门槛值后,01的计数就要除以某个值,从而使得新加入的01在模型中产生更大的影响。


分享到:
评论

相关推荐

    CAVLC.rar_CABAC MATLAB_CABAC MATLAB_H.264_entropy coding_h.26

    本文将深入探讨H.264熵编码中的两种主要技术:上下文自适应二进制算术编码(Context-Adaptive Binary Arithmetic Coding, CABAC)和上下文自适应变长编码(Context-Adaptive Variable Length Coding, CAVLC)。...

    H.264熵解码分析

    本文将深入探讨H.264协议中的两种主要熵解码算法:Context-Adaptive Variable Length Coding (CAVLC) 和 Context-Adaptive Binary Arithmetic Coding (CABAC)。 **CAVLC** 是一种基于变量长度编码的算法,它的特点...

    CAVLC.rar详细编码过程

    本文将深入探讨CAVLC编码过程的各个环节,帮助读者理解其工作原理和重要性。 1. CAVLC编码基础 CAVLC是一种基于上下文的变长编码方式,它根据预测误差的统计特性来选择不同的码字长度,以适应不同场景和内容的变化...

    CAVLC.rar_CAVLC_h.264 CAVLC program

    在H.264标准中,CAVLC和 CABAC(Context-Adaptive Binary Arithmetic Coding)是两种主要的熵编码方法。 CAVLC的核心思想是根据上下文信息,使用不同长度的代码来表示不同的符号,使得频繁出现的符号对应较短的码字...

    H.264熵编码分析

    本篇将深入探讨H.264熵编码中的指数编码、Context-Adaptive Variable Length Coding (CAVLC) 和 Context-Adaptive Binary Arithmetic Coding (CABAC),以及它们如何协同工作来优化视频编码过程。 1. **指数编码**:...

    论文研究-H.264标准中CABAC算法和CAVLC算法的比较与研究 .pdf

    H.264标准中CABAC算法和CAVLC算法的比较与研究,刘冲,刘岚,H.264/AVC是由国际电信联盟(ITU)和国际标准化组织(ISO)共同制定的新一代视频编码标准。在该标准中,规定了两种熵编码的模式,即基于上��

    X264中cavlc编解码函数的注释

    CABAC和CAVLC都是H.264标准定义的熵编码方法,它们的主要目标是在保持视频质量的同时,尽可能地减少编码后的比特流大小。熵编码是视频编码的最后一步,它将熵编码之前的语法元素(如运动矢量、量化系数等)转化为二...

    一种CABAC解码引擎的芯片实现.pdf

    H.264标准在高效率视频压缩方面取得了显著的成效,尤其是在CABAC的应用下,相较于baseline模式下的CAVLC(上下文自适应变长编码)能够提升约14%的压缩率,但代价是算法的复杂度增加。 在CABAC编码过程中,首先将...

    H.264解码器中CAVLC码表查找算法的改进.pdf

    6. H.264解码器中的其他编码技术,例如CABAC和VLC 7. H.264解码器的发展和应用 本文还引用了多篇相关文献,例如ITU-T Rec. H.264 ISO/IEC 14496-10 AVC、Emerging H 26L Standard、Bjφ ntegaard Gisle的Context-...

    H264中cavlc相关提案

    在视频编码领域,H.264(也称为AVC,Advanced Video Coding)是一种广泛应用的高效编码标准,它...同时,熟悉CAVLC也能为学习更先进的熵编码技术如CABAC(Context-Adaptive Binary Arithmetic Coding)打下坚实的基础。

    H264 AVC标准中的熵编码技术

    熵编码是H.264/AVC标准中提高视频编码效率的关键技术之一,它包括两种主要的编码方式:上下文自适应变长编码(CAVLC)和上下文自适应二进制算术编码(CABAC)。这两种编码方法在H.264/AVC标准中扮演着重要角色,旨在...

    H.264熵编码CABAC经典文章与提案汇兑

    相比于早期的熵编码方式,如熵编码器中的上下文自适应变长编码(Context-Adaptive Variable Length Coding,CAVLC),CABAC具有更高的编码效率。 CABAC的工作流程可以分为以下几个步骤: 1. **初始化**:编码器...

    H264中熵编码CABAC经典论文

    H.264/AVC支持两种熵编码方法,包括上下文自适应二进制算术编码(CABAC)和上下文自适应变长编码(CAVLC)。在这两种方法中,CABAC更为高效,尤其在比特率节省上,可以达到最高70%的优势,但代价是更高的计算复杂度...

    h264解码之CAVLC编码实例

    在H264编码标准中,...然而,尽管CAVLC在某些场景下表现出色,但它并不适用于所有情况,特别是在复杂或高动态范围的视频中,更高效的熵编码方法如Cabac(Context-Adaptive Binary Arithmetic Coding)可能更为合适。

    基于H264熵编码的视频加密技术研究

    该标准支持两种熵编码方法:上下文自适应可变长度编码(CAVLC)和上下文自适应二进制算术编码(CABAC)。这两种方法都有各自的特点和应用场景。 - **CAVLC**:是一种较为简单的熵编码方法,通过使用预先定义的可变...

Global site tag (gtag.js) - Google Analytics