zsw79923
驱动牛犊
驱动牛犊
  • 注册日期2002-11-15
  • 最后登录2009-11-05
  • 粉丝1
  • 关注1
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1551回复:0

懂h264CABAC算法的看过来

楼主#
更多 发布于:2005-03-31 16:36

哪位兄弟能给解释一下H264的下面这段程序是怎样工作的,也就是CABAC算法那部分。我主要是不懂下面的头定义是什么东东,谢了!

#define Elow            (eep->Elow)
#define Erange          (eep->Erange)
#define Ebits_to_follow (eep->Ebits_to_follow)
#define Ebuffer         (eep->Ebuffer)
#define Ebits_to_go     (eep->Ebits_to_go)
#define Ecodestrm       (eep->Ecodestrm)
#define Ecodestrm_len   (eep->Ecodestrm_len)
#define Ecodestrm_laststartcode   (eep->Ecodestrm_laststartcode)
#define B_BITS     10 // Number of bits to represent the whole coding interval
#define ONE                              (1 << B_BITS)
#define HALF                     (1 << (B_BITS-1))
#define QUARTER    (1 << (B_BITS-2))


const byte rLPS_table_64x4[64][4]=
{
        { 128, 176, 208, 240},
        { 128, 167, 197, 227},
        { 128, 158, 187, 216},
        { 123, 150, 178, 205},
        { 116, 142, 169, 195},
        { 111, 135, 160, 185},
        { 105, 128, 152, 175},
        { 100, 122, 144, 166},
        {  95, 116, 137, 158},
        {  90, 110, 130, 150},
        {  85, 104, 123, 142},
        {  81,  99, 117, 135},
        {  77,  94, 111, 128},
        {  73,  89, 105, 122},
        {  69,  85, 100, 116},
        {  66,  80,  95, 110},
        {  62,  76,  90, 104},
        {  59,  72,  86,  99},
        {  56,  69,  81,  94},
        {  53,  65,  77,  89},
        {  51,  62,  73,  85},
        {  48,  59,  69,  80},
        {  46,  56,  66,  76},
        {  43,  53,  63,  72},
        {  41,  50,  59,  69},
        {  39,  48,  56,  65},
        {  37,  45,  54,  62},
        {  35,  43,  51,  59},
        {  33,  41,  48,  56},
        {  32,  39,  46,  53},
        {  30,  37,  43,  50},
        {  29,  35,  41,  48},
        {  27,  33,  39,  45},
        {  26,  31,  37,  43},
        {  24,  30,  35,  41},
        {  23,  28,  33,  39},
        {  22,  27,  32,  37},
        {  21,  26,  30,  35},
        {  20,  24,  29,  33},
        {  19,  23,  27,  31},
        {  18,  22,  26,  30},
        {  17,  21,  25,  28},
        {  16,  20,  23,  27},
        {  15,  19,  22,  25},
        {  14,  18,  21,  24},
        {  14,  17,  20,  23},
        {  13,  16,  19,  22},
        {  12,  15,  18,  21},
        {  12,  14,  17,  20},
        {  11,  14,  16,  19},
        {  11,  13,  15,  18},
        {  10,  12,  15,  17},
        {  10,  12,  14,  16},
        {   9,  11,  13,  15},
        {   9,  11,  12,  14},
        {   8,  10,  12,  14},
        {   8,   9,  11,  13},
        {   7,   9,  11,  12},
        {   7,   9,  10,  12},
        {   7,   8,  10,  11},
        {   6,   8,   9,  11},
        {   6,   7,   9,  10},
        {   6,   7,   8,   9},
        {   2,   2,   2,   2}
};


const unsigned short AC_next_state_MPS_64[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 unsigned short AC_next_state_LPS_64[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
};
******************************************************************************************************************************************************************************************************
void biari_encode_symbol(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct )
00160 {
00161   register unsigned int range = Erange;
00162   register unsigned int low = Elow;
00163   unsigned int rLPS = rLPS_table_64x4[bi_ct->state][(range>>6) & 3];
00164
00165   extern int cabac_encoding;
00166
00167   if( cabac_encoding )
00168   {
00169     bi_ct->count++;
00170   }
00171
00172   /* covers all cases where code does not bother to shift down symbol to be
00173    * either 0 or 1, e.g. in some cases for cbp, mb_Type etc the code symply
00174    * masks off the bit position and passes in the resulting value */
00175
00176   if (symbol != 0)
00177     symbol = 1;
00178  
00179   range -= rLPS;
00180   if (symbol != bi_ct->MPS)
00181   {
00182     low += range;
00183     range = rLPS;
00184    
00185     if (!bi_ct->state)
00186       bi_ct->MPS = bi_ct->MPS ^ 1;               // switch LPS if necessary
00187     bi_ct->state = AC_next_state_LPS_64[bi_ct->state]; // next state
00188   }
00189   else
00190     bi_ct->state = AC_next_state_MPS_64[bi_ct->state]; // next state
00191  
00193   /* renormalisation */    
00194   while (range < QUARTER)
00195   {
00196     if (low >= HALF)
00197     {
00198       put_one_bit_plus_outstanding(1);
00199       low -= HALF;
00200     }
00201     else
00202       if (low < QUARTER)
00203       {
00204         put_one_bit_plus_outstanding(0);
00205       }
00206       else
00207       {
00208         Ebits_to_follow++;
00209         low -= QUARTER;
00210       }
00211     low <<= 1;
00212     range <<= 1;
00213   }
00214   Erange = range;
00215   Elow = low;
00216   eep->C++;
00217
00218 }
00219
一片云
游客

返回顶部