H264学习笔记(4):CABAC基于上下文的自适应二进制熵编码

来源:互联网 发布:知金教育和奥鹏哪个好 编辑:程序博客网 时间:2024/05/07 08:11

        自适应算术编码:算术编码的思想是用0到1的区间上的一个数字来表示一个符输入流,本质是为了整个输入流分配一个码字,而不是给输入流中的每个字符分别指定码字,算术编码是用区间递进的方法来为输入流寻找这个码字的,从第一个符号确定的初始区间0,1开始,逐个字符地读入输入流,在每一个新的字符出现后地柜划分当前区间,划分的根据是在各个字符的概率将当前区间按照各个字符的概率划分为若干子区间,将当前字符对应的子2区间去除,作为下一个字符时的当前区间,当处理完最后一个字符后,得到了最终区间,在最终区间中挑选一个数字作为输出。解码器按照和编码相同的方法和步骤工作,不同的是作为逆过程,解码器每划分一个子区间就得到输入流中的一个字符。

        CABAC的自适应:在实际过程中输入流中字符的概率分布时动态改变的,这需要维护一个概率表去记录概率变化的信息,在做递进计算时,通过对概率表中的值估计当前字符的概率,当前字符处理后,需要重新刷新概率表,这个过程表现为对输入流字符的自适应。编码器和解码器按照同样的方法估计和刷新概率表,从而保证编码后的码流能够顺利解码。

        CABAC的码流输出:在实际操作过程中,编码器并不是等递进到最终区间才输出码字的,这里面有两方面的原因,意识在编码器的递进计算过程中,如果没有输出,信道会出现空闲,形成浪费,二是如果输入流比较长时,最终得到的区间非常小,必须以极高的精度来记录L和R,在二进制编码中,区间的上下限以二进制形式表示,每当下线的最高有效位与上限的最高有效位一样时,就可以移出这比特,这样的方法可以保证编码器在递进计算时不断输出码流,序列出现的可能性越大,区间就越长,确定该区间所需要的比特就越少。

        CABAC算术编码的生命期:算术编码是对整个流分配码字,但考虑如果有某个比特丢失,编码和解码将错位。为了将差错控制在一定范围内,CABAC将片(slice)作为算术编码的生命周期,在每个片开始时,CABAC进行初始化。

        CABAC的上下文模型:即使对片内数据,CABAC也不是将他们作为整体来处理的,而是继续分割为若干个子部分,分别编码。除了上下文提到的插座控制原因外,也是由于如果输入流过长,则要求L和R必须有足够的精度和长度保存中间数据,这对于编码器是个不小的负担。H264将一个片内可能出现的数据划分为399个上下文模型,每个模型以ctxIdx标识,在每个模型内部进行概率的查找和更新。H264共要建立399个概率表,每个上下文模型都独立地使用对应的表维护概率状态,这些模型的划分精确到比特,几乎大多数比特和他们临近的比特处于不同的上下文模型中。解码器对于输入的每一个比特首先要做的工作是查找它属于哪个上下文模型,然后查找该上下文模型对应的概率表以递进区间。

       对输入流预编码:CABAC微软算术编码的特性做了许多优化,这其中也包括从统计角度对输入流做的一套预编码方案,当前处理的字符为MPS时,区间递进只是子区间的长度发生改变,而作为影响实际输出值的L却并没有变化。这个现象意味着,如果输入流中连续出现大量的MPS,或者MPS对LPS的概率比非常高时,可以达到极高的压缩效果。算术编码对这种输入流的压缩性能达到最优,编码输出的码率也更能接近信源熵率。由此CABAC体系包含了一个与编码过程,将输入流重新编码后再进行算术编码,这个预编码过程叫做输入流的二进制话,经它编码输出的是MPS概率极高的比特流。


0 0
原创粉丝点击