00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "contributors.h"
00011
00012 #include <math.h>
00013 #include <float.h>
00014
00015 #include "global.h"
00016 #include "image.h"
00017 #include "fmo.h"
00018 #include "macroblock.h"
00019 #include "mb_access.h"
00020 #include "ratectl.h"
00021 #include "rdoq.h"
00022 #include "block.h"
00023
00024 extern const int estErr4x4[6][4][4];
00025 extern const int estErr8x8[6][8][8];
00026
00027
00028
00029
00030
00031
00032
00033 int estSyntaxElement_Level_VLC1(SyntaxElement *se)
00034 {
00035 int level = se->value1;
00036 int sign = (level < 0 ? 1 : 0);
00037 int levabs = iabs(level);
00038
00039 if (levabs < 8)
00040 {
00041 se->len = levabs * 2 + sign - 1;
00042 }
00043 else if (levabs < 16)
00044 {
00045
00046 se->len = 19;
00047 }
00048 else
00049 {
00050
00051 se->len = 28;
00052 }
00053
00054 return (se->len);
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 int estSyntaxElement_Level_VLCN(SyntaxElement *se, int vlc)
00066 {
00067 int level = se->value1;
00068 int levabs = iabs(level) - 1;
00069
00070 int shift = vlc - 1;
00071 int escape = (15 << shift);
00072
00073 if (levabs < escape)
00074 {
00075 se->len = ((levabs) >> shift) + 1 + vlc;
00076 }
00077 else
00078 {
00079 se->len = 28;
00080 }
00081
00082 return (se->len);
00083 }
00084
00085 int cmp(const void *arg1, const void *arg2)
00086 {
00087 return (((levelDataStruct *)arg2)->levelDouble - ((levelDataStruct *)arg1)->levelDouble);
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 int est_CAVLC_bits (levelDataStruct *levelData, int level_to_enc[16], int sign_to_enc[16], int nnz, int block_type)
00097 {
00098 int no_bits = 0;
00099 SyntaxElement se;
00100
00101 int coeff_ctr, scan_pos = 0;
00102 int k, level = 1, run = -1, vlcnum;
00103 int numcoeff = 0, lastcoeff = 0, numtrailingones = 0;
00104 int numones = 0, totzeros = 0, zerosleft, numcoef;
00105 int numcoeff_vlc;
00106 int level_two_or_higher;
00107 int max_coeff_num = 0, cdc = (block_type == CHROMA_DC ? 1 : 0);
00108 int yuv = img->yuv_format - 1;
00109 static const int incVlc[] = {0, 3, 6, 12, 24, 48, 32768};
00110
00111 int pLevel[16] = {0};
00112 int pRun[16] = {0};
00113
00114 static const int Token_lentab[3][4][17] =
00115 {
00116 {
00117 { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
00118 { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
00119 { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
00120 { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}
00121 },
00122 {
00123 { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
00124 { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
00125 { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
00126 { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14}
00127 },
00128 {
00129 { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
00130 { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
00131 { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
00132 { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10}
00133 }
00134 };
00135
00136 static const int Totalzeros_lentab[TOTRUN_NUM][16] =
00137 {
00138 { 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
00139 { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
00140 { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
00141 { 5,3,4,4,3,3,3,4,3,4,5,5,5},
00142 { 4,4,4,3,3,3,3,3,4,5,4,5},
00143 { 6,5,3,3,3,3,3,3,4,3,6},
00144 { 6,5,3,3,3,2,3,4,3,6},
00145 { 6,4,5,3,2,2,3,3,6},
00146 { 6,6,4,2,2,3,2,5},
00147 { 5,5,3,2,2,2,4},
00148 { 4,4,3,3,1,3},
00149 { 4,4,2,1,3},
00150 { 3,3,1,2},
00151 { 2,2,1},
00152 { 1,1},
00153 };
00154 static const int Run_lentab[TOTRUN_NUM][16] =
00155 {
00156 {1,1},
00157 {1,2,2},
00158 {2,2,2,2},
00159 {2,2,2,3,3},
00160 {2,2,3,3,3,3},
00161 {2,3,3,3,3,3,3},
00162 {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
00163 };
00164 static const int Token_lentab_cdc[3][4][17] =
00165 {
00166
00167 {{ 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00168 { 0, 1, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00169 { 0, 0, 3, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00170 { 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
00171
00172 {{ 1, 7, 7, 9, 9,10,11,12,13, 0, 0, 0, 0, 0, 0, 0, 0},
00173 { 0, 2, 7, 7, 9,10,11,12,12, 0, 0, 0, 0, 0, 0, 0, 0},
00174 { 0, 0, 3, 7, 7, 9,10,11,12, 0, 0, 0, 0, 0, 0, 0, 0},
00175 { 0, 0, 0, 5, 6, 7, 7,10,11, 0, 0, 0, 0, 0, 0, 0, 0}},
00176
00177 {{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
00178 { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
00179 { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
00180 { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}}
00181 };
00182 static const int Totalzeros_lentab_cdc[3][TOTRUN_NUM][16] =
00183 {
00184
00185 {{ 1,2,3,3},
00186 { 1,2,2},
00187 { 1,1}},
00188
00189 {{ 1,3,3,4,4,4,5,5},
00190 { 3,2,3,3,3,3,3},
00191 { 3,3,2,2,3,3},
00192 { 3,2,2,2,3},
00193 { 2,2,2,2},
00194 { 2,2,1},
00195 { 1,1}},
00196
00197 {{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
00198 { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
00199 { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
00200 { 5,3,4,4,3,3,3,4,3,4,5,5,5},
00201 { 4,4,4,3,3,3,3,3,4,5,4,5},
00202 { 6,5,3,3,3,3,3,3,4,3,6},
00203 { 6,5,3,3,3,2,3,4,3,6},
00204 { 6,4,5,3,2,2,3,3,6},
00205 { 6,6,4,2,2,3,2,5},
00206 { 5,5,3,2,2,2,4},
00207 { 4,4,3,3,1,3},
00208 { 4,4,2,1,3},
00209 { 3,3,1,2},
00210 { 2,2,1},
00211 { 1,1}}
00212 };
00213
00214
00215 max_coeff_num = ( (block_type == CHROMA_DC) ? img->num_cdc_coeff :
00216 ( (block_type == LUMA_INTRA16x16AC || block_type == CB_INTRA16x16AC || block_type == CR_INTRA16x16AC || block_type == CHROMA_AC) ? 15 : 16) );
00217
00218
00219 for (coeff_ctr = 0; coeff_ctr < max_coeff_num; coeff_ctr++)
00220 {
00221 run++;
00222 level = level_to_enc[coeff_ctr];
00223 if (level != 0)
00224 {
00225 pLevel[scan_pos] = isignab(level, sign_to_enc[coeff_ctr]);
00226 pRun [scan_pos] = run;
00227 ++scan_pos;
00228 run = -1;
00229 }
00230 }
00231
00232 level = 1;
00233 for(k = 0; (k < max_coeff_num) && level != 0; k++)
00234 {
00235 level = pLevel[k];
00236 run = pRun[k];
00237
00238 if (level)
00239 {
00240 totzeros += run;
00241 if (iabs(level) == 1)
00242 {
00243 numones ++;
00244 numtrailingones ++;
00245 numtrailingones = imin(numtrailingones, 3);
00246 }
00247 else
00248 {
00249 numtrailingones = 0;
00250 }
00251 numcoeff ++;
00252 lastcoeff = k;
00253 }
00254 }
00255
00256 if (!cdc)
00257 {
00258 if (nnz < 2)
00259 {
00260 numcoeff_vlc = 0;
00261 }
00262 else if (nnz < 4)
00263 {
00264 numcoeff_vlc = 1;
00265 }
00266 else if (nnz < 8)
00267 {
00268 numcoeff_vlc = 2;
00269 }
00270 else
00271 {
00272 numcoeff_vlc = 3;
00273 }
00274 }
00275 else
00276 {
00277
00278
00279 numcoeff_vlc = 0;
00280 }
00281
00282 se.value1 = numcoeff;
00283 se.value2 = numtrailingones;
00284 se.len = numcoeff_vlc;
00285
00286 if (!cdc)
00287 {
00288 if (se.len == 3)
00289 no_bits += 6;
00290 else
00291 no_bits += Token_lentab[se.len][se.value2][se.value1];
00292 }
00293 else
00294 no_bits += Token_lentab_cdc[yuv][se.value2][se.value1];
00295
00296 if (!numcoeff)
00297 return no_bits;
00298 else
00299 {
00300 if (numtrailingones)
00301 no_bits += numtrailingones;
00302
00303
00304 level_two_or_higher = (numcoeff > 3 && numtrailingones == 3) ? 0 : 1;
00305
00306 vlcnum = (numcoeff > 10 && numtrailingones < 3) ? 1 : 0;
00307
00308 for (k = lastcoeff - numtrailingones; k >= 0; k--)
00309 {
00310 level = pLevel[k];
00311
00312 se.value1 = level;
00313
00314 if (level_two_or_higher)
00315 {
00316 level_two_or_higher = 0;
00317 if (se.value1 > 0)
00318 se.value1 --;
00319 else
00320 se.value1 ++;
00321 }
00322
00323
00324 if (vlcnum == 0)
00325 estSyntaxElement_Level_VLC1(&se);
00326 else
00327 estSyntaxElement_Level_VLCN(&se, vlcnum);
00328
00329
00330 if (iabs(level) > incVlc[vlcnum])
00331 vlcnum++;
00332
00333 if ((k == lastcoeff - numtrailingones) && iabs(level) > 3)
00334 vlcnum = 2;
00335
00336 no_bits += se.len;
00337 }
00338
00339
00340 if (numcoeff < max_coeff_num)
00341 {
00342 se.value1 = totzeros;
00343
00344 vlcnum = numcoeff-1;
00345
00346 se.len = vlcnum;
00347
00348 if (!cdc)
00349 no_bits += Totalzeros_lentab[se.len][se.value1];
00350 else
00351 no_bits += Totalzeros_lentab_cdc[yuv][se.len][se.value1];
00352 }
00353
00354
00355 zerosleft = totzeros;
00356 numcoef = numcoeff;
00357 for (k = lastcoeff; k >= 0; k--)
00358 {
00359 run = pRun[k];
00360
00361 se.value1 = run;
00362
00363
00364
00365 if ((!zerosleft) || (numcoeff <= 1 ))
00366 break;
00367
00368 if (numcoef > 1 && zerosleft)
00369 {
00370 vlcnum = imin(zerosleft - 1, RUNBEFORE_NUM_M1);
00371 se.len = vlcnum;
00372 no_bits += Run_lentab[se.len][se.value1];
00373 zerosleft -= run;
00374 numcoef --;
00375 }
00376 }
00377 }
00378
00379 return no_bits;
00380 }
00381
00382
00383
00384
00385
00386
00387
00388
00389 void est_RunLevel_CAVLC(levelDataStruct *levelData, int *levelTrellis, int block_type,
00390 int b8, int b4, int coeff_num, double lambda)
00391 {
00392 int k, lastnonzero = -1, coeff_ctr;
00393 int level_to_enc[16] = {0}, sign_to_enc[16] = {0};
00394 int cstat, bestcstat = 0;
00395 int nz_coeff=0;
00396 double lagr, lagrAcc = 0, minlagr = 0;
00397
00398 int subblock_x = ((b8&0x1)==0)?(((b4&0x1)==0)?0:1):(((b4&0x1)==0)?2:3);
00399
00400 int subblock_y = (b8<2)?((b4<2)?0:1):((b4<2)?2:3);
00401
00402 int nnz;
00403 levelDataStruct *dataLevel = &levelData[0];
00404
00405 if (block_type != CHROMA_AC)
00406 nnz = predict_nnz(&img->mb_data[img->current_mb_nr], LUMA, subblock_x,subblock_y);
00407 else
00408 nnz = predict_nnz_chroma(&img->mb_data[img->current_mb_nr], img->subblock_x, img->subblock_y+4);
00409
00410 for (coeff_ctr=0;coeff_ctr < coeff_num;coeff_ctr++)
00411 {
00412 levelTrellis[coeff_ctr] = 0;
00413
00414 for(k=0; k < dataLevel->noLevels; k++)
00415 {
00416 dataLevel->errLevel[k] /= 32768;
00417 }
00418
00419 lagrAcc += dataLevel->errLevel[dataLevel->noLevels - 1];
00420
00421 level_to_enc[coeff_ctr] = dataLevel->pre_level;
00422 sign_to_enc[coeff_ctr] = dataLevel->sign;
00423
00424 if(dataLevel->noLevels > 1)
00425 {
00426 dataLevel->coeff_ctr = coeff_ctr;
00427 lastnonzero = coeff_ctr;
00428 }
00429 else
00430 dataLevel->coeff_ctr = -1;
00431 dataLevel++;
00432 }
00433
00434 if(lastnonzero != -1)
00435 {
00436
00437 qsort(levelData, lastnonzero + 1, sizeof(levelDataStruct), cmp);
00438
00439 dataLevel = &levelData[lastnonzero];
00440
00441 for(coeff_ctr = lastnonzero; coeff_ctr >= 0; coeff_ctr--)
00442 {
00443 if(dataLevel->noLevels == 1)
00444 {
00445 dataLevel--;
00446 continue;
00447 }
00448
00449 lagrAcc -= dataLevel->errLevel[dataLevel->noLevels-1];
00450 for(cstat=0; cstat<dataLevel->noLevels; cstat++)
00451 {
00452 level_to_enc[dataLevel->coeff_ctr] = dataLevel->level[cstat];
00453 lagr = lagrAcc + dataLevel->errLevel[cstat];
00454
00455 lagr += lambda * est_CAVLC_bits(levelData, level_to_enc, sign_to_enc, nnz, block_type);
00456
00457 if(cstat==0 || lagr<minlagr)
00458 {
00459 minlagr = lagr;
00460 bestcstat = cstat;
00461 }
00462 }
00463 lagrAcc += dataLevel->errLevel[bestcstat];
00464 level_to_enc[dataLevel->coeff_ctr] = dataLevel->level[bestcstat];
00465 dataLevel--;
00466 }
00467
00468 for(coeff_ctr = 0; coeff_ctr <= lastnonzero; coeff_ctr++)
00469 {
00470 levelTrellis[coeff_ctr] = level_to_enc[coeff_ctr];
00471 if (level_to_enc[coeff_ctr] != 0)
00472 nz_coeff++;
00473 }
00474 }
00475
00476 img->nz_coeff [img->current_mb_nr ][subblock_x][subblock_y] = nz_coeff;
00477 }
00478
00479
00480
00481
00482
00483
00484
00485 void init_trellis_data_4x4_CAVLC(int **tblock, int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset,
00486 const byte *p_scan, Macroblock *currMB, levelDataStruct *dataLevel, int type)
00487 {
00488 int i, j, coeff_ctr;
00489 static int *m7;
00490 int end_coeff_ctr = ( ( type == LUMA_4x4 ) ? 16 : 15 );
00491 int q_bits = Q_BITS + qp_per;
00492 int q_offset = ( 1 << (q_bits - 1) );
00493 int level, lowerInt, k;
00494 double err, estErr;
00495
00496
00497 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00498 {
00499 i = *p_scan++;
00500 j = *p_scan++;
00501
00502 m7 = &tblock[j][block_x + i];
00503
00504 if (*m7 == 0)
00505 {
00506 dataLevel->levelDouble = 0;
00507 dataLevel->level[0] = 0;
00508 dataLevel->noLevels = 1;
00509 err = 0.0;
00510 dataLevel->errLevel[0] = 0.0;
00511 dataLevel->pre_level = 0;
00512 dataLevel->sign = 0;
00513 }
00514 else
00515 {
00516 estErr = ((double) estErr4x4[qp_rem][j][i]) / norm_factor_4x4;
00517
00518 dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
00519 level = (dataLevel->levelDouble >> q_bits);
00520
00521 lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
00522
00523 dataLevel->level[0] = 0;
00524 if (level == 0 && lowerInt == 1)
00525 {
00526 dataLevel->noLevels = 1;
00527 }
00528 else if (level == 0 && lowerInt == 0)
00529 {
00530 dataLevel->level[1] = 1;
00531 dataLevel->noLevels = 2;
00532 }
00533 else if (level > 0 && lowerInt == 1)
00534 {
00535 dataLevel->level[1] = level;
00536 dataLevel->noLevels = 2;
00537 }
00538 else
00539 {
00540 dataLevel->level[1] = level;
00541 dataLevel->level[2] = level + 1;
00542 dataLevel->noLevels = 3;
00543 }
00544
00545 for (k = 0; k < dataLevel->noLevels; k++)
00546 {
00547 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00548 dataLevel->errLevel[k] = (err * err * estErr);
00549 }
00550
00551 if(dataLevel->noLevels == 1)
00552 dataLevel->pre_level = 0;
00553 else
00554 dataLevel->pre_level = (iabs (*m7) * levelscale[j][i] + leveloffset[j][i]) >> q_bits;
00555 dataLevel->sign = isign(*m7);
00556 }
00557 dataLevel++;
00558 }
00559 }
00560
00561
00562
00563
00564
00565
00566
00567 void init_trellis_data_DC_CAVLC(int **tblock, int qp_per, int qp_rem,
00568 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00569 levelDataStruct *dataLevel, int type)
00570 {
00571 int i, j, coeff_ctr, end_coeff_ctr = 16;
00572 int q_bits = Q_BITS + qp_per + 1;
00573 int q_offset = ( 1 << (q_bits - 1) );
00574 int level, lowerInt, k;
00575 int *m7;
00576 double err, estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4;
00577
00578 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00579 {
00580 i = *p_scan++;
00581 j = *p_scan++;
00582 m7 = &tblock[j][i];
00583
00584 if (*m7 == 0)
00585 {
00586 dataLevel->levelDouble = 0;
00587 dataLevel->level[0] = 0;
00588 dataLevel->noLevels = 1;
00589 err = 0.0;
00590 dataLevel->errLevel[0] = 0.0;
00591 dataLevel->pre_level = 0;
00592 dataLevel->sign = 0;
00593 }
00594 else
00595 {
00596 dataLevel->levelDouble = iabs(*m7 * levelscale);
00597 level = (dataLevel->levelDouble >> q_bits);
00598
00599 lowerInt=( ((int)dataLevel->levelDouble - (level<<q_bits)) < q_offset )? 1 : 0;
00600
00601 dataLevel->level[0] = 0;
00602 if (level == 0 && lowerInt == 1)
00603 {
00604 dataLevel->noLevels = 1;
00605 }
00606 else if (level == 0 && lowerInt == 0)
00607 {
00608 dataLevel->level[1] = 1;
00609 dataLevel->noLevels = 2;
00610 }
00611 else if (level > 0 && lowerInt == 1)
00612 {
00613 dataLevel->level[1] = level;
00614 dataLevel->noLevels = 2;
00615 }
00616 else
00617 {
00618 dataLevel->level[1] = level;
00619 dataLevel->level[2] = level + 1;
00620 dataLevel->noLevels = 3;
00621 }
00622
00623 for (k = 0; k < dataLevel->noLevels; k++)
00624 {
00625 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00626 dataLevel->errLevel[k] = (err * err * estErr);
00627 }
00628
00629 if(dataLevel->noLevels == 1)
00630 dataLevel->pre_level = 0;
00631 else
00632 dataLevel->pre_level = (iabs (*m7) * levelscale + leveloffset) >> q_bits;
00633 dataLevel->sign = isign(*m7);
00634 }
00635 dataLevel++;
00636 }
00637 }
00638
00639
00640
00641
00642
00643
00644
00645 void init_trellis_data_8x8_CAVLC(int **tblock, int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset,
00646 const byte *p_scan, Macroblock *currMB, levelDataStruct levelData[4][16])
00647 {
00648 int i, j, block, coeff_ctr;
00649 static int *m7;
00650 int q_bits = Q_BITS_8 + qp_per;
00651 int q_offset = ( 1 << (q_bits - 1) );
00652 double err, estErr;
00653 int level, lowerInt, k;
00654
00655 levelDataStruct *dataLevel = &levelData[0][0];
00656
00657 for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
00658 {
00659 for (block = 0; block < 4; block++)
00660 {
00661 i = *p_scan++;
00662 j = *p_scan++;
00663
00664 m7 = &tblock[j][block_x + i];
00665
00666 dataLevel = &levelData[block][coeff_ctr];
00667 if (*m7 == 0)
00668 {
00669 dataLevel->levelDouble = 0;
00670 dataLevel->level[0] = 0;
00671 dataLevel->noLevels = 1;
00672 err = 0.0;
00673 dataLevel->errLevel[0] = 0.0;
00674 dataLevel->pre_level = 0;
00675 dataLevel->sign = 0;
00676 }
00677 else
00678 {
00679 estErr = (double) estErr8x8[qp_rem][j][i] / norm_factor_8x8;
00680
00681 dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
00682 level = (dataLevel->levelDouble >> q_bits);
00683
00684 lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset ) ? 1 : 0;
00685
00686 dataLevel->level[0] = 0;
00687 if (level == 0 && lowerInt == 1)
00688 {
00689 dataLevel->noLevels = 1;
00690 }
00691 else if (level == 0 && lowerInt == 0)
00692 {
00693 dataLevel->level[1] = 1;
00694 dataLevel->noLevels = 2;
00695 }
00696 else if (level > 0 && lowerInt == 1)
00697 {
00698 if (level > 1)
00699 {
00700 dataLevel->level[1] = level - 1;
00701 dataLevel->level[2] = level;
00702 dataLevel->noLevels = 3;
00703 }
00704 else
00705 {
00706 dataLevel->level[1] = level;
00707 dataLevel->noLevels = 2;
00708 }
00709 }
00710 else
00711 {
00712 dataLevel->level[1] = level;
00713 dataLevel->level[2] = level + 1;
00714 dataLevel->noLevels = 3;
00715 }
00716
00717 for (k = 0; k < dataLevel->noLevels; k++)
00718 {
00719 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00720 dataLevel->errLevel[k] = err * err * estErr;
00721 }
00722
00723 if(dataLevel->noLevels == 1)
00724 dataLevel->pre_level = 0;
00725 else
00726 dataLevel->pre_level = (iabs (*m7) * levelscale[j][i] + leveloffset[j][i]) >> q_bits;
00727 dataLevel->sign = isign(*m7);
00728 }
00729 }
00730 }
00731 }
00732
00733