rdoq_cabac.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:27k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file rdoq_cabac.c
  4.  *
  5.  * brief
  6.  *    Rate Distortion Optimized Quantization based on VCEG-AH21 related to CABAC
  7.  *************************************************************************************
  8.  */
  9. #include "contributors.h"
  10. #include <math.h>
  11. #include <float.h>
  12. #include "global.h"
  13. #include "image.h"
  14. #include "fmo.h"
  15. #include "macroblock.h"
  16. #include "mb_access.h"
  17. #include "ratectl.h"
  18. #include "rdoq.h"
  19. const int entropyBits[128]= 
  20. {
  21.      895,    943,    994,   1048,   1105,   1165,   1228,   1294, 
  22.     1364,   1439,   1517,   1599,   1686,   1778,   1875,   1978, 
  23.     2086,   2200,   2321,   2448,   2583,   2725,   2876,   3034, 
  24.     3202,   3380,   3568,   3767,   3977,   4199,   4435,   4684, 
  25.     4948,   5228,   5525,   5840,   6173,   6527,   6903,   7303, 
  26.     7727,   8178,   8658,   9169,   9714,  10294,  10914,  11575, 
  27.    12282,  13038,  13849,  14717,  15650,  16653,  17734,  18899, 
  28.    20159,  21523,  23005,  24617,  26378,  28306,  30426,  32768, 
  29.    32768,  35232,  37696,  40159,  42623,  45087,  47551,  50015, 
  30.    52479,  54942,  57406,  59870,  62334,  64798,  67262,  69725, 
  31.    72189,  74653,  77117,  79581,  82044,  84508,  86972,  89436, 
  32.    91900,  94363,  96827,  99291, 101755, 104219, 106683, 109146, 
  33.   111610, 114074, 116538, 119002, 121465, 123929, 126393, 128857, 
  34.   131321, 133785, 136248, 138712, 141176, 143640, 146104, 148568, 
  35.   151031, 153495, 155959, 158423, 160887, 163351, 165814, 168278, 
  36.   170742, 173207, 175669, 178134, 180598, 183061, 185525, 187989
  37. };
  38. extern const int maxpos       [];
  39. extern const int type2ctx_bcbp[];
  40. extern const int type2ctx_map [];
  41. extern const int type2ctx_last[]; 
  42. extern const int type2ctx_one []; // 7
  43. extern const int type2ctx_abs []; // 7
  44. extern const int max_c2       []; // 9
  45. extern const int  pos2ctx_map8x8 [];
  46. extern const int  pos2ctx_map8x4 [];
  47. extern const int  pos2ctx_map4x4 [];
  48. extern const int  pos2ctx_map2x4c[];
  49. extern const int  pos2ctx_map4x4c[];
  50. extern const int* pos2ctx_map    [];
  51. extern const int  pos2ctx_last8x8 [];
  52. extern const int  pos2ctx_last8x4 [];
  53. extern const int  pos2ctx_last4x4 [];
  54. extern const int  pos2ctx_last2x4c[];
  55. extern const int  pos2ctx_last4x4c[];
  56. extern const int* pos2ctx_last    [];
  57. extern const int estErr4x4[6][4][4];
  58. extern const int estErr8x8[6][8][8];
  59. int precalcUnaryLevelTab[128][MAX_PREC_COEFF];
  60. estBitsCabacStruct estBitsCabac[NUM_BLOCK_TYPES];
  61. void precalculate_unary_exp_golomb_level()
  62. {
  63.   int state, ctx_state0, ctx_state1, estBits0, estBits1, symbol;
  64.   for (state=0; state<=63; state++)
  65.   {
  66.     // symbol 0 is MPS
  67.     ctx_state0=64+state;
  68.     estBits0=entropyBits[127-ctx_state0];
  69.     ctx_state1=63-state;
  70.     estBits1=entropyBits[127-ctx_state1];
  71.     for (symbol=0; symbol<MAX_PREC_COEFF; symbol++)
  72.     {
  73.       precalcUnaryLevelTab[ctx_state0][symbol]=est_unary_exp_golomb_level_bits(symbol, estBits0, estBits1);
  74.       // symbol 0 is LPS
  75.       precalcUnaryLevelTab[ctx_state1][symbol]=est_unary_exp_golomb_level_bits(symbol, estBits1, estBits0);
  76.     }
  77.   }
  78. }
  79. int est_unary_exp_golomb_level_bits(unsigned int symbol, int bits0, int bits1)
  80. {
  81.   unsigned int l,k;
  82.   unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
  83.   int estBits;
  84.   if (symbol==0)
  85.   {
  86.     return (bits0);
  87.   }
  88.   else
  89.   {
  90.     estBits=bits1;
  91.     l=symbol;
  92.     k=1;
  93.     while (((--l)>0) && (++k <= exp_start))
  94.     {
  95.       estBits += bits1;
  96.     }
  97.     if (symbol < exp_start)
  98.     {
  99.       estBits += bits0;
  100.     }
  101.     else 
  102.     {
  103.       estBits += est_exp_golomb_encode_eq_prob(symbol-exp_start);
  104.     }
  105.   }
  106.   return(estBits);
  107. }
  108. /*!
  109. ****************************************************************************
  110. * brief
  111. *    estimate exp golomb bit cost 
  112. ****************************************************************************
  113. */
  114. int est_exp_golomb_encode_eq_prob(unsigned int symbol)
  115. {
  116.   int k = 0, estBits = 0;
  117.   while(1)
  118.   {
  119.     if (symbol >= (unsigned int)(1<<k))   
  120.     {
  121.       estBits++;
  122.       symbol -= (1<<k);
  123.       k++;
  124.     }
  125.     else                  
  126.     {
  127.       estBits += (k + 1);  
  128.       break;
  129.     }
  130.   }
  131.   return(estBits);
  132. }
  133. /*!
  134. ****************************************************************************
  135. * brief
  136. *   estimate bit cost for CBP, significant map and significant coefficients
  137. ****************************************************************************
  138. */
  139. void estRunLevel_CABAC (Macroblock *currMB, int context) // marta - writes CABAC run/level 
  140. {
  141.   DataPartition*  dataPart = &(img->currentSlice->partArr[0]); // assumed that no DP is used (table assignSE2partition_NoDP)
  142.   EncodingEnvironmentPtr eep_dp = &(dataPart->ee_cabac); 
  143.   est_CBP_block_bit  (currMB, eep_dp, context);      
  144.   //===== encode significance map =====
  145.   est_significance_map         (currMB, eep_dp, context);      
  146.   //===== encode significant coefficients =====
  147.   est_significant_coefficients (currMB, eep_dp, context);
  148. }
  149. /*!
  150. ****************************************************************************
  151. * brief
  152. *    estimate bit cost for each CBP bit
  153. ****************************************************************************
  154. */
  155. void est_CBP_block_bit (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
  156. {
  157.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  158.   int ctx;
  159.   for (ctx=0; ctx<=3; ctx++)
  160.   {
  161.     cabacEstBits->blockCbpBits[ctx][0]=biari_no_bits(eep_dp, 0, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
  162.     cabacEstBits->blockCbpBits[ctx][1]=biari_no_bits(eep_dp, 1, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
  163.   }
  164. }
  165. /*!
  166. ****************************************************************************
  167. * brief
  168. *    estimate CABAC bit cost for significant coefficient map
  169. ****************************************************************************
  170. */
  171. void est_significance_map(Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
  172. {
  173.   int   k;
  174.   int   k1  = maxpos[type]-1;
  175. #if ENABLE_FIELD_CTX
  176.   int   fld = ( img->structure!=FRAME || currMB->mb_field );
  177. #else
  178.   int   fld = 0;
  179. #endif
  180.   BiContextTypePtr  map_ctx   = img->currentSlice->tex_ctx->map_contexts [fld][type2ctx_map [type]];
  181.   BiContextTypePtr  last_ctx  = img->currentSlice->tex_ctx->last_contexts[fld][type2ctx_last[type]];
  182.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  183.   for (k = 0; k < k1; k++) // if last coeff is reached, it has to be significant
  184.   {
  185.     cabacEstBits->significantBits[pos2ctx_map[type][k]][0]=biari_no_bits  (eep_dp, 0,  map_ctx+pos2ctx_map     [type][k]);
  186.     cabacEstBits->significantBits[pos2ctx_map[type][k]][1]=biari_no_bits  (eep_dp, 1,  map_ctx+pos2ctx_map     [type][k]);
  187.     cabacEstBits->lastBits[pos2ctx_last[type][k]][0]=biari_no_bits(eep_dp, 0, last_ctx+pos2ctx_last[type][k]);
  188.     cabacEstBits->lastBits[pos2ctx_last[type][k]][1]=biari_no_bits(eep_dp, 1, last_ctx+pos2ctx_last[type][k]);
  189.   }
  190.   // if last coeff is reached, it has to be significant
  191.   cabacEstBits->significantBits[pos2ctx_map[type][k1]][0]=0;
  192.   cabacEstBits->significantBits[pos2ctx_map[type][k1]][1]=0;
  193.   cabacEstBits->lastBits[pos2ctx_last[type][k1]][0]=0;
  194.   cabacEstBits->lastBits[pos2ctx_last[type][k1]][1]=0;
  195. }
  196. /*!
  197. ****************************************************************************
  198. * brief
  199. *    estimate bit cost of significant coefficient
  200. ****************************************************************************
  201. */
  202. void est_significant_coefficients (Macroblock* currMB, EncodingEnvironmentPtr eep_dp,  int type)
  203. {
  204.   int   ctx;
  205.   int maxCtx = imin(4, max_c2[type]);
  206.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  207.   for (ctx=0; ctx<=4; ctx++){    
  208.     cabacEstBits->greaterOneBits[0][ctx][0]=
  209.       biari_no_bits (eep_dp, 0, img->currentSlice->tex_ctx->one_contexts[type2ctx_one[type]] + ctx);
  210.     cabacEstBits->greaterOneBits[0][ctx][1]=
  211.       biari_no_bits (eep_dp, 1, img->currentSlice->tex_ctx->one_contexts[type2ctx_one[type]] + ctx);
  212.   }
  213.   for (ctx=0; ctx<=maxCtx; ctx++){
  214.     cabacEstBits->greaterOneBits[1][ctx][0]=
  215.       biari_no_bits(eep_dp, 0, img->currentSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
  216.     cabacEstBits->greaterOneState[ctx]=biari_state(eep_dp, 0, img->currentSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
  217.     cabacEstBits->greaterOneBits[1][ctx][1]=
  218.       biari_no_bits(eep_dp, 1, img->currentSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
  219.   }
  220. }
  221. int biari_no_bits(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct )
  222. {
  223.   int ctx_state, estBits;
  224.   symbol = (short) (symbol != 0);
  225.   ctx_state = (symbol == bi_ct->MPS) ? 64 + bi_ct->state : 63 - bi_ct->state;
  226.   estBits=entropyBits[127 - ctx_state];
  227.   return(estBits);
  228. }
  229. int biari_state(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct )
  230.   int ctx_state;
  231.   symbol = (short) (symbol != 0);
  232.   ctx_state = (symbol == bi_ct->MPS) ? 64 + bi_ct->state : 63 - bi_ct->state;
  233.   return(ctx_state);
  234. }
  235. #define BIT_SET(x,n)  ((int)(((x)&((int64)1<<(n)))>>(n)))
  236. /*!
  237. ****************************************************************************
  238. * brief
  239. *    estimate CABAC CBP bits
  240. ****************************************************************************
  241. */
  242. int est_write_and_store_CBP_block_bit(Macroblock* currMB, int type) 
  243. {
  244.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  245.   int y_ac        = (type==LUMA_16AC || type==LUMA_8x8 || type==LUMA_8x4 || type==LUMA_4x8 || type==LUMA_4x4
  246.     || type==CB_16AC || type==CB_8x8 || type==CB_8x4 || type==CB_4x8 || type==CB_4x4
  247.     || type==CR_16AC || type==CR_8x8 || type==CR_8x4 || type==CR_4x8 || type==CR_4x4);
  248.   int y_dc        = (type==LUMA_16DC || type==CB_16DC || type==CR_16DC); 
  249.   int u_ac        = (type==CHROMA_AC && !img->is_v_block);
  250.   int v_ac        = (type==CHROMA_AC &&  img->is_v_block);
  251.   int chroma_dc   = (type==CHROMA_DC || type==CHROMA_DC_2x4 || type==CHROMA_DC_4x4);
  252.   int u_dc        = (chroma_dc && !img->is_v_block);
  253.   int v_dc        = (chroma_dc &&  img->is_v_block);
  254.   int j           = ((y_ac || u_ac || v_ac ? img->subblock_y : 0) << 2);
  255.   int i           =  (y_ac || u_ac || v_ac ? img->subblock_x : 0);
  256.   int bit;
  257.   int default_bit =  (IS_INTRA(currMB) ? 1 : 0);
  258.   int upper_bit   = default_bit;
  259.   int left_bit    = default_bit;
  260.   int ctx, estBits = 0;
  261.   int bit_pos_a   = 0;
  262.   int bit_pos_b   = 0;
  263.   PixelPos block_a, block_b;
  264.   if (y_ac || y_dc)
  265.   {
  266.     get4x4Neighbour(currMB, (i << 2) - 1, j   , img->mb_size[IS_LUMA], &block_a);
  267.     get4x4Neighbour(currMB, (i << 2),     j -1, img->mb_size[IS_LUMA], &block_b);
  268.     if (y_ac)
  269.     {
  270.       if (block_a.available)
  271.         bit_pos_a = 4*block_a.y + block_a.x;
  272.       if (block_b.available)
  273.         bit_pos_b = 4*block_b.y + block_b.x;
  274.     }
  275.   }
  276.   else
  277.   {
  278.     get4x4Neighbour(currMB, (i << 2) - 1, j    , img->mb_size[IS_CHROMA], &block_a);
  279.     get4x4Neighbour(currMB, (i << 2),     j - 1, img->mb_size[IS_CHROMA], &block_b);
  280.     if (u_ac||v_ac)
  281.     {
  282.       if (block_a.available)
  283.         bit_pos_a = (block_a.y << 2) + block_a.x;
  284.       if (block_b.available)
  285.         bit_pos_b = (block_b.y << 2) + block_b.x;
  286.     }
  287.   }
  288.   bit = (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 35);
  289.   if (enc_picture->chroma_format_idc!=YUV444 || IS_INDEPENDENT(params))
  290.   {
  291.     if (type!=LUMA_8x8)
  292.     {
  293.       if (block_b.available)
  294.       {
  295.         if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
  296.           upper_bit = 1;
  297.         else
  298.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[0],bit+bit_pos_b);
  299.       }
  300.       if (block_a.available)
  301.       {
  302.         if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
  303.           left_bit = 1;
  304.         else
  305.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[0],bit+bit_pos_a);
  306.       }
  307.       ctx = 2*upper_bit+left_bit;
  308.       //===== encode symbol =====
  309.       estBits = cabacEstBits->blockCbpBits[ctx][0] - cabacEstBits->blockCbpBits[ctx][1];
  310.     }
  311.   }
  312.   else 
  313.   {
  314.     if (block_b.available)
  315.     {
  316.       if(img->mb_data[block_b.mb_addr].mb_type == IPCM)
  317.         upper_bit=1;
  318.       else
  319.       {
  320.         if(type==LUMA_8x8)
  321.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[0], bit + bit_pos_b);
  322.         else if (type==CB_8x8)
  323.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[1], bit + bit_pos_b);
  324.         else if (type==CR_8x8)
  325.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits_8x8[2], bit + bit_pos_b);
  326.         else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
  327.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[1], bit + bit_pos_b);
  328.         else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
  329.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[2], bit + bit_pos_b);
  330.         else
  331.           upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits[0], bit + bit_pos_b);
  332.       }
  333.     }
  334.     if (block_a.available)
  335.     {
  336.       if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
  337.         left_bit = 1;
  338.       else
  339.       {
  340.         if(type==LUMA_8x8)
  341.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[0],bit + bit_pos_a);
  342.         else if (type==CB_8x8)
  343.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[1],bit + bit_pos_a);
  344.         else if (type==CR_8x8)
  345.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits_8x8[2],bit + bit_pos_a);
  346.         else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
  347.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[1],bit + bit_pos_a);
  348.         else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
  349.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[2],bit + bit_pos_a);
  350.         else
  351.           left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits[0],bit + bit_pos_a);
  352.       }
  353.     }
  354.     ctx = 2*upper_bit+left_bit;
  355.     //===== encode symbol =====
  356.     estBits = cabacEstBits->blockCbpBits[ctx][0] - cabacEstBits->blockCbpBits[ctx][1];
  357.   }
  358.   return(estBits);
  359. }
  360. /*!
  361. ****************************************************************************
  362. * brief
  363. *    Rate distortion optimized trellis quantization
  364. ****************************************************************************
  365. */
  366. void est_writeRunLevel_CABAC(levelDataStruct levelData[], int levelTabMin[], int type, double lambda, int kInit, int kStop, 
  367.                              int noCoeff, int estCBP)
  368. {
  369.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  370.   int   k, i;
  371.   int   estBits;
  372.   double lagr, lagrMin=0, lagrTabMin, lagrTab;
  373.   int   c1 = 1, c2 = 0, c1Tab[3], c2Tab[3];
  374.   int   iBest, levelTab[64];
  375.   int   ctx, greater_one, last, maxK = maxpos[type];
  376.   double   lagrAcc, lagrLastMin=0, lagrLast;
  377.   int      kBest=0, kStart, first;
  378.   levelDataStruct *dataLevel;
  379.   for (k = 0; k <= maxK; k++)
  380.   {
  381.     levelTabMin[k] = 0;
  382.   }
  383.   if (noCoeff > 0)
  384.   {
  385.     if (noCoeff > 1)
  386.     {
  387.       kStart = kInit; kBest = 0; first = 1; 
  388.       lagrAcc = 0; 
  389.       for (k = kStart; k <= kStop; k++)
  390.       {
  391.         lagrAcc += levelData[k].errLevel[0];
  392.       }
  393.       if (levelData[kStart].noLevels > 2)
  394.       { 
  395.         lagrAcc -= levelData[kStart].errLevel[0];
  396.         lagrLastMin=lambda * (cabacEstBits->lastBits[pos2ctx_last[type][kStart]][1] - cabacEstBits->lastBits[pos2ctx_last[type][kStart]][0]) + lagrAcc;
  397.         kBest = kStart;
  398.         kStart++;
  399.         first = 0;
  400.       }
  401.       for (k = kStart; k <= kStop; k++)
  402.       {
  403.         dataLevel = &levelData[k];
  404.         lagrMin  = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
  405.         lagrAcc -= dataLevel->errLevel[0];
  406.         if (dataLevel->noLevels > 1)
  407.         { 
  408.           estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1]+
  409.             cabacEstBits->greaterOneBits[0][4][0];
  410.           lagrLast = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][1]) + lagrAcc;
  411.           lagr     = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][0]);
  412.           lagrMin = (lagr < lagrMin) ? lagr : lagrMin;
  413.           if (lagrLast < lagrLastMin || first==1)
  414.           {
  415.             kBest = k;
  416.             first = 0;
  417.             lagrLastMin = lagrLast;
  418.           }
  419.         }
  420.         lagrAcc += lagrMin;
  421.       }
  422.       kStart = kBest;
  423.     }
  424.     else
  425.     {
  426.       kStart = kStop;
  427.     }
  428.     lagrTabMin = 0;
  429.     for (k = 0; k <= kStart; k++)
  430.     {
  431.       lagrTabMin += levelData[k].errLevel[0];
  432.     }
  433.     // Initial Lagrangian calculation
  434.     lagrTab=0;
  435.     //////////////////////////
  436.     lagrTabMin += (lambda*estCBP);
  437.     iBest = 0; first = 1;
  438.     for (k = kStart; k >= 0; k--)
  439.     {
  440.       dataLevel = &levelData[k];
  441.       last = (k == kStart);
  442.       if (!last)
  443.       {
  444.         lagrMin = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
  445.         iBest = 0;
  446.         first = 0;
  447.       }
  448.       for (i = 1; i < dataLevel->noLevels; i++)
  449.       {
  450.         estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1];
  451.         estBits += cabacEstBits->lastBits[pos2ctx_last[type][k]][last];
  452.         // greater than 1
  453.         greater_one = (dataLevel->level[i] > 1);
  454.         c1Tab[i] = c1;   
  455.         c2Tab[i] = c2;
  456.         ctx = imin(c1Tab[i], 4);  
  457.         estBits += cabacEstBits->greaterOneBits[0][ctx][greater_one];
  458.         // magnitude if greater than 1
  459.         if (greater_one)
  460.         {
  461.           ctx = imin(c2Tab[i], max_c2[type]);
  462.           if ( (dataLevel->level[i] - 2) < MAX_PREC_COEFF)
  463.           {
  464.             estBits += precalcUnaryLevelTab[cabacEstBits->greaterOneState[ctx]][dataLevel->level[i] - 2];
  465.           }
  466.           else
  467.           {
  468.             estBits += est_unary_exp_golomb_level_encode(dataLevel->level[i] - 2, ctx, type);
  469.           }
  470.           c1Tab[i] = 0;
  471.           c2Tab[i]++;
  472.         }
  473.         else if (c1Tab[i])
  474.         {
  475.           c1Tab[i]++;
  476.         }
  477.         lagr = dataLevel->errLevel[i] + lambda*estBits;
  478.         if (lagr<lagrMin || first==1)
  479.         {
  480.           iBest = i;
  481.           lagrMin=lagr;
  482.           first = 0;
  483.         }
  484.       }
  485.       if (iBest>0)
  486.       {
  487.         c1 = c1Tab[iBest]; 
  488.         c2 = c2Tab[iBest];
  489.       }
  490.       levelTab[k] = dataLevel->level[iBest];
  491.       lagrTab += lagrMin;
  492.     }
  493.     ///////////////////////////////////
  494.     if (lagrTab < lagrTabMin)
  495.     {
  496.       memcpy(levelTabMin, levelTab, (kStart + 1) * sizeof(int));
  497.     }
  498.   }
  499. }
  500. /*!
  501. ****************************************************************************
  502. * brief
  503. *    estimate unary exp golomb bit cost
  504. ****************************************************************************
  505. */
  506. int est_unary_exp_golomb_level_encode(unsigned int symbol, int ctx, int type)
  507. {
  508.   estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
  509.   unsigned int l = symbol, k = 1;
  510.   unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
  511.   int estBits;
  512.   if (symbol==0)
  513.   {
  514.     estBits = cabacEstBits->greaterOneBits[1][ctx][0];
  515.     return (estBits);
  516.   }
  517.   else
  518.   {
  519.     estBits = cabacEstBits->greaterOneBits[1][ctx][1];
  520.     // this could be done using min of the two conditionals * value
  521.     while (((--l)>0) && (++k <= exp_start))
  522.     {
  523.       estBits += cabacEstBits->greaterOneBits[1][ctx][1];
  524.     }
  525.     
  526.     if (symbol < exp_start)
  527.     {
  528.       estBits += cabacEstBits->greaterOneBits[1][ctx][0];
  529.     }
  530.     else 
  531.     {
  532.       estBits+=est_exp_golomb_encode_eq_prob(symbol - exp_start);
  533.     }
  534.   }
  535.   return(estBits);
  536. }
  537. /*!
  538. ****************************************************************************
  539. * brief
  540. *    Initialize levelData 
  541. ****************************************************************************
  542. */
  543. int init_trellis_data_4x4_CABAC(int (*tblock)[16], int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,  
  544.                       levelDataStruct *dataLevel, int* kStart, int* kStop, int type)
  545. {
  546.   int noCoeff = 0;
  547.   int i, j, coeff_ctr;
  548.   static int *m7;
  549.   int end_coeff_ctr = ( ( type == LUMA_4x4 ) ? 16 : 15 );
  550.   int q_bits = Q_BITS + qp_per; 
  551.   int q_offset = ( 1 << (q_bits - 1) );
  552.   int level, lowerInt, k;
  553.   double err, estErr;
  554.   
  555.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  556.   {
  557.     i = *p_scan++;  // horizontal position
  558.     j = *p_scan++;  // vertical position
  559.     m7 = &tblock[j][block_x + i];
  560.     if (*m7 == 0)
  561.     {
  562.       dataLevel->levelDouble = 0;
  563.       dataLevel->level[0] = 0;
  564.       dataLevel->noLevels = 1;
  565.       err = 0.0;
  566.       dataLevel->errLevel[0] = 0.0;
  567.     }
  568.     else
  569.     {
  570.       estErr = ((double) estErr4x4[qp_rem][j][i]) / norm_factor_4x4;
  571.       dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
  572.       level = (dataLevel->levelDouble >> q_bits);
  573.       lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
  574.       dataLevel->level[0] = 0; 
  575.       if (level == 0 && lowerInt == 1)
  576.       {
  577.         dataLevel->noLevels = 1;
  578.       }
  579.       else if (level == 0 && lowerInt == 0)
  580.       {
  581.         dataLevel->level[1] = 1;
  582.         dataLevel->noLevels = 2;
  583.         *kStop = coeff_ctr;
  584.         noCoeff++;
  585.       }
  586.       else if (level > 0 && lowerInt == 1)
  587.       {
  588.         dataLevel->level[1] = level;
  589.         dataLevel->noLevels = 2;
  590.         *kStop = coeff_ctr;
  591.         noCoeff++;
  592.       }
  593.       else
  594.       {
  595.         dataLevel->level[1] = level;
  596.         dataLevel->level[2] = level + 1;
  597.         dataLevel->noLevels = 3;
  598.         *kStop  = coeff_ctr;
  599.         *kStart = coeff_ctr;
  600.         noCoeff++;
  601.       }
  602.       for (k = 0; k < dataLevel->noLevels; k++)
  603.       {
  604.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  605.         dataLevel->errLevel[k] = (err * err * estErr); 
  606.       }
  607.     }
  608.     dataLevel++;
  609.   }
  610.   return (noCoeff);
  611. }
  612. /*
  613. ****************************************************************************
  614. * brief
  615. *    Initialize levelData 
  616. ****************************************************************************
  617. */
  618. int init_trellis_data_8x8_CABAC(int (*tblock)[16], int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,  
  619.                       levelDataStruct *dataLevel, int* kStart, int* kStop, int symbolmode)
  620. {
  621.   int noCoeff = 0;
  622.   static int *m7;
  623.   int i, j, coeff_ctr, end_coeff_ctr = 64;
  624.   int q_bits = Q_BITS_8 + qp_per;
  625.   int q_offset = ( 1 << (q_bits - 1) );
  626.   double err, estErr; 
  627.   int level, lowerInt, k;
  628.   
  629.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  630.   {
  631.     i = *p_scan++;  // horizontal position
  632.     j = *p_scan++;  // vertical position
  633.     
  634.     m7 = &tblock[j][block_x + i];
  635.     if (*m7 == 0)
  636.     {
  637.       dataLevel->levelDouble = 0;
  638.       dataLevel->level[0] = 0;
  639.       dataLevel->noLevels = 1;
  640.       err = 0.0;
  641.       dataLevel->errLevel[0] = 0.0;
  642.     }
  643.     else
  644.     {
  645.       estErr = (double) estErr8x8[qp_rem][j][i] / norm_factor_8x8;
  646.       dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
  647.       level = (dataLevel->levelDouble >> q_bits);
  648.       lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
  649.       dataLevel->level[0] = 0;
  650.       if (level == 0 && lowerInt == 1)
  651.       {
  652.         dataLevel->noLevels = 1;
  653.       }
  654.       else if (level == 0 && lowerInt == 0)
  655.       {
  656.         dataLevel->level[1] = 1;
  657.         dataLevel->noLevels = 2;
  658.         *kStop = coeff_ctr;
  659.         noCoeff++;
  660.       }
  661.       else if (level > 0 && lowerInt == 1)
  662.       {
  663.         dataLevel->level[1] = level;
  664.         dataLevel->noLevels = 2;
  665.         *kStop = coeff_ctr;
  666.         noCoeff++;
  667.       }
  668.       else
  669.       {
  670.         dataLevel->level[1] = level;
  671.         dataLevel->level[2] = level + 1;
  672.         dataLevel->noLevels = 3;
  673.         *kStop  = coeff_ctr;
  674.         *kStart = coeff_ctr;
  675.         noCoeff++;
  676.       }
  677.       for (k = 0; k < dataLevel->noLevels; k++)
  678.       {
  679.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  680.         dataLevel->errLevel[k] = err * err * estErr; 
  681.       }
  682.     }
  683.  
  684.     dataLevel++;
  685.   }
  686.   return (noCoeff);
  687. }
  688. /*!
  689. ****************************************************************************
  690. * brief
  691. *    Initialize levelData for Luma DC
  692. ****************************************************************************
  693. */
  694. int init_trellis_data_DC_CABAC(int (*tblock)[4], int qp_per, int qp_rem, 
  695.                          int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,  
  696.                          levelDataStruct *dataLevel, int* kStart, int* kStop)
  697. {
  698.   int noCoeff = 0;
  699.   int i, j, coeff_ctr, end_coeff_ctr = 16;
  700.   int q_bits   = Q_BITS + qp_per + 1; 
  701.   int q_offset = ( 1 << (q_bits - 1) );
  702.   int level, lowerInt, k;
  703.   int *m7;
  704.   double err, estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4; // note that we could also use int64
  705.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  706.   {
  707.     i = *p_scan++;  // horizontal position
  708.     j = *p_scan++;  // vertical position
  709.     m7 = &tblock[j][i];
  710.     if (*m7 == 0)
  711.     {
  712.       dataLevel->levelDouble = 0;
  713.       dataLevel->level[0] = 0;
  714.       dataLevel->noLevels = 1;
  715.       err = 0.0;
  716.       dataLevel->errLevel[0] = 0.0;
  717.     }
  718.     else
  719.     {
  720.       dataLevel->levelDouble = iabs(*m7 * levelscale);
  721.       level = (dataLevel->levelDouble >> q_bits);
  722.       lowerInt=( ((int)dataLevel->levelDouble - (level<<q_bits)) < q_offset )? 1 : 0;
  723.       dataLevel->level[0] = 0;    
  724.       if (level == 0 && lowerInt == 1)
  725.       {
  726.         dataLevel->noLevels = 1;
  727.       }
  728.       else if (level == 0 && lowerInt == 0)
  729.       {
  730.         dataLevel->level[1] = 1;
  731.         dataLevel->noLevels = 2;
  732.         *kStop = coeff_ctr;
  733.         noCoeff++;
  734.       }
  735.       else if (level > 0 && lowerInt == 1)
  736.       {
  737.         dataLevel->level[1] = level;
  738.         dataLevel->noLevels = 2;
  739.         *kStop = coeff_ctr;
  740.         noCoeff++;
  741.       }
  742.       else
  743.       {
  744.         dataLevel->level[1] = level;
  745.         dataLevel->level[2] = level + 1;
  746.         dataLevel->noLevels = 3;
  747.         *kStop  = coeff_ctr;
  748.         *kStart = coeff_ctr;
  749.         noCoeff++;
  750.       }
  751.       for (k = 0; k < dataLevel->noLevels; k++)
  752.       {
  753.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  754.         dataLevel->errLevel[k] = (err * err * estErr); 
  755.       }
  756.     }
  757.     dataLevel++;
  758.   }
  759.   return (noCoeff);
  760. }