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

Audio

开发平台:

Visual C++

  1. /*!
  2. *************************************************************************************
  3. * file rdoq_cavlc.c
  4. *
  5. * brief
  6. *    Rate Distortion Optimized Quantization based on VCEG-AH21 related to CAVLC
  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. extern const int estErr4x4[6][4][4];
  20. extern const int estErr8x8[6][8][8];
  21. extern const byte SNGL_SCAN[16][2]; // need to revisit
  22. extern const byte FIELD_SCAN[16][2]; 
  23. /*!
  24. ************************************************************************
  25. * brief
  26. *    estimate VLC for Coeff Level
  27. ************************************************************************
  28. */
  29. int estSyntaxElement_Level_VLC1(SyntaxElement *se)
  30. {
  31.   int level  = se->value1;
  32.   int sign   = (level < 0 ? 1 : 0);
  33.   int levabs = iabs(level);
  34.   if (levabs < 8)
  35.   {
  36.     se->len = levabs * 2 + sign - 1;
  37.   }
  38.   else if (levabs < 16)
  39.   {
  40.     // escape code1
  41.     se->len = 19;
  42.   }
  43.   else
  44.   {
  45.     // escape code2
  46.     se->len = 28;
  47.   }
  48.   return (se->len);
  49. }
  50. /*!
  51. ************************************************************************
  52. * brief
  53. *    estimate VLC for Coeff Level
  54. ************************************************************************
  55. */
  56. int estSyntaxElement_Level_VLCN(SyntaxElement *se, int vlc)//, DataPartition *this_dataPart)
  57. {
  58.   int level = se->value1;
  59.   int levabs = iabs(level) - 1;  
  60.   int shift = vlc - 1;
  61.   int escape = (15 << shift);
  62.   if (levabs < escape)
  63.   {
  64.     se->len = ((levabs) >> shift) + 1 + vlc;
  65.   }
  66.   else
  67.   {
  68.     se->len = 28;
  69.   }
  70.   return (se->len);
  71. }
  72. int cmp(const void *arg1, const void *arg2)
  73. {
  74.   return (((levelDataStruct *)arg2)->levelDouble - ((levelDataStruct *)arg1)->levelDouble);
  75. }
  76. /*!
  77. ************************************************************************
  78. * brief
  79. *    estimate CAVLC bits
  80. ************************************************************************
  81. */
  82. int est_CAVLC_bits (levelDataStruct *levelData, int level_to_enc[16], int sign_to_enc[16], int nnz, int block_type)
  83. {
  84.   int           no_bits    = 0;
  85.   SyntaxElement se;
  86.   int coeff_ctr, scan_pos = 0;
  87.   int k, level = 1, run = -1, vlcnum;
  88.   int numcoeff = 0, lastcoeff = 0, numtrailingones = 0; 
  89.   int numones = 0, totzeros = 0, zerosleft, numcoef;
  90.   int numcoeff_vlc;
  91.   int level_two_or_higher;
  92.   int max_coeff_num = 0, cdc = (block_type == CHROMA_DC ? 1 : 0);
  93.   int yuv = img->yuv_format - 1;
  94.   static const int incVlc[] = {0, 3, 6, 12, 24, 48, 32768};  // maximum vlc = 6
  95.   int  pLevel[16] = {0};
  96.   int  pRun[16] = {0};
  97.   static const int Token_lentab[3][4][17] = 
  98.   {
  99.     {
  100.       { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
  101.       { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
  102.       { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
  103.       { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}
  104.     },
  105.     {                                                  
  106.       { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
  107.       { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
  108.       { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
  109.       { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14}
  110.     },
  111.     {                                                  
  112.       { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
  113.       { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
  114.       { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
  115.       { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10}
  116.     }
  117.   };
  118.   static const int Totalzeros_lentab[TOTRUN_NUM][16] = 
  119.   {
  120.     { 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},  
  121.     { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},  
  122.     { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},  
  123.     { 5,3,4,4,3,3,3,4,3,4,5,5,5},  
  124.     { 4,4,4,3,3,3,3,3,4,5,4,5},  
  125.     { 6,5,3,3,3,3,3,3,4,3,6},  
  126.     { 6,5,3,3,3,2,3,4,3,6},  
  127.     { 6,4,5,3,2,2,3,3,6},  
  128.     { 6,6,4,2,2,3,2,5},  
  129.     { 5,5,3,2,2,2,4},  
  130.     { 4,4,3,3,1,3},  
  131.     { 4,4,2,1,3},  
  132.     { 3,3,1,2},  
  133.     { 2,2,1},  
  134.     { 1,1},  
  135.   };
  136.   static const int Run_lentab[TOTRUN_NUM][16] = 
  137.   {
  138.     {1,1},
  139.     {1,2,2},
  140.     {2,2,2,2},
  141.     {2,2,2,3,3},
  142.     {2,2,3,3,3,3},
  143.     {2,3,3,3,3,3,3},
  144.     {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
  145.   };
  146.   static const int Token_lentab_cdc[3][4][17] =
  147.   {
  148.     //YUV420
  149.    {{ 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  150.     { 0, 1, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  151.     { 0, 0, 3, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  152.     { 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
  153.     //YUV422
  154.    {{ 1, 7, 7, 9, 9,10,11,12,13, 0, 0, 0, 0, 0, 0, 0, 0},
  155.     { 0, 2, 7, 7, 9,10,11,12,12, 0, 0, 0, 0, 0, 0, 0, 0},
  156.     { 0, 0, 3, 7, 7, 9,10,11,12, 0, 0, 0, 0, 0, 0, 0, 0},
  157.     { 0, 0, 0, 5, 6, 7, 7,10,11, 0, 0, 0, 0, 0, 0, 0, 0}},
  158.     //YUV444
  159.    {{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
  160.     { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
  161.     { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
  162.     { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}}
  163.   };
  164.   static const int Totalzeros_lentab_cdc[3][TOTRUN_NUM][16] =
  165.   {
  166.     //YUV420
  167.    {{ 1,2,3,3},
  168.     { 1,2,2},
  169.     { 1,1}},
  170.     //YUV422
  171.    {{ 1,3,3,4,4,4,5,5},
  172.     { 3,2,3,3,3,3,3},
  173.     { 3,3,2,2,3,3},
  174.     { 3,2,2,2,3},
  175.     { 2,2,2,2},
  176.     { 2,2,1},
  177.     { 1,1}},
  178.     //YUV444
  179.    {{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
  180.     { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
  181.     { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
  182.     { 5,3,4,4,3,3,3,4,3,4,5,5,5},
  183.     { 4,4,4,3,3,3,3,3,4,5,4,5},
  184.     { 6,5,3,3,3,3,3,3,4,3,6},
  185.     { 6,5,3,3,3,2,3,4,3,6},
  186.     { 6,4,5,3,2,2,3,3,6},
  187.     { 6,6,4,2,2,3,2,5},
  188.     { 5,5,3,2,2,2,4},
  189.     { 4,4,3,3,1,3},
  190.     { 4,4,2,1,3},
  191.     { 3,3,1,2},
  192.     { 2,2,1},
  193.     { 1,1}}
  194.   };
  195.   max_coeff_num = ( (block_type == CHROMA_DC) ? img->num_cdc_coeff : 
  196.   ( (block_type == LUMA_INTRA16x16AC || block_type == CB_INTRA16x16AC || block_type == CR_INTRA16x16AC || block_type == CHROMA_AC) ? 15 : 16) );
  197.   //convert zigzag scan to (run, level) pairs
  198.   for (coeff_ctr = 0; coeff_ctr < max_coeff_num; coeff_ctr++)
  199.   {
  200.     run++;
  201.     level = level_to_enc[coeff_ctr];
  202.     if (level != 0)
  203.     {
  204.       pLevel[scan_pos] = isignab(level, sign_to_enc[coeff_ctr]);
  205.       pRun  [scan_pos] = run;
  206.       ++scan_pos;
  207.       run = -1;                     // reset zero level counter
  208.     }
  209.   }
  210.   level = 1;
  211.   for(k = 0; (k < max_coeff_num) && level != 0; k++)    
  212.   {
  213.     level = pLevel[k]; // level
  214.     run   = pRun[k];   // run
  215.     if (level)
  216.     {
  217.       totzeros += run; // lets add run always (even if zero) to avoid conditional
  218.       if (iabs(level) == 1)
  219.       {
  220.         numones ++;
  221.         numtrailingones ++;
  222.         numtrailingones = imin(numtrailingones, 3); // clip to 3
  223.       }
  224.       else
  225.       {
  226.         numtrailingones = 0;
  227.       }
  228.       numcoeff ++;
  229.       lastcoeff = k;
  230.     }
  231.   }
  232.   if (!cdc)
  233.   {
  234.     if (nnz < 2)
  235.     {
  236.       numcoeff_vlc = 0;
  237.     }
  238.     else if (nnz < 4)
  239.     {
  240.       numcoeff_vlc = 1;
  241.     }
  242.     else if (nnz < 8)
  243.     {
  244.       numcoeff_vlc = 2;
  245.     }
  246.     else 
  247.     {
  248.       numcoeff_vlc = 3;
  249.     }
  250.   }
  251.   else
  252.   {
  253.     // chroma DC (has its own VLC)
  254.     // numcoeff_vlc not relevant
  255.     numcoeff_vlc = 0;
  256.   }
  257.   se.value1 = numcoeff;
  258.   se.value2 = numtrailingones;
  259.   se.len    = numcoeff_vlc; /* use len to pass vlcnum */
  260.   if (!cdc)
  261.   {
  262.     if (se.len == 3)
  263.       no_bits += 6;  // 4 + 2 bit FLC
  264.     else
  265.       no_bits += Token_lentab[se.len][se.value2][se.value1];
  266.   }
  267.   else
  268.     no_bits += Token_lentab_cdc[yuv][se.value2][se.value1];  
  269.   if (!numcoeff)
  270.     return no_bits;
  271.   else
  272.   {
  273.     if (numtrailingones)
  274.       no_bits += numtrailingones;
  275.     // encode levels
  276.     level_two_or_higher = (numcoeff > 3 && numtrailingones == 3) ? 0 : 1;
  277.     vlcnum = (numcoeff > 10 && numtrailingones < 3) ? 1 : 0;
  278.     for (k = lastcoeff - numtrailingones; k >= 0; k--)
  279.     {
  280.       level = pLevel[k]; // level
  281.       se.value1 = level;
  282.       if (level_two_or_higher)
  283.       {
  284.         level_two_or_higher = 0;
  285.         if (se.value1 > 0)
  286.           se.value1 --;
  287.         else
  288.           se.value1 ++;
  289.       }
  290.       //    encode level
  291.       if (vlcnum == 0)
  292.         estSyntaxElement_Level_VLC1(&se);
  293.       else
  294.         estSyntaxElement_Level_VLCN(&se, vlcnum);
  295.       // update VLC table
  296.       if (iabs(level) > incVlc[vlcnum])
  297.         vlcnum++;
  298.       if ((k == lastcoeff - numtrailingones) && iabs(level) > 3)
  299.         vlcnum = 2;
  300.       no_bits  += se.len;
  301.     }
  302.     // encode total zeroes
  303.     if (numcoeff < max_coeff_num)
  304.     {
  305.       se.value1 = totzeros;
  306.       vlcnum = numcoeff-1;
  307.       se.len = vlcnum;
  308.       if (!cdc)
  309.         no_bits += Totalzeros_lentab[se.len][se.value1];
  310.       else
  311.         no_bits += Totalzeros_lentab_cdc[yuv][se.len][se.value1];
  312.     }
  313.     // encode run before each coefficient
  314.     zerosleft = totzeros;
  315.     numcoef = numcoeff;
  316.     for (k = lastcoeff; k >= 0; k--)
  317.     {
  318.       run = pRun[k]; // run
  319.       se.value1 = run;
  320.       // for last coeff, run is remaining totzeros
  321.       // when zerosleft is zero, remaining coeffs have 0 run
  322.       if ((!zerosleft) || (numcoeff <= 1 ))
  323.         break;
  324.       if (numcoef > 1 && zerosleft) 
  325.       {
  326.         vlcnum = imin(zerosleft - 1, RUNBEFORE_NUM_M1);
  327.         se.len = vlcnum;
  328.         no_bits += Run_lentab[se.len][se.value1];
  329.         zerosleft -= run;
  330.         numcoef --;
  331.       }
  332.     }
  333.   }
  334.   return no_bits;
  335. }
  336. /*!
  337. ****************************************************************************
  338. * brief
  339. *    estimate run and level for CAVLC 
  340. ****************************************************************************
  341. */
  342. void est_RunLevel_CAVLC(levelDataStruct *levelData, int *levelTrellis, int block_type, 
  343.                         int b8, int b4, int coeff_num, double lambda)
  344. {
  345.   int k, lastnonzero = -1, coeff_ctr;
  346.   int level_to_enc[16] = {0}, sign_to_enc[16] = {0};
  347.   int cstat, bestcstat = 0; 
  348.   int nz_coeff=0;
  349.   double lagr, lagrAcc = 0, minlagr = 0;
  350.   int subblock_x = ((b8&0x1)==0)?(((b4&0x1)==0)?0:1):(((b4&0x1)==0)?2:3); 
  351.   // horiz. position for coeff_count context  
  352.   int subblock_y = (b8<2)?((b4<2)?0:1):((b4<2)?2:3); 
  353.   // vert.  position for coeff_count context      
  354.   int nnz; 
  355.   levelDataStruct *dataLevel = &levelData[0];
  356.   if (block_type != CHROMA_AC)
  357.     nnz = predict_nnz(&img->mb_data[img->current_mb_nr], LUMA, subblock_x,subblock_y); 
  358.   else
  359.     nnz = predict_nnz_chroma(&img->mb_data[img->current_mb_nr], img->subblock_x, img->subblock_y+4);
  360.   for (coeff_ctr=0;coeff_ctr < coeff_num;coeff_ctr++)
  361.   {  
  362.     levelTrellis[coeff_ctr] = 0;
  363.     for(k=0; k < dataLevel->noLevels; k++)
  364.     {
  365.       dataLevel->errLevel[k] /= 32768;
  366.     }
  367.     lagrAcc += dataLevel->errLevel[dataLevel->noLevels - 1];
  368.     level_to_enc[coeff_ctr] = dataLevel->pre_level;
  369.     sign_to_enc[coeff_ctr] = dataLevel->sign;
  370.     if(dataLevel->noLevels > 1)
  371.     {
  372.       dataLevel->coeff_ctr = coeff_ctr;
  373.       lastnonzero = coeff_ctr;
  374.     }
  375.     else
  376.       dataLevel->coeff_ctr = -1;
  377.     dataLevel++;
  378.   }
  379.   if(lastnonzero != -1)
  380.   {
  381.     //sort the coefficients based on their absolute value
  382.     qsort(levelData, lastnonzero + 1, sizeof(levelDataStruct), cmp);
  383.     dataLevel = &levelData[lastnonzero];
  384.     for(coeff_ctr = lastnonzero; coeff_ctr >= 0; coeff_ctr--) // go over all coeff
  385.     {
  386.       if(dataLevel->noLevels == 1)
  387.       {
  388.         dataLevel--;
  389.         continue;
  390.       }
  391.       lagrAcc -= dataLevel->errLevel[dataLevel->noLevels-1];
  392.       for(cstat=0; cstat<dataLevel->noLevels; cstat++) // go over all states of cur coeff k
  393.       {
  394.         level_to_enc[dataLevel->coeff_ctr] = dataLevel->level[cstat];
  395.         lagr = lagrAcc + dataLevel->errLevel[cstat];
  396.         lagr += lambda * est_CAVLC_bits(levelData, level_to_enc, sign_to_enc, nnz, block_type);
  397.         if(cstat==0 || lagr<minlagr)
  398.         {
  399.           minlagr = lagr;
  400.           bestcstat = cstat;
  401.         }
  402.       }
  403.       lagrAcc += dataLevel->errLevel[bestcstat];
  404.       level_to_enc[dataLevel->coeff_ctr] = dataLevel->level[bestcstat];
  405.       dataLevel--;
  406.     }
  407.     for(coeff_ctr = 0; coeff_ctr <= lastnonzero; coeff_ctr++)
  408.     {
  409.       levelTrellis[coeff_ctr] = level_to_enc[coeff_ctr];
  410.       if (level_to_enc[coeff_ctr] != 0)
  411.         nz_coeff++;
  412.     }
  413.   }
  414.   img->nz_coeff [img->current_mb_nr ][subblock_x][subblock_y] = nz_coeff;
  415. }
  416. /*!
  417. ****************************************************************************
  418. * brief
  419. *    Initialize levelData 
  420. ****************************************************************************
  421. */
  422. void init_trellis_data_4x4_CAVLC(int (*tblock)[16], int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, 
  423.                                  const byte *p_scan, Macroblock *currMB, levelDataStruct *dataLevel, int type)
  424. {
  425.   int i, j, coeff_ctr; 
  426.   static int *m7;
  427.   int end_coeff_ctr = ( ( type == LUMA_4x4 ) ? 16 : 15 );
  428.   int q_bits = Q_BITS + qp_per; 
  429.   int q_offset = ( 1 << (q_bits - 1) );
  430.   int level, lowerInt, k;
  431.   double err, estErr;
  432.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  433.   {
  434.     i = *p_scan++;  // horizontal position
  435.     j = *p_scan++;  // vertical position
  436.     m7 = &tblock[j][block_x + i];
  437.     if (*m7 == 0)
  438.     {
  439.       dataLevel->levelDouble = 0;
  440.       dataLevel->level[0] = 0;
  441.       dataLevel->noLevels = 1;
  442.       err = 0.0;
  443.       dataLevel->errLevel[0] = 0.0;
  444.       dataLevel->pre_level = 0;
  445.       dataLevel->sign = 0;
  446.     }
  447.     else
  448.     {
  449.       estErr = ((double) estErr4x4[qp_rem][j][i]) / norm_factor_4x4;
  450.       dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
  451.       level = (dataLevel->levelDouble >> q_bits);
  452.       lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
  453.       
  454.       dataLevel->level[0] = 0;
  455.       if (level == 0 && lowerInt == 1)
  456.       {
  457.         dataLevel->noLevels = 1;
  458.       }
  459.       else if (level == 0 && lowerInt == 0)
  460.       {
  461.         dataLevel->level[1] = 1;
  462.         dataLevel->noLevels = 2;
  463.       }
  464.       else if (level > 0 && lowerInt == 1)
  465.       {
  466.         dataLevel->level[1] = level;
  467.         dataLevel->noLevels = 2;
  468.       }
  469.       else
  470.       {
  471.         dataLevel->level[1] = level;
  472.         dataLevel->level[2] = level + 1;
  473.         dataLevel->noLevels = 3;
  474.       }
  475.       for (k = 0; k < dataLevel->noLevels; k++)
  476.       {
  477.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  478.         dataLevel->errLevel[k] = (err * err * estErr); 
  479.       }
  480.       if(dataLevel->noLevels == 1)
  481.         dataLevel->pre_level = 0;
  482.       else
  483.         dataLevel->pre_level = (iabs (*m7) * levelscale[j][i] + leveloffset[j][i]) >> q_bits;
  484.       dataLevel->sign = isign(*m7);
  485.     }
  486.     dataLevel++;
  487.   }
  488. }
  489. /*!
  490. ****************************************************************************
  491. * brief
  492. *    Initialize levelData for Luma DC
  493. ****************************************************************************
  494. */
  495. void init_trellis_data_DC_CAVLC(int (*tblock)[4], int qp_per, int qp_rem, 
  496.                          int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,  
  497.                          levelDataStruct *dataLevel, int type)
  498. {
  499.   int i, j, coeff_ctr, end_coeff_ctr = 16;
  500.   int q_bits   = Q_BITS + qp_per + 1; 
  501.   int q_offset = ( 1 << (q_bits - 1) );
  502.   int level, lowerInt, k;
  503.   int *m7;
  504.   double err, estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4; // note that we could also use int64
  505.   for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
  506.   {
  507.     i = *p_scan++;  // horizontal position
  508.     j = *p_scan++;  // vertical position
  509.     m7 = &tblock[j][i];
  510.     if (*m7 == 0)
  511.     {
  512.       dataLevel->levelDouble = 0;
  513.       dataLevel->level[0] = 0;
  514.       dataLevel->noLevels = 1;
  515.       err = 0.0;
  516.       dataLevel->errLevel[0] = 0.0;
  517.       dataLevel->pre_level = 0;
  518.       dataLevel->sign = 0;
  519.     }
  520.     else
  521.     {
  522.       dataLevel->levelDouble = iabs(*m7 * levelscale);
  523.       level = (dataLevel->levelDouble >> q_bits);
  524.       lowerInt=( ((int)dataLevel->levelDouble - (level<<q_bits)) < q_offset )? 1 : 0;
  525.       dataLevel->level[0] = 0;    
  526.       if (level == 0 && lowerInt == 1)
  527.       {
  528.         dataLevel->noLevels = 1;
  529.       }
  530.       else if (level == 0 && lowerInt == 0)
  531.       {
  532.         dataLevel->level[1] = 1;
  533.         dataLevel->noLevels = 2;
  534.       }
  535.       else if (level > 0 && lowerInt == 1)
  536.       {
  537.         dataLevel->level[1] = level;
  538.         dataLevel->noLevels = 2;
  539.       }
  540.       else
  541.       {
  542.         dataLevel->level[1] = level;
  543.         dataLevel->level[2] = level + 1;
  544.         dataLevel->noLevels = 3;
  545.       }
  546.       for (k = 0; k < dataLevel->noLevels; k++)
  547.       {
  548.         err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  549.         dataLevel->errLevel[k] = (err * err * estErr); 
  550.       }
  551.       if(dataLevel->noLevels == 1)
  552.         dataLevel->pre_level = 0;
  553.       else
  554.         dataLevel->pre_level = (iabs (*m7) * levelscale + leveloffset) >> q_bits;
  555.       dataLevel->sign = isign(*m7);
  556.     }
  557.     dataLevel++;
  558.   }
  559. }
  560. /*!
  561. ****************************************************************************
  562. * brief
  563. *    Initialize levelData 
  564. ****************************************************************************
  565. */
  566. void init_trellis_data_8x8_CAVLC(int (*tblock)[16], int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, 
  567.                                  const byte *p_scan, Macroblock *currMB, levelDataStruct levelData[4][16])
  568. {
  569.   int i, j, block, coeff_ctr;
  570.   static int *m7;
  571.   int q_bits   = Q_BITS_8 + qp_per;
  572.   int q_offset = ( 1 << (q_bits - 1) );
  573.   double err, estErr;
  574.   int level, lowerInt, k;
  575.   
  576.   levelDataStruct *dataLevel = &levelData[0][0];  
  577.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  578.   {
  579.     for (block = 0; block < 4; block++)
  580.     {
  581.       i = *p_scan++;  // horizontal position
  582.       j = *p_scan++;  // vertical position
  583.       m7 = &tblock[j][block_x + i];
  584.       dataLevel = &levelData[block][coeff_ctr];
  585.       if (*m7 == 0)
  586.       {
  587.         dataLevel->levelDouble = 0;
  588.         dataLevel->level[0] = 0;
  589.         dataLevel->noLevels = 1;
  590.         err = 0.0;
  591.         dataLevel->errLevel[0] = 0.0;
  592.         dataLevel->pre_level = 0;
  593.         dataLevel->sign = 0;
  594.       }
  595.       else
  596.       {
  597.         estErr = (double) estErr8x8[qp_rem][j][i] / norm_factor_8x8;
  598.         dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
  599.         level = (dataLevel->levelDouble >> q_bits);
  600.         lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset ) ? 1 : 0;
  601.         dataLevel->level[0] = 0;
  602.         if (level == 0 && lowerInt == 1)
  603.         {
  604.           dataLevel->noLevels = 1;
  605.         }
  606.         else if (level == 0 && lowerInt == 0)
  607.         {
  608.           dataLevel->level[1] = 1;
  609.           dataLevel->noLevels = 2;
  610.         }
  611.         else if (level > 0 && lowerInt == 1)
  612.         {
  613.           if (level > 1)
  614.           {
  615.             dataLevel->level[1] = level - 1;
  616.             dataLevel->level[2] = level;
  617.             dataLevel->noLevels = 3;
  618.           }
  619.           else
  620.           {
  621.             dataLevel->level[1] = level;
  622.             dataLevel->noLevels = 2;
  623.           }
  624.         }
  625.         else
  626.         {
  627.           dataLevel->level[1] = level;
  628.           dataLevel->level[2] = level + 1;
  629.           dataLevel->noLevels = 3;
  630.         }
  631.         for (k = 0; k < dataLevel->noLevels; k++)
  632.         {
  633.           err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
  634.           dataLevel->errLevel[k] = err * err * estErr; 
  635.         }
  636.         if(dataLevel->noLevels == 1)
  637.           dataLevel->pre_level = 0;
  638.         else
  639.           dataLevel->pre_level = (iabs (*m7) * levelscale[j][i] + leveloffset[j][i]) >> q_bits;
  640.         dataLevel->sign = isign(*m7);
  641.       }
  642.     }
  643.   }
  644. }