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 "cabac.h"
00017 #include "image.h"
00018 #include "fmo.h"
00019 #include "macroblock.h"
00020 #include "mb_access.h"
00021 #include "ratectl.h"
00022 #include "rdoq.h"
00023
00024 const int entropyBits[128]=
00025 {
00026 895, 943, 994, 1048, 1105, 1165, 1228, 1294,
00027 1364, 1439, 1517, 1599, 1686, 1778, 1875, 1978,
00028 2086, 2200, 2321, 2448, 2583, 2725, 2876, 3034,
00029 3202, 3380, 3568, 3767, 3977, 4199, 4435, 4684,
00030 4948, 5228, 5525, 5840, 6173, 6527, 6903, 7303,
00031 7727, 8178, 8658, 9169, 9714, 10294, 10914, 11575,
00032 12282, 13038, 13849, 14717, 15650, 16653, 17734, 18899,
00033 20159, 21523, 23005, 24617, 26378, 28306, 30426, 32768,
00034 32768, 35232, 37696, 40159, 42623, 45087, 47551, 50015,
00035 52479, 54942, 57406, 59870, 62334, 64798, 67262, 69725,
00036 72189, 74653, 77117, 79581, 82044, 84508, 86972, 89436,
00037 91900, 94363, 96827, 99291, 101755, 104219, 106683, 109146,
00038 111610, 114074, 116538, 119002, 121465, 123929, 126393, 128857,
00039 131321, 133785, 136248, 138712, 141176, 143640, 146104, 148568,
00040 151031, 153495, 155959, 158423, 160887, 163351, 165814, 168278,
00041 170742, 173207, 175669, 178134, 180598, 183061, 185525, 187989
00042 };
00043
00044
00045 extern const int estErr4x4[6][4][4];
00046 extern const int estErr8x8[6][8][8];
00047
00048
00049 int precalcUnaryLevelTab[128][MAX_PREC_COEFF];
00050 estBitsCabacStruct estBitsCabac[NUM_BLOCK_TYPES];
00051
00052 void precalculate_unary_exp_golomb_level()
00053 {
00054 int state, ctx_state0, ctx_state1, estBits0, estBits1, symbol;
00055
00056 for (state=0; state<=63; state++)
00057 {
00058
00059 ctx_state0=64+state;
00060 estBits0=entropyBits[127-ctx_state0];
00061 ctx_state1=63-state;
00062 estBits1=entropyBits[127-ctx_state1];
00063
00064 for (symbol=0; symbol<MAX_PREC_COEFF; symbol++)
00065 {
00066 precalcUnaryLevelTab[ctx_state0][symbol]=est_unary_exp_golomb_level_bits(symbol, estBits0, estBits1);
00067
00068
00069 precalcUnaryLevelTab[ctx_state1][symbol]=est_unary_exp_golomb_level_bits(symbol, estBits1, estBits0);
00070 }
00071 }
00072 }
00073
00074 int est_unary_exp_golomb_level_bits(unsigned int symbol, int bits0, int bits1)
00075 {
00076 unsigned int l,k;
00077 unsigned int exp_start = 13;
00078 int estBits;
00079
00080 if (symbol==0)
00081 {
00082 return (bits0);
00083 }
00084 else
00085 {
00086 estBits=bits1;
00087 l=symbol;
00088 k=1;
00089 while (((--l)>0) && (++k <= exp_start))
00090 {
00091 estBits += bits1;
00092 }
00093 if (symbol < exp_start)
00094 {
00095 estBits += bits0;
00096 }
00097 else
00098 {
00099 estBits += est_exp_golomb_encode_eq_prob(symbol-exp_start);
00100 }
00101 }
00102 return(estBits);
00103 }
00104
00105
00106
00107
00108
00109
00110
00111 int est_exp_golomb_encode_eq_prob(unsigned int symbol)
00112 {
00113 int k = 0, estBits = 0;
00114
00115 while(1)
00116 {
00117 if (symbol >= (unsigned int)(1<<k))
00118 {
00119 estBits++;
00120 symbol -= (1<<k);
00121 k++;
00122 }
00123 else
00124 {
00125 estBits += (k + 1);
00126 break;
00127 }
00128 }
00129 return(estBits);
00130 }
00131
00132
00133
00134
00135
00136
00137
00138 void estRunLevel_CABAC (Slice *currSlice, Macroblock *currMB, int context)
00139 {
00140 DataPartition* dataPart = &(currSlice->partArr[0]);
00141 EncodingEnvironmentPtr eep_dp = &(dataPart->ee_cabac);
00142
00143 est_CBP_block_bit (currSlice, currMB, eep_dp, context);
00144
00145 est_significance_map (currSlice, currMB, eep_dp, context);
00146
00147 est_significant_coefficients (currSlice, currMB, eep_dp, context);
00148 }
00149
00150
00151
00152
00153
00154
00155
00156 void est_CBP_block_bit (Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
00157 {
00158 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00159 int ctx;
00160
00161 for (ctx=0; ctx<=3; ctx++)
00162 {
00163 cabacEstBits->blockCbpBits[ctx][0]=biari_no_bits(eep_dp, 0, currSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
00164
00165 cabacEstBits->blockCbpBits[ctx][1]=biari_no_bits(eep_dp, 1, currSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
00166 }
00167 }
00168
00169
00170
00171
00172
00173
00174
00175 void est_significance_map(Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
00176 {
00177 int k;
00178 int k1 = maxpos[type]-1;
00179 #if ENABLE_FIELD_CTX
00180 int fld = ( img->structure!=FRAME || currMB->mb_field );
00181 #else
00182 int fld = 0;
00183 #endif
00184 BiContextTypePtr map_ctx = currSlice->tex_ctx->map_contexts [fld][type2ctx_map [type]];
00185 BiContextTypePtr last_ctx = currSlice->tex_ctx->last_contexts[fld][type2ctx_last[type]];
00186 const byte *pos2ctxmap = fld ? pos2ctx_map_int [type] : pos2ctx_map[type];
00187 const byte *pos2ctxlast = pos2ctx_last[type];
00188
00189 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00190
00191 for (k = 0; k < k1; k++)
00192 {
00193 cabacEstBits->significantBits[pos2ctxmap[k]][0] = biari_no_bits (eep_dp, 0, map_ctx + pos2ctxmap[k]);
00194
00195 cabacEstBits->significantBits[pos2ctxmap[k]][1] = biari_no_bits (eep_dp, 1, map_ctx + pos2ctxmap[k]);
00196
00197 cabacEstBits->lastBits[pos2ctxlast[k]][0] = biari_no_bits(eep_dp, 0, last_ctx+pos2ctxlast[k]);
00198
00199 cabacEstBits->lastBits[pos2ctxlast[k]][1] = biari_no_bits(eep_dp, 1, last_ctx+pos2ctxlast[k]);
00200 }
00201
00202 cabacEstBits->significantBits[pos2ctxmap[k1]][0]=0;
00203 cabacEstBits->significantBits[pos2ctxmap[k1]][1]=0;
00204 cabacEstBits->lastBits[pos2ctxlast[k1]][0]=0;
00205 cabacEstBits->lastBits[pos2ctxlast[k1]][1]=0;
00206 }
00207
00208
00209
00210
00211
00212
00213
00214 void est_significant_coefficients (Slice *currSlice, Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
00215 {
00216 int ctx;
00217 int maxCtx = imin(4, max_c2[type]);
00218 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00219
00220 for (ctx=0; ctx<=4; ctx++){
00221 cabacEstBits->greaterOneBits[0][ctx][0]=
00222 biari_no_bits (eep_dp, 0, currSlice->tex_ctx->one_contexts[type2ctx_one[type]] + ctx);
00223
00224 cabacEstBits->greaterOneBits[0][ctx][1]=
00225 biari_no_bits (eep_dp, 1, currSlice->tex_ctx->one_contexts[type2ctx_one[type]] + ctx);
00226 }
00227
00228 for (ctx=0; ctx<=maxCtx; ctx++){
00229 cabacEstBits->greaterOneBits[1][ctx][0]=
00230 biari_no_bits(eep_dp, 0, currSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
00231
00232 cabacEstBits->greaterOneState[ctx]=biari_state(eep_dp, 0, currSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
00233
00234 cabacEstBits->greaterOneBits[1][ctx][1]=
00235 biari_no_bits(eep_dp, 1, currSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
00236 }
00237 }
00238
00239 int biari_no_bits(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct )
00240 {
00241 int ctx_state, estBits;
00242
00243 symbol = (short) (symbol != 0);
00244
00245 ctx_state = (symbol == bi_ct->MPS) ? 64 + bi_ct->state : 63 - bi_ct->state;
00246 estBits=entropyBits[127 - ctx_state];
00247
00248 return(estBits);
00249 }
00250
00251 int biari_state(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct )
00252 {
00253 int ctx_state;
00254
00255 symbol = (short) (symbol != 0);
00256 ctx_state = (symbol == bi_ct->MPS) ? 64 + bi_ct->state : 63 - bi_ct->state;
00257
00258 return(ctx_state);
00259 }
00260
00261
00262
00263
00264
00265
00266
00267 int est_write_and_store_CBP_block_bit(Macroblock* currMB, int type)
00268 {
00269 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00270
00271 int y_ac = (type==LUMA_16AC || type==LUMA_8x8 || type==LUMA_8x4 || type==LUMA_4x8 || type==LUMA_4x4
00272 || type==CB_16AC || type==CB_8x8 || type==CB_8x4 || type==CB_4x8 || type==CB_4x4
00273 || type==CR_16AC || type==CR_8x8 || type==CR_8x4 || type==CR_4x8 || type==CR_4x4);
00274 int y_dc = (type==LUMA_16DC || type==CB_16DC || type==CR_16DC);
00275 int u_ac = (type==CHROMA_AC && !img->is_v_block);
00276 int v_ac = (type==CHROMA_AC && img->is_v_block);
00277 int chroma_dc = (type==CHROMA_DC || type==CHROMA_DC_2x4 || type==CHROMA_DC_4x4);
00278 int u_dc = (chroma_dc && !img->is_v_block);
00279 int v_dc = (chroma_dc && img->is_v_block);
00280 int j = ((y_ac || u_ac || v_ac ? img->subblock_y : 0) << 2);
00281 int i = (y_ac || u_ac || v_ac ? img->subblock_x : 0);
00282 int bit;
00283 int default_bit = (IS_INTRA(currMB) ? 1 : 0);
00284 int upper_bit = default_bit;
00285 int left_bit = default_bit;
00286 int ctx, estBits = 0;
00287
00288 int bit_pos_a = 0;
00289 int bit_pos_b = 0;
00290
00291 PixelPos block_a, block_b;
00292
00293 if (y_ac || y_dc)
00294 {
00295 get4x4Neighbour(currMB, (i << 2) - 1, j , img->mb_size[IS_LUMA], &block_a);
00296 get4x4Neighbour(currMB, (i << 2), j -1, img->mb_size[IS_LUMA], &block_b);
00297 if (y_ac)
00298 {
00299 if (block_a.available)
00300 bit_pos_a = 4*block_a.y + block_a.x;
00301 if (block_b.available)
00302 bit_pos_b = 4*block_b.y + block_b.x;
00303 }
00304 }
00305 else
00306 {
00307 get4x4Neighbour(currMB, (i << 2) - 1, j , img->mb_size[IS_CHROMA], &block_a);
00308 get4x4Neighbour(currMB, (i << 2), j - 1, img->mb_size[IS_CHROMA], &block_b);
00309 if (u_ac||v_ac)
00310 {
00311 if (block_a.available)
00312 bit_pos_a = (block_a.y << 2) + block_a.x;
00313 if (block_b.available)
00314 bit_pos_b = (block_b.y << 2) + block_b.x;
00315 }
00316 }
00317
00318 bit = (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 35);
00319
00320 if (enc_picture->chroma_format_idc!=YUV444 || IS_INDEPENDENT(params))
00321 {
00322 if (type!=LUMA_8x8)
00323 {
00324 if (block_b.available)
00325 {
00326 if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
00327 upper_bit = 1;
00328 else
00329 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits[0], bit + bit_pos_b);
00330 }
00331
00332 if (block_a.available)
00333 {
00334 if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
00335 left_bit = 1;
00336 else
00337 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits[0], bit + bit_pos_a);
00338 }
00339
00340 ctx = 2*upper_bit+left_bit;
00341
00342 estBits = cabacEstBits->blockCbpBits[ctx][0] - cabacEstBits->blockCbpBits[ctx][1];
00343 }
00344 }
00345 else
00346 {
00347 if (block_b.available)
00348 {
00349 if(img->mb_data[block_b.mb_addr].mb_type == IPCM)
00350 upper_bit=1;
00351 else
00352 {
00353 if(type==LUMA_8x8)
00354 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits_8x8[0], bit + bit_pos_b);
00355 else if (type==CB_8x8)
00356 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits_8x8[1], bit + bit_pos_b);
00357 else if (type==CR_8x8)
00358 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits_8x8[2], bit + bit_pos_b);
00359 else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
00360 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits[1], bit + bit_pos_b);
00361 else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
00362 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits[2], bit + bit_pos_b);
00363 else
00364 upper_bit = get_bit(img->mb_data[block_b.mb_addr].cbp_bits[0], bit + bit_pos_b);
00365 }
00366 }
00367
00368 if (block_a.available)
00369 {
00370 if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
00371 left_bit = 1;
00372 else
00373 {
00374 if(type==LUMA_8x8)
00375 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits_8x8[0],bit + bit_pos_a);
00376 else if (type==CB_8x8)
00377 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits_8x8[1],bit + bit_pos_a);
00378 else if (type==CR_8x8)
00379 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits_8x8[2],bit + bit_pos_a);
00380 else if ((type==CB_4x4)||(type==CB_4x8)||(type==CB_8x4)||(type==CB_16AC)||(type==CB_16DC))
00381 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits[1], bit + bit_pos_a);
00382 else if ((type==CR_4x4)||(type==CR_4x8)||(type==CR_8x4)||(type==CR_16AC)||(type==CR_16DC))
00383 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits[2], bit + bit_pos_a);
00384 else
00385 left_bit = get_bit(img->mb_data[block_a.mb_addr].cbp_bits[0], bit + bit_pos_a);
00386 }
00387 }
00388
00389 ctx = 2*upper_bit+left_bit;
00390
00391
00392 estBits = cabacEstBits->blockCbpBits[ctx][0] - cabacEstBits->blockCbpBits[ctx][1];
00393 }
00394
00395 return(estBits);
00396 }
00397
00398
00399
00400
00401
00402
00403 void est_writeRunLevel_CABAC(levelDataStruct levelData[], int levelTabMin[], int type, double lambda, int kInit, int kStop,
00404 int noCoeff, int estCBP)
00405 {
00406 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00407 int k, i;
00408 int estBits;
00409 double lagr, lagrMin=0, lagrTabMin, lagrTab;
00410 int c1 = 1, c2 = 0, c1Tab[3], c2Tab[3];
00411 int iBest, levelTab[64];
00412 int ctx, greater_one, last, maxK = maxpos[type];
00413 double lagrAcc, lagrLastMin=0, lagrLast;
00414 int kBest=0, kStart, first;
00415 levelDataStruct *dataLevel;
00416
00417 for (k = 0; k <= maxK; k++)
00418 {
00419 levelTabMin[k] = 0;
00420 }
00421
00422 if (noCoeff > 0)
00423 {
00424 if (noCoeff > 1)
00425 {
00426 kStart = kInit; kBest = 0; first = 1;
00427 lagrAcc = 0;
00428 for (k = kStart; k <= kStop; k++)
00429 {
00430 lagrAcc += levelData[k].errLevel[0];
00431 }
00432
00433 if (levelData[kStart].noLevels > 2)
00434 {
00435 lagrAcc -= levelData[kStart].errLevel[0];
00436 lagrLastMin=lambda * (cabacEstBits->lastBits[pos2ctx_last[type][kStart]][1] - cabacEstBits->lastBits[pos2ctx_last[type][kStart]][0]) + lagrAcc;
00437
00438 kBest = kStart;
00439 kStart++;
00440 first = 0;
00441 }
00442
00443 for (k = kStart; k <= kStop; k++)
00444 {
00445 dataLevel = &levelData[k];
00446 lagrMin = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
00447 lagrAcc -= dataLevel->errLevel[0];
00448
00449 if (dataLevel->noLevels > 1)
00450 {
00451 estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1]+
00452 cabacEstBits->greaterOneBits[0][4][0];
00453
00454 lagrLast = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][1]) + lagrAcc;
00455 lagr = dataLevel->errLevel[1] + lambda * (estBits + cabacEstBits->lastBits[pos2ctx_last[type][k]][0]);
00456
00457 lagrMin = (lagr < lagrMin) ? lagr : lagrMin;
00458
00459 if (lagrLast < lagrLastMin || first==1)
00460 {
00461 kBest = k;
00462 first = 0;
00463 lagrLastMin = lagrLast;
00464 }
00465 }
00466 lagrAcc += lagrMin;
00467 }
00468 kStart = kBest;
00469 }
00470 else
00471 {
00472 kStart = kStop;
00473 }
00474
00475 lagrTabMin = 0;
00476 for (k = 0; k <= kStart; k++)
00477 {
00478 lagrTabMin += levelData[k].errLevel[0];
00479 }
00480
00481 lagrTab=0;
00482
00483
00484
00485 lagrTabMin += (lambda*estCBP);
00486 iBest = 0; first = 1;
00487 for (k = kStart; k >= 0; k--)
00488 {
00489 dataLevel = &levelData[k];
00490 last = (k == kStart);
00491
00492 if (!last)
00493 {
00494 lagrMin = dataLevel->errLevel[0] + lambda * cabacEstBits->significantBits[pos2ctx_map[type][k]][0];
00495 iBest = 0;
00496 first = 0;
00497 }
00498
00499 for (i = 1; i < dataLevel->noLevels; i++)
00500 {
00501 estBits = SIGN_BITS + cabacEstBits->significantBits[pos2ctx_map[type][k]][1];
00502 estBits += cabacEstBits->lastBits[pos2ctx_last[type][k]][last];
00503
00504
00505 greater_one = (dataLevel->level[i] > 1);
00506
00507 c1Tab[i] = c1;
00508 c2Tab[i] = c2;
00509
00510 ctx = imin(c1Tab[i], 4);
00511 estBits += cabacEstBits->greaterOneBits[0][ctx][greater_one];
00512
00513
00514 if (greater_one)
00515 {
00516 ctx = imin(c2Tab[i], max_c2[type]);
00517 if ( (dataLevel->level[i] - 2) < MAX_PREC_COEFF)
00518 {
00519 estBits += precalcUnaryLevelTab[cabacEstBits->greaterOneState[ctx]][dataLevel->level[i] - 2];
00520 }
00521 else
00522 {
00523 estBits += est_unary_exp_golomb_level_encode(dataLevel->level[i] - 2, ctx, type);
00524 }
00525
00526 c1Tab[i] = 0;
00527 c2Tab[i]++;
00528 }
00529 else if (c1Tab[i])
00530 {
00531 c1Tab[i]++;
00532 }
00533
00534 lagr = dataLevel->errLevel[i] + lambda*estBits;
00535 if (lagr<lagrMin || first==1)
00536 {
00537 iBest = i;
00538 lagrMin=lagr;
00539 first = 0;
00540 }
00541 }
00542
00543 if (iBest>0)
00544 {
00545 c1 = c1Tab[iBest];
00546 c2 = c2Tab[iBest];
00547 }
00548
00549 levelTab[k] = dataLevel->level[iBest];
00550 lagrTab += lagrMin;
00551 }
00552
00553
00554 if (lagrTab < lagrTabMin)
00555 {
00556 memcpy(levelTabMin, levelTab, (kStart + 1) * sizeof(int));
00557 }
00558 }
00559 }
00560
00561
00562
00563
00564
00565
00566
00567 int est_unary_exp_golomb_level_encode(unsigned int symbol, int ctx, int type)
00568 {
00569 estBitsCabacStruct *cabacEstBits = &estBitsCabac[type];
00570 unsigned int l = symbol, k = 1;
00571 unsigned int exp_start = 13;
00572 int estBits;
00573
00574 if (symbol==0)
00575 {
00576 estBits = cabacEstBits->greaterOneBits[1][ctx][0];
00577 return (estBits);
00578 }
00579 else
00580 {
00581 estBits = cabacEstBits->greaterOneBits[1][ctx][1];
00582
00583 while (((--l)>0) && (++k <= exp_start))
00584 {
00585 estBits += cabacEstBits->greaterOneBits[1][ctx][1];
00586 }
00587
00588 if (symbol < exp_start)
00589 {
00590 estBits += cabacEstBits->greaterOneBits[1][ctx][0];
00591 }
00592 else
00593 {
00594 estBits+=est_exp_golomb_encode_eq_prob(symbol - exp_start);
00595 }
00596 }
00597 return(estBits);
00598 }
00599
00600
00601
00602
00603
00604
00605
00606 int init_trellis_data_4x4_CABAC(int **tblock, int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00607 levelDataStruct *dataLevel, int* kStart, int* kStop, int type)
00608 {
00609 int noCoeff = 0;
00610 int i, j, coeff_ctr;
00611 static int *m7;
00612 int end_coeff_ctr = ( ( type == LUMA_4x4 ) ? 16 : 15 );
00613 int q_bits = Q_BITS + qp_per;
00614 int q_offset = ( 1 << (q_bits - 1) );
00615 int level, lowerInt, k;
00616 double err, estErr;
00617
00618
00619 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00620 {
00621 i = *p_scan++;
00622 j = *p_scan++;
00623
00624 m7 = &tblock[j][block_x + i];
00625
00626 if (*m7 == 0)
00627 {
00628 dataLevel->levelDouble = 0;
00629 dataLevel->level[0] = 0;
00630 dataLevel->noLevels = 1;
00631 err = 0.0;
00632 dataLevel->errLevel[0] = 0.0;
00633 }
00634 else
00635 {
00636 estErr = ((double) estErr4x4[qp_rem][j][i]) / norm_factor_4x4;
00637
00638 dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
00639 level = (dataLevel->levelDouble >> q_bits);
00640
00641 lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
00642
00643 dataLevel->level[0] = 0;
00644 if (level == 0 && lowerInt == 1)
00645 {
00646 dataLevel->noLevels = 1;
00647 }
00648 else if (level == 0 && lowerInt == 0)
00649 {
00650 dataLevel->level[1] = 1;
00651 dataLevel->noLevels = 2;
00652 *kStop = coeff_ctr;
00653 noCoeff++;
00654 }
00655 else if (level > 0 && lowerInt == 1)
00656 {
00657 dataLevel->level[1] = level;
00658 dataLevel->noLevels = 2;
00659 *kStop = coeff_ctr;
00660 noCoeff++;
00661 }
00662 else
00663 {
00664 dataLevel->level[1] = level;
00665 dataLevel->level[2] = level + 1;
00666 dataLevel->noLevels = 3;
00667 *kStop = coeff_ctr;
00668 *kStart = coeff_ctr;
00669 noCoeff++;
00670 }
00671
00672 for (k = 0; k < dataLevel->noLevels; k++)
00673 {
00674 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00675 dataLevel->errLevel[k] = (err * err * estErr);
00676 }
00677 }
00678
00679 dataLevel++;
00680 }
00681 return (noCoeff);
00682 }
00683
00684
00685
00686
00687
00688
00689
00690 int init_trellis_data_8x8_CABAC(int **tblock, int block_x, int qp_per, int qp_rem, int **levelscale, int **leveloffset, const byte *p_scan, Macroblock *currMB,
00691 levelDataStruct *dataLevel, int* kStart, int* kStop, int symbolmode)
00692 {
00693 int noCoeff = 0;
00694 static int *m7;
00695 int i, j, coeff_ctr, end_coeff_ctr = 64;
00696 int q_bits = Q_BITS_8 + qp_per;
00697 int q_offset = ( 1 << (q_bits - 1) );
00698 double err, estErr;
00699 int level, lowerInt, k;
00700
00701 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00702 {
00703 i = *p_scan++;
00704 j = *p_scan++;
00705
00706 m7 = &tblock[j][block_x + i];
00707
00708 if (*m7 == 0)
00709 {
00710 dataLevel->levelDouble = 0;
00711 dataLevel->level[0] = 0;
00712 dataLevel->noLevels = 1;
00713 err = 0.0;
00714 dataLevel->errLevel[0] = 0.0;
00715 }
00716 else
00717 {
00718 estErr = (double) estErr8x8[qp_rem][j][i] / norm_factor_8x8;
00719
00720 dataLevel->levelDouble = iabs(*m7 * levelscale[j][i]);
00721 level = (dataLevel->levelDouble >> q_bits);
00722
00723 lowerInt = (((int)dataLevel->levelDouble - (level << q_bits)) < q_offset )? 1 : 0;
00724
00725 dataLevel->level[0] = 0;
00726 if (level == 0 && lowerInt == 1)
00727 {
00728 dataLevel->noLevels = 1;
00729 }
00730 else if (level == 0 && lowerInt == 0)
00731 {
00732 dataLevel->level[1] = 1;
00733 dataLevel->noLevels = 2;
00734 *kStop = coeff_ctr;
00735 noCoeff++;
00736 }
00737 else if (level > 0 && lowerInt == 1)
00738 {
00739 dataLevel->level[1] = level;
00740 dataLevel->noLevels = 2;
00741 *kStop = coeff_ctr;
00742 noCoeff++;
00743 }
00744 else
00745 {
00746 dataLevel->level[1] = level;
00747 dataLevel->level[2] = level + 1;
00748 dataLevel->noLevels = 3;
00749 *kStop = coeff_ctr;
00750 *kStart = coeff_ctr;
00751 noCoeff++;
00752 }
00753
00754 for (k = 0; k < dataLevel->noLevels; k++)
00755 {
00756 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00757 dataLevel->errLevel[k] = err * err * estErr;
00758 }
00759 }
00760
00761 dataLevel++;
00762 }
00763 return (noCoeff);
00764 }
00765
00766
00767
00768
00769
00770
00771
00772 int init_trellis_data_DC_CABAC(int **tblock, int qp_per, int qp_rem,
00773 int levelscale, int leveloffset, const byte *p_scan, Macroblock *currMB,
00774 levelDataStruct *dataLevel, int* kStart, int* kStop)
00775 {
00776 int noCoeff = 0;
00777 int i, j, coeff_ctr, end_coeff_ctr = 16;
00778 int q_bits = Q_BITS + qp_per + 1;
00779 int q_offset = ( 1 << (q_bits - 1) );
00780 int level, lowerInt, k;
00781 int *m7;
00782 double err, estErr = (double) estErr4x4[qp_rem][0][0] / norm_factor_4x4;
00783
00784 for (coeff_ctr = 0; coeff_ctr < end_coeff_ctr; coeff_ctr++)
00785 {
00786 i = *p_scan++;
00787 j = *p_scan++;
00788 m7 = &tblock[j][i];
00789
00790 if (*m7 == 0)
00791 {
00792 dataLevel->levelDouble = 0;
00793 dataLevel->level[0] = 0;
00794 dataLevel->noLevels = 1;
00795 err = 0.0;
00796 dataLevel->errLevel[0] = 0.0;
00797 }
00798 else
00799 {
00800 dataLevel->levelDouble = iabs(*m7 * levelscale);
00801 level = (dataLevel->levelDouble >> q_bits);
00802
00803 lowerInt=( ((int)dataLevel->levelDouble - (level<<q_bits)) < q_offset )? 1 : 0;
00804
00805 dataLevel->level[0] = 0;
00806 if (level == 0 && lowerInt == 1)
00807 {
00808 dataLevel->noLevels = 1;
00809 }
00810 else if (level == 0 && lowerInt == 0)
00811 {
00812 dataLevel->level[1] = 1;
00813 dataLevel->noLevels = 2;
00814 *kStop = coeff_ctr;
00815 noCoeff++;
00816 }
00817 else if (level > 0 && lowerInt == 1)
00818 {
00819 dataLevel->level[1] = level;
00820 dataLevel->noLevels = 2;
00821 *kStop = coeff_ctr;
00822 noCoeff++;
00823 }
00824 else
00825 {
00826 dataLevel->level[1] = level;
00827 dataLevel->level[2] = level + 1;
00828 dataLevel->noLevels = 3;
00829 *kStop = coeff_ctr;
00830 *kStart = coeff_ctr;
00831 noCoeff++;
00832 }
00833
00834 for (k = 0; k < dataLevel->noLevels; k++)
00835 {
00836 err = (double)(dataLevel->level[k] << q_bits) - (double)dataLevel->levelDouble;
00837 dataLevel->errLevel[k] = (err * err * estErr);
00838 }
00839 }
00840 dataLevel++;
00841 }
00842 return (noCoeff);
00843 }
00844
00845
00846