类分析_CABAC__CabacContextModel

本文介绍了CABAC编码中的类分析,包括CabacContextModel类的成员及功能,如m_uiCount和m_ucState,以及相关函数incrementCount和toggleMps的作用。此外,还提到了 CabacContextModel2DBuffer 类,它构成了一个二维数组,并提供了获取和初始化元素的方法。CABAC编码上下文模型的更新规则通过g_aucLPSTable64x4和g_aucACNextStateMPS64、g_aucACNextStateLPS64表格进行描述。
 // CabacContextModel头文件:
class H264AVCCOMMONLIB_API CabacContextModel
{
public:
	CabacContextModel();
	~CabacContextModel();

  const UChar getState()           { return m_ucState>>1; }
  const UChar getMps()             { return m_ucState&1;  }
  Void toggleMps()                 { m_ucState ^= 1;      }
  Void setState( UChar ucState )   { m_ucState = (ucState<<1)+getMps(); }

  Void init( Short asCtxInit[], Int iQp )
  {
	  Int iState = ( ( asCtxInit[0] * iQp ) >> 4 ) + asCtxInit[1];
    iState = min (max ( 1, iState), 126 );

    if (iState>=64)
    {
      m_ucState = iState - 64;
      m_ucState += m_ucState + 1;
    }
    else
    {
      m_ucState = 63 - iState;
      m_ucState += m_ucState;
    }
    m_uiCount = 0;
  }

  Void initEqualProbability()
  {
    m_ucState = 0;
    m_uiCount = 0;
  }

  Void  incrementCount()  { m_uiCount++; }

private:
  UChar m_ucState;
  UInt  m_uiCount;

  static  const Double m_afProbability[128];
  static  const Double m_afEntropy    [128];
};

两个私有成员,m_uiCount似乎是上下文的编号,m_ucState最后一位表示MPS符号是什么,前面的位数表示

m_afProbability[128]和m_afEntropy [128] 是常数

 

构造函数和initEqualProbability都把m_ucState和m_uiCount初始化为零。

函数incrementCount:当输入的是MPS符号时,sigma右移一位,表现为m_uiCount自增1
 toggleMps:交换MPS和LPS符号

 

 

类CabacContextModel2DBuffer:

成员变量

 CabacContextModel*  m_pcCContextModel;
  const UInt          m_uiSizeX;
  const UInt          m_uiSizeY;

事实上形成了一个 m_uiSizeX * m_uiSizeY 的CabacContextModel数组,m_uiSizeX 是列数

 初始化:

Void init( Short asCtxInit[], Int iQp )
  {
	  Int iState = ( ( asCtxInit[0] * iQp ) >> 4 ) + asCtxInit[1];
    iState = min (max ( 1, iState), 126 );

    if (iState>=64)
    {
      m_ucState = iState - 64;
      m_ucState += m_ucState + 1;
    }
    else
    {
      m_ucState = 63 - iState;
      m_ucState += m_ucState;
    }
    m_uiCount = 0;
  }


 

函数:

CabacContextModel* get( UInt uiY )                          取得第uiY 的地址

CabacContextModel& get( UInt uiY, UInt uiX )          取得第uiY行第uiX 列的元素

 ErrVal initBuffer( Short* psCtxModel, Int iQp )  初始化

/******************************************************************************************************************************/

CabacTables.h:记录了三张表格

g_aucLPSTable64x4  :64行4列的表格

g_aucACNextStateMPS64   :新来的符号是MPS时,状态下标的迁移

g_aucACNextStateLPS64  : 新来的符号时LPS时,状态下标的迁移

const UChar g_aucACNextStateMPS64[64] =
{
   1, 2, 3, 4, 5, 6, 7, 8, 9,10,
  11,12,13,14,15,16,17,18,19,20,
  21,22,23,24,25,26,27,28,29,30,
  31,32,33,34,35,36,37,38,39,40,
  41,42,43,44,45,46,47,48,49,50,
  51,52,53,54,55,56,57,58,59,60,
  61,62,62,63
};

 

const UChar g_aucACNextStateLPS64[64] =
{
   0, 0, 1, 2, 2, 4, 4, 5, 6, 7,
   8, 9, 9,11,11,12,13,13,15,15,
  16,16,18,18,19,19,21,21,22,22,
  23,24,24,25,26,26,27,27,28,29,
  29,30,30,30,31,32,32,33,33,33,
  34,34,35,35,35,36,36,36,37,37,
  37,38,38,63
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值