00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <limits.h>
00019
00020 #include "global.h"
00021
00022 #include "image.h"
00023 #include "macroblock.h"
00024 #include "mb_access.h"
00025 #include "rdopt_coding_state.h"
00026 #include "mode_decision.h"
00027 #include "rdopt.h"
00028 #include "rd_intra_jm.h"
00029 #include "q_around.h"
00030
00031
00032
00033
00034
00035
00036
00037 int Mode_Decision_for_4x4IntraBlocks_JM_High (Slice *currSlice, Macroblock *currMB, int b8, int b4, double lambda, double* min_cost, int cr_cbp[3], int is_cavlc)
00038 {
00039 int ipmode, best_ipmode = 0, i, j, y, dummy;
00040 int c_nz, nonzero = 0;
00041 int* ACLevel = img->cofAC[b8][b4][0];
00042 int* ACRun = img->cofAC[b8][b4][1];
00043 int c_nzCbCr[3]= {999,999, 999};
00044 int uv;
00045
00046 double rdcost;
00047 int block_x = ((b8 & 0x01) << 3) + ((b4 & 0x01) << 2);
00048 int block_y = ((b8 >> 1) << 3) + ((b4 >> 1) << 2);
00049 int pic_pix_x = img->pix_x + block_x;
00050 int pic_pix_y = img->pix_y + block_y;
00051 int pic_opix_x = img->opix_x + block_x;
00052 int pic_opix_y = img->opix_y + block_y;
00053 int pic_block_x = pic_pix_x >> 2;
00054 int pic_block_y = pic_pix_y >> 2;
00055 double min_rdcost = 1e30;
00056
00057 int left_available, up_available, all_available;
00058
00059 char upMode, leftMode;
00060 int mostProbableMode;
00061
00062 PixelPos left_block, top_block;
00063
00064 static int lrec4x4[4][4];
00065
00066 #ifdef BEST_NZ_COEFF
00067 int best_nz_coeff = 0;
00068 int best_coded_block_flag = 0;
00069 int bit_pos = 1 + ((((b8>>1)<<1)+(b4>>1))<<2) + (((b8&1)<<1)+(b4&1));
00070 static int64 cbp_bits;
00071
00072 if (b8==0 && b4==0)
00073 cbp_bits = 0;
00074 #endif
00075
00076 get4x4Neighbour(currMB, block_x - 1, block_y , img->mb_size[IS_LUMA], &left_block);
00077 get4x4Neighbour(currMB, block_x, block_y - 1, img->mb_size[IS_LUMA], &top_block );
00078
00079
00080 if (params->UseConstrainedIntraPred)
00081 {
00082 left_block.available = left_block.available ? img->intra_block[left_block.mb_addr] : 0;
00083 top_block.available = top_block.available ? img->intra_block[top_block.mb_addr] : 0;
00084 }
00085
00086 upMode = top_block.available ? img->ipredmode[top_block.pos_y ][top_block.pos_x ] : -1;
00087 leftMode = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
00088
00089 mostProbableMode = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
00090
00091 *min_cost = INT_MAX;
00092
00093 ipmode_DPCM = NO_INTRA_PMODE;
00094
00095
00096 intrapred_4x4 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00097
00098 if (img->P444_joined)
00099 {
00100 select_plane(PLANE_U);
00101 intrapred_4x4 (currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00102 select_plane(PLANE_V);
00103 intrapred_4x4 (currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00104 select_plane(PLANE_Y);
00105 }
00106
00107
00108 for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
00109 {
00110 int available_mode = (all_available) || (ipmode==DC_PRED) ||
00111 (up_available && (ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED)) ||
00112 (left_available && (ipmode==HOR_PRED||ipmode==HOR_UP_PRED));
00113
00114 if (valid_intra_mode(ipmode) == 0)
00115 continue;
00116
00117 if( available_mode)
00118 {
00119
00120 generate_pred_error(&pCurImg[pic_opix_y], img->mpr_4x4[0][ipmode], &img->mb_pred[0][block_y], &img->mb_ores[0][block_y], pic_opix_x, block_x);
00121
00122 if (img->yuv_format == YUV444)
00123 {
00124 ipmode_DPCM = ipmode;
00125 if (!IS_INDEPENDENT(params))
00126 {
00127 generate_pred_error(&pImgOrg[1][pic_opix_y], img->mpr_4x4[1][ipmode], &img->mb_pred[1][block_y], &img->mb_ores[1][block_y], pic_opix_x, block_x);
00128 generate_pred_error(&pImgOrg[2][pic_opix_y], img->mpr_4x4[2][ipmode], &img->mb_pred[2][block_y], &img->mb_ores[2][block_y], pic_opix_x, block_x);
00129 }
00130 }
00131
00132
00133
00134
00135 #ifdef BEST_NZ_COEFF
00136 currMB->cbp_bits[0] = cbp_bits;
00137 #endif
00138 if ((rdcost = RDCost_for_4x4IntraBlocks (currSlice, currMB, &c_nz, b8, b4, ipmode, lambda, mostProbableMode, c_nzCbCr, is_cavlc)) < min_rdcost)
00139 {
00140
00141 memcpy(cofAC4x4[0],ACLevel, 18 * sizeof(int));
00142 memcpy(cofAC4x4[1],ACRun, 18 * sizeof(int));
00143
00144
00145 copy_4x4block(rec4x4[PLANE_Y], &enc_picture->imgY[pic_pix_y], 0, pic_pix_x);
00146
00147
00148 if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
00149 {
00150 for (y=0; y<4; y++)
00151 {
00152 memcpy(lrec4x4[y],&lrec[pic_pix_y+y][pic_pix_x], BLOCK_SIZE * sizeof(int));
00153 }
00154 }
00155
00156 if(img->P444_joined)
00157 {
00158
00159 for (uv=0; uv < 2; uv++)
00160 {
00161 memcpy(cofAC4x4CbCr[uv][0],img->cofAC[b8+4+uv*4][b4][0], 18 * sizeof(int));
00162 memcpy(cofAC4x4CbCr[uv][1],img->cofAC[b8+4+uv*4][b4][1], 18 * sizeof(int));
00163 cr_cbp[uv + 1] = c_nzCbCr[uv + 1];
00164
00165
00166 copy_4x4block(rec4x4CbCr[uv], &enc_picture->imgUV[uv][pic_pix_y], 0, pic_pix_x);
00167 }
00168 }
00169
00170 nonzero = c_nz;
00171
00172
00173 *min_cost = rdcost;
00174 min_rdcost = rdcost;
00175 best_ipmode = ipmode;
00176 #ifdef BEST_NZ_COEFF
00177 best_nz_coeff = img->nz_coeff [img->current_mb_nr][block_x4][block_y4];
00178 best_coded_block_flag = (int)((currMB->cbp_bits[0] >> bit_pos)&(int64)(1));
00179 #endif
00180
00181 if (img->AdaptiveRounding)
00182 {
00183 store_adaptive_rounding_4x4 (img, img->ARCofAdj4x4, I4MB, block_y, block_x);
00184 }
00185
00186 }
00187 reset_coding_state (currSlice, currMB, cs_cm);
00188 }
00189 }
00190
00191 #ifdef BEST_NZ_COEFF
00192 img->nz_coeff [img->current_mb_nr][block_x4][block_y4] = best_nz_coeff;
00193 cbp_bits &= (~(int64)(1<<bit_pos));
00194 cbp_bits |= (int64)(best_coded_block_flag<<bit_pos);
00195 #endif
00196
00197
00198 img->ipredmode[pic_block_y][pic_block_x] = (char) best_ipmode;
00199 currMB->intra_pred_modes[4*b8+b4] =
00200 (char) (mostProbableMode == best_ipmode ? -1 : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1));
00201
00202 if(img->P444_joined)
00203 {
00204 ColorPlane k;
00205 for (k = PLANE_U; k <= PLANE_V; k++)
00206 {
00207 select_plane(k);
00208
00209 copy_4x4block(&img->mb_pred[k][block_y], img->mpr_4x4[k][best_ipmode], block_x, 0);
00210 for (j=0; j<4; j++)
00211 {
00212 for (i=0; i<4; i++)
00213 {
00214 img->mb_ores[k][block_y+j][block_x+i] = pImgOrg[k][img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr_4x4[k][best_ipmode][j][i];
00215 }
00216 }
00217 cr_cbp[k] = pDCT_4x4(currMB, k, block_x,block_y,&dummy,1, is_cavlc);
00218 }
00219 select_plane(PLANE_Y);
00220 }
00221
00222
00223 memcpy (ACLevel,cofAC4x4[0], 18 * sizeof(int));
00224 memcpy (ACRun,cofAC4x4[1], 18 * sizeof(int));
00225
00226
00227 copy_4x4block(&enc_picture->imgY[pic_pix_y], rec4x4[PLANE_Y], pic_pix_x, 0);
00228 copy_4x4block(&img->mb_pred[0][block_y], img->mpr_4x4[0][best_ipmode], block_x, 0);
00229
00230
00231 if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
00232 {
00233 for (y=0; y<BLOCK_SIZE; y++)
00234 {
00235 memcpy (&lrec[pic_pix_y+y][pic_pix_x], lrec4x4[y], BLOCK_SIZE * sizeof(int));
00236 }
00237 }
00238 if (img->P444_joined)
00239 {
00240 for (uv=0; uv < 2; uv++ )
00241 {
00242
00243 memcpy(img->cofAC[b8+4+uv*4][b4][0], cofAC4x4CbCr[uv][0], 18 * sizeof(int));
00244 memcpy(img->cofAC[b8+4+uv*4][b4][1], cofAC4x4CbCr[uv][1], 18 * sizeof(int));
00245
00246 copy_4x4block(&enc_picture->imgUV[uv][pic_pix_y], rec4x4CbCr[uv], pic_pix_x, 0);
00247 copy_4x4block(&img->mb_pred[uv + 1][block_y], img->mpr_4x4[uv + 1][best_ipmode], block_x, 0);
00248 }
00249 }
00250
00251 if (img->AdaptiveRounding)
00252 {
00253 update_adaptive_rounding_4x4 (img,img->ARCofAdj4x4, I4MB, block_y, block_x);
00254 }
00255
00256
00257 return nonzero;
00258 }
00259
00260
00261
00262
00263
00264
00265
00266 int Mode_Decision_for_4x4IntraBlocks_JM_Low (Slice *currSlice, Macroblock *currMB, int b8, int b4, double lambda, double* min_cost, int cr_cbp[3], int is_cavlc)
00267 {
00268 int ipmode, best_ipmode = 0, i, j, cost, dummy;
00269 int nonzero = 0;
00270
00271 int block_x = ((b8 & 0x01) << 3) + ((b4 & 0x01) << 2);
00272 int block_y = ((b8 >> 1) << 3) + ((b4 >> 1) << 2);
00273 int pic_pix_x = img->pix_x + block_x;
00274 int pic_pix_y = img->pix_y + block_y;
00275 int pic_opix_x = img->opix_x + block_x;
00276 int pic_opix_y = img->opix_y + block_y;
00277 int pic_block_x = pic_pix_x >> 2;
00278 int pic_block_y = pic_pix_y >> 2;
00279
00280 int left_available, up_available, all_available;
00281
00282 char upMode;
00283 char leftMode;
00284 int mostProbableMode;
00285
00286 PixelPos left_block;
00287 PixelPos top_block;
00288
00289 int fixedcost = (int) floor(4 * lambda );
00290
00291 #ifdef BEST_NZ_COEFF
00292 int best_nz_coeff = 0;
00293 int best_coded_block_flag = 0;
00294 int bit_pos = 1 + ((((b8>>1)<<1)+(b4>>1))<<2) + (((b8&1)<<1)+(b4&1));
00295 static int64 cbp_bits;
00296
00297 if (b8==0 && b4==0)
00298 cbp_bits = 0;
00299 #endif
00300
00301 get4x4Neighbour(currMB, block_x - 1, block_y , img->mb_size[IS_LUMA], &left_block);
00302 get4x4Neighbour(currMB, block_x, block_y - 1, img->mb_size[IS_LUMA], &top_block );
00303
00304
00305 if (params->UseConstrainedIntraPred)
00306 {
00307 left_block.available = left_block.available ? img->intra_block[left_block.mb_addr] : 0;
00308 top_block.available = top_block.available ? img->intra_block[top_block.mb_addr] : 0;
00309 }
00310
00311 upMode = top_block.available ? img->ipredmode[top_block.pos_y ][top_block.pos_x ] : -1;
00312 leftMode = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
00313
00314 mostProbableMode = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
00315
00316 *min_cost = INT_MAX;
00317
00318 ipmode_DPCM = NO_INTRA_PMODE;
00319
00320
00321 intrapred_4x4 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00322
00323 if (img->P444_joined)
00324 {
00325 select_plane(PLANE_U);
00326 intrapred_4x4 (currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00327 select_plane(PLANE_V);
00328 intrapred_4x4 (currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
00329 select_plane(PLANE_Y);
00330 }
00331
00332
00333 for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
00334 {
00335 int available_mode = (all_available) || (ipmode==DC_PRED) ||
00336 (up_available && (ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED)) ||
00337 (left_available && (ipmode==HOR_PRED||ipmode==HOR_UP_PRED));
00338
00339 if (valid_intra_mode(ipmode) == 0)
00340 continue;
00341
00342 if( available_mode)
00343 {
00344 cost = (ipmode == mostProbableMode) ? 0 : fixedcost;
00345
00346 compute_comp_cost(&pCurImg[pic_opix_y], img->mpr_4x4[0][ipmode], pic_opix_x, &cost);
00347
00348 if (img->P444_joined)
00349 {
00350 compute_comp_cost(&pImgOrg[1][pic_opix_y], img->mpr_4x4[1][ipmode], pic_opix_x, &cost);
00351 compute_comp_cost(&pImgOrg[2][pic_opix_y], img->mpr_4x4[2][ipmode], pic_opix_x, &cost);
00352 }
00353
00354 if (cost < *min_cost)
00355 {
00356 best_ipmode = ipmode;
00357 *min_cost = cost;
00358 }
00359 }
00360 }
00361
00362 #ifdef BEST_NZ_COEFF
00363 img->nz_coeff [img->current_mb_nr][block_x4][block_y4] = best_nz_coeff;
00364 cbp_bits &= (~(int64)(1<<bit_pos));
00365 cbp_bits |= (int64)(best_coded_block_flag<<bit_pos);
00366 #endif
00367
00368 img->ipredmode[pic_block_y][pic_block_x] = (char) best_ipmode;
00369 currMB->intra_pred_modes[4*b8+b4] =
00370 (char) (mostProbableMode == best_ipmode ? -1 : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1));
00371
00372
00373 generate_pred_error(&pCurImg[pic_opix_y], img->mpr_4x4[0][best_ipmode], &img->mb_pred[0][block_y], &img->mb_ores[0][block_y], pic_opix_x, block_x);
00374
00375 ipmode_DPCM=best_ipmode;
00376
00377 select_dct(img, currMB);
00378 nonzero = cr_cbp[0] = pDCT_4x4 (currMB, PLANE_Y, block_x, block_y, &dummy, 1, is_cavlc);
00379
00380 if (img->P444_joined)
00381 {
00382 ColorPlane k;
00383 for (k = PLANE_U; k <= PLANE_V; k++)
00384 {
00385 select_plane(k);
00386 for (j=0; j<4; j++)
00387 {
00388 for (i=0; i<4; i++)
00389 {
00390 img->mb_pred[k][block_y + j][block_x+i] = img->mpr_4x4[k][best_ipmode][j][i];
00391 img->mb_ores[k][block_y + j][block_x+i] = pImgOrg[k][pic_opix_y+j][pic_opix_x+i] - img->mpr_4x4[k][best_ipmode][j][i];
00392 }
00393 }
00394
00395 cr_cbp[k] = pDCT_4x4(currMB, k, block_x,block_y,&dummy,1, is_cavlc);
00396 }
00397 select_plane(PLANE_Y);
00398 }
00399
00400 return nonzero;
00401 }
00402
00403
00404
00405
00406
00407
00408
00409 int Mode_Decision_for_IntraSubMBlocks(Slice *currSlice, Macroblock *currMB, int b8,double lambda,double *cost, int non_zero[3], int is_cavlc)
00410 {
00411 int b4;
00412 double cost4x4;
00413 int CbCr_cbp[3]={0, 0, 0};
00414
00415 memset(non_zero, 0, 3 * sizeof(int));
00416
00417 *cost = (int)floor(6.0 * lambda + 0.4999);
00418
00419 for (b4=0; b4<4; b4++)
00420 {
00421 non_zero[0] |= Mode_Decision_for_4x4IntraBlocks (currSlice, currMB, b8, b4, lambda, &cost4x4, CbCr_cbp, is_cavlc);
00422 non_zero[1] |= CbCr_cbp[1];
00423 non_zero[2] |= CbCr_cbp[2];
00424 *cost += cost4x4;
00425 }
00426
00427
00428 return non_zero[0];
00429 }
00430
00431
00432
00433
00434
00435
00436
00437 int Mode_Decision_for_Intra4x4Macroblock (Slice *currSlice, Macroblock *currMB, double lambda, double* cost, int is_cavlc)
00438 {
00439 int cbp=0, b8;
00440 double cost8x8;
00441 int non_zero[3] = {0, 0, 0};
00442
00443 cmp_cbp[1] = cmp_cbp[2] = 0;
00444
00445 for (*cost=0, b8=0; b8<4; b8++)
00446 {
00447 if (Mode_Decision_for_IntraSubMBlocks (currSlice, currMB, b8, lambda, &cost8x8, non_zero, is_cavlc))
00448 {
00449 cbp |= (1<<b8);
00450 }
00451 *cost += cost8x8;
00452 if (non_zero[1])
00453 {
00454 cmp_cbp[1] |= (1<<b8);
00455 cbp |= cmp_cbp[1];
00456 cmp_cbp[1] = cbp;
00457 cmp_cbp[2] = cbp;
00458 }
00459 if (non_zero[2])
00460 {
00461 cmp_cbp[2] |= (1<<b8);
00462 cbp |= cmp_cbp[2];
00463 cmp_cbp[1] = cbp;
00464 cmp_cbp[2] = cbp;
00465 }
00466 }
00467 return cbp;
00468 }
00469
00470
00471
00472
00473
00474
00475
00476
00477 void Intra16x16_Mode_Decision (Macroblock* currMB, int* i16mode, int is_cavlc)
00478 {
00479 if (!img->P444_joined)
00480 {
00481
00482 intrapred_16x16 (currMB, PLANE_Y);
00483 find_sad_16x16 (currMB, i16mode);
00484 currMB->cbp = pDCT_16x16 (currMB, PLANE_Y, *i16mode, is_cavlc);
00485 }
00486 else
00487 {
00488
00489 intrapred_16x16 (currMB, PLANE_Y);
00490 select_plane(PLANE_U);
00491 intrapred_16x16 (currMB, PLANE_U);
00492 select_plane(PLANE_V);
00493 intrapred_16x16 (currMB, PLANE_V);
00494 select_plane(PLANE_Y);
00495
00496 find_sad_16x16 (currMB, i16mode);
00497
00498 currMB->cbp = pDCT_16x16 (currMB, PLANE_Y, *i16mode, is_cavlc);
00499 select_plane(PLANE_U);
00500 cmp_cbp[1] = pDCT_16x16 (currMB, PLANE_U, *i16mode, is_cavlc);
00501 select_plane(PLANE_V);
00502 cmp_cbp[2] = pDCT_16x16 (currMB, PLANE_V, *i16mode, is_cavlc);
00503 select_plane(PLANE_Y);
00504
00505 currMB->cbp |= (cmp_cbp[1] | cmp_cbp[2]);
00506 cmp_cbp[1] = currMB->cbp;
00507 cmp_cbp[2] = currMB->cbp;
00508 }
00509 }
00510