十七熵编码_CABAC的上下文环境

Posted 叮咚咕噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十七熵编码_CABAC的上下文环境相关的知识,希望对你有一定的参考价值。

一、CABAC中的概率模型

1、为什么采用概率模型

  • 构建模型:对每一个符号(即经过二值化的语法元素中的每一个bit值)分配一个概率分布模型
  • 概率模型直接决定了编码截断的性能
  • 在构建概率模型时,应尽可能地使该模型可以符合符号的统计情况,并且在编码的过程中实时更新
  • 在H.264编码的实际应用中,为了尽可能降低编码的运算量,CABAC定义了基于查表的的概率模型。每当编码完一个bit值需要更新索引时,编码器不再是通过计算更新概率,而是通过查表来获取最新的上下文。

2、CABAC上下文模型的定义

我们已经知道,在CABAC中所有的信息都会转换为二进制数据进行编码,即0和1两种字符。因此在CABAC中,概率模型实际上只包含有一个概率——P(a),另外一个元素P(b)实际上等于1-P(a),其中a=1,b=0或相反。无论二者关系如何,总有一个值的概率不小于0.5,另一个值的概率不超过0.5。其中,概率不大于0.5的字符定义为LPS(Least Probability Symbol),概率不小于0.5的字符定义为MPS(Most Probability Symbol),分别用于表示当前状态下的小概率字符以及大概率字符。

在1.1节中可知,对于CABAC执行过程中的每一个状态,其MPS和LPS的概率通过一个预定义的表格来进行查询和转移,因此上下文模型中还需要一个索引值来表示当前在表格中所处的位置。因此在实现中,上下文模型可以用如下结构体表示:

//! struct for context management
typedef struct
{
  unsigned short state;         // index into state-table CP  
  unsigned char  MPS;           // Least Probable Symbol 0/1 CP
} BiContextType;

typedef BiContextType *BiContextTypePtr;

二、 上下文模型索的初始化与更新

  • 以mb_type为例,来说明如何获取解析该语法元素上下文的过程

2、上下文模型的初始化

初始化CABAC上下文模型是编码器初始化的重要步骤,其本质就是针对上节定义的上下文模型结构BiContextType的初始值。初始化上下文模型的部分在标准文档的9.3.1.1节中定义。其中规定的初始化上下文模型的方法如下式表示:

preCtxState = Clip3( 1, 126, ( ( m ∗ Clip3( 0, 51, SliceQPY ) ) >> 4 ) + n )
if( preCtxState <= 63 ) {
    pStateIdx = 63 − preCtxState
    valMPS = 0
} else {
    pStateIdx = preCtxState − 64
    valMPS = 1
}

从上式中可知,如果希望初始化上下文模型的变量pStateIdx和valMPS,我们所必须的数据有SliceQPY、m与n等3个数值。其中我们所必须的数据有SliceQPY表示当前slice的亮度分量的量化参数初始值,可以通过pps结构中的pic_init_qp和SliceHeader中的slice_qp_delta值计算。m和n的值通过查表获取,实际查询的表格由语法元素类型、帧类型和cabac_init_idc决定。

不同的语法元素之间采用的初始上下文模型索引值不同,下表中列出了不同的语法元素在不同的帧类型下所采用的上下文索引ctxIdx的范围,以及初始化时查找m和n的表:
在这里插入图片描述
例如在初始化I帧的宏块类型mb_type这个语法元素的上下文模型时,参考表9-12:
在这里插入图片描述

2、上下文模型的更新

  • CABAC为了提高编码效率,需要实时更新。概率模型实时更新的过程中,不仅仅是MPS(或LPS)的概率在更新,甚至是MPS和LPS本身所代表的符号也可能会互换
  • LPS的概率取值区间[0,0.5]被划分为64个概率值,分别对应了索引值为0 ~ 63的各种状态,其中在编码过程中可供更新概率模型使用的状态为0 ~ 62
  • 在CABAC编码过程中,概率模型处在下图的某一个点的位置上。此时根据当前处理的二进制字符的取值,采取不同的模型更新方法:
    • 当前字符为MPS,沿实线部分向右更新;此时LPS的概率趋向于越来越小,如果MPS持续出现,则LPS概率最终会更新到索引值为62的状态(此时LPS的概率达到预定义的最小值),而后保持在该状态不再变化,直到一个LPS出现;
    • 当前字符为LPS,沿虚线部分向左更新,此时LPS的概率趋向于越来越大,当索引值降为0时,LPS的概率达到最大的0.5;如果下一个字符依然为LPS,则认为LPS的实际概率已经超过0.5,LPS与MPS对调,继续按当前规则更新。
      在这里插入图片描述

以上是关于十七熵编码_CABAC的上下文环境的主要内容,如果未能解决你的问题,请参考以下文章

x264代码剖析(十七):核心算法之熵编码(Entropy Encoding)

H.264/AVC视频编解码技术详解二十一熵编码:CABAC的上下文环境

H.264/AVC视频编解码技术详解二十一熵编码:CABAC的上下文环境

Codecs系列x265编码器:CABAC代码分析

编码原理详解--CABAC

CABAC