00001
00017 #include "contributors.h"
00018
00019 #include "global.h"
00020 #include "block.h"
00021 #include "image.h"
00022 #include "mb_access.h"
00023 #include "transform.h"
00024 #include "quant.h"
00025 #include "memalloc.h"
00026
00027 static int **M4;
00028 static int **PBlock;
00029
00030 int allocate_block_mem(void)
00031 {
00032 int alloc_size = 0;
00033 alloc_size += get_mem2Dint(&M4, BLOCK_SIZE, BLOCK_SIZE);
00034 alloc_size += get_mem2Dint(&PBlock, MB_BLOCK_SIZE, MB_BLOCK_SIZE);
00035
00036 return (alloc_size);
00037 }
00038
00039 void free_block_mem(void)
00040 {
00041 free_mem2Dint(PBlock);
00042 free_mem2Dint(M4);
00043 }
00044
00045 static void intra_chroma_DC_single(imgpel **curr_img, int up_avail, int left_avail, PixelPos up, PixelPos left[17], int blk_x, int blk_y, int *pred, int direction )
00046 {
00047 static int i;
00048 int s0 = 0;
00049
00050 if ((direction && up_avail) || (!left_avail && up_avail))
00051 {
00052 for (i = blk_x; i < (blk_x + 4);i++)
00053 s0 += curr_img[up.pos_y][up.pos_x + i];
00054 *pred = (s0 + 2) >> 2;
00055 }
00056 else if (left_avail)
00057 {
00058 for (i = blk_y; i < (blk_y + 4);i++)
00059 s0 += curr_img[left[i].pos_y][left[i].pos_x];
00060 *pred = (s0 + 2) >> 2;
00061 }
00062 }
00063
00064
00065 static void intra_chroma_DC_all(imgpel **curr_img, int up_avail, int left_avail, PixelPos up, PixelPos left[17], int blk_x, int blk_y, int *pred )
00066 {
00067 static int i;
00068 int s0 = 0, s1 = 0;
00069
00070 if (up_avail)
00071 for (i = blk_x; i < (blk_x + 4);i++)
00072 s0 += curr_img[up.pos_y][up.pos_x + i];
00073
00074 if (left_avail)
00075 for (i = blk_y; i < (blk_y + 4);i++)
00076 s1 += curr_img[left[i].pos_y][left[i].pos_x];
00077
00078 if (up_avail && left_avail)
00079 *pred = (s0 + s1 + 4) >> 3;
00080 else if (up_avail)
00081 *pred = (s0 + 2) >> 2;
00082 else if (left_avail)
00083 *pred = (s1 + 2) >> 2;
00084 }
00085
00094 void intrapred_chroma(ImageParameters *img, Macroblock *currMB, int uv)
00095 {
00096 int i,j, ii, jj;
00097
00098 imgpel **imgUV = dec_picture->imgUV[uv];
00099 imgpel **mb_pred = img->mb_pred[uv + 1];
00100 int max_imgpel_value = img->max_imgpel_value_comp[uv + 1];
00101
00102 int ih, iv, ib, ic, iaa;
00103
00104 int b8, b4;
00105 int yuv = dec_picture->chroma_format_idc - 1;
00106 int blk_x, blk_y;
00107 int pred;
00108 static int block_pos[3][4][4]=
00109 {
00110 { {0, 1, 2, 3},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}},
00111 { {0, 1, 2, 3},{2, 3, 2, 3},{0, 0, 0, 0},{0, 0, 0, 0}},
00112 { {0, 1, 2, 3},{1, 1, 3, 3},{2, 3, 2, 3},{3, 3, 3, 3}}
00113 };
00114
00115 PixelPos up;
00116 PixelPos left[17];
00117
00118 int up_avail, left_avail[2], left_up_avail;
00119
00120 int cr_MB_x = img->mb_cr_size_x;
00121 int cr_MB_y = img->mb_cr_size_y;
00122 int cr_MB_y2 = (cr_MB_y >> 1);
00123 int cr_MB_x2 = (cr_MB_x >> 1);
00124
00125 for (i=0; i < cr_MB_y + 1 ; i++)
00126 {
00127 getNeighbour(currMB, -1, i-1, img->mb_size[IS_CHROMA], &left[i]);
00128 }
00129
00130 getNeighbour(currMB, 0, -1, img->mb_size[IS_CHROMA], &up);
00131
00132 if (!active_pps->constrained_intra_pred_flag)
00133 {
00134 up_avail = up.available;
00135 left_avail[0] = left_avail[1] = left[1].available;
00136 left_up_avail = left[0].available;
00137 }
00138 else
00139 {
00140 up_avail = up.available ? img->intra_block[up.mb_addr] : 0;
00141 for (i=0, left_avail[0] = 1; i < cr_MB_y2;i++)
00142 left_avail[0] &= left[i + 1].available ? img->intra_block[left[i + 1].mb_addr]: 0;
00143
00144 for (i = cr_MB_y2, left_avail[1] = 1; i<cr_MB_y;i++)
00145 left_avail[1] &= left[i + 1].available ? img->intra_block[left[i + 1].mb_addr]: 0;
00146
00147 left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
00148 }
00149
00150 switch (currMB->c_ipred_mode)
00151 {
00152 case DC_PRED_8:
00153
00154
00155
00156 for(b8 = 0; b8 < (img->num_uv_blocks) ;b8++)
00157 {
00158 for (b4 = 0; b4 < 4; b4++)
00159 {
00160 blk_y = subblk_offset_y[yuv][b8][b4];
00161 blk_x = subblk_offset_x[yuv][b8][b4];
00162
00163 pred = img->dc_pred_value_comp[1];
00164
00165
00166 switch (block_pos[yuv][b8][b4])
00167 {
00168 case 0:
00169 intra_chroma_DC_all (imgUV, up_avail, left_avail[0], up, left, blk_x, blk_y + 1, &pred);
00170 break;
00171 case 1:
00172 intra_chroma_DC_single(imgUV, up_avail, left_avail[0], up, left, blk_x, blk_y + 1, &pred, 1);
00173 break;
00174 case 2:
00175 intra_chroma_DC_single(imgUV, up_avail, left_avail[1], up, left, blk_x, blk_y + 1, &pred, 0);
00176 break;
00177 case 3:
00178 intra_chroma_DC_all (imgUV, up_avail, left_avail[1], up, left, blk_x, blk_y + 1, &pred);
00179 break;
00180 }
00181
00182 for (jj = blk_y; jj < blk_y + BLOCK_SIZE; jj++)
00183 {
00184 for (ii = blk_x; ii < blk_x + BLOCK_SIZE; ii++)
00185 {
00186 mb_pred[jj][ii]=(imgpel) pred;
00187 }
00188 }
00189 }
00190 }
00191 break;
00192 case HOR_PRED_8:
00193
00194 if (!left_avail[0] || !left_avail[1])
00195 error("unexpected HOR_PRED_8 chroma intra prediction mode",-1);
00196
00197 for (j = 0; j < cr_MB_y; j++)
00198 {
00199 pred = imgUV[left[1 + j].pos_y][left[1 + j].pos_x];
00200 for (i = 0; i < cr_MB_x; i++)
00201 mb_pred[j][i]=(imgpel) pred;
00202 }
00203
00204 break;
00205 case VERT_PRED_8:
00206
00207 if (!up_avail)
00208 error("unexpected VERT_PRED_8 chroma intra prediction mode",-1);
00209
00210 for (j = 0; j < cr_MB_y; j++)
00211 {
00212 memcpy(&(mb_pred[j][0]), &(imgUV[up.pos_y][up.pos_x]), cr_MB_x * sizeof(imgpel));
00213 }
00214 break;
00215 case PLANE_8:
00216
00217 if (!left_up_avail || !left_avail[0] || !left_avail[1] || !up_avail)
00218 error("unexpected PLANE_8 chroma intra prediction mode",-1);
00219 else
00220 {
00221 imgpel *upPred = &imgUV[up.pos_y][up.pos_x];
00222
00223 ih = cr_MB_x2 * (upPred[cr_MB_x - 1] - imgUV[left[0].pos_y][left[0].pos_x]);
00224 for (i = 0; i < cr_MB_x2 - 1; i++)
00225 ih += (i + 1) * (upPred[cr_MB_x2 + i] - upPred[cr_MB_x2 - 2 - i]);
00226
00227 iv = cr_MB_y2 * (imgUV[left[cr_MB_y].pos_y][left[cr_MB_y].pos_x] - imgUV[left[0].pos_y][left[0].pos_x]);
00228 for (i = 0; i < cr_MB_y2 - 1; i++)
00229 iv += (i + 1)*(imgUV[left[cr_MB_y2 + 1 + i].pos_y][left[cr_MB_y2 + 1 + i].pos_x] -
00230 imgUV[left[cr_MB_y2 - 1 - i].pos_y][left[cr_MB_y2 - 1 - i].pos_x]);
00231
00232 ib= ((cr_MB_x == 8 ? 17 : 5) * ih + 2 * cr_MB_x)>>(cr_MB_x == 8 ? 5 : 6);
00233 ic= ((cr_MB_y == 8 ? 17 : 5) * iv + 2 * cr_MB_y)>>(cr_MB_y == 8 ? 5 : 6);
00234
00235 iaa=16*(imgUV[left[cr_MB_y].pos_y][left[cr_MB_y].pos_x] + upPred[cr_MB_x-1]);
00236
00237 for (j = 0; j < cr_MB_y; j++)
00238 for (i = 0; i < cr_MB_x; i++)
00239 mb_pred[j][i]=(imgpel) iClip1(max_imgpel_value, ((iaa + (i - cr_MB_x2 + 1) * ib + (j - cr_MB_y2 + 1) * ic + 16) >> 5));
00240 }
00241 break;
00242 default:
00243 error("illegal chroma intra prediction mode", 600);
00244 break;
00245 }
00246 }
00247
00254 void itrans4x4(ImageParameters *img,
00255 ColorPlane pl,
00256 int ioff,
00257 int joff)
00258 {
00259 static int i,j;
00260
00261 int max_imgpel_value = img->max_imgpel_value_comp[pl];
00262
00263 imgpel **mb_pred = img->mb_pred[pl];
00264 imgpel **mb_rec = img->mb_rec[pl];
00265 int **mb_rres = img->mb_rres[pl];
00266
00267 inverse4x4(img->cof[pl],mb_rres,joff,ioff);
00268
00269 for (j = joff; j < joff + BLOCK_SIZE; j++)
00270 {
00271 for (i = ioff; i < ioff + BLOCK_SIZE; i++)
00272 {
00273 mb_rec[j][i] = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf((mb_rres[j][i] + ((long)mb_pred[j][i] << DQ_BITS)), DQ_BITS));
00274 }
00275 }
00276 }
00277
00284 void itrans4x4_ls(ImageParameters *img,
00285 ColorPlane pl,
00286 int ioff,
00287 int joff)
00288 {
00289 static int i,j;
00290
00291 int max_imgpel_value = img->max_imgpel_value_comp[pl];
00292
00293 imgpel **mb_pred = img->mb_pred[pl];
00294 imgpel **mb_rec = img->mb_rec[pl];
00295 int **mb_rres = img->mb_rres [pl];
00296
00297 inverse4x4(img->cof[pl],mb_rres,joff,ioff);
00298
00299 for (j = joff; j < joff + BLOCK_SIZE; j++)
00300 {
00301 for (i = ioff; i < ioff + BLOCK_SIZE; i++)
00302 {
00303 mb_rec[j][i] = (imgpel) iClip1(max_imgpel_value, rshift_rnd_sf((mb_rres[j][i] + ((long)mb_pred[j][i] << DQ_BITS)), DQ_BITS));
00304 }
00305 }
00306 }
00307
00315 void Inv_Residual_trans_4x4(ImageParameters *img,
00316 ColorPlane pl,
00317 int ioff,
00318 int joff)
00319 {
00320 int i,j;
00321 int temp[4][4];
00322 imgpel **mb_pred = img->mb_pred[pl];
00323 imgpel **mb_rec = img->mb_rec[pl];
00324 int **mb_rres = img->mb_rres[pl];
00325 int **cof = img->cof[pl];
00326
00327 if(ipmode_DPCM==VERT_PRED)
00328 {
00329 for(i=0; i<4; i++)
00330 {
00331 temp[0][i] = cof[joff + 0][ioff + i];
00332 temp[1][i] = cof[joff + 1][ioff + i] + temp[0][i];
00333 temp[2][i] = cof[joff + 2][ioff + i] + temp[1][i];
00334 temp[3][i] = cof[joff + 3][ioff + i] + temp[2][i];
00335 }
00336
00337 for(i=0; i<4; i++)
00338 {
00339 mb_rres[joff ][ioff + i]=temp[0][i];
00340 mb_rres[joff + 1][ioff + i]=temp[1][i];
00341 mb_rres[joff + 2][ioff + i]=temp[2][i];
00342 mb_rres[joff + 3][ioff + i]=temp[3][i];
00343 }
00344 }
00345 else if(ipmode_DPCM==HOR_PRED)
00346 {
00347 for(j=0; j<4; j++)
00348 {
00349 temp[j][0] = cof[joff + j][ioff ];
00350 temp[j][1] = cof[joff + j][ioff + 1] + temp[j][0];
00351 temp[j][2] = cof[joff + j][ioff + 2] + temp[j][1];
00352 temp[j][3] = cof[joff + j][ioff + 3] + temp[j][2];
00353 }
00354
00355 for(j=0; j<4; j++)
00356 {
00357 mb_rres[joff + j][ioff ]=temp[j][0];
00358 mb_rres[joff + j][ioff + 1]=temp[j][1];
00359 mb_rres[joff + j][ioff + 2]=temp[j][2];
00360 mb_rres[joff + j][ioff + 3]=temp[j][3];
00361 }
00362 }
00363 else
00364 {
00365 for (j = joff; j < joff + BLOCK_SIZE; j++)
00366 for (i = ioff; i < ioff + BLOCK_SIZE; i++)
00367 mb_rres[j][i] = cof[j][i];
00368 }
00369
00370 for (j = joff; j < joff + BLOCK_SIZE; j++)
00371 {
00372 for (i = ioff; i < ioff + BLOCK_SIZE; i++)
00373 {
00374 mb_rec[j][i] = (imgpel) (mb_rres[j][i] + mb_pred[j][i]);
00375 }
00376 }
00377 }
00378
00388
00389 void Inv_Residual_trans_8x8(ImageParameters *img, Macroblock *currMB, ColorPlane pl, int ioff,int joff)
00390 {
00391 int i, j;
00392 int temp[8][8];
00393 imgpel **mb_pred = img->mb_pred[pl];
00394 imgpel **mb_rec = img->mb_rec[pl];
00395 int **mb_rres = img->mb_rres[pl];
00396
00397 if(ipmode_DPCM==VERT_PRED)
00398 {
00399 for(i=0; i<8; i++)
00400 {
00401 temp[0][i] = mb_rres[joff + 0][ioff + i];
00402 temp[1][i] = mb_rres[joff + 1][ioff + i] + temp[0][i];
00403 temp[2][i] = mb_rres[joff + 2][ioff + i] + temp[1][i];
00404 temp[3][i] = mb_rres[joff + 3][ioff + i] + temp[2][i];
00405 temp[4][i] = mb_rres[joff + 4][ioff + i] + temp[3][i];
00406 temp[5][i] = mb_rres[joff + 5][ioff + i] + temp[4][i];
00407 temp[6][i] = mb_rres[joff + 6][ioff + i] + temp[5][i];
00408 temp[7][i] = mb_rres[joff + 7][ioff + i] + temp[6][i];
00409 }
00410 for(i=0; i<8; i++)
00411 {
00412 mb_rres[joff ][ioff+i]=temp[0][i];
00413 mb_rres[joff+1][ioff+i]=temp[1][i];
00414 mb_rres[joff+2][ioff+i]=temp[2][i];
00415 mb_rres[joff+3][ioff+i]=temp[3][i];
00416 mb_rres[joff+4][ioff+i]=temp[4][i];
00417 mb_rres[joff+5][ioff+i]=temp[5][i];
00418 mb_rres[joff+6][ioff+i]=temp[6][i];
00419 mb_rres[joff+7][ioff+i]=temp[7][i];
00420 }
00421 }
00422 else if(ipmode_DPCM==HOR_PRED)
00423 {
00424 for(i=0; i<8; i++)
00425 {
00426 temp[i][0] = mb_rres[joff + i][ioff + 0];
00427 temp[i][1] = mb_rres[joff + i][ioff + 1] + temp[i][0];
00428 temp[i][2] = mb_rres[joff + i][ioff + 2] + temp[i][1];
00429 temp[i][3] = mb_rres[joff + i][ioff + 3] + temp[i][2];
00430 temp[i][4] = mb_rres[joff + i][ioff + 4] + temp[i][3];
00431 temp[i][5] = mb_rres[joff + i][ioff + 5] + temp[i][4];
00432 temp[i][6] = mb_rres[joff + i][ioff + 6] + temp[i][5];
00433 temp[i][7] = mb_rres[joff + i][ioff + 7] + temp[i][6];
00434 }
00435 for(i=0; i<8; i++)
00436 {
00437 mb_rres[joff+i][ioff+0]=temp[i][0];
00438 mb_rres[joff+i][ioff+1]=temp[i][1];
00439 mb_rres[joff+i][ioff+2]=temp[i][2];
00440 mb_rres[joff+i][ioff+3]=temp[i][3];
00441 mb_rres[joff+i][ioff+4]=temp[i][4];
00442 mb_rres[joff+i][ioff+5]=temp[i][5];
00443 mb_rres[joff+i][ioff+6]=temp[i][6];
00444 mb_rres[joff+i][ioff+7]=temp[i][7];
00445 }
00446 }
00447
00448 for (j = joff; j < joff + BLOCK_SIZE*2; j++)
00449 {
00450 for (i = ioff; i < ioff + BLOCK_SIZE*2; i++)
00451 {
00452 mb_rec [j][i] = (imgpel) (mb_rres[j][i] + mb_pred[j][i]);
00453 }
00454 }
00455 }
00456
00457
00458
00465 void itrans_2(ImageParameters *img,
00466 Macroblock *currMB,
00467 ColorPlane pl)
00468 {
00469 int i,j;
00470
00471 int transform_pl = IS_INDEPENDENT(img) ? PLANE_Y : pl;
00472 int **cof = img->cof[transform_pl];
00473 int qp_scaled = currMB->qp_scaled[pl];
00474
00475 int qp_per = qp_per_matrix[ qp_scaled ];
00476 int qp_rem = qp_rem_matrix[ qp_scaled ];
00477
00478 int invLevelScale = InvLevelScale4x4_Intra[pl][qp_rem][0][0];
00479
00480
00481 for (j=0; j < 4;j++)
00482 {
00483 for (i=0; i < 4;i++)
00484 {
00485 M4[j][i]=cof[j<<2][i<<2];
00486 }
00487 }
00488
00489 ihadamard4x4(M4, M4);
00490
00491
00492 for (j=0; j < 4;j++)
00493 {
00494 for (i=0; i < 4;i++)
00495 {
00496 cof[j<<2][i<<2] = rshift_rnd((( M4[j][i] * invLevelScale) << qp_per), 6);
00497 }
00498 }
00499 }
00500
00501
00502 void itrans_sp(ImageParameters *img,
00503 ColorPlane pl,
00504 int ioff,
00505 int joff)
00506 {
00507 int i,j;
00508 int ilev, icof;
00509
00510 int qp = (img->type == SI_SLICE) ? img->qpsp : img->qp;
00511 int qp_per = qp_per_matrix[ qp ];
00512 int qp_rem = qp_rem_matrix[ qp ];
00513
00514 int qp_per_sp = qp_per_matrix[ img->qpsp ];
00515 int qp_rem_sp = qp_rem_matrix[ img->qpsp ];
00516 int q_bits_sp = Q_BITS + qp_per_sp;
00517
00518 imgpel **mb_pred = img->mb_pred[pl];
00519 imgpel **mb_rec = img->mb_rec[pl];
00520 int **mb_rres = img->mb_rres[pl];
00521 int **cof = img->cof[pl];
00522 int max_imgpel_value = img->max_imgpel_value_comp[pl];
00523
00524
00525 const int (*InvLevelScale4x4) [4] = dequant_coef[qp_rem];
00526 const int (*InvLevelScale4x4SP)[4] = dequant_coef[qp_rem_sp];
00527
00528 for (j=0; j< BLOCK_SIZE; j++)
00529 for (i=0; i< BLOCK_SIZE; i++)
00530 PBlock[j][i] = mb_pred[j+joff][i+ioff];
00531
00532 forward4x4(PBlock, PBlock, 0, 0);
00533
00534 if(img->sp_switch || img->type==SI_SLICE)
00535 {
00536 for (j=0;j<BLOCK_SIZE;j++)
00537 {
00538 for (i=0;i<BLOCK_SIZE;i++)
00539 {
00540
00541 icof = (cof[joff + j][ioff + i] >> qp_per) / InvLevelScale4x4[j][i];
00542
00543
00544 ilev = rshift_rnd_sf(iabs(PBlock[j][i]) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
00545 ilev = isignab(ilev, PBlock[j][i]) + icof;
00546 cof[joff + j][ioff + i] = ilev * InvLevelScale4x4SP[j][i] << qp_per_sp;
00547 }
00548 }
00549 }
00550 else
00551 {
00552 for (j=0;j<BLOCK_SIZE;j++)
00553 {
00554 for (i=0;i<BLOCK_SIZE;i++)
00555 {
00556
00557 icof = (cof[joff + j][ioff + i] >> qp_per) / InvLevelScale4x4[j][i];
00558
00559
00560 ilev = PBlock[j][i] + ((icof * InvLevelScale4x4[j][i] * A[j][i] << qp_per) >> 6);
00561 ilev = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
00562
00563 cof[joff + j][ioff + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
00564 }
00565 }
00566 }
00567
00568 inverse4x4(cof, mb_rres, joff, ioff);
00569
00570 for (j=joff; j<joff +BLOCK_SIZE;j++)
00571 {
00572 for (i=ioff; i < ioff + BLOCK_SIZE;i++)
00573 {
00574 mb_rec[j][i] = (imgpel) iClip1(max_imgpel_value,rshift_rnd_sf(mb_rres[j][i], DQ_BITS));
00575 }
00576 }
00577 }
00578
00579
00580 void itrans_sp_cr(ImageParameters *img, int uv)
00581 {
00582 int i,j,ilev, icof, n2,n1;
00583 int mp1[BLOCK_SIZE];
00584 int qp_per,qp_rem;
00585 int qp_per_sp,qp_rem_sp,q_bits_sp;
00586 imgpel **mb_pred = img->mb_pred[uv + 1];
00587 int **cof = img->cof[uv + 1];
00588
00589 qp_per = qp_per_matrix[ ((img->qp < 0 ? img->qp : QP_SCALE_CR[img->qp]))];
00590 qp_rem = qp_rem_matrix[ ((img->qp < 0 ? img->qp : QP_SCALE_CR[img->qp]))];
00591
00592 qp_per_sp = qp_per_matrix[ ((img->qpsp < 0 ? img->qpsp : QP_SCALE_CR[img->qpsp]))];
00593 qp_rem_sp = qp_rem_matrix[ ((img->qpsp < 0 ? img->qpsp : QP_SCALE_CR[img->qpsp]))];
00594 q_bits_sp = Q_BITS + qp_per_sp;
00595
00596 if (img->type == SI_SLICE)
00597 {
00598 qp_per = qp_per_sp;
00599 qp_rem = qp_rem_sp;
00600 }
00601
00602 for (j=0; j < img->mb_cr_size_y; j++)
00603 {
00604 for (i=0; i < img->mb_cr_size_x; i++)
00605 {
00606 PBlock[j][i] = mb_pred[j][i];
00607 mb_pred[j][i] = 0;
00608 }
00609 }
00610
00611 for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
00612 {
00613 for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
00614 {
00615 forward4x4(PBlock, PBlock, n2, n1);
00616 }
00617 }
00618
00619
00620 mp1[0] = (PBlock[0][0] + PBlock[4][0] + PBlock[0][4] + PBlock[4][4]);
00621 mp1[1] = (PBlock[0][0] - PBlock[4][0] + PBlock[0][4] - PBlock[4][4]);
00622 mp1[2] = (PBlock[0][0] + PBlock[4][0] - PBlock[0][4] - PBlock[4][4]);
00623 mp1[3] = (PBlock[0][0] - PBlock[4][0] - PBlock[0][4] + PBlock[4][4]);
00624
00625 if (img->sp_switch || img->type==SI_SLICE)
00626 {
00627 for (n2=0; n2 < 2; n2 ++)
00628 {
00629 for (n1=0; n1 < 2; n1 ++)
00630 {
00631
00632 ilev = rshift_rnd_sf(iabs (mp1[n1+n2*2]) * quant_coef[qp_rem_sp][0][0], q_bits_sp + 1);
00633
00634 ilev = isignab(ilev, mp1[n1+n2*2]) + cof[n2<<2][n1<<2];
00635
00636 mp1[n1+n2*2] =ilev * dequant_coef[qp_rem_sp][0][0] << qp_per_sp;
00637 }
00638 }
00639
00640 for (n2 = 0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
00641 {
00642 for (n1 = 0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
00643 {
00644 for (j = 0; j < BLOCK_SIZE; j++)
00645 {
00646 for (i = 0; i < BLOCK_SIZE; i++)
00647 {
00648
00649 cof[n2 + j][n1 + i] = (cof[n2 + j][n1 + i] >> qp_per) / dequant_coef[qp_rem][j][i];
00650
00651
00652 ilev = rshift_rnd_sf(iabs(PBlock[n2 + j][n1 + i]) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
00653
00654 ilev = isignab(ilev,PBlock[n2 + j][n1 + i]) + cof[n2 + j][n1 + i];
00655
00656 cof[n2 + j][n1 + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
00657 }
00658 }
00659 }
00660 }
00661 }
00662 else
00663 {
00664 for (n2=0; n2 < 2; n2 ++)
00665 {
00666 for (n1=0; n1 < 2; n1 ++)
00667 {
00668 ilev = mp1[n1+n2*2] + (((cof[n2<<2][n1<<2] * dequant_coef[qp_rem][0][0] * A[0][0]) << qp_per) >> 5);
00669 ilev = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][0][0], q_bits_sp + 1);
00670
00671 mp1[n1+n2*2] = ilev * dequant_coef[qp_rem_sp][0][0] << qp_per_sp;
00672 }
00673 }
00674
00675 for (n2 = 0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
00676 {
00677 for (n1 = 0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
00678 {
00679 for (j = 0; j< BLOCK_SIZE; j++)
00680 {
00681 for (i = 0; i< BLOCK_SIZE; i++)
00682 {
00683
00684
00685 icof = (cof[n2 + j][n1 + i] >> qp_per) / dequant_coef[qp_rem][j][i];
00686
00687 ilev = PBlock[n2 + j][n1 + i] + ((icof * dequant_coef[qp_rem][j][i] * A[j][i] << qp_per) >> 6);
00688
00689 ilev = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
00690 cof[n2 + j][n1 + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
00691
00692 }
00693 }
00694 }
00695 }
00696 }
00697
00698 cof[0][0] = (mp1[0] + mp1[1] + mp1[2] + mp1[3]) >> 1;
00699 cof[0][4] = (mp1[0] + mp1[1] - mp1[2] - mp1[3]) >> 1;
00700 cof[4][0] = (mp1[0] - mp1[1] + mp1[2] - mp1[3]) >> 1;
00701 cof[4][4] = (mp1[0] - mp1[1] - mp1[2] + mp1[3]) >> 1;
00702 }
00703
00704 static const byte decode_block_scan[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15};
00705
00706 void iMBtrans4x4(ImageParameters *img, Macroblock *currMB, ColorPlane pl, int smb)
00707 {
00708 int jj, ii;
00709 int block8x8;
00710 int j, k;
00711
00712 imgpel **curr_img = pl ? &(dec_picture->imgUV[pl - 1][img->pix_y]): &dec_picture->imgY[img->pix_y];
00713
00714
00715
00716
00717 itrans_4x4 = (smb) ? itrans_sp : ((currMB->is_lossless == FALSE) ? itrans4x4 : Inv_Residual_trans_4x4);
00718
00719 for (block8x8=0; block8x8 < MB_BLOCK_SIZE; block8x8 += 4)
00720 {
00721 for (k = block8x8; k < block8x8 + 4; k ++)
00722 {
00723 jj = ((decode_block_scan[k] >> 2) & 3) << BLOCK_SHIFT;
00724 ii = (decode_block_scan[k] & 3) << BLOCK_SHIFT;
00725
00726 itrans_4x4(img, pl, ii, jj);
00727 }
00728 }
00729
00730 for(j = 0; j < MB_BLOCK_SIZE; j++)
00731 {
00732 memcpy(&curr_img[j][img->pix_x], &img->mb_rec[pl][j][0], MB_BLOCK_SIZE * sizeof(imgpel));
00733 }
00734 }
00735
00736 void iMBtrans8x8(ImageParameters *img, Macroblock *currMB, ColorPlane pl)
00737 {
00738 imgpel **curr_img = pl ? &dec_picture->imgUV[pl - 1][img->pix_y]: &dec_picture->imgY[img->pix_y];
00739
00740 int block8x8;
00741 int j, ioff, joff;
00742
00743 for (block8x8=0; block8x8<4; block8x8++)
00744 {
00745
00746
00747 ioff = 8 * (block8x8 & 0x01);
00748 joff = 8 * (block8x8 >> 1);
00749
00750 itrans8x8(img, currMB, pl, ioff, joff);
00751 }
00752
00753 for(j = 0; j < MB_BLOCK_SIZE; j++)
00754 {
00755 memcpy(&curr_img[j][img->pix_x], &img->mb_rec[pl][j][0], MB_BLOCK_SIZE * sizeof(imgpel));
00756 }
00757 }
00758
00759 void iTransform(ImageParameters *img, Macroblock *currMB, ColorPlane pl, int need_4x4_transform, int smb)
00760 {
00761 static imgpel **mb_pred;
00762 static imgpel **curr_img;
00763 int j, uv = pl-1;
00764
00765 if ((currMB->cbp & 15) != 0 || smb)
00766 {
00767 if(need_4x4_transform)
00768 {
00769 iMBtrans4x4(img, currMB, pl, smb);
00770 }
00771 else
00772 {
00773 iMBtrans8x8(img, currMB, pl);
00774 }
00775 }
00776 else
00777 {
00778 mb_pred = img->mb_pred[pl];
00779 curr_img = pl ? &dec_picture->imgUV[uv][img->pix_y] : &dec_picture->imgY[img->pix_y];
00780 for(j = 0; j < MB_BLOCK_SIZE; j++)
00781 {
00782 memcpy(&(curr_img[j][img->pix_x]), &(img->mb_pred[pl][j][0]), MB_BLOCK_SIZE * sizeof(imgpel));
00783 }
00784 }
00785
00786 if ((dec_picture->chroma_format_idc != YUV400) && (dec_picture->chroma_format_idc != YUV444))
00787 {
00788 static imgpel **curUV;
00789 static int b4, b8;
00790 static int ioff, joff, jj;
00791 static imgpel **mb_rec;
00792
00793 for(uv=0;uv<2;uv++)
00794 {
00795 itrans_4x4 = (currMB->is_lossless == FALSE) ? itrans4x4 : itrans4x4_ls;
00796
00797
00798
00799 curUV = &dec_picture->imgUV[uv][img->pix_c_y];
00800 mb_rec = img->mb_rec[uv+1];
00801
00802 if (!smb && (currMB->cbp>>4))
00803 {
00804 for (b8 = 0; b8 < (img->num_uv_blocks); b8++)
00805 {
00806 for(b4 = 0; b4 < 4; b4++)
00807 {
00808 joff = subblk_offset_y[1][b8][b4];
00809 ioff = subblk_offset_x[1][b8][b4];
00810
00811 itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
00812 }
00813 }
00814
00815 for(jj = 0; jj < img->mb_size[1][1]; jj++)
00816 memcpy(&(curUV[jj][img->pix_c_x]), &(mb_rec[jj][0]), img->mb_size[1][0] * sizeof(imgpel));
00817 }
00818 else if (smb)
00819 {
00820 itrans_sp_cr(img, uv);
00821
00822 for (joff = 0; joff < img->mb_cr_size_y; joff += BLOCK_SIZE)
00823 {
00824 for(ioff = 0; ioff < img->mb_cr_size_x ;ioff += BLOCK_SIZE)
00825 {
00826 itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
00827 }
00828 }
00829
00830 for(jj = 0; jj < img->mb_size[1][1]; jj++)
00831 memcpy(&(curUV[jj][img->pix_c_x]), &(mb_rec[jj][0]), img->mb_size[1][0] * sizeof(imgpel));
00832 }
00833 else
00834 {
00835 mb_pred = img->mb_pred[uv + 1];
00836 for(jj = 0; jj < img->mb_size[1][1]; jj++)
00837 memcpy(&(curUV[jj][img->pix_c_x]), &(mb_pred[jj][0]), img->mb_size[1][0] * sizeof(imgpel));
00838 }
00839 }
00840 }
00841 }
00842