H264学习笔记(3):CAVLC基于上下文自适应的可变长编码

时间:2022-08-18 15:54:22

       熵编码的基本原理:熵编码是无损压缩编码方法,它生成的马路可以经解码无失真地恢复出原数据,熵编码是简历在随机过程的统计基础上。

       自信息量:设X可发出的消息符号集合为A={ai|i=1,2,...,m},并设X发出符号ai的概率为p(ai),则ai出现的自信息量为I(ai)=-log p(ai)。通常取2为底,这是信息量单位为比特。

       无记忆信息源:如果各符号出现是独立的,那么X发出衣服好序列的概率等于各符号的概率之积,因而该序列出现的信息量等于相机出现的各符号的自信息量之和,这类信源称为无记忆信源。
       平均信息量:对信息员的各符号的自信息量取统计个均即为信源的平均信息量。

       信息源的熵:平均信息量也叫信源的熵,符号是比特,通常也称为X的一阶熵,可以理解为信息员X发任意一个符号的平均信息量。由此可知,一阶熵是无记忆信息源,是在无失真编码时所需数码率的下界。
       结论:熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也不同,当信源中各时间是等概率分布的,熵具有极大值,信源的熵与其可能达到的最大值之间的差值反应了该信源的冗余度,信源冗余度越小,即每个符号锁携带的信息量越大,那么传送相同的信息量所需要的序列长度越短,符号位越少,因此数据压缩的一个基本途径是去除信源符号之间的相关性,尽可能地使序列成为无记忆的,即钱已付好的出现不影响以后任何一个符号出现的概率。

        CAVLC的基本原理:在H264的CAVLC中,通过根据已编码句法元素的情况动态调整编码中使用的码表,取得了极高的压缩比。CAVLC用于亮度和色度残差数据的编码,残差经过变换量化后的数据表现出如下特性:4x4块数据经过预测,变换,量化后,非零系数主要集中在低频部分,而高频系数的大部分是,量化后的数据经过zig-zag扫描,直流系数附近的非零系数值较大,而高频位置上的非零系数值大部分是+1和-1,相邻的4x4块的非零系数的数目是相关的,CAVLC充分利用残差经过证书变换,量化后的数据的特性进行压缩,进一步较少数据中的冗余信息。

        CAVLC的上下文模型:利用相邻已编码符号所提供的相关性,为所需要编码的符号选择合适的上下文模型。利用合适的上下文模型,就可以大大降低符号间的冗余度。CAVLC中上下文模型的选择主要体现在两个方面:1)非零系数编码所需表格的选择。2)拖尾系数后缀长度的更新

        CAVLC编码的过程:
        1)编码非零系数的数目以及拖尾系数的数目
        2)编码每个拖尾系数的符号
        3)编码除了拖尾系数之外的非零系数的幅值
        4)编码最后一个非零系数前零的数目
        5)编码每个非零系数前零的个数

        编码非零系数的数目以及图为系数的数目:非零系数数目范围从0到16,拖尾系数数目范围从0到3.如果±1的个数大于三个,只有随后的三个被视为拖尾系数,其余的被视为普通的非零系数。对非零系数数目和拖尾系数数目的编码是通过查表方式,共有4个变长表格和一个顶场表格可供选择。其中定长表格的码字是6个比特长,高4位表示非零系数的个数,最低两位表示拖尾系数的个数。表格的选择是根据变量当前块值来选择的,在求变量当前块值的过程中,体现了基于上下文的思想。除了色度的直流系数外,其他系数类型的当前块值根据当前块左边4x4块的非零系数数目和当前块上面4x4块的非零系数数目求得的。当输入的系数是色度的直流系数,当前块值=-1。

       编码每个拖尾系数的符号:对于每个拖尾系数±1秩序指明其符号,其符号用一个比特表示0正1负。编码的顺序是按照反向扫描的顺序从高频数据开始。

       编码除了拖尾系数之外的非零系数的幅值:非零系数的幅值的组成分为两个部分,前缀和后缀。levelSuffixSize和suffixLength是编码过程中需要使用的两个变量。后缀是长度为levelSuffixLength位的服务号证书。通常情况下变量levelSuffixSize的值等于变量suffixLength的值。变量suffixLength是基于上下文模式自适应更新的,suffixLength的更新与当前的suffixLength的值以及已经解码好的非零系数值level有关。

       suffixLength数值的初始化以及更新过程:1)普通情况下suffixLength初始化为0,但是当块中有多余10个非零系数并且其中拖尾系数的数目少于3个,suffixLength初始化为1。2)编码在最高频率位置上的非零系数。3)如果当前已经解码好的非零系数值大于余弦定义好的阈值,suffixLength加1.

       编码最后一个非零系数前零的数目:TotalZeros值得是在最后一个非零系数前零的数目,此非零系数值得是按照正想扫描的最后一个非零系数。例如:0 0 5 0 3 0 0 0 1 0 0 -1 0 0 0 0 ,最后一个非零系数是-1,TotalZeros的值等于2+3+1+2=8.因为非零系数数目是已知的,这就决定了TotalZeros可能的最大值。

       编码每个非零系数前零的个数:每个非零系数前零的个数是按照范旭来进行编码的,从最高频的非零系数开始。在CAVLC中,对每个非零系数前零的个数的编码是依赖于ZerosLeft的值,ZerosLeft表示当前非零系数坐标所有0的个数,ZerosLeft的初始值等于TotalZeros,在每个非零系数前零的个数值编码后进行更新,用这种编码方法,有助于进一步压缩编码的比特数,例如:如果当前ZerosLeft值等于1就是只剩下一个零没有编码,下一个非零系数前的数目只可能是0或者1,编码只需要1个比特。