zoukankan      html  css  js  c++  java
  • H.264---CABAC---第一步---上下文变量的初始化

    初始化执行于slice开始之前,另外如果在编码过程中某个宏块是PCM宏块(编码器直接传输图像的像素值,而不经过预测和变换),那么在PCM宏块之后,编码下一个宏块之前也需要进行初始化。

    初始化主要工作就是确定所有上下文的初始MPS以及初始状态pStateIdx。求解方法如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    preCtxState = Clip3( 1, 126, ( ( m ∗ Clip3( 0, 51, SliceQPY ) ) >> 4 ) + n )
     
    if( preCtxState <= 63 ) {
        pStateIdx = 63 − preCtxState
        valMPS = 0                           ( 9-5)
    } else {
        pStateIdx = preCtxState − 64
        valMPS = 1
    }

    上面的计算依赖于SliceQPY,m,n三个变量,其中不同的上下文索引(contex Index)对应不同的m、n,具体的m、n的取值请参考标准9.3.1中的各个表格。上下文索引是基于语法元素以及二值化后的二进制串的索引binIdx,我们将在下一小节进行阐述。

    在CABAC的初始化过程的结果会得到所有上下文索引对应的MPS与pStateIdx的初始值。如果确定了MPS为“0”,那么LPS为“1”,反之如果MPS为“1”,那么LPS为“0”。状态pStateIdx是什么呢?

    状态pStateIdx是LPS出现的概率pLPS的索引。算术编码中最重要的要素就是符号的概率,CABAC是自适应的算术编码,也就是说符号的概率会随着符号的输入而改变,这种变化就是一种状态机,如果输入的是LPS的话,状态(概率)会怎样变化,如果输入的是MPS的话,状态(概率)又会怎么变化。CABAC的状态机转换的规则由HOWARD与VITTER的"exponential aging"模型借鉴而来,转换规则如下

    在CABAC中规定了LPS的概率取值范围是pLPS[0.01875,0.5],由于LPS是小概率符号,因此它的概率肯定是小于0.5的,如果某个小概率符号在状态转换的过程中超出了0.5,此时我们就需要把MPS与LPS进行交换。

    CABAC的状态机中共有64个状态,pStateIdx = 0,1,2,…,63,分别代表64个不同的概率,除了pStateIdx = 63外,其他的63个状态都满足上述状态转换规则,其中

    结合上述状态机的转换规则,我们可以得到状态转换参数

    CABAC状态机的状态转换如下图(黑色实线代表输入的是MPS,红色虚线代表输入的是LPS),具体的pStateIdx变换请参考标准的表9-45

    stateMachine2

  • 相关阅读:
    将纸质照片转成数字报名照
    华为手机如何下载google play商店中的apk
    大疆Mavic 2发布
    [转] Spring使用Cache、整合Ehcache
    [转] spring-boot集成swagger2
    [转] Intellij IDEA快捷键与使用小技巧
    [转] 这个常识很重要,教你如何区分JEDEC 1600内存与XMP 1600内存
    [转] 下载文件旁边附的MD5/SHA256等有什么用途?
    Openresty 健康检查
    Vuforia图像追踪,动态创建的对象隐藏显示的坑
  • 原文地址:https://www.cnblogs.com/qing1991/p/10106256.html
Copyright © 2011-2022 走看看