00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "global.h"
00013 #include "memalloc.h"
00014 #include "q_matrix.h"
00015 #include "q_offsets.h"
00016
00017 extern char *GetConfigFileContent (char *Filename, int error_type);
00018
00019 #define MAX_ITEMS_TO_PARSE 2000
00020
00021 int offset4x4_check[6] = { 0, 0, 0, 0, 0, 0 };
00022 int offset8x8_check[6] = { 0, 0, 0, 0, 0, 0 };
00023
00024 static const char OffsetType4x4[15][24] = {
00025 "INTRA4X4_LUMA_INTRA",
00026 "INTRA4X4_CHROMAU_INTRA",
00027 "INTRA4X4_CHROMAV_INTRA",
00028 "INTRA4X4_LUMA_INTERP",
00029 "INTRA4X4_CHROMAU_INTERP",
00030 "INTRA4X4_CHROMAV_INTERP",
00031 "INTRA4X4_LUMA_INTERB",
00032 "INTRA4X4_CHROMAU_INTERB",
00033 "INTRA4X4_CHROMAV_INTERB",
00034 "INTER4X4_LUMA_INTERP",
00035 "INTER4X4_CHROMAU_INTERP",
00036 "INTER4X4_CHROMAV_INTERP",
00037 "INTER4X4_LUMA_INTERB",
00038 "INTER4X4_CHROMAU_INTERB",
00039 "INTER4X4_CHROMAV_INTERB"
00040 };
00041
00042 static const char OffsetType8x8[15][24] = {
00043 "INTRA8X8_LUMA_INTRA",
00044 "INTRA8X8_LUMA_INTERP",
00045 "INTRA8X8_LUMA_INTERB",
00046 "INTER8X8_LUMA_INTERP",
00047 "INTER8X8_LUMA_INTERB",
00048 "INTRA8X8_CHROMAU_INTRA",
00049 "INTRA8X8_CHROMAU_INTERP",
00050 "INTRA8X8_CHROMAU_INTERB",
00051 "INTER8X8_CHROMAU_INTERP",
00052 "INTER8X8_CHROMAU_INTERB",
00053 "INTRA8X8_CHROMAV_INTRA",
00054 "INTRA8X8_CHROMAV_INTERP",
00055 "INTRA8X8_CHROMAV_INTERB",
00056 "INTER8X8_CHROMAV_INTERP",
00057 "INTER8X8_CHROMAV_INTERB"
00058 };
00059
00060
00061 int *****LevelOffset4x4Comp;
00062 int *****LevelOffset8x8Comp;
00063
00064
00065 int ****ptLevelOffset4x4;
00066 int ****ptLevelOffset8x8;
00067
00068 int AdaptRndWeight;
00069 int AdaptRndCrWeight;
00070
00071 short **OffsetList4x4input;
00072 short **OffsetList8x8input;
00073 short ***OffsetList4x4;
00074 short ***OffsetList8x8;
00075
00076 void InitOffsetParam ();
00077
00078 const int OffsetBits = 11;
00079
00080 static const short Offset_intra_default_intra[16] = {
00081 682, 682, 682, 682,
00082 682, 682, 682, 682,
00083 682, 682, 682, 682,
00084 682, 682, 682, 682
00085 };
00086
00087 static const short Offset_intra_default_chroma[16] = {
00088 682, 682, 682, 682,
00089 682, 682, 682, 682,
00090 682, 682, 682, 682,
00091 682, 682, 682, 682
00092 };
00093
00094
00095 static const short Offset_intra_default_inter[16] = {
00096 342, 342, 342, 342,
00097 342, 342, 342, 342,
00098 342, 342, 342, 342,
00099 342, 342, 342, 342,
00100 };
00101
00102 static const short Offset_inter_default[16] = {
00103 342, 342, 342, 342,
00104 342, 342, 342, 342,
00105 342, 342, 342, 342,
00106 342, 342, 342, 342,
00107 };
00108
00109 static const short Offset8_intra_default_intra[64] = {
00110 682, 682, 682, 682, 682, 682, 682, 682,
00111 682, 682, 682, 682, 682, 682, 682, 682,
00112 682, 682, 682, 682, 682, 682, 682, 682,
00113 682, 682, 682, 682, 682, 682, 682, 682,
00114 682, 682, 682, 682, 682, 682, 682, 682,
00115 682, 682, 682, 682, 682, 682, 682, 682,
00116 682, 682, 682, 682, 682, 682, 682, 682,
00117 682, 682, 682, 682, 682, 682, 682, 682
00118 };
00119
00120 static const short Offset8_intra_default_chroma[64] = {
00121 682, 682, 682, 682, 682, 682, 682, 682,
00122 682, 682, 682, 682, 682, 682, 682, 682,
00123 682, 682, 682, 682, 682, 682, 682, 682,
00124 682, 682, 682, 682, 682, 682, 682, 682,
00125 682, 682, 682, 682, 682, 682, 682, 682,
00126 682, 682, 682, 682, 682, 682, 682, 682,
00127 682, 682, 682, 682, 682, 682, 682, 682,
00128 682, 682, 682, 682, 682, 682, 682, 682
00129 };
00130
00131 static const short Offset8_intra_default_inter[64] = {
00132 342, 342, 342, 342, 342, 342, 342, 342,
00133 342, 342, 342, 342, 342, 342, 342, 342,
00134 342, 342, 342, 342, 342, 342, 342, 342,
00135 342, 342, 342, 342, 342, 342, 342, 342,
00136 342, 342, 342, 342, 342, 342, 342, 342,
00137 342, 342, 342, 342, 342, 342, 342, 342,
00138 342, 342, 342, 342, 342, 342, 342, 342,
00139 342, 342, 342, 342, 342, 342, 342, 342
00140 };
00141
00142 static const short Offset8_inter_default[64] = {
00143 342, 342, 342, 342, 342, 342, 342, 342,
00144 342, 342, 342, 342, 342, 342, 342, 342,
00145 342, 342, 342, 342, 342, 342, 342, 342,
00146 342, 342, 342, 342, 342, 342, 342, 342,
00147 342, 342, 342, 342, 342, 342, 342, 342,
00148 342, 342, 342, 342, 342, 342, 342, 342,
00149 342, 342, 342, 342, 342, 342, 342, 342,
00150 342, 342, 342, 342, 342, 342, 342, 342
00151 };
00152
00153
00154
00155
00156
00157
00158
00159 void allocate_QOffsets ()
00160 {
00161 int max_bitdepth = imax(params->output.bit_depth[0], params->output.bit_depth[1]);
00162 int max_qp = (3 + 6*(max_bitdepth));
00163
00164 get_mem5Dint(&LevelOffset4x4Comp, 3, 2, max_qp + 1, 4, 4);
00165 get_mem5Dint(&LevelOffset8x8Comp, 3, 2, max_qp + 1, 8, 8);
00166
00167 if (params->AdaptRoundingFixed)
00168 {
00169 get_mem3Dshort(&OffsetList4x4, 1, 25, 16);
00170 get_mem3Dshort(&OffsetList8x8, 1, 15, 64);
00171 }
00172 else
00173 {
00174 get_mem3Dshort(&OffsetList4x4, max_qp + 1, 25, 16);
00175 get_mem3Dshort(&OffsetList8x8, max_qp + 1, 15, 64);
00176 }
00177
00178 get_mem2Dshort(&OffsetList4x4input, 25, 16);
00179 get_mem2Dshort(&OffsetList8x8input, 15, 64);
00180 }
00181
00182
00183
00184
00185
00186
00187
00188 void free_QOffsets ()
00189 {
00190 free_mem5Dint(LevelOffset4x4Comp);
00191 free_mem5Dint(LevelOffset8x8Comp);
00192
00193 if (params->AdaptRoundingFixed)
00194 {
00195 free_mem3Dshort(OffsetList8x8);
00196 free_mem3Dshort(OffsetList4x4);
00197 }
00198 else
00199 {
00200 free_mem3Dshort(OffsetList8x8);
00201 free_mem3Dshort(OffsetList4x4);
00202 }
00203
00204 free_mem2Dshort(OffsetList8x8input);
00205 free_mem2Dshort(OffsetList4x4input);
00206 }
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 int CheckOffsetParameterName (char *s, int *type)
00224 {
00225 int i = 0;
00226
00227 *type = 0;
00228 while ((OffsetType4x4[i] != NULL) && (i < 15))
00229 {
00230 if (0 == strcmp (OffsetType4x4[i], s))
00231 return i;
00232 else
00233 i++;
00234 }
00235
00236 i = 0;
00237 *type = 1;
00238 while ((OffsetType8x8[i] != NULL) && (i < 15))
00239 {
00240 if (0 == strcmp (OffsetType8x8[i], s))
00241 return i;
00242 else
00243 i++;
00244 }
00245
00246 return -1;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 void ParseQOffsetMatrix (char *buf, int bufsize)
00260 {
00261 char *items[MAX_ITEMS_TO_PARSE];
00262 int MapIdx;
00263 int item = 0;
00264 int InString = 0, InItem = 0;
00265 char *p = buf;
00266 char *bufend = &buf[bufsize];
00267 int IntContent;
00268 int i, j, range, type, cnt;
00269 short *OffsetList;
00270
00271 while (p < bufend)
00272 {
00273 switch (*p)
00274 {
00275 case 13:
00276 p++;
00277 break;
00278 case '#':
00279 *p = '\0';
00280 while (*p != '\n' && p < bufend)
00281 p++;
00282 InString = 0;
00283 InItem = 0;
00284 break;
00285 case '\n':
00286 InItem = 0;
00287 InString = 0;
00288 *p++ = '\0';
00289 break;
00290 case ' ':
00291 case '\t':
00292 if (InString)
00293 p++;
00294 else
00295 {
00296 *p++ = '\0';
00297 InItem = 0;
00298 }
00299 break;
00300
00301 case '"':
00302 *p++ = '\0';
00303 if (!InString)
00304 {
00305 items[item++] = p;
00306 InItem = ~InItem;
00307 }
00308 else
00309 InItem = 0;
00310 InString = ~InString;
00311 break;
00312
00313 case ',':
00314 p++;
00315 InItem = 0;
00316 break;
00317
00318 default:
00319 if (!InItem)
00320 {
00321 items[item++] = p;
00322 InItem = ~InItem;
00323 }
00324 p++;
00325 }
00326 }
00327
00328 item--;
00329
00330 for (i = 0; i < item; i += cnt)
00331 {
00332 cnt = 0;
00333 if (0 > (MapIdx = CheckOffsetParameterName (items[i + cnt], &type)))
00334 {
00335 snprintf (errortext, ET_SIZE,
00336 " Parsing error in quantization offset config file: Parameter Name '%s' not recognized.",
00337 items[i + cnt]);
00338 error (errortext, 300);
00339 }
00340 cnt++;
00341 if (strcmp ("=", items[i + cnt]))
00342 {
00343 snprintf (errortext, ET_SIZE,
00344 " Parsing error in quantization offset config file: '=' expected as the second token in each item.");
00345 error (errortext, 300);
00346 }
00347 cnt++;
00348
00349 if (!type)
00350 {
00351 range = 16;
00352 OffsetList = OffsetList4x4input[MapIdx];
00353 offset4x4_check[MapIdx] = 1;
00354 }
00355 else
00356 {
00357 range = 64;
00358 OffsetList = OffsetList8x8input[MapIdx];
00359 offset8x8_check[MapIdx] = 1;
00360 }
00361
00362 for (j = 0; j < range; j++)
00363 {
00364 if (1 != sscanf (items[i + cnt + j], "%d", &IntContent))
00365 {
00366 snprintf (errortext, ET_SIZE,
00367 " Parsing error in quantization offset file: Expected numerical value for Parameter of %s, found '%s'.",
00368 items[i], items[i + cnt + j]);
00369 error (errortext, 300);
00370 }
00371
00372 OffsetList[j] = (short) IntContent;
00373 }
00374 cnt += j;
00375 printf (".");
00376 }
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386 void Init_QOffsetMatrix ()
00387 {
00388 char *content;
00389
00390 allocate_QOffsets ();
00391
00392 if (params->OffsetMatrixPresentFlag)
00393 {
00394 printf ("Parsing Quantization Offset Matrix file %s ",
00395 params->QOffsetMatrixFile);
00396 content = GetConfigFileContent (params->QOffsetMatrixFile, 0);
00397 if (content != '\0')
00398 ParseQOffsetMatrix (content, strlen (content));
00399 else
00400 {
00401 printf
00402 ("\nError: %s\nProceeding with default values for all matrices.",
00403 errortext);
00404 params->OffsetMatrixPresentFlag = 0;
00405 }
00406
00407 printf ("\n");
00408
00409 free (content);
00410 }
00411
00412 InitOffsetParam ();
00413 }
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428 void InitOffsetParam ()
00429 {
00430 int i, k;
00431 int max_qp_luma = (4 + 6*(params->output.bit_depth[0]));
00432 int max_qp_cr = (4 + 6*(params->output.bit_depth[1]));
00433
00434 for (i = 0; i < (params->AdaptRoundingFixed ? 1 : imax(max_qp_luma, max_qp_cr)); i++)
00435 {
00436 if (params->OffsetMatrixPresentFlag)
00437 {
00438 memcpy(&(OffsetList4x4[i][0][0]),&(OffsetList4x4input[0][0]), 400 * sizeof(short));
00439 memcpy(&(OffsetList8x8[i][0][0]),&(OffsetList8x8input[0][0]), 960 * sizeof(short));
00440 }
00441 else
00442 {
00443
00444 memcpy(&(OffsetList4x4[i][0][0]),&(Offset_intra_default_intra[0]), 16 * sizeof(short));
00445 for (k = 1; k < 3; k++)
00446 memcpy(&(OffsetList4x4[i][k][0]),&(Offset_intra_default_chroma[0]), 16 * sizeof(short));
00447 for (k = 3; k < 9; k++)
00448 memcpy(&(OffsetList4x4[i][k][0]),&(Offset_intra_default_inter[0]), 16 * sizeof(short));
00449 for (k = 9; k < 25; k++)
00450 memcpy(&(OffsetList4x4[i][k][0]),&(Offset_inter_default[0]), 16 * sizeof(short));
00451
00452
00453 memcpy(&(OffsetList8x8[i][0][0]),&(Offset8_intra_default_intra[0]), 64 * sizeof(short));
00454 for (k = 1; k < 3; k++)
00455 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
00456 for (k = 3; k < 5; k++)
00457 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
00458
00459
00460 memcpy(&(OffsetList8x8[i][5][0]),&(Offset8_intra_default_chroma[0]), 64 * sizeof(short));
00461 for (k = 6; k < 8; k++)
00462 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
00463 for (k = 8; k < 10; k++)
00464 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
00465
00466
00467 memcpy(&(OffsetList8x8[i][10][0]),&(Offset8_intra_default_chroma[0]), 64 * sizeof(short));
00468 for (k = 11; k < 13; k++)
00469 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_intra_default_inter[0]), 64 * sizeof(short));
00470 for (k = 13; k < 15; k++)
00471 memcpy(&(OffsetList8x8[i][k][0]),&(Offset8_inter_default[0]), 64 * sizeof(short));
00472 }
00473 }
00474 }
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489 void CalculateOffsetParam ()
00490 {
00491 int i, j, k, temp;
00492 int qp_per, qp;
00493 short **OffsetList;
00494 static int **LevelOffsetCmp0Intra, **LevelOffsetCmp1Intra, **LevelOffsetCmp2Intra;
00495 static int **LevelOffsetCmp0Inter, **LevelOffsetCmp1Inter, **LevelOffsetCmp2Inter;
00496 int img_type = (img->type == SI_SLICE ? I_SLICE : (img->type == SP_SLICE ? P_SLICE : img->type));
00497
00498 int max_qp_scale = imax(img->bitdepth_luma_qp_scale, img->bitdepth_chroma_qp_scale);
00499 int max_qp = 51 + max_qp_scale;
00500
00501 AdaptRndWeight = params->AdaptRndWFactor[img->nal_reference_idc != 0][img_type];
00502 AdaptRndCrWeight = params->AdaptRndCrWFactor[img->nal_reference_idc != 0][img_type];
00503
00504 if (img_type == I_SLICE )
00505 {
00506 for (qp = 0; qp < max_qp + 1; qp++)
00507 {
00508 k = qp_per_matrix [qp];
00509 qp_per = Q_BITS + k - OffsetBits;
00510 OffsetList = OffsetList4x4[params->AdaptRoundingFixed ? 0 : qp];
00511 LevelOffsetCmp0Intra = LevelOffset4x4Comp[0][1][qp];
00512 LevelOffsetCmp1Intra = LevelOffset4x4Comp[1][1][qp];
00513 LevelOffsetCmp2Intra = LevelOffset4x4Comp[2][1][qp];
00514
00515 temp = 0;
00516 for (j = 0; j < 4; j++)
00517 {
00518 for (i = 0; i < 4; i++, temp++)
00519 {
00520 LevelOffsetCmp0Intra[j][i] = (int) OffsetList[0][temp] << qp_per;
00521 LevelOffsetCmp1Intra[j][i] = (int) OffsetList[1][temp] << qp_per;
00522 LevelOffsetCmp2Intra[j][i] = (int) OffsetList[2][temp] << qp_per;
00523 }
00524 }
00525 }
00526 }
00527 else if (img_type == B_SLICE)
00528 {
00529 for (qp = 0; qp < max_qp + 1; qp++)
00530 {
00531 k = qp_per_matrix [qp];
00532 qp_per = Q_BITS + k - OffsetBits;
00533 OffsetList = OffsetList4x4[params->AdaptRoundingFixed ? 0 : qp];
00534 LevelOffsetCmp0Intra = LevelOffset4x4Comp[0][1][qp];
00535 LevelOffsetCmp1Intra = LevelOffset4x4Comp[1][1][qp];
00536 LevelOffsetCmp2Intra = LevelOffset4x4Comp[2][1][qp];
00537 LevelOffsetCmp0Inter = LevelOffset4x4Comp[0][0][qp];
00538 LevelOffsetCmp1Inter = LevelOffset4x4Comp[1][0][qp];
00539 LevelOffsetCmp2Inter = LevelOffset4x4Comp[2][0][qp];
00540
00541
00542 for (temp = 0, j = 0; j < 4; j++)
00543 {
00544 for (i = 0; i < 4; i++, temp++)
00545 {
00546
00547 LevelOffsetCmp0Intra[j][i] = (int) OffsetList[6][temp] << qp_per;
00548 LevelOffsetCmp1Intra[j][i] = (int) OffsetList[7][temp] << qp_per;
00549 LevelOffsetCmp2Intra[j][i] = (int) OffsetList[8][temp] << qp_per;
00550 }
00551 }
00552
00553 for (temp = 0, j = 0; j < 4; j++)
00554 {
00555 for (i = 0; i < 4; i++, temp++)
00556 {
00557
00558 LevelOffsetCmp0Inter[j][i] = (int) OffsetList[12][temp] << qp_per;
00559 LevelOffsetCmp1Inter[j][i] = (int) OffsetList[13][temp] << qp_per;
00560 LevelOffsetCmp2Inter[j][i] = (int) OffsetList[14][temp] << qp_per;
00561 }
00562 }
00563
00564 }
00565 }
00566 else
00567 {
00568 for (qp = 0; qp < max_qp + 1; qp++)
00569 {
00570 k = qp_per_matrix [qp];
00571 qp_per = Q_BITS + k - OffsetBits;
00572 OffsetList = OffsetList4x4[params->AdaptRoundingFixed ? 0 : qp];
00573 LevelOffsetCmp0Intra = LevelOffset4x4Comp[0][1][qp];
00574 LevelOffsetCmp1Intra = LevelOffset4x4Comp[1][1][qp];
00575 LevelOffsetCmp2Intra = LevelOffset4x4Comp[2][1][qp];
00576 LevelOffsetCmp0Inter = LevelOffset4x4Comp[0][0][qp];
00577 LevelOffsetCmp1Inter = LevelOffset4x4Comp[1][0][qp];
00578 LevelOffsetCmp2Inter = LevelOffset4x4Comp[2][0][qp];
00579
00580 temp = 0;
00581 for (j = 0; j < 4; j++)
00582 {
00583 for (i = 0; i < 4; i++, temp++)
00584 {
00585
00586 LevelOffsetCmp0Intra[j][i] = (int) OffsetList[3][temp] << qp_per;
00587 LevelOffsetCmp1Intra[j][i] = (int) OffsetList[4][temp] << qp_per;
00588 LevelOffsetCmp2Intra[j][i] = (int) OffsetList[5][temp] << qp_per;
00589
00590 LevelOffsetCmp0Inter[j][i] = (int) OffsetList[9 ][temp] << qp_per;
00591 LevelOffsetCmp1Inter[j][i] = (int) OffsetList[10][temp] << qp_per;
00592 LevelOffsetCmp2Inter[j][i] = (int) OffsetList[11][temp] << qp_per;
00593 }
00594 }
00595 }
00596 }
00597
00598
00599 if( IS_INDEPENDENT(params) )
00600 {
00601 if( img->colour_plane_id == 0 )
00602 {
00603 ptLevelOffset4x4 = LevelOffset4x4Comp[0];
00604 }
00605 else if( img->colour_plane_id == 1 )
00606 {
00607 ptLevelOffset4x4 = LevelOffset4x4Comp[1];
00608 }
00609 else if( img->colour_plane_id == 2 )
00610 {
00611 ptLevelOffset4x4 = LevelOffset4x4Comp[2];
00612 }
00613 }
00614 else
00615 {
00616 ptLevelOffset4x4 = LevelOffset4x4Comp[0];
00617 }
00618 }
00619
00620
00621
00622
00623
00624
00625
00626
00627 void CalculateOffset8Param ()
00628 {
00629 int i, j, k, temp;
00630 int q_bits, qp;
00631
00632 int max_qp_scale = imax(img->bitdepth_luma_qp_scale, img->bitdepth_chroma_qp_scale);
00633 int max_qp = 51 + max_qp_scale;
00634
00635 if (img->type == I_SLICE || img->type == SI_SLICE )
00636 {
00637 for (qp = 0; qp < max_qp + 1; qp++)
00638 {
00639 q_bits = Q_BITS_8 + qp_per_matrix[qp] - OffsetBits;
00640 k = params->AdaptRoundingFixed ? 0 : qp;
00641 for (j = 0; j < 8; j++)
00642 {
00643 temp = (j << 3);
00644 for (i = 0; i < 8; i++)
00645 {
00646
00647 LevelOffset8x8Comp[0][1][qp][j][i] = (int) OffsetList8x8[k][0][temp] << q_bits;
00648
00649
00650 LevelOffset8x8Comp[1][1][qp][j][i] = (int) OffsetList8x8[k][5][temp] << q_bits;
00651
00652
00653 LevelOffset8x8Comp[2][1][qp][j][i] = (int) OffsetList8x8[k][10][temp++] << q_bits;
00654 }
00655 }
00656 }
00657 }
00658 else if ((img->type == P_SLICE) || (img->type == SP_SLICE))
00659 {
00660 for (qp = 0; qp < max_qp + 1; qp++)
00661 {
00662 q_bits = Q_BITS_8 + qp_per_matrix[qp] - OffsetBits;
00663 k = params->AdaptRoundingFixed ? 0 : qp;
00664 for (j = 0; j < 8; j++)
00665 {
00666 temp = (j << 3);
00667 for (i = 0; i < 8; i++)
00668 {
00669
00670 LevelOffset8x8Comp[0][1][qp][j][i] = (int) OffsetList8x8[k][1][temp] << q_bits;
00671
00672
00673 LevelOffset8x8Comp[0][0][qp][j][i] = (int) OffsetList8x8[k][3][temp] << q_bits;
00674
00675
00676 LevelOffset8x8Comp[1][1][qp][j][i] = (int) OffsetList8x8[k][6][temp] << q_bits;
00677
00678
00679 LevelOffset8x8Comp[1][0][qp][j][i] = (int) OffsetList8x8[k][8][temp] << q_bits;
00680
00681
00682 LevelOffset8x8Comp[2][1][qp][j][i] = (int) OffsetList8x8[k][11][temp] << q_bits;
00683
00684
00685 LevelOffset8x8Comp[2][0][qp][j][i] = (int) OffsetList8x8[k][13][temp++] << q_bits;
00686 }
00687 }
00688 }
00689 }
00690 else
00691 {
00692 for (qp = 0; qp < max_qp + 1; qp++)
00693 {
00694 q_bits = Q_BITS_8 + qp_per_matrix[qp] - OffsetBits;
00695 k = params->AdaptRoundingFixed ? 0 : qp;
00696 for (j = 0; j < 8; j++)
00697 {
00698 temp = (j << 3);
00699 for (i = 0; i < 8; i++)
00700 {
00701
00702 LevelOffset8x8Comp[0][1][qp][j][i] = (int) OffsetList8x8[k][2][temp] << q_bits;
00703
00704 LevelOffset8x8Comp[0][0][qp][j][i] = (int) OffsetList8x8[k][4][temp] << q_bits;
00705
00706
00707 LevelOffset8x8Comp[1][1][qp][j][i] = (int) OffsetList8x8[k][7][temp] << q_bits;
00708
00709
00710 LevelOffset8x8Comp[1][0][qp][j][i] = (int) OffsetList8x8[k][9][temp] << q_bits;
00711
00712
00713 LevelOffset8x8Comp[2][1][qp][j][i] = (int) OffsetList8x8[k][12][temp] << q_bits;
00714
00715
00716 LevelOffset8x8Comp[2][0][qp][j][i] = (int) OffsetList8x8[k][14][temp++] << q_bits;
00717 }
00718 }
00719 }
00720 }
00721
00722
00723 if( IS_INDEPENDENT(params) )
00724 {
00725 if( img->colour_plane_id == 0 )
00726 {
00727 ptLevelOffset8x8 = LevelOffset8x8Comp[0];
00728 }
00729 else if( img->colour_plane_id == 1 )
00730 {
00731 ptLevelOffset8x8 = LevelOffset8x8Comp[1];
00732 }
00733 else if( img->colour_plane_id == 2 )
00734 {
00735 ptLevelOffset8x8 = LevelOffset8x8Comp[2];
00736 }
00737 }
00738 else
00739 {
00740 ptLevelOffset8x8 = LevelOffset8x8Comp[0];
00741 }
00742 }
00743
00744 void SelectColorType (int colour_id)
00745 {
00746 switch (colour_id)
00747 {
00748 case 0:
00749 default:
00750 ptLevelOffset8x8 = LevelOffset8x8Comp[0];
00751 break;
00752 case 1:
00753 ptLevelOffset8x8 = LevelOffset8x8Comp[1];
00754 break;
00755 case 2:
00756 ptLevelOffset8x8 = LevelOffset8x8Comp[2];
00757 break;
00758 }
00759 }