• H.264---CABAC---第三步----确定上下文索引


    在前面初始化的时候就出现了上下文这个概念,那么上下文所指的是什么?

    以JM中的上下文结构体为例

    1
    2
    3
    4
    5
    6
    7
    //! struct for context management
    struct bi_context_type  
    {
       unsigned long  count; 
       byte state; //uint16 state;         // index into state-table CP
       unsigned char  MPS;           // Least Probable Symbol 0/1 CP 
    };

    上下文包含两个变量:MPSpStateIdx(count只是用于计数)。在CABAC编码的过程中会碰到需要修改这两个值的情况(如上面的状态变换),这些修改都是以上下文为单位的。

    语法元素在经过二值化后形成二进制串,二进制串中不同binIdx位置上的MPS(出现频率高的符号)可能会有所不同,并且概率也可能会不同,因此需要用一个概念来表示特定语法元素的二进制串中特定binIdx的MPS与pStateIdx,上下文就是这样的概念。

    在h.264标准中,用一个上下文索引ctxIdx来代表上下文,ctxIdx的取值为0~1023,就是说h.264的上下文一共有1024个。

    ctxIdx的计算方式分为两种:

    如果语法元素为coded_block_flag、significant_coeff_flag、last_significant_coeff_flag、coeff_abs_level_minus1,即残差系数部分的语法元素,则

    ctxIdx = ctxIdxOffset + BlockCatOffset(ctxBlockCat) + ctxIdxInc(ctxBlockCat)

    否则

    ctxIdx = ctxIdxOffset + ctxIdxInc

    其中的变量有

    • ctxIdxOffset  每个语法元素都有一个ctxIdxOffset,甚至一些语法元素在二值化后分为前后缀会,这种语法元素可能会有两个ctxIdxOffset,如下表格部分摘自h.264标准9.3.2的第一个表格
    Syntax Element ctxIdxOffset
    mb_type 
    (SI slices only)
    prefix: 0
    suffix: 3
    mb_type (I slices only) 3
    mb_skip_flag 
    (P,SP slices only)
    11
    mb_type 
    (P, SP slices only)
    prefix: 14
    suffix: 17
    sub_mb_type[] 
    (P, SP slices only)
    21
      • ctxIdxInc   在特定的语法元素二值化后,会形成以binIdx为索引的二进制串,尽管是同一个二进制串,但是不同的binIdx上的上下文(MPS,pStateIdx)可能会有所不同,ctxIdxInc就是在这种情况下产生的一个值,它用于划分二进制串上不同的上下文。如下面一项表格摘自h.264标准9.3.3.1的第一个表格
        ctxIdxOffset b0 b1 b2 b3 b4 b5 >=b6
        40 0,1,2 3 4 5 6 6 6
        ctxIdxOffset=40代表mvd的横向分量,上述表格描述了这个语法元素各个binIdx所对应的ctxIdxInc。也就是说mvd横向分量按照binIdx得到的ctxIdx如下表
        binIdx b0 b1 b2 b3 b4 b5 >=b6
        ctxIdx 40,41,42 43 44 45 46 46 46
        像上面表格的这种binIdx=0中出现三个ctxIdx的情况,意思就是会根据编码的具体情况选择0、1或者2作为ctxIdxInc,需要另外分析。ctxIdxInc的确定方法具体请参考标准9.3.3.1小节
      • BlockCatOffset(ctxBlockCat)  其中ctxBlockCat的范围为0~13,分别代表不同残差块类型,如下表
        Block description maxNumCoeff ctxBlockCat
        block of luma DC transform coefficient levels 16 0
        block of luma AC transform coefficient levels 15 1
        block of 16 luma transform coefficient levels 16 2
        block of chroma DC transform coefficient levels when ChromaArrayType is equal to 1 or 2 4*2/4*4 3
        block of chroma AC transform coefficient levels when ChromaArrayType is equal to 1 or 2 15 4
        block of 64 luma transform coefficient levels 64 5
        block of Cb DC transform coefficient levels when ChromaArrayType is equal to 3 16 6
        block of Cb AC transform coefficient levels when ChromaArrayType is equal to 3 15 7
        block of 16 Cb transform coefficient levels when ChromaArrayType is equal to 3 16 8
        block of 64 Cb transform coefficient levels when ChromaArrayType is equal to 3 64 9
        block of Cr DC transform coefficient levels when ChromaArrayType is equal to 3 16 10
        block of Cr AC transform coefficient levels when ChromaArrayType is equal to 3 15 11
        block of 16 Cr transform coefficient levels when ChromaArrayType is equal to 3 16 12
        block of 64 Cr transform coefficient levels when ChromaArrayType is equal to 3 64 13

        在残差系数部分,上下文是会根据不同的残差块类型做出不同选择的,BlockCatOffset就代表了不同的残差块类型的索引偏移,具体偏移值可以查看标准中的相关表格。

  • 相关阅读:
    AFNetworking 使用总结
    FMDB 直接将查询结果转化为字典
    NSArray 与 NSMutableArray 的排序
    iOS 用UISearchDisplayController实现查找功能
    (转)一句话实例化模型
    OC KVC总结
    OC 解决NSArray、NSDictionary直接打印中文出现乱码的问题
    配置SecureCRT密钥连接Linux
    公司服务器安装——防火墙设置
    给公司服务器装web服务器,邮件服务器——安装SecureCRT
  • 原文地址:https://www.cnblogs.com/qing1991/p/10106286.html
Copyright © 2020-2023  润新知