不知道很多人是不是和我一样有疑惑,那个probability estimation 是干什么用的?
就是在CABAC 的第三步, 算术编码完一个bin, 都要update context model.
在TEncBinCoderCABAC.cpp中的 encodeBin()函数中调用:
rcCtxModel.updateLPS();
<pre name="code" class="cpp"> rcCtxModel.updateMPS();
这个函数来update context ,其实就是更新概率模型。
算术编码克服了哈夫曼只能为整数的缺点,根据概率更新来更准确估计信源信号出现概率,概率估计越精确,编码效果越好。
这里的概率更新模型是单参数指数平滑法模型, 并以CABAC 定义的64个转换状态为index。这只是概率与index的函数的趋势关系, 参考H.264/AVC中那个经典的概率模型图。
但是在CABAC中, 概率更新FSM却是根据当前状态的概率来计算出新的概率。
每个概率在CABAC中其实是隐含着对应的状态的,比如如果得出概率0.04, 那么对应该的pStateIdx 就是48. 这与当前是LPS 还是MPS无关,就是一个概率对应一个确定的pstaeIdx.
只不过,标准中简化了对概率这种FP类型的数据的应用,直接实施为状态转移FSM,如果编码完一个bin之后, 当前的state是知道