00001
00017 #include "global.h"
00018 #include "intra8x8_pred.h"
00019 #include "mb_access.h"
00020 #include "image.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #define P_Z (PredPel[0])
00039 #define P_A (PredPel[1])
00040 #define P_B (PredPel[2])
00041 #define P_C (PredPel[3])
00042 #define P_D (PredPel[4])
00043 #define P_E (PredPel[5])
00044 #define P_F (PredPel[6])
00045 #define P_G (PredPel[7])
00046 #define P_H (PredPel[8])
00047 #define P_I (PredPel[9])
00048 #define P_J (PredPel[10])
00049 #define P_K (PredPel[11])
00050 #define P_L (PredPel[12])
00051 #define P_M (PredPel[13])
00052 #define P_N (PredPel[14])
00053 #define P_O (PredPel[15])
00054 #define P_P (PredPel[16])
00055 #define P_Q (PredPel[17])
00056 #define P_R (PredPel[18])
00057 #define P_S (PredPel[19])
00058 #define P_T (PredPel[20])
00059 #define P_U (PredPel[21])
00060 #define P_V (PredPel[22])
00061 #define P_W (PredPel[23])
00062 #define P_X (PredPel[24])
00063
00070 static inline void LowPassForIntra8x8Pred(imgpel *PredPel, int block_up_left, int block_up, int block_left)
00071 {
00072 int i;
00073 static imgpel LoopArray[25];
00074
00075 memcpy(&LoopArray[0], &PredPel[0], 25 * sizeof(imgpel));
00076
00077 if(block_up_left)
00078 {
00079 if(block_up && block_left)
00080 {
00081 LoopArray[0] = (imgpel) ((P_Q + (P_Z<<1) + P_A + 2)>>2);
00082 }
00083 else
00084 {
00085 if(block_up)
00086 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_A + 2)>>2);
00087 else if (block_left)
00088 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_Q + 2)>>2);
00089 }
00090 }
00091
00092 if(block_up)
00093 {
00094 if(block_up_left)
00095 {
00096 LoopArray[1] = (imgpel) ((PredPel[0] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
00097 }
00098 else
00099 LoopArray[1] = (imgpel) ((PredPel[1] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
00100
00101
00102 for(i = 2; i <16; i++)
00103 {
00104 LoopArray[i] = (imgpel) ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
00105 }
00106 LoopArray[16] = (imgpel) ((P_P + (P_P<<1) + P_O + 2)>>2);
00107 }
00108
00109 if(block_left)
00110 {
00111 if(block_up_left)
00112 LoopArray[17] = (imgpel) ((P_Z + (P_Q<<1) + P_R + 2)>>2);
00113 else
00114 LoopArray[17] = (imgpel) ((P_Q + (P_Q<<1) + P_R + 2)>>2);
00115
00116 for(i = 18; i <24; i++)
00117 {
00118 LoopArray[i] = (imgpel) ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
00119 }
00120 LoopArray[24] = (imgpel) ((P_W + (P_X<<1) + P_X + 2) >> 2);
00121 }
00122
00123 memcpy(&PredPel[0], &LoopArray[0], 25 * sizeof(imgpel));
00124 }
00125
00132 static inline void LowPassForIntra8x8PredHor(imgpel *PredPel, int block_up_left, int block_up, int block_left)
00133 {
00134 int i;
00135 static imgpel LoopArray[25];
00136
00137 memcpy(&LoopArray[0], &PredPel[0], 25 * sizeof(imgpel));
00138
00139 if(block_up_left)
00140 {
00141 if(block_up && block_left)
00142 {
00143 LoopArray[0] = (imgpel) ((P_Q + (P_Z<<1) + P_A + 2)>>2);
00144 }
00145 else
00146 {
00147 if(block_up)
00148 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_A + 2)>>2);
00149 else if (block_left)
00150 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_Q + 2)>>2);
00151 }
00152 }
00153
00154 if(block_up)
00155 {
00156 if(block_up_left)
00157 {
00158 LoopArray[1] = (imgpel) ((PredPel[0] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
00159 }
00160 else
00161 LoopArray[1] = (imgpel) ((PredPel[1] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
00162
00163
00164 for(i = 2; i <16; i++)
00165 {
00166 LoopArray[i] = (imgpel) ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
00167 }
00168 LoopArray[16] = (imgpel) ((P_P + (P_P<<1) + P_O + 2)>>2);
00169 }
00170
00171
00172 memcpy(&PredPel[0], &LoopArray[0], 17 * sizeof(imgpel));
00173 }
00174
00181 static inline void LowPassForIntra8x8PredVer(imgpel *PredPel, int block_up_left, int block_up, int block_left)
00182 {
00183
00184
00185 int i;
00186 static imgpel LoopArray[25];
00187
00188 memcpy(&LoopArray[0], &PredPel[0], 25 * sizeof(imgpel));
00189
00190 if(block_up_left)
00191 {
00192 if(block_up && block_left)
00193 {
00194 LoopArray[0] = (imgpel) ((P_Q + (P_Z<<1) + P_A + 2)>>2);
00195 }
00196 else
00197 {
00198 if(block_up)
00199 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_A + 2)>>2);
00200 else if (block_left)
00201 LoopArray[0] = (imgpel) ((P_Z + (P_Z<<1) + P_Q + 2)>>2);
00202 }
00203 }
00204
00205 if(block_left)
00206 {
00207 if(block_up_left)
00208 LoopArray[17] = (imgpel) ((P_Z + (P_Q<<1) + P_R + 2)>>2);
00209 else
00210 LoopArray[17] = (imgpel) ((P_Q + (P_Q<<1) + P_R + 2)>>2);
00211
00212 for(i = 18; i <24; i++)
00213 {
00214 LoopArray[i] = (imgpel) ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
00215 }
00216 LoopArray[24] = (imgpel) ((P_W + (P_X<<1) + P_X + 2) >> 2);
00217 }
00218
00219 memcpy(&PredPel[0], &LoopArray[0], 25 * sizeof(imgpel));
00220 }
00221
00232 static inline int intra8x8_dc_pred(ImageParameters *img,
00233 Macroblock *currMB,
00234 ColorPlane pl,
00235 int ioff,
00236 int joff)
00237 {
00238 int i,j;
00239 int s0 = 0;
00240 imgpel PredPel[25];
00241 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
00242
00243 PixelPos pix_a[8];
00244 PixelPos pix_b, pix_c, pix_d;
00245
00246 int block_available_up;
00247 int block_available_left;
00248 int block_available_up_left;
00249 int block_available_up_right;
00250
00251 imgpel *pred_pels, **mpr = img->mb_pred[pl];
00252 int *mb_size = img->mb_size[IS_LUMA];
00253
00254 for (i=0;i<8;i++)
00255 {
00256 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
00257 }
00258
00259 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
00260 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
00261 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
00262
00263 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
00264
00265 if (active_pps->constrained_intra_pred_flag)
00266 {
00267 for (i=0, block_available_left=1; i<8;i++)
00268 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
00269 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
00270 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
00271 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
00272 }
00273 else
00274 {
00275 block_available_left = pix_a[0].available;
00276 block_available_up = pix_b.available;
00277 block_available_up_right = pix_c.available;
00278 block_available_up_left = pix_d.available;
00279 }
00280
00281
00282 if (block_available_up)
00283 {
00284 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
00285 P_A = pred_pels[0];
00286 P_B = pred_pels[1];
00287 P_C = pred_pels[2];
00288 P_D = pred_pels[3];
00289 P_E = pred_pels[4];
00290 P_F = pred_pels[5];
00291 P_G = pred_pels[6];
00292 P_H = pred_pels[7];
00293 }
00294 else
00295 {
00296 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
00297 }
00298
00299 if (block_available_up_right)
00300 {
00301 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
00302 P_I = pred_pels[0];
00303 P_J = pred_pels[1];
00304 P_K = pred_pels[2];
00305 P_L = pred_pels[3];
00306 P_M = pred_pels[4];
00307 P_N = pred_pels[5];
00308 P_O = pred_pels[6];
00309 P_P = pred_pels[7];
00310
00311 }
00312 else
00313 {
00314 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
00315 }
00316
00317 if (block_available_left)
00318 {
00319 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
00320 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
00321 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
00322 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
00323 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
00324 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
00325 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
00326 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
00327 }
00328 else
00329 {
00330 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
00331 }
00332
00333 if (block_available_up_left)
00334 {
00335 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
00336 }
00337 else
00338 {
00339 P_Z = (imgpel) img->dc_pred_value_comp[pl];
00340 }
00341
00342 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
00343
00344 if (block_available_up && block_available_left)
00345 {
00346
00347 s0 = (P_A + P_B + P_C + P_D + P_E + P_F + P_G + P_H + P_Q + P_R + P_S + P_T + P_U + P_V + P_W + P_X + 8) >> 4;
00348 }
00349 else if (!block_available_up && block_available_left)
00350 {
00351
00352 s0 = (P_Q + P_R + P_S + P_T + P_U + P_V + P_W + P_X + 4) >> 3;
00353 }
00354 else if (block_available_up && !block_available_left)
00355 {
00356
00357 s0 = (P_A + P_B + P_C + P_D + P_E + P_F + P_G + P_H + 4) >> 3;
00358 }
00359 else
00360 {
00361
00362 s0 = img->dc_pred_value_comp[pl];
00363 }
00364
00365 for(j = joff; j < joff + BLOCK_SIZE_8x8; j++)
00366 for(i = ioff; i < ioff + BLOCK_SIZE_8x8; i++)
00367 mpr[j][i] = (imgpel) s0;
00368
00369 return DECODING_OK;
00370 }
00371
00382 static inline int intra8x8_vert_pred(ImageParameters *img,
00383 Macroblock *currMB,
00384 ColorPlane pl,
00385 int ioff,
00386 int joff)
00387 {
00388 int i;
00389 imgpel PredPel[25];
00390 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
00391
00392 PixelPos pix_a[8];
00393 PixelPos pix_b, pix_c, pix_d;
00394
00395 int block_available_up;
00396 int block_available_left;
00397 int block_available_up_left;
00398 int block_available_up_right;
00399
00400 imgpel *pred_pels, **mpr = img->mb_pred[pl];
00401 int *mb_size = img->mb_size[IS_LUMA];
00402
00403 for (i=0;i<8;i++)
00404 {
00405 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
00406 }
00407
00408 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
00409 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
00410 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
00411
00412 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
00413
00414 if (active_pps->constrained_intra_pred_flag)
00415 {
00416 for (i=0, block_available_left=1; i<8;i++)
00417 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
00418 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
00419 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
00420 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
00421 }
00422 else
00423 {
00424 block_available_left = pix_a[0].available;
00425 block_available_up = pix_b.available;
00426 block_available_up_right = pix_c.available;
00427 block_available_up_left = pix_d.available;
00428 }
00429
00430 if (!block_available_up)
00431 printf ("warning: Intra_8x8_Vertical prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
00432
00433
00434 if (block_available_up)
00435 {
00436 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
00437 P_A = *(pred_pels ++);
00438 P_B = *(pred_pels ++);
00439 P_C = *(pred_pels ++);
00440 P_D = *(pred_pels ++);
00441 P_E = *(pred_pels ++);
00442 P_F = *(pred_pels ++);
00443 P_G = *(pred_pels ++);
00444 P_H = *pred_pels;
00445 }
00446 else
00447 {
00448 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
00449 }
00450
00451 if (block_available_up_right)
00452 {
00453 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
00454 P_I = *(pred_pels ++);
00455 P_J = *(pred_pels ++);
00456 P_K = *(pred_pels ++);
00457 P_L = *(pred_pels ++);
00458 P_M = *(pred_pels ++);
00459 P_N = *(pred_pels ++);
00460 P_O = *(pred_pels ++);
00461 P_P = *pred_pels;
00462 }
00463 else
00464 {
00465 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
00466 }
00467
00468 if (block_available_up_left)
00469 {
00470 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
00471 }
00472 else
00473 {
00474 P_Z = (imgpel) img->dc_pred_value_comp[pl];
00475 }
00476
00477 LowPassForIntra8x8PredHor(&(P_Z), block_available_up_left, block_available_up, block_available_left);
00478
00479 for (i=joff; i < joff + BLOCK_SIZE_8x8; i++)
00480 {
00481 memcpy(&mpr[i][ioff], (&P_A), BLOCK_SIZE_8x8 * sizeof(imgpel));
00482 }
00483
00484 return DECODING_OK;
00485 }
00486
00497 static inline int intra8x8_hor_pred(ImageParameters *img,
00498 Macroblock *currMB,
00499 ColorPlane pl,
00500 int ioff,
00501 int joff)
00502 {
00503 int i,j;
00504 imgpel PredPel[25];
00505 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
00506
00507 PixelPos pix_a[8];
00508 PixelPos pix_b, pix_c, pix_d;
00509
00510 int block_available_up;
00511 int block_available_left;
00512 int block_available_up_left;
00513 int block_available_up_right;
00514
00515 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
00516 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
00517 int jpos;
00518 imgpel **mpr = img->mb_pred[pl];
00519 int *mb_size = img->mb_size[IS_LUMA];
00520
00521 for (i=0;i<8;i++)
00522 {
00523 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
00524 }
00525
00526 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
00527 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
00528 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
00529
00530 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
00531
00532 if (active_pps->constrained_intra_pred_flag)
00533 {
00534 for (i=0, block_available_left=1; i<8;i++)
00535 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
00536 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
00537 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
00538 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
00539 }
00540 else
00541 {
00542 block_available_left = pix_a[0].available;
00543 block_available_up = pix_b.available;
00544 block_available_up_right = pix_c.available;
00545 block_available_up_left = pix_d.available;
00546 }
00547
00548 if (!block_available_left)
00549 printf ("warning: Intra_8x8_Horizontal prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
00550
00551
00552 if (block_available_left)
00553 {
00554 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
00555 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
00556 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
00557 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
00558 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
00559 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
00560 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
00561 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
00562 }
00563 else
00564 {
00565 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
00566 }
00567
00568 if (block_available_up_left)
00569 {
00570 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
00571 }
00572 else
00573 {
00574 P_Z = (imgpel) img->dc_pred_value_comp[pl];
00575 }
00576
00577 LowPassForIntra8x8PredVer(&(P_Z), block_available_up_left, block_available_up, block_available_left);
00578
00579 for (j=0; j < BLOCK_SIZE_8x8; j++)
00580 {
00581 jpos = j + joff;
00582 mpr[jpos][ipos0] =
00583 mpr[jpos][ipos1] =
00584 mpr[jpos][ipos2] =
00585 mpr[jpos][ipos3] =
00586 mpr[jpos][ipos4] =
00587 mpr[jpos][ipos5] =
00588 mpr[jpos][ipos6] =
00589 mpr[jpos][ipos7] = (imgpel) (&P_Q)[j];
00590 }
00591
00592 return DECODING_OK;
00593 }
00594
00605 static inline int intra8x8_diag_down_right_pred(ImageParameters *img,
00606 Macroblock *currMB,
00607 ColorPlane pl,
00608 int ioff,
00609 int joff)
00610 {
00611 int i;
00612 imgpel PredPel[25];
00613 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
00614
00615 PixelPos pix_a[8];
00616 PixelPos pix_b, pix_c, pix_d;
00617
00618 int block_available_up;
00619 int block_available_left;
00620 int block_available_up_left;
00621 int block_available_up_right;
00622
00623 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
00624 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
00625 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
00626 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
00627 imgpel *pred_pels, **mpr = img->mb_pred[pl];
00628 int *mb_size = img->mb_size[IS_LUMA];
00629
00630 for (i=0;i<8;i++)
00631 {
00632 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
00633 }
00634
00635 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
00636 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
00637 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
00638
00639 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
00640
00641 if (active_pps->constrained_intra_pred_flag)
00642 {
00643 for (i=0, block_available_left=1; i<8;i++)
00644 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
00645 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
00646 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
00647 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
00648 }
00649 else
00650 {
00651 block_available_left = pix_a[0].available;
00652 block_available_up = pix_b.available;
00653 block_available_up_right = pix_c.available;
00654 block_available_up_left = pix_d.available;
00655 }
00656
00657 if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
00658 printf ("warning: Intra_8x8_Diagonal_Down_Right prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
00659
00660
00661 if (block_available_up)
00662 {
00663 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
00664 P_A = pred_pels[0];
00665 P_B = pred_pels[1];
00666 P_C = pred_pels[2];
00667 P_D = pred_pels[3];
00668 P_E = pred_pels[4];
00669 P_F = pred_pels[5];
00670 P_G = pred_pels[6];
00671 P_H = pred_pels[7];
00672 }
00673 else
00674 {
00675 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
00676 }
00677
00678 if (block_available_up_right)
00679 {
00680 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
00681 P_I = pred_pels[0];
00682 P_J = pred_pels[1];
00683 P_K = pred_pels[2];
00684 P_L = pred_pels[3];
00685 P_M = pred_pels[4];
00686 P_N = pred_pels[5];
00687 P_O = pred_pels[6];
00688 P_P = pred_pels[7];
00689
00690 }
00691 else
00692 {
00693 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
00694 }
00695
00696 if (block_available_left)
00697 {
00698 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
00699 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
00700 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
00701 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
00702 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
00703 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
00704 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
00705 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
00706 }
00707 else
00708 {
00709 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
00710 }
00711
00712 if (block_available_up_left)
00713 {
00714 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
00715 }
00716 else
00717 {
00718 P_Z = (imgpel) img->dc_pred_value_comp[pl];
00719 }
00720
00721 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
00722
00723
00724 mpr[jpos7][ipos0] = (imgpel) ((P_X + P_V + 2*(P_W) + 2) >> 2);
00725 mpr[jpos6][ipos0] =
00726 mpr[jpos7][ipos1] = (imgpel) ((P_W + P_U + 2*(P_V) + 2) >> 2);
00727 mpr[jpos5][ipos0] =
00728 mpr[jpos6][ipos1] =
00729 mpr[jpos7][ipos2] = (imgpel) ((P_V + P_T + 2*(P_U) + 2) >> 2);
00730 mpr[jpos4][ipos0] =
00731 mpr[jpos5][ipos1] =
00732 mpr[jpos6][ipos2] =
00733 mpr[jpos7][ipos3] = (imgpel) ((P_U + P_S + 2*(P_T) + 2) >> 2);
00734 mpr[jpos3][ipos0] =
00735 mpr[jpos4][ipos1] =
00736 mpr[jpos5][ipos2] =
00737 mpr[jpos6][ipos3] =
00738 mpr[jpos7][ipos4] = (imgpel) ((P_T + P_R + 2*(P_S) + 2) >> 2);
00739 mpr[jpos2][ipos0] =
00740 mpr[jpos3][ipos1] =
00741 mpr[jpos4][ipos2] =
00742 mpr[jpos5][ipos3] =
00743 mpr[jpos6][ipos4] =
00744 mpr[jpos7][ipos5] = (imgpel) ((P_S + P_Q + 2*(P_R) + 2) >> 2);
00745 mpr[jpos1][ipos0] =
00746 mpr[jpos2][ipos1] =
00747 mpr[jpos3][ipos2] =
00748 mpr[jpos4][ipos3] =
00749 mpr[jpos5][ipos4] =
00750 mpr[jpos6][ipos5] =
00751 mpr[jpos7][ipos6] = (imgpel) ((P_R + P_Z + 2*(P_Q) + 2) >> 2);
00752 mpr[jpos0][ipos0] =
00753 mpr[jpos1][ipos1] =
00754 mpr[jpos2][ipos2] =
00755 mpr[jpos3][ipos3] =
00756 mpr[jpos4][ipos4] =
00757 mpr[jpos5][ipos5] =
00758 mpr[jpos6][ipos6] =
00759 mpr[jpos7][ipos7] = (imgpel) ((P_Q + P_A + 2*(P_Z) + 2) >> 2);
00760 mpr[jpos0][ipos1] =
00761 mpr[jpos1][ipos2] =
00762 mpr[jpos2][ipos3] =
00763 mpr[jpos3][ipos4] =
00764 mpr[jpos4][ipos5] =
00765 mpr[jpos5][ipos6] =
00766 mpr[jpos6][ipos7] = (imgpel) ((P_Z + P_B + 2*(P_A) + 2) >> 2);
00767 mpr[jpos0][ipos2] =
00768 mpr[jpos1][ipos3] =
00769 mpr[jpos2][ipos4] =
00770 mpr[jpos3][ipos5] =
00771 mpr[jpos4][ipos6] =
00772 mpr[jpos5][ipos7] = (imgpel) ((P_A + P_C + 2*(P_B) + 2) >> 2);
00773 mpr[jpos0][ipos3] =
00774 mpr[jpos1][ipos4] =
00775 mpr[jpos2][ipos5] =
00776 mpr[jpos3][ipos6] =
00777 mpr[jpos4][ipos7] = (imgpel) ((P_B + P_D + 2*(P_C) + 2) >> 2);
00778 mpr[jpos0][ipos4] =
00779 mpr[jpos1][ipos5] =
00780 mpr[jpos2][ipos6] =
00781 mpr[jpos3][ipos7] = (imgpel) ((P_C + P_E + 2*(P_D) + 2) >> 2);
00782 mpr[jpos0][ipos5] =
00783 mpr[jpos1][ipos6] =
00784 mpr[jpos2][ipos7] = (imgpel) ((P_D + P_F + 2*(P_E) + 2) >> 2);
00785 mpr[jpos0][ipos6] =
00786 mpr[jpos1][ipos7] = (imgpel) ((P_E + P_G + 2*(P_F) + 2) >> 2);
00787 mpr[jpos0][ipos7] = (imgpel) ((P_F + P_H + 2*(P_G) + 2) >> 2);
00788
00789 return DECODING_OK;
00790 }
00791
00802 static inline int intra8x8_diag_down_left_pred(ImageParameters *img,
00803 Macroblock *currMB,
00804 ColorPlane pl,
00805 int ioff,
00806 int joff)
00807 {
00808 int i;
00809 imgpel PredPel[25];
00810 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
00811
00812 PixelPos pix_a[8];
00813 PixelPos pix_b, pix_c, pix_d;
00814
00815 int block_available_up;
00816 int block_available_left;
00817 int block_available_up_left;
00818 int block_available_up_right;
00819
00820 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
00821 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
00822 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
00823 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
00824 imgpel *pred_pels, **mpr = img->mb_pred[pl];
00825 int *mb_size = img->mb_size[IS_LUMA];
00826
00827 for (i=0;i<8;i++)
00828 {
00829 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
00830 }
00831
00832 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
00833 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
00834 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
00835
00836 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
00837
00838 if (active_pps->constrained_intra_pred_flag)
00839 {
00840 for (i=0, block_available_left=1; i<8;i++)
00841 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
00842 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
00843 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
00844 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
00845 }
00846 else
00847 {
00848 block_available_left = pix_a[0].available;
00849 block_available_up = pix_b.available;
00850 block_available_up_right = pix_c.available;
00851 block_available_up_left = pix_d.available;
00852 }
00853
00854 if (!block_available_up)
00855 printf ("warning: Intra_8x8_Diagonal_Down_Left prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
00856
00857
00858 if (block_available_up)
00859 {
00860 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
00861 P_A = pred_pels[0];
00862 P_B = pred_pels[1];
00863 P_C = pred_pels[2];
00864 P_D = pred_pels[3];
00865 P_E = pred_pels[4];
00866 P_F = pred_pels[5];
00867 P_G = pred_pels[6];
00868 P_H = pred_pels[7];
00869 }
00870 else
00871 {
00872 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
00873 }
00874
00875 if (block_available_up_right)
00876 {
00877 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
00878 P_I = pred_pels[0];
00879 P_J = pred_pels[1];
00880 P_K = pred_pels[2];
00881 P_L = pred_pels[3];
00882 P_M = pred_pels[4];
00883 P_N = pred_pels[5];
00884 P_O = pred_pels[6];
00885 P_P = pred_pels[7];
00886
00887 }
00888 else
00889 {
00890 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
00891 }
00892
00893 if (block_available_left)
00894 {
00895 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
00896 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
00897 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
00898 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
00899 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
00900 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
00901 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
00902 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
00903 }
00904 else
00905 {
00906 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
00907 }
00908
00909 if (block_available_up_left)
00910 {
00911 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
00912 }
00913 else
00914 {
00915 P_Z = (imgpel) img->dc_pred_value_comp[pl];
00916 }
00917
00918 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
00919
00920
00921 mpr[jpos0][ipos0] = (imgpel) ((P_A + P_C + 2*(P_B) + 2) >> 2);
00922 mpr[jpos1][ipos0] =
00923 mpr[jpos0][ipos1] = (imgpel) ((P_B + P_D + 2*(P_C) + 2) >> 2);
00924 mpr[jpos2][ipos0] =
00925 mpr[jpos1][ipos1] =
00926 mpr[jpos0][ipos2] = (imgpel) ((P_C + P_E + 2*(P_D) + 2) >> 2);
00927 mpr[jpos3][ipos0] =
00928 mpr[jpos2][ipos1] =
00929 mpr[jpos1][ipos2] =
00930 mpr[jpos0][ipos3] = (imgpel) ((P_D + P_F + 2*(P_E) + 2) >> 2);
00931 mpr[jpos4][ipos0] =
00932 mpr[jpos3][ipos1] =
00933 mpr[jpos2][ipos2] =
00934 mpr[jpos1][ipos3] =
00935 mpr[jpos0][ipos4] = (imgpel) ((P_E + P_G + 2*(P_F) + 2) >> 2);
00936 mpr[jpos5][ipos0] =
00937 mpr[jpos4][ipos1] =
00938 mpr[jpos3][ipos2] =
00939 mpr[jpos2][ipos3] =
00940 mpr[jpos1][ipos4] =
00941 mpr[jpos0][ipos5] = (imgpel) ((P_F + P_H + 2*(P_G) + 2) >> 2);
00942 mpr[jpos6][ipos0] =
00943 mpr[jpos5][ipos1] =
00944 mpr[jpos4][ipos2] =
00945 mpr[jpos3][ipos3] =
00946 mpr[jpos2][ipos4] =
00947 mpr[jpos1][ipos5] =
00948 mpr[jpos0][ipos6] = (imgpel) ((P_G + P_I + 2*(P_H) + 2) >> 2);
00949 mpr[jpos7][ipos0] =
00950 mpr[jpos6][ipos1] =
00951 mpr[jpos5][ipos2] =
00952 mpr[jpos4][ipos3] =
00953 mpr[jpos3][ipos4] =
00954 mpr[jpos2][ipos5] =
00955 mpr[jpos1][ipos6] =
00956 mpr[jpos0][ipos7] = (imgpel) ((P_H + P_J + 2*(P_I) + 2) >> 2);
00957 mpr[jpos7][ipos1] =
00958 mpr[jpos6][ipos2] =
00959 mpr[jpos5][ipos3] =
00960 mpr[jpos4][ipos4] =
00961 mpr[jpos3][ipos5] =
00962 mpr[jpos2][ipos6] =
00963 mpr[jpos1][ipos7] = (imgpel) ((P_I + P_K + 2*(P_J) + 2) >> 2);
00964 mpr[jpos7][ipos2] =
00965 mpr[jpos6][ipos3] =
00966 mpr[jpos5][ipos4] =
00967 mpr[jpos4][ipos5] =
00968 mpr[jpos3][ipos6] =
00969 mpr[jpos2][ipos7] = (imgpel) ((P_J + P_L + 2*(P_K) + 2) >> 2);
00970 mpr[jpos7][ipos3] =
00971 mpr[jpos6][ipos4] =
00972 mpr[jpos5][ipos5] =
00973 mpr[jpos4][ipos6] =
00974 mpr[jpos3][ipos7] = (imgpel) ((P_K + P_M + 2*(P_L) + 2) >> 2);
00975 mpr[jpos7][ipos4] =
00976 mpr[jpos6][ipos5] =
00977 mpr[jpos5][ipos6] =
00978 mpr[jpos4][ipos7] = (imgpel) ((P_L + P_N + 2*(P_M) + 2) >> 2);
00979 mpr[jpos7][ipos5] =
00980 mpr[jpos6][ipos6] =
00981 mpr[jpos5][ipos7] = (imgpel) ((P_M + P_O + 2*(P_N) + 2) >> 2);
00982 mpr[jpos7][ipos6] =
00983 mpr[jpos6][ipos7] = (imgpel) ((P_N + P_P + 2*(P_O) + 2) >> 2);
00984 mpr[jpos7][ipos7] = (imgpel) ((P_O + 3*(P_P) + 2) >> 2);
00985
00986 return DECODING_OK;
00987 }
00988
00999 static inline int intra8x8_vert_right_pred(ImageParameters *img,
01000 Macroblock *currMB,
01001 ColorPlane pl,
01002 int ioff,
01003 int joff)
01004 {
01005 int i;
01006 imgpel PredPel[25];
01007 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
01008
01009 PixelPos pix_a[8];
01010 PixelPos pix_b, pix_c, pix_d;
01011
01012 int block_available_up;
01013 int block_available_left;
01014 int block_available_up_left;
01015 int block_available_up_right;
01016 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
01017 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
01018 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
01019 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
01020 imgpel *pred_pels, **mpr = img->mb_pred[pl];
01021 int *mb_size = img->mb_size[IS_LUMA];
01022
01023 for (i=0;i<8;i++)
01024 {
01025 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
01026 }
01027
01028 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
01029 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
01030 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
01031
01032 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
01033
01034 if (active_pps->constrained_intra_pred_flag)
01035 {
01036 for (i=0, block_available_left=1; i<8;i++)
01037 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
01038 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
01039 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
01040 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
01041 }
01042 else
01043 {
01044 block_available_left = pix_a[0].available;
01045 block_available_up = pix_b.available;
01046 block_available_up_right = pix_c.available;
01047 block_available_up_left = pix_d.available;
01048 }
01049
01050 if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
01051 printf ("warning: Intra_8x8_Vertical_Right prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
01052
01053
01054 if (block_available_up)
01055 {
01056 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
01057 P_A = pred_pels[0];
01058 P_B = pred_pels[1];
01059 P_C = pred_pels[2];
01060 P_D = pred_pels[3];
01061 P_E = pred_pels[4];
01062 P_F = pred_pels[5];
01063 P_G = pred_pels[6];
01064 P_H = pred_pels[7];
01065 }
01066 else
01067 {
01068 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
01069 }
01070
01071 if (block_available_up_right)
01072 {
01073 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
01074 P_I = pred_pels[0];
01075 P_J = pred_pels[1];
01076 P_K = pred_pels[2];
01077 P_L = pred_pels[3];
01078 P_M = pred_pels[4];
01079 P_N = pred_pels[5];
01080 P_O = pred_pels[6];
01081 P_P = pred_pels[7];
01082
01083 }
01084 else
01085 {
01086 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
01087 }
01088
01089 if (block_available_left)
01090 {
01091 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
01092 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
01093 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
01094 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
01095 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
01096 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
01097 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
01098 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
01099 }
01100 else
01101 {
01102 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
01103 }
01104
01105 if (block_available_up_left)
01106 {
01107 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
01108 }
01109 else
01110 {
01111 P_Z = (imgpel) img->dc_pred_value_comp[pl];
01112 }
01113
01114 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
01115
01116 mpr[jpos0][ipos0] =
01117 mpr[jpos2][ipos1] =
01118 mpr[jpos4][ipos2] =
01119 mpr[jpos6][ipos3] = (imgpel) ((P_Z + P_A + 1) >> 1);
01120 mpr[jpos0][ipos1] =
01121 mpr[jpos2][ipos2] =
01122 mpr[jpos4][ipos3] =
01123 mpr[jpos6][ipos4] = (imgpel) ((P_A + P_B + 1) >> 1);
01124 mpr[jpos0][ipos2] =
01125 mpr[jpos2][ipos3] =
01126 mpr[jpos4][ipos4] =
01127 mpr[jpos6][ipos5] = (imgpel) ((P_B + P_C + 1) >> 1);
01128 mpr[jpos0][ipos3] =
01129 mpr[jpos2][ipos4] =
01130 mpr[jpos4][ipos5] =
01131 mpr[jpos6][ipos6] = (imgpel) ((P_C + P_D + 1) >> 1);
01132 mpr[jpos0][ipos4] =
01133 mpr[jpos2][ipos5] =
01134 mpr[jpos4][ipos6] =
01135 mpr[jpos6][ipos7] = (imgpel) ((P_D + P_E + 1) >> 1);
01136 mpr[jpos0][ipos5] =
01137 mpr[jpos2][ipos6] =
01138 mpr[jpos4][ipos7] = (imgpel) ((P_E + P_F + 1) >> 1);
01139 mpr[jpos0][ipos6] =
01140 mpr[jpos2][ipos7] = (imgpel) ((P_F + P_G + 1) >> 1);
01141 mpr[jpos0][ipos7] = (imgpel) ((P_G + P_H + 1) >> 1);
01142 mpr[jpos1][ipos0] =
01143 mpr[jpos3][ipos1] =
01144 mpr[jpos5][ipos2] =
01145 mpr[jpos7][ipos3] = (imgpel) ((P_Q + P_A + 2*P_Z + 2) >> 2);
01146 mpr[jpos1][ipos1] =
01147 mpr[jpos3][ipos2] =
01148 mpr[jpos5][ipos3] =
01149 mpr[jpos7][ipos4] = (imgpel) ((P_Z + P_B + 2*P_A + 2) >> 2);
01150 mpr[jpos1][ipos2] =
01151 mpr[jpos3][ipos3] =
01152 mpr[jpos5][ipos4] =
01153 mpr[jpos7][ipos5] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
01154 mpr[jpos1][ipos3] =
01155 mpr[jpos3][ipos4] =
01156 mpr[jpos5][ipos5] =
01157 mpr[jpos7][ipos6] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
01158 mpr[jpos1][ipos4] =
01159 mpr[jpos3][ipos5] =
01160 mpr[jpos5][ipos6] =
01161 mpr[jpos7][ipos7] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
01162 mpr[jpos1][ipos5] =
01163 mpr[jpos3][ipos6] =
01164 mpr[jpos5][ipos7] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
01165 mpr[jpos1][ipos6] =
01166 mpr[jpos3][ipos7] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
01167 mpr[jpos1][ipos7] = (imgpel) ((P_F + P_H + 2*P_G + 2) >> 2);
01168 mpr[jpos2][ipos0] =
01169 mpr[jpos4][ipos1] =
01170 mpr[jpos6][ipos2] = (imgpel) ((P_R + P_Z + 2*P_Q + 2) >> 2);
01171 mpr[jpos3][ipos0] =
01172 mpr[jpos5][ipos1] =
01173 mpr[jpos7][ipos2] = (imgpel) ((P_S + P_Q + 2*P_R + 2) >> 2);
01174 mpr[jpos4][ipos0] =
01175 mpr[jpos6][ipos1] = (imgpel) ((P_T + P_R + 2*P_S + 2) >> 2);
01176 mpr[jpos5][ipos0] =
01177 mpr[jpos7][ipos1] = (imgpel) ((P_U + P_S + 2*P_T + 2) >> 2);
01178 mpr[jpos6][ipos0] = (imgpel) ((P_V + P_T + 2*P_U + 2) >> 2);
01179 mpr[jpos7][ipos0] = (imgpel) ((P_W + P_U + 2*P_V + 2) >> 2);
01180
01181 return DECODING_OK;
01182 }
01183
01184
01195 static inline int intra8x8_vert_left_pred(ImageParameters *img,
01196 Macroblock *currMB,
01197 ColorPlane pl,
01198 int ioff,
01199 int joff)
01200 {
01201 int i;
01202 imgpel PredPel[25];
01203 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
01204
01205 PixelPos pix_a[8];
01206 PixelPos pix_b, pix_c, pix_d;
01207
01208 int block_available_up;
01209 int block_available_left;
01210 int block_available_up_left;
01211 int block_available_up_right;
01212
01213 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
01214 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
01215 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
01216 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
01217 imgpel *pred_pels, **mpr = img->mb_pred[pl];
01218 int *mb_size = img->mb_size[IS_LUMA];
01219
01220 for (i=0;i<8;i++)
01221 {
01222 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
01223 }
01224
01225 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
01226 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
01227 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
01228
01229 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
01230
01231 if (active_pps->constrained_intra_pred_flag)
01232 {
01233 for (i=0, block_available_left=1; i<8;i++)
01234 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
01235 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
01236 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
01237 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
01238 }
01239 else
01240 {
01241 block_available_left = pix_a[0].available;
01242 block_available_up = pix_b.available;
01243 block_available_up_right = pix_c.available;
01244 block_available_up_left = pix_d.available;
01245 }
01246
01247 if (!block_available_up)
01248 printf ("warning: Intra_4x4_Vertical_Left prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
01249
01250
01251 if (block_available_up)
01252 {
01253 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
01254 P_A = pred_pels[0];
01255 P_B = pred_pels[1];
01256 P_C = pred_pels[2];
01257 P_D = pred_pels[3];
01258 P_E = pred_pels[4];
01259 P_F = pred_pels[5];
01260 P_G = pred_pels[6];
01261 P_H = pred_pels[7];
01262 }
01263 else
01264 {
01265 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
01266 }
01267
01268 if (block_available_up_right)
01269 {
01270 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
01271 P_I = pred_pels[0];
01272 P_J = pred_pels[1];
01273 P_K = pred_pels[2];
01274 P_L = pred_pels[3];
01275 P_M = pred_pels[4];
01276 P_N = pred_pels[5];
01277 P_O = pred_pels[6];
01278 P_P = pred_pels[7];
01279
01280 }
01281 else
01282 {
01283 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
01284 }
01285
01286 if (block_available_left)
01287 {
01288 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
01289 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
01290 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
01291 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
01292 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
01293 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
01294 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
01295 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
01296 }
01297 else
01298 {
01299 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
01300 }
01301
01302 if (block_available_up_left)
01303 {
01304 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
01305 }
01306 else
01307 {
01308 P_Z = (imgpel) img->dc_pred_value_comp[pl];
01309 }
01310
01311 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
01312
01313 mpr[jpos0][ipos0] = (imgpel) ((P_A + P_B + 1) >> 1);
01314 mpr[jpos0][ipos1] =
01315 mpr[jpos2][ipos0] = (imgpel) ((P_B + P_C + 1) >> 1);
01316 mpr[jpos0][ipos2] =
01317 mpr[jpos2][ipos1] =
01318 mpr[jpos4][ipos0] = (imgpel) ((P_C + P_D + 1) >> 1);
01319 mpr[jpos0][ipos3] =
01320 mpr[jpos2][ipos2] =
01321 mpr[jpos4][ipos1] =
01322 mpr[jpos6][ipos0] = (imgpel) ((P_D + P_E + 1) >> 1);
01323 mpr[jpos0][ipos4] =
01324 mpr[jpos2][ipos3] =
01325 mpr[jpos4][ipos2] =
01326 mpr[jpos6][ipos1] = (imgpel) ((P_E + P_F + 1) >> 1);
01327 mpr[jpos0][ipos5] =
01328 mpr[jpos2][ipos4] =
01329 mpr[jpos4][ipos3] =
01330 mpr[jpos6][ipos2] = (imgpel) ((P_F + P_G + 1) >> 1);
01331 mpr[jpos0][ipos6] =
01332 mpr[jpos2][ipos5] =
01333 mpr[jpos4][ipos4] =
01334 mpr[jpos6][ipos3] = (imgpel) ((P_G + P_H + 1) >> 1);
01335 mpr[jpos0][ipos7] =
01336 mpr[jpos2][ipos6] =
01337 mpr[jpos4][ipos5] =
01338 mpr[jpos6][ipos4] = (imgpel) ((P_H + P_I + 1) >> 1);
01339 mpr[jpos2][ipos7] =
01340 mpr[jpos4][ipos6] =
01341 mpr[jpos6][ipos5] = (imgpel) ((P_I + P_J + 1) >> 1);
01342 mpr[jpos4][ipos7] =
01343 mpr[jpos6][ipos6] = (imgpel) ((P_J + P_K + 1) >> 1);
01344 mpr[jpos6][ipos7] = (imgpel) ((P_K + P_L + 1) >> 1);
01345 mpr[jpos1][ipos0] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
01346 mpr[jpos1][ipos1] =
01347 mpr[jpos3][ipos0] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
01348 mpr[jpos1][ipos2] =
01349 mpr[jpos3][ipos1] =
01350 mpr[jpos5][ipos0] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
01351 mpr[jpos1][ipos3] =
01352 mpr[jpos3][ipos2] =
01353 mpr[jpos5][ipos1] =
01354 mpr[jpos7][ipos0] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
01355 mpr[jpos1][ipos4] =
01356 mpr[jpos3][ipos3] =
01357 mpr[jpos5][ipos2] =
01358 mpr[jpos7][ipos1] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
01359 mpr[jpos1][ipos5] =
01360 mpr[jpos3][ipos4] =
01361 mpr[jpos5][ipos3] =
01362 mpr[jpos7][ipos2] = (imgpel) ((P_F + P_H + 2*P_G + 2) >> 2);
01363 mpr[jpos1][ipos6] =
01364 mpr[jpos3][ipos5] =
01365 mpr[jpos5][ipos4] =
01366 mpr[jpos7][ipos3] = (imgpel) ((P_G + P_I + 2*P_H + 2) >> 2);
01367 mpr[jpos1][ipos7] =
01368 mpr[jpos3][ipos6] =
01369 mpr[jpos5][ipos5] =
01370 mpr[jpos7][ipos4] = (imgpel) ((P_H + P_J + 2*P_I + 2) >> 2);
01371 mpr[jpos3][ipos7] =
01372 mpr[jpos5][ipos6] =
01373 mpr[jpos7][ipos5] = (imgpel) ((P_I + P_K + 2*P_J + 2) >> 2);
01374 mpr[jpos5][ipos7] =
01375 mpr[jpos7][ipos6] = (imgpel) ((P_J + P_L + 2*P_K + 2) >> 2);
01376 mpr[jpos7][ipos7] = (imgpel) ((P_K + P_M + 2*P_L + 2) >> 2);
01377
01378 return DECODING_OK;
01379 }
01380
01391 static inline int intra8x8_hor_up_pred(ImageParameters *img,
01392 Macroblock *currMB,
01393 ColorPlane pl,
01394 int ioff,
01395 int joff)
01396 {
01397 int i;
01398 imgpel PredPel[25];
01399 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
01400
01401 PixelPos pix_a[8];
01402 PixelPos pix_b, pix_c, pix_d;
01403
01404 int block_available_up;
01405 int block_available_left;
01406 int block_available_up_left;
01407 int block_available_up_right;
01408 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
01409 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
01410 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
01411 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
01412 imgpel *pred_pels, **mpr = img->mb_pred[pl];
01413 int *mb_size = img->mb_size[IS_LUMA];
01414
01415 for (i=0;i<8;i++)
01416 {
01417 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
01418 }
01419
01420 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
01421 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
01422 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
01423
01424 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
01425
01426 if (active_pps->constrained_intra_pred_flag)
01427 {
01428 for (i=0, block_available_left=1; i<8;i++)
01429 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
01430 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
01431 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
01432 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
01433 }
01434 else
01435 {
01436 block_available_left = pix_a[0].available;
01437 block_available_up = pix_b.available;
01438 block_available_up_right = pix_c.available;
01439 block_available_up_left = pix_d.available;
01440 }
01441
01442 if (!block_available_left)
01443 printf ("warning: Intra_8x8_Horizontal_Up prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
01444
01445
01446 if (block_available_up)
01447 {
01448 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
01449 P_A = pred_pels[0];
01450 P_B = pred_pels[1];
01451 P_C = pred_pels[2];
01452 P_D = pred_pels[3];
01453 P_E = pred_pels[4];
01454 P_F = pred_pels[5];
01455 P_G = pred_pels[6];
01456 P_H = pred_pels[7];
01457 }
01458 else
01459 {
01460 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
01461 }
01462
01463 if (block_available_up_right)
01464 {
01465 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
01466 P_I = pred_pels[0];
01467 P_J = pred_pels[1];
01468 P_K = pred_pels[2];
01469 P_L = pred_pels[3];
01470 P_M = pred_pels[4];
01471 P_N = pred_pels[5];
01472 P_O = pred_pels[6];
01473 P_P = pred_pels[7];
01474
01475 }
01476 else
01477 {
01478 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
01479 }
01480
01481 if (block_available_left)
01482 {
01483 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
01484 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
01485 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
01486 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
01487 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
01488 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
01489 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
01490 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
01491 }
01492 else
01493 {
01494 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
01495 }
01496
01497 if (block_available_up_left)
01498 {
01499 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
01500 }
01501 else
01502 {
01503 P_Z = (imgpel) img->dc_pred_value_comp[pl];
01504 }
01505
01506 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
01507
01508 mpr[jpos0][ipos0] = (imgpel) ((P_Q + P_R + 1) >> 1);
01509 mpr[jpos1][ipos0] =
01510 mpr[jpos0][ipos2] = (imgpel) ((P_R + P_S + 1) >> 1);
01511 mpr[jpos2][ipos0] =
01512 mpr[jpos1][ipos2] =
01513 mpr[jpos0][ipos4] = (imgpel) ((P_S + P_T + 1) >> 1);
01514 mpr[jpos3][ipos0] =
01515 mpr[jpos2][ipos2] =
01516 mpr[jpos1][ipos4] =
01517 mpr[jpos0][ipos6] = (imgpel) ((P_T + P_U + 1) >> 1);
01518 mpr[jpos4][ipos0] =
01519 mpr[jpos3][ipos2] =
01520 mpr[jpos2][ipos4] =
01521 mpr[jpos1][ipos6] = (imgpel) ((P_U + P_V + 1) >> 1);
01522 mpr[jpos5][ipos0] =
01523 mpr[jpos4][ipos2] =
01524 mpr[jpos3][ipos4] =
01525 mpr[jpos2][ipos6] = (imgpel) ((P_V + P_W + 1) >> 1);
01526 mpr[jpos6][ipos0] =
01527 mpr[jpos5][ipos2] =
01528 mpr[jpos4][ipos4] =
01529 mpr[jpos3][ipos6] = (imgpel) ((P_W + P_X + 1) >> 1);
01530 mpr[jpos4][ipos6] =
01531 mpr[jpos4][ipos7] =
01532 mpr[jpos5][ipos4] =
01533 mpr[jpos5][ipos5] =
01534 mpr[jpos5][ipos6] =
01535 mpr[jpos5][ipos7] =
01536 mpr[jpos6][ipos2] =
01537 mpr[jpos6][ipos3] =
01538 mpr[jpos6][ipos4] =
01539 mpr[jpos6][ipos5] =
01540 mpr[jpos6][ipos6] =
01541 mpr[jpos6][ipos7] =
01542 mpr[jpos7][ipos0] =
01543 mpr[jpos7][ipos1] =
01544 mpr[jpos7][ipos2] =
01545 mpr[jpos7][ipos3] =
01546 mpr[jpos7][ipos4] =
01547 mpr[jpos7][ipos5] =
01548 mpr[jpos7][ipos6] =
01549 mpr[jpos7][ipos7] = (imgpel) P_X;
01550 mpr[jpos6][ipos1] =
01551 mpr[jpos5][ipos3] =
01552 mpr[jpos4][ipos5] =
01553 mpr[jpos3][ipos7] = (imgpel) ((P_W + 3*P_X + 2) >> 2);
01554 mpr[jpos5][ipos1] =
01555 mpr[jpos4][ipos3] =
01556 mpr[jpos3][ipos5] =
01557 mpr[jpos2][ipos7] = (imgpel) ((P_X + P_V + 2*P_W + 2) >> 2);
01558 mpr[jpos4][ipos1] =
01559 mpr[jpos3][ipos3] =
01560 mpr[jpos2][ipos5] =
01561 mpr[jpos1][ipos7] = (imgpel) ((P_W + P_U + 2*P_V + 2) >> 2);
01562 mpr[jpos3][ipos1] =
01563 mpr[jpos2][ipos3] =
01564 mpr[jpos1][ipos5] =
01565 mpr[jpos0][ipos7] = (imgpel) ((P_V + P_T + 2*P_U + 2) >> 2);
01566 mpr[jpos2][ipos1] =
01567 mpr[jpos1][ipos3] =
01568 mpr[jpos0][ipos5] = (imgpel) ((P_U + P_S + 2*P_T + 2) >> 2);
01569 mpr[jpos1][ipos1] =
01570 mpr[jpos0][ipos3] = (imgpel) ((P_T + P_R + 2*P_S + 2) >> 2);
01571 mpr[jpos0][ipos1] = (imgpel) ((P_S + P_Q + 2*P_R + 2) >> 2);
01572
01573 return DECODING_OK;
01574 }
01575
01586 static inline int intra8x8_hor_down_pred(ImageParameters *img,
01587 Macroblock *currMB,
01588 ColorPlane pl,
01589 int ioff,
01590 int joff)
01591 {
01592 int i;
01593 imgpel PredPel[25];
01594 imgpel **imgY = (pl) ? dec_picture->imgUV[pl - 1] : dec_picture->imgY;
01595
01596 PixelPos pix_a[8];
01597 PixelPos pix_b, pix_c, pix_d;
01598
01599 int block_available_up;
01600 int block_available_left;
01601 int block_available_up_left;
01602 int block_available_up_right;
01603 int jpos0 = joff , jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
01604 int jpos4 = joff + 4, jpos5 = joff + 5, jpos6 = joff + 6, jpos7 = joff + 7;
01605 int ipos0 = ioff , ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
01606 int ipos4 = ioff + 4, ipos5 = ioff + 5, ipos6 = ioff + 6, ipos7 = ioff + 7;
01607 imgpel *pred_pels, **mpr = img->mb_pred[pl];
01608 int *mb_size = img->mb_size[IS_LUMA];
01609
01610 for (i=0;i<8;i++)
01611 {
01612 getNeighbour(currMB, ioff - 1, joff + i, mb_size, &pix_a[i]);
01613 }
01614
01615 getNeighbour(currMB, ioff , joff - 1, mb_size, &pix_b);
01616 getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
01617 getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
01618
01619 pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
01620
01621 if (active_pps->constrained_intra_pred_flag)
01622 {
01623 for (i=0, block_available_left=1; i<8;i++)
01624 block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
01625 block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
01626 block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
01627 block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
01628 }
01629 else
01630 {
01631 block_available_left = pix_a[0].available;
01632 block_available_up = pix_b.available;
01633 block_available_up_right = pix_c.available;
01634 block_available_up_left = pix_d.available;
01635 }
01636
01637 if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
01638 printf ("warning: Intra_8x8_Horizontal_Down prediction mode not allowed at mb %d\n", (int) img->current_mb_nr);
01639
01640
01641 if (block_available_up)
01642 {
01643 pred_pels = &imgY[pix_b.pos_y][pix_b.pos_x];
01644 P_A = pred_pels[0];
01645 P_B = pred_pels[1];
01646 P_C = pred_pels[2];
01647 P_D = pred_pels[3];
01648 P_E = pred_pels[4];
01649 P_F = pred_pels[5];
01650 P_G = pred_pels[6];
01651 P_H = pred_pels[7];
01652 }
01653 else
01654 {
01655 P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = (imgpel) img->dc_pred_value_comp[pl];
01656 }
01657
01658 if (block_available_up_right)
01659 {
01660 pred_pels = &imgY[pix_c.pos_y][pix_c.pos_x];
01661 P_I = pred_pels[0];
01662 P_J = pred_pels[1];
01663 P_K = pred_pels[2];
01664 P_L = pred_pels[3];
01665 P_M = pred_pels[4];
01666 P_N = pred_pels[5];
01667 P_O = pred_pels[6];
01668 P_P = pred_pels[7];
01669
01670 }
01671 else
01672 {
01673 P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
01674 }
01675
01676 if (block_available_left)
01677 {
01678 P_Q = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
01679 P_R = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
01680 P_S = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
01681 P_T = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
01682 P_U = imgY[pix_a[4].pos_y][pix_a[4].pos_x];
01683 P_V = imgY[pix_a[5].pos_y][pix_a[5].pos_x];
01684 P_W = imgY[pix_a[6].pos_y][pix_a[6].pos_x];
01685 P_X = imgY[pix_a[7].pos_y][pix_a[7].pos_x];
01686 }
01687 else
01688 {
01689 P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = (imgpel) img->dc_pred_value_comp[pl];
01690 }
01691
01692 if (block_available_up_left)
01693 {
01694 P_Z = imgY[pix_d.pos_y][pix_d.pos_x];
01695 }
01696 else
01697 {
01698 P_Z = (imgpel) img->dc_pred_value_comp[pl];
01699 }
01700
01701 LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
01702
01703 mpr[jpos0][ipos0] =
01704 mpr[jpos1][ipos2] =
01705 mpr[jpos2][ipos4] =
01706 mpr[jpos3][ipos6] = (imgpel) ((P_Q + P_Z + 1) >> 1);
01707 mpr[jpos1][ipos0] =
01708 mpr[jpos2][ipos2] =
01709 mpr[jpos3][ipos4] =
01710 mpr[jpos4][ipos6] = (imgpel) ((P_R + P_Q + 1) >> 1);
01711 mpr[jpos2][ipos0] =
01712 mpr[jpos3][ipos2] =
01713 mpr[jpos4][ipos4] =
01714 mpr[jpos5][ipos6] = (imgpel) ((P_S + P_R + 1) >> 1);
01715 mpr[jpos3][ipos0] =
01716 mpr[jpos4][ipos2] =
01717 mpr[jpos5][ipos4] =
01718 mpr[jpos6][ipos6] = (imgpel) ((P_T + P_S + 1) >> 1);
01719 mpr[jpos4][ipos0] =
01720 mpr[jpos5][ipos2] =
01721 mpr[jpos6][ipos4] =
01722 mpr[jpos7][ipos6] = (imgpel) ((P_U + P_T + 1) >> 1);
01723 mpr[jpos5][ipos0] =
01724 mpr[jpos6][ipos2] =
01725 mpr[jpos7][ipos4] = (imgpel) ((P_V + P_U + 1) >> 1);
01726 mpr[jpos6][ipos0] =
01727 mpr[jpos7][ipos2] = (imgpel) ((P_W + P_V + 1) >> 1);
01728 mpr[jpos7][ipos0] = (imgpel) ((P_X + P_W + 1) >> 1);
01729 mpr[jpos0][ipos1] =
01730 mpr[jpos1][ipos3] =
01731 mpr[jpos2][ipos5] =
01732 mpr[jpos3][ipos7] = (imgpel) ((P_Q + P_A + 2*P_Z + 2) >> 2);
01733 mpr[jpos1][ipos1] =
01734 mpr[jpos2][ipos3] =
01735 mpr[jpos3][ipos5] =
01736 mpr[jpos4][ipos7] = (imgpel) ((P_Z + P_R + 2*P_Q + 2) >> 2);
01737 mpr[jpos2][ipos1] =
01738 mpr[jpos3][ipos3] =
01739 mpr[jpos4][ipos5] =
01740 mpr[jpos5][ipos7] = (imgpel) ((P_Q + P_S + 2*P_R + 2) >> 2);
01741 mpr[jpos3][ipos1] =
01742 mpr[jpos4][ipos3] =
01743 mpr[jpos5][ipos5] =
01744 mpr[jpos6][ipos7] = (imgpel) ((P_R + P_T + 2*P_S + 2) >> 2);
01745 mpr[jpos4][ipos1] =
01746 mpr[jpos5][ipos3] =
01747 mpr[jpos6][ipos5] =
01748 mpr[jpos7][ipos7] = (imgpel) ((P_S + P_U + 2*P_T + 2) >> 2);
01749 mpr[jpos5][ipos1] =
01750 mpr[jpos6][ipos3] =
01751 mpr[jpos7][ipos5] = (imgpel) ((P_T + P_V + 2*P_U + 2) >> 2);
01752 mpr[jpos6][ipos1] =
01753 mpr[jpos7][ipos3] = (imgpel) ((P_U + P_W + 2*P_V + 2) >> 2);
01754 mpr[jpos7][ipos1] = (imgpel) ((P_V + P_X + 2*P_W + 2) >> 2);
01755 mpr[jpos0][ipos2] =
01756 mpr[jpos1][ipos4] =
01757 mpr[jpos2][ipos6] = (imgpel) ((P_Z + P_B + 2*P_A + 2) >> 2);
01758 mpr[jpos0][ipos3] =
01759 mpr[jpos1][ipos5] =
01760 mpr[jpos2][ipos7] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
01761 mpr[jpos0][ipos4] =
01762 mpr[jpos1][ipos6] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
01763 mpr[jpos0][ipos5] =
01764 mpr[jpos1][ipos7] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
01765 mpr[jpos0][ipos6] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
01766 mpr[jpos0][ipos7] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
01767
01768 return DECODING_OK;
01769 }
01770
01785 int intrapred8x8(ImageParameters *img,
01786 Macroblock *currMB,
01787 ColorPlane pl,
01788 int b8)
01789
01790 {
01791
01792
01793 int img_block_x = (img->mb_x << 2) + ((b8 & 0x01) << 1);
01794 int img_block_y = (img->mb_y << 2) + ((b8 >> 1) << 1);
01795 int ioff = (b8 & 0x01) << 3;
01796 int joff = (b8 >> 1 ) << 3;
01797
01798 byte predmode = img->ipredmode[img_block_y][img_block_x];
01799 ipmode_DPCM = predmode;
01800
01801 switch (predmode)
01802 {
01803 case DC_PRED:
01804 return (intra8x8_dc_pred(img, currMB, pl, ioff, joff));
01805 break;
01806 case VERT_PRED:
01807 return (intra8x8_vert_pred(img, currMB, pl, ioff, joff));
01808 break;
01809 case HOR_PRED:
01810 return (intra8x8_hor_pred(img, currMB, pl, ioff, joff));
01811 break;
01812 case DIAG_DOWN_RIGHT_PRED:
01813 return (intra8x8_diag_down_right_pred(img, currMB, pl, ioff, joff));
01814 break;
01815 case DIAG_DOWN_LEFT_PRED:
01816 return (intra8x8_diag_down_left_pred(img, currMB, pl, ioff, joff));
01817 break;
01818 case VERT_RIGHT_PRED:
01819 return (intra8x8_vert_right_pred(img, currMB, pl, ioff, joff));
01820 break;
01821 case VERT_LEFT_PRED:
01822 return (intra8x8_vert_left_pred(img, currMB, pl, ioff, joff));
01823 break;
01824 case HOR_UP_PRED:
01825 return (intra8x8_hor_up_pred(img, currMB, pl, ioff, joff));
01826 break;
01827 case HOR_DOWN_PRED:
01828 return (intra8x8_hor_down_pred(img, currMB, pl, ioff, joff));
01829 default:
01830 printf("Error: illegal intra_8x8 prediction mode: %d\n", (int) predmode);
01831 return SEARCH_SYNC;
01832 break;
01833 }
01834
01835 return DECODING_OK;
01836 }
01837
01838