00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "contributors.h"
00018
00019 #include <limits.h>
00020
00021 #include "global.h"
00022 #include "image.h"
00023 #include "memalloc.h"
00024 #include "mb_access.h"
00025 #include "refbuf.h"
00026 #include "mv-search.h"
00027 #include "me_distortion.h"
00028
00029
00030
00031
00032 SubImageContainer ref_pic_sub;
00033 SubImageContainer ref_pic1_sub;
00034 SubImageContainer ref_pic2_sub;
00035
00036 short weight1, weight2, offsetBi;
00037 short weight1_cr[2], weight2_cr[2], offsetBi_cr[2];
00038 int weight_luma, weight_cr[2], offset_luma, offset_cr[2];
00039 short img_width, img_height;
00040 int test8x8transform;
00041 int ChromaMEEnable;
00042
00043
00044 static int diff[MB_PIXELS];
00045
00046 static int m[16], d[16];
00047 static int m1[8][8], m2[8][8], m3[8][8];
00048 static imgpel *src_line, *ref_line, *ref1_line, *ref2_line;
00049
00050 int (*computeUniPred[6])(imgpel* , int , int , int , int , int);
00051 int (*computeBiPred) (imgpel* , int , int , int , int , int, int , int);
00052 int (*computeBiPred1[3])(imgpel* , int , int , int , int , int, int , int);
00053 int (*computeBiPred2[3])(imgpel* , int , int , int , int , int, int , int);
00054
00055
00056
00057
00058
00059
00060
00061 int distortion4x4(int* diff)
00062 {
00063 int distortion = 0, k, *byte_sse;
00064
00065 switch(params->ModeDecisionMetric)
00066 {
00067 case ERROR_SAD:
00068 for (k = 0; k < 16; k++)
00069 {
00070 distortion += byte_abs [diff [k]];
00071 }
00072 break;
00073 case ERROR_SSE:
00074 byte_sse = img->quad;
00075 for (k = 0; k < 16; k++)
00076 {
00077 distortion += byte_sse [diff [k]];
00078 }
00079 break;
00080 case ERROR_SATD :
00081 default:
00082 distortion = HadamardSAD4x4( diff );
00083 break;
00084 }
00085
00086 return distortion;
00087 }
00088
00089
00090
00091
00092
00093
00094
00095 int distortion8x8(int* diff)
00096 {
00097 int distortion = 0, k, *byte_sse;
00098
00099 switch(params->ModeDecisionMetric)
00100 {
00101 case ERROR_SAD:
00102 for (k = 0; k < 64; k++)
00103 {
00104 distortion += byte_abs [diff [k]];
00105 }
00106 break;
00107 case ERROR_SSE:
00108 byte_sse = img->quad;
00109 for (k = 0; k < 64; k++)
00110 {
00111 distortion += byte_sse [diff [k]];
00112 }
00113 break;
00114 case ERROR_SATD :
00115 default:
00116 distortion = HadamardSAD8x8( diff );
00117 break;
00118 }
00119
00120 return distortion;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129 int HadamardMB (int c_diff[MB_PIXELS], int blocktype)
00130 {
00131 int sad=0;
00132
00133 switch(blocktype)
00134 {
00135
00136 case 1:
00137 sad = HadamardSAD8x8( c_diff );
00138 sad += HadamardSAD8x8(&c_diff[ 64]);
00139 sad += HadamardSAD8x8(&c_diff[128]);
00140 sad += HadamardSAD8x8(&c_diff[192]);
00141 break;
00142
00143 case 2:
00144 case 3:
00145 sad = HadamardSAD8x8( c_diff );
00146 sad += HadamardSAD8x8(&c_diff[64]);
00147 break;
00148
00149 case 4:
00150 sad = HadamardSAD8x8(c_diff);
00151 break;
00152
00153 default:
00154 sad=-1;
00155 break;
00156 }
00157
00158 return sad;
00159 }
00160
00161
00162
00163
00164
00165
00166
00167 int HadamardSAD4x4 (int* diff)
00168 {
00169 int k, satd = 0;
00170
00171
00172 m[ 0] = diff[ 0] + diff[12];
00173 m[ 1] = diff[ 1] + diff[13];
00174 m[ 2] = diff[ 2] + diff[14];
00175 m[ 3] = diff[ 3] + diff[15];
00176 m[ 4] = diff[ 4] + diff[ 8];
00177 m[ 5] = diff[ 5] + diff[ 9];
00178 m[ 6] = diff[ 6] + diff[10];
00179 m[ 7] = diff[ 7] + diff[11];
00180 m[ 8] = diff[ 4] - diff[ 8];
00181 m[ 9] = diff[ 5] - diff[ 9];
00182 m[10] = diff[ 6] - diff[10];
00183 m[11] = diff[ 7] - diff[11];
00184 m[12] = diff[ 0] - diff[12];
00185 m[13] = diff[ 1] - diff[13];
00186 m[14] = diff[ 2] - diff[14];
00187 m[15] = diff[ 3] - diff[15];
00188
00189 d[ 0] = m[ 0] + m[ 4];
00190 d[ 1] = m[ 1] + m[ 5];
00191 d[ 2] = m[ 2] + m[ 6];
00192 d[ 3] = m[ 3] + m[ 7];
00193 d[ 4] = m[ 8] + m[12];
00194 d[ 5] = m[ 9] + m[13];
00195 d[ 6] = m[10] + m[14];
00196 d[ 7] = m[11] + m[15];
00197 d[ 8] = m[ 0] - m[ 4];
00198 d[ 9] = m[ 1] - m[ 5];
00199 d[10] = m[ 2] - m[ 6];
00200 d[11] = m[ 3] - m[ 7];
00201 d[12] = m[12] - m[ 8];
00202 d[13] = m[13] - m[ 9];
00203 d[14] = m[14] - m[10];
00204 d[15] = m[15] - m[11];
00205
00206 m[ 0] = d[ 0] + d[ 3];
00207 m[ 1] = d[ 1] + d[ 2];
00208 m[ 2] = d[ 1] - d[ 2];
00209 m[ 3] = d[ 0] - d[ 3];
00210 m[ 4] = d[ 4] + d[ 7];
00211 m[ 5] = d[ 5] + d[ 6];
00212 m[ 6] = d[ 5] - d[ 6];
00213 m[ 7] = d[ 4] - d[ 7];
00214 m[ 8] = d[ 8] + d[11];
00215 m[ 9] = d[ 9] + d[10];
00216 m[10] = d[ 9] - d[10];
00217 m[11] = d[ 8] - d[11];
00218 m[12] = d[12] + d[15];
00219 m[13] = d[13] + d[14];
00220 m[14] = d[13] - d[14];
00221 m[15] = d[12] - d[15];
00222
00223 d[ 0] = m[ 0] + m[ 1];
00224 d[ 1] = m[ 0] - m[ 1];
00225 d[ 2] = m[ 2] + m[ 3];
00226 d[ 3] = m[ 3] - m[ 2];
00227 d[ 4] = m[ 4] + m[ 5];
00228 d[ 5] = m[ 4] - m[ 5];
00229 d[ 6] = m[ 6] + m[ 7];
00230 d[ 7] = m[ 7] - m[ 6];
00231 d[ 8] = m[ 8] + m[ 9];
00232 d[ 9] = m[ 8] - m[ 9];
00233 d[10] = m[10] + m[11];
00234 d[11] = m[11] - m[10];
00235 d[12] = m[12] + m[13];
00236 d[13] = m[12] - m[13];
00237 d[14] = m[14] + m[15];
00238 d[15] = m[15] - m[14];
00239
00240
00241
00242 for (k=0; k<16; ++k)
00243 {
00244 satd += byte_abs [d [k]];
00245 }
00246
00247
00248 return ((satd+1)>>1);
00249 }
00250
00251
00252
00253
00254
00255
00256
00257 int HadamardSAD8x8 (int* diff)
00258 {
00259 int i, j, jj, sad=0;
00260
00261
00262 for (j=0; j < 8; j++)
00263 {
00264 jj = j << 3;
00265 m2[j][0] = diff[jj ] + diff[jj+4];
00266 m2[j][1] = diff[jj+1] + diff[jj+5];
00267 m2[j][2] = diff[jj+2] + diff[jj+6];
00268 m2[j][3] = diff[jj+3] + diff[jj+7];
00269 m2[j][4] = diff[jj ] - diff[jj+4];
00270 m2[j][5] = diff[jj+1] - diff[jj+5];
00271 m2[j][6] = diff[jj+2] - diff[jj+6];
00272 m2[j][7] = diff[jj+3] - diff[jj+7];
00273
00274 m1[j][0] = m2[j][0] + m2[j][2];
00275 m1[j][1] = m2[j][1] + m2[j][3];
00276 m1[j][2] = m2[j][0] - m2[j][2];
00277 m1[j][3] = m2[j][1] - m2[j][3];
00278 m1[j][4] = m2[j][4] + m2[j][6];
00279 m1[j][5] = m2[j][5] + m2[j][7];
00280 m1[j][6] = m2[j][4] - m2[j][6];
00281 m1[j][7] = m2[j][5] - m2[j][7];
00282
00283 m2[j][0] = m1[j][0] + m1[j][1];
00284 m2[j][1] = m1[j][0] - m1[j][1];
00285 m2[j][2] = m1[j][2] + m1[j][3];
00286 m2[j][3] = m1[j][2] - m1[j][3];
00287 m2[j][4] = m1[j][4] + m1[j][5];
00288 m2[j][5] = m1[j][4] - m1[j][5];
00289 m2[j][6] = m1[j][6] + m1[j][7];
00290 m2[j][7] = m1[j][6] - m1[j][7];
00291 }
00292
00293
00294 for (i=0; i < 8; i++)
00295 {
00296 m3[0][i] = m2[0][i] + m2[4][i];
00297 m3[1][i] = m2[1][i] + m2[5][i];
00298 m3[2][i] = m2[2][i] + m2[6][i];
00299 m3[3][i] = m2[3][i] + m2[7][i];
00300 m3[4][i] = m2[0][i] - m2[4][i];
00301 m3[5][i] = m2[1][i] - m2[5][i];
00302 m3[6][i] = m2[2][i] - m2[6][i];
00303 m3[7][i] = m2[3][i] - m2[7][i];
00304
00305 m1[0][i] = m3[0][i] + m3[2][i];
00306 m1[1][i] = m3[1][i] + m3[3][i];
00307 m1[2][i] = m3[0][i] - m3[2][i];
00308 m1[3][i] = m3[1][i] - m3[3][i];
00309 m1[4][i] = m3[4][i] + m3[6][i];
00310 m1[5][i] = m3[5][i] + m3[7][i];
00311 m1[6][i] = m3[4][i] - m3[6][i];
00312 m1[7][i] = m3[5][i] - m3[7][i];
00313
00314 m2[0][i] = m1[0][i] + m1[1][i];
00315 m2[1][i] = m1[0][i] - m1[1][i];
00316 m2[2][i] = m1[2][i] + m1[3][i];
00317 m2[3][i] = m1[2][i] - m1[3][i];
00318 m2[4][i] = m1[4][i] + m1[5][i];
00319 m2[5][i] = m1[4][i] - m1[5][i];
00320 m2[6][i] = m1[6][i] + m1[7][i];
00321 m2[7][i] = m1[6][i] - m1[7][i];
00322 }
00323 for (j=0; j < 8; j++)
00324 for (i=0; i < 8; i++)
00325 sad += iabs (m2[j][i]);
00326
00327 return ((sad+2)>>2);
00328 }
00329
00330
00331
00332
00333
00334
00335
00336 int computeSAD(imgpel* src_pic,
00337 int blocksize_y,
00338 int blocksize_x,
00339 int min_mcost,
00340 int cand_x,
00341 int cand_y)
00342 {
00343 int mcost = 0;
00344 int y,x;
00345 int pad_size_x = img_padded_size_x - blocksize_x;
00346
00347 src_line = src_pic;
00348 ref_line = UMVLine4X (ref_pic_sub.luma, cand_y, cand_x, height_pad, width_pad);
00349 for (y=0; y<blocksize_y; y++)
00350 {
00351 for (x = 0; x < blocksize_x; x+=4)
00352 {
00353 mcost += byte_abs[ *src_line++ - *ref_line++ ];
00354 mcost += byte_abs[ *src_line++ - *ref_line++ ];
00355 mcost += byte_abs[ *src_line++ - *ref_line++ ];
00356 mcost += byte_abs[ *src_line++ - *ref_line++ ];
00357 }
00358 if (mcost >= min_mcost) return mcost;
00359 ref_line += pad_size_x;
00360 }
00361 if ( ChromaMEEnable )
00362 {
00363
00364 int blocksize_x_cr = blocksize_x >> shift_cr_x;
00365 int blocksize_y_cr = blocksize_y >> shift_cr_y;
00366 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
00367 int k;
00368 int mcr_cost = 0;
00369
00370 for (k=0; k < 2; k++)
00371 {
00372 src_line = src_pic + (256 << k);
00373 ref_line = UMVLine8X_chroma ( ref_pic_sub.crcb[k], cand_y, cand_x, height_pad_cr, width_pad_cr);
00374 mcr_cost = 0;
00375
00376 for (y=0; y<blocksize_y_cr; y++)
00377 {
00378 for (x = 0; x < blocksize_x_cr; x += 2)
00379 {
00380 mcr_cost += byte_abs[ *src_line++ - *ref_line++ ];
00381 mcr_cost += byte_abs[ *src_line++ - *ref_line++ ];
00382 }
00383 ref_line += cr_pad_size_x;
00384 }
00385 mcost += params->ChromaMEWeight * mcr_cost;
00386 if (mcost >= min_mcost) return mcost;
00387 }
00388 }
00389
00390 return mcost;
00391 }
00392
00393
00394
00395
00396
00397
00398
00399 int computeSADWP(imgpel* src_pic,
00400 int blocksize_y,
00401 int blocksize_x,
00402 int min_mcost,
00403 int cand_x,
00404 int cand_y)
00405 {
00406 int mcost = 0;
00407 int y, x;
00408 int weighted_pel;
00409 int pad_size_x = img_padded_size_x - blocksize_x;
00410
00411 src_line = src_pic;
00412 ref_line = UMVLine4X (ref_pic_sub.luma, cand_y, cand_x, height_pad, width_pad);
00413 for (y=0; y<blocksize_y; y++)
00414 {
00415 for (x = 0; x < blocksize_x; x+=4)
00416 {
00417 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00418 mcost += byte_abs[ *src_line++ - weighted_pel ];
00419 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00420 mcost += byte_abs[ *src_line++ - weighted_pel ];
00421 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00422 mcost += byte_abs[ *src_line++ - weighted_pel ];
00423 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00424 mcost += byte_abs[ *src_line++ - weighted_pel ];
00425 }
00426 if (mcost >= min_mcost) return mcost;
00427 ref_line += pad_size_x;
00428 }
00429 if ( ChromaMEEnable )
00430 {
00431
00432 int blocksize_x_cr = blocksize_x >> shift_cr_x;
00433 int blocksize_y_cr = blocksize_y >> shift_cr_y;
00434 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
00435 int k;
00436 int mcr_cost = 0;
00437 int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
00438
00439 for (k=0; k < 2; k++)
00440 {
00441 mcr_cost = 0;
00442 src_line = src_pic + (256 << k);
00443 ref_line = UMVLine8X_chroma ( ref_pic_sub.crcb[k], cand_y, cand_x, height_pad_cr, width_pad_cr);
00444 for (y=0; y<blocksize_y_cr; y++)
00445 {
00446 for (x = 0; x < blocksize_x_cr; x+=2)
00447 {
00448 weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++ + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
00449 mcr_cost += byte_abs[ *src_line++ - weighted_pel ];
00450 weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++ + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
00451 mcr_cost += byte_abs[ *src_line++ - weighted_pel ];
00452 }
00453 ref_line += cr_pad_size_x;
00454 }
00455 mcost += params->ChromaMEWeight * mcr_cost;
00456 if (mcost >= min_mcost) return mcost;
00457 }
00458 }
00459
00460 return mcost;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469 int computeBiPredSAD1(imgpel* src_pic,
00470 int blocksize_y,
00471 int blocksize_x,
00472 int min_mcost,
00473 int cand_x1, int cand_y1,
00474 int cand_x2, int cand_y2)
00475 {
00476 int mcost = 0;
00477 int bi_diff;
00478 int y,x;
00479 int pad_size_x = img_padded_size_x - blocksize_x;
00480
00481 src_line = src_pic;
00482 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2, cand_x2, height_pad, width_pad);
00483 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1, cand_x1, height_pad, width_pad);
00484
00485 for (y = 0; y < blocksize_y; y++)
00486 {
00487 for (x = 0; x < blocksize_x; x+=4)
00488 {
00489 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00490 mcost += byte_abs[bi_diff];
00491 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00492 mcost += byte_abs[bi_diff];
00493 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00494 mcost += byte_abs[bi_diff];
00495 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00496 mcost += byte_abs[bi_diff];
00497 }
00498 if (mcost >= min_mcost) return mcost;
00499 ref2_line += pad_size_x;
00500 ref1_line += pad_size_x;
00501 }
00502
00503 if ( ChromaMEEnable )
00504 {
00505
00506 int blocksize_x_cr = blocksize_x >> shift_cr_x;
00507 int blocksize_y_cr = blocksize_y >> shift_cr_y;
00508 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
00509 int k;
00510 int mcr_cost = 0;
00511
00512 for (k=0; k<2; k++)
00513 {
00514 mcr_cost = 0;
00515 src_line = src_pic + (256 << k);
00516 ref2_line = UMVLine8X_chroma ( ref_pic2_sub.crcb[k], cand_y2, cand_x2, height_pad_cr, width_pad_cr);
00517 ref1_line = UMVLine8X_chroma ( ref_pic1_sub.crcb[k], cand_y1, cand_x1, height_pad_cr, width_pad_cr);
00518
00519 for (y=0; y<blocksize_y_cr; y++)
00520 {
00521 for (x = 0; x < blocksize_x_cr; x+=2)
00522 {
00523 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00524 mcr_cost += byte_abs[bi_diff];
00525 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00526 mcr_cost += byte_abs[bi_diff];
00527 }
00528 ref2_line += cr_pad_size_x;
00529 ref1_line += cr_pad_size_x;
00530 }
00531 mcost += params->ChromaMEWeight * mcr_cost;
00532 if (mcost >= min_mcost) return mcost;
00533 }
00534 }
00535 return mcost;
00536 }
00537
00538
00539
00540
00541
00542
00543
00544 int computeBiPredSAD2(imgpel* src_pic,
00545 int blocksize_y,
00546 int blocksize_x,
00547 int min_mcost,
00548 int cand_x1, int cand_y1,
00549 int cand_x2, int cand_y2)
00550 {
00551 int mcost = 0;
00552 int bi_diff;
00553 int denom = luma_log_weight_denom + 1;
00554 int lround = 2 * wp_luma_round;
00555 int y,x;
00556 int weighted_pel, pixel1, pixel2;
00557 int pad_size_x = img_padded_size_x - blocksize_x;
00558
00559 src_line = src_pic;
00560 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2, cand_x2, height_pad, width_pad);
00561 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1, cand_x1, height_pad, width_pad);
00562
00563 for (y=0; y<blocksize_y; y++)
00564 {
00565 for (x = 0; x < blocksize_x; x+=4)
00566 {
00567 pixel1 = weight1 * (*ref1_line++);
00568 pixel2 = weight2 * (*ref2_line++);
00569 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00570 bi_diff = (*src_line++) - weighted_pel;
00571 mcost += byte_abs[bi_diff];
00572
00573 pixel1 = weight1 * (*ref1_line++);
00574 pixel2 = weight2 * (*ref2_line++);
00575 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00576 bi_diff = (*src_line++) - weighted_pel;
00577 mcost += byte_abs[bi_diff];
00578
00579 pixel1 = weight1 * (*ref1_line++);
00580 pixel2 = weight2 * (*ref2_line++);
00581 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00582 bi_diff = (*src_line++) - weighted_pel;
00583 mcost += byte_abs[bi_diff];
00584
00585 pixel1 = weight1 * (*ref1_line++);
00586 pixel2 = weight2 * (*ref2_line++);
00587 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00588 bi_diff = (*src_line++) - weighted_pel;
00589 mcost += byte_abs[bi_diff];
00590 }
00591 if (mcost >= min_mcost) return mcost;
00592 ref2_line += pad_size_x;
00593 ref1_line += pad_size_x;
00594 }
00595
00596 if ( ChromaMEEnable )
00597 {
00598
00599 int blocksize_x_cr = blocksize_x >> shift_cr_x;
00600 int blocksize_y_cr = blocksize_y >> shift_cr_y;
00601 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
00602 int k;
00603 int mcr_cost = 0;
00604 int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
00605
00606 for (k=0; k<2; k++)
00607 {
00608 mcr_cost = 0;
00609 src_line = src_pic + (256 << k);
00610 ref2_line = UMVLine8X_chroma ( ref_pic2_sub.crcb[k], cand_y2, cand_x2, height_pad_cr, width_pad_cr);
00611 ref1_line = UMVLine8X_chroma ( ref_pic1_sub.crcb[k], cand_y1, cand_x1, height_pad_cr, width_pad_cr);
00612
00613 for (y=0; y<blocksize_y_cr; y++)
00614 {
00615 for (x = 0; x < blocksize_x_cr; x+=2)
00616 {
00617 pixel1 = weight1_cr[k] * (*ref1_line++);
00618 pixel2 = weight2_cr[k] * (*ref2_line++);
00619 weighted_pel = iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
00620 bi_diff = (*src_line++) - weighted_pel;
00621 mcr_cost += byte_abs[bi_diff];
00622
00623 pixel1 = weight1_cr[k] * (*ref1_line++);
00624 pixel2 = weight2_cr[k] * (*ref2_line++);
00625 weighted_pel = iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
00626 bi_diff = (*src_line++) - weighted_pel;
00627 mcr_cost += byte_abs[bi_diff];
00628 }
00629 ref2_line += cr_pad_size_x;
00630 ref1_line += cr_pad_size_x;
00631 }
00632 mcost += params->ChromaMEWeight * mcr_cost;
00633 if (mcost >= min_mcost) return mcost;
00634
00635 }
00636 }
00637 return mcost;
00638 }
00639
00640
00641
00642
00643
00644
00645
00646 int computeSATD(imgpel* src_pic,
00647 int blocksize_y,
00648 int blocksize_x,
00649 int min_mcost,
00650 int cand_x,
00651 int cand_y)
00652 {
00653 int mcost = 0;
00654 int y, x, y4, *d;
00655 int src_size_x, src_size_mul;
00656 imgpel *src_tmp = src_pic;
00657
00658 if ( !test8x8transform )
00659 {
00660 src_size_x = blocksize_x - BLOCK_SIZE;
00661 src_size_mul = blocksize_x * BLOCK_SIZE;
00662 for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_SP))
00663 {
00664 for (x=0; x<blocksize_x; x += BLOCK_SIZE)
00665 {
00666 d = diff;
00667 ref_line = UMVLine4X (ref_pic_sub.luma, y, cand_x + (x<<2), height_pad, width_pad);
00668 src_line = src_tmp + x;
00669 for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
00670 {
00671 *d++ = *src_line++ - *ref_line++ ;
00672 *d++ = *src_line++ - *ref_line++ ;
00673 *d++ = *src_line++ - *ref_line++ ;
00674 *d++ = *src_line++ - *ref_line++ ;
00675
00676 ref_line += img_padded_size_x_m4x4;
00677 src_line += src_size_x;
00678 }
00679 if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
00680 }
00681 src_tmp += src_size_mul;
00682 }
00683 }
00684 else
00685 {
00686 src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
00687 src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
00688 for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_8x8_SP) )
00689 {
00690 for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
00691 {
00692 d = diff;
00693 ref_line = UMVLine4X (ref_pic_sub.luma, y, cand_x + (x<<2), height_pad, width_pad);
00694 src_line = src_tmp + x;
00695 for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
00696 {
00697 *d++ = *src_line++ - *ref_line++ ;
00698 *d++ = *src_line++ - *ref_line++ ;
00699 *d++ = *src_line++ - *ref_line++ ;
00700 *d++ = *src_line++ - *ref_line++ ;
00701 *d++ = *src_line++ - *ref_line++ ;
00702 *d++ = *src_line++ - *ref_line++ ;
00703 *d++ = *src_line++ - *ref_line++ ;
00704 *d++ = *src_line++ - *ref_line++ ;
00705
00706 ref_line += img_padded_size_x_m8x8;
00707 src_line += src_size_x;
00708 }
00709 if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
00710 }
00711 src_tmp += src_size_mul;
00712 }
00713 }
00714 return mcost;
00715 }
00716
00717
00718
00719
00720
00721
00722
00723 int computeSATDWP(imgpel* src_pic,
00724 int blocksize_y,
00725 int blocksize_x,
00726 int min_mcost,
00727 int cand_x,
00728 int cand_y)
00729 {
00730 int mcost = 0;
00731 int y, x, y4, *d;
00732 int weighted_pel;
00733 int src_size_x, src_size_mul;
00734 imgpel *src_tmp = src_pic;
00735
00736 if ( !test8x8transform )
00737 {
00738 src_size_x = (blocksize_x - BLOCK_SIZE);
00739 src_size_mul = blocksize_x * BLOCK_SIZE;
00740 for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_SP))
00741 {
00742 for (x=0; x<blocksize_x; x += BLOCK_SIZE)
00743 {
00744 d = diff;
00745 ref_line = UMVLine4X (ref_pic_sub.luma, y, cand_x + (x<<2), height_pad, width_pad);
00746 src_line = src_tmp + x;
00747 for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
00748 {
00749 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00750 *d++ = *src_line++ - weighted_pel;
00751 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00752 *d++ = *src_line++ - weighted_pel;
00753 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00754 *d++ = *src_line++ - weighted_pel;
00755 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00756 *d++ = *src_line++ - weighted_pel;
00757
00758 ref_line += img_padded_size_x_m4x4;
00759 src_line += src_size_x;
00760 }
00761 if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
00762 }
00763 src_tmp += src_size_mul;
00764 }
00765 }
00766 else
00767 {
00768 src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
00769 src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
00770 for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_8x8_SP) )
00771 {
00772 for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
00773 {
00774 d = diff;
00775 ref_line = UMVLine4X (ref_pic_sub.luma, y, cand_x + (x<<2), height_pad, width_pad);
00776 src_line = src_tmp + x;
00777 for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
00778 {
00779 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00780 *d++ = *src_line++ - weighted_pel;
00781 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00782 *d++ = *src_line++ - weighted_pel;
00783 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00784 *d++ = *src_line++ - weighted_pel;
00785 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00786 *d++ = *src_line++ - weighted_pel;
00787 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00788 *d++ = *src_line++ - weighted_pel;
00789 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00790 *d++ = *src_line++ - weighted_pel;
00791 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00792 *d++ = *src_line++ - weighted_pel;
00793 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
00794 *d++ = *src_line++ - weighted_pel;
00795
00796 ref_line += img_padded_size_x_m8x8;
00797 src_line += src_size_x;
00798 }
00799 if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
00800 }
00801 src_tmp += src_size_mul;
00802 }
00803 }
00804 return mcost;
00805 }
00806
00807
00808
00809
00810
00811
00812
00813 int computeBiPredSATD1(imgpel* src_pic,
00814 int blocksize_y,
00815 int blocksize_x,
00816 int min_mcost,
00817 int cand_x1, int cand_y1,
00818 int cand_x2, int cand_y2)
00819 {
00820 int mcost = 0;
00821 int y, x, y4, *d;
00822 int src_size_x, src_size_mul;
00823 imgpel *src_tmp = src_pic;
00824
00825 if ( !test8x8transform )
00826 {
00827 src_size_x = (blocksize_x - BLOCK_SIZE);
00828 src_size_mul = blocksize_x * BLOCK_SIZE;
00829 for (y=0; y<(blocksize_y<<2); y += (BLOCK_SIZE_SP))
00830 {
00831 for (x=0; x<blocksize_x; x += BLOCK_SIZE)
00832 {
00833 d = diff;
00834 src_line = src_tmp + x;
00835 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2 + y, cand_x2 + (x<<2), height_pad, width_pad);
00836 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1 + y, cand_x1 + (x<<2), height_pad, width_pad);
00837 for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
00838 {
00839 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00840 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00841 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00842 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00843
00844 ref1_line += img_padded_size_x_m4x4;
00845 ref2_line += img_padded_size_x_m4x4;
00846 src_line += src_size_x;
00847 }
00848 if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
00849 }
00850 src_tmp += src_size_mul;
00851 }
00852 }
00853 else
00854 {
00855 src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
00856 src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
00857 for (y=0; y<blocksize_y; y += BLOCK_SIZE_8x8 )
00858 {
00859 int y_pos2 = cand_y2 + (y<<2);
00860 int y_pos1 = cand_y1 + (y<<2);
00861 for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
00862 {
00863 d = diff;
00864 src_line = src_tmp + x;
00865 ref2_line = UMVLine4X(ref_pic2_sub.luma, y_pos2, cand_x2 + (x<<2), height_pad, width_pad);
00866 ref1_line = UMVLine4X(ref_pic1_sub.luma, y_pos1, cand_x1 + (x<<2), height_pad, width_pad);
00867 for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
00868 {
00869 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00870 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00871 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00872 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00873 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00874 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00875 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00876 *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
00877
00878 ref1_line += img_padded_size_x_m8x8;
00879 ref2_line += img_padded_size_x_m8x8;
00880 src_line += src_size_x;
00881 }
00882 if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
00883 }
00884 src_tmp += src_size_mul;
00885 }
00886 }
00887 return mcost;
00888 }
00889
00890
00891
00892
00893
00894
00895
00896 int computeBiPredSATD2(imgpel* src_pic,
00897 int blocksize_y,
00898 int blocksize_x,
00899 int min_mcost,
00900 int cand_x1, int cand_y1,
00901 int cand_x2, int cand_y2)
00902 {
00903 int mcost = 0;
00904 int y, x, y4, *d;
00905 int weighted_pel, pixel1, pixel2;
00906 int denom = luma_log_weight_denom + 1;
00907 int lround = 2 * wp_luma_round;
00908 int src_size_x, src_size_mul;
00909 imgpel *src_tmp = src_pic;
00910
00911 if ( !test8x8transform )
00912 {
00913 src_size_x = (blocksize_x - BLOCK_SIZE);
00914 src_size_mul = blocksize_x * BLOCK_SIZE;
00915 for (y=0; y<(blocksize_y<<2); y += BLOCK_SIZE_SP)
00916 {
00917 for (x=0; x<blocksize_x; x += BLOCK_SIZE)
00918 {
00919 d = diff;
00920 src_line = src_tmp + x;
00921 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2 + y, cand_x2 + (x<<2), height_pad, width_pad);
00922 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1 + y, cand_x1 + (x<<2), height_pad, width_pad);
00923 for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
00924 {
00925
00926 pixel1 = weight1 * (*ref1_line++);
00927 pixel2 = weight2 * (*ref2_line++);
00928 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00929 *d++ = (*src_line++) - weighted_pel;
00930
00931 pixel1 = weight1 * (*ref1_line++);
00932 pixel2 = weight2 * (*ref2_line++);
00933 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00934 *d++ = (*src_line++) - weighted_pel;
00935
00936 pixel1 = weight1 * (*ref1_line++);
00937 pixel2 = weight2 * (*ref2_line++);
00938 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00939 *d++ = (*src_line++) - weighted_pel;
00940
00941 pixel1 = weight1 * (*ref1_line++);
00942 pixel2 = weight2 * (*ref2_line++);
00943 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00944 *d++ = (*src_line++) - weighted_pel;
00945
00946 ref1_line += img_padded_size_x_m4x4;
00947 ref2_line += img_padded_size_x_m4x4;
00948 src_line += src_size_x;
00949 }
00950 if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
00951 }
00952 src_tmp += src_size_mul;
00953 }
00954 }
00955 else
00956 {
00957 src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
00958 src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
00959 for (y=0; y<blocksize_y; y += BLOCK_SIZE_8x8 )
00960 {
00961 int y_pos2 = cand_y2 + (y<<2);
00962 int y_pos1 = cand_y1 + (y<<2);
00963 for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
00964 {
00965 d = diff;
00966 src_line = src_tmp + x;
00967 ref2_line = UMVLine4X(ref_pic2_sub.luma, y_pos2, cand_x2 + (x<<2), height_pad, width_pad);
00968 ref1_line = UMVLine4X(ref_pic1_sub.luma, y_pos1, cand_x1 + (x<<2), height_pad, width_pad);
00969 for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
00970 {
00971
00972 pixel1 = weight1 * (*ref1_line++);
00973 pixel2 = weight2 * (*ref2_line++);
00974 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00975 *d++ = (*src_line++) - weighted_pel;
00976
00977 pixel1 = weight1 * (*ref1_line++);
00978 pixel2 = weight2 * (*ref2_line++);
00979 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00980 *d++ = (*src_line++) - weighted_pel;
00981
00982 pixel1 = weight1 * (*ref1_line++);
00983 pixel2 = weight2 * (*ref2_line++);
00984 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00985 *d++ = (*src_line++) - weighted_pel;
00986
00987 pixel1 = weight1 * (*ref1_line++);
00988 pixel2 = weight2 * (*ref2_line++);
00989 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00990 *d++ = (*src_line++) - weighted_pel;
00991
00992 pixel1 = weight1 * (*ref1_line++);
00993 pixel2 = weight2 * (*ref2_line++);
00994 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
00995 *d++ = (*src_line++) - weighted_pel;
00996
00997 pixel1 = weight1 * (*ref1_line++);
00998 pixel2 = weight2 * (*ref2_line++);
00999 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01000 *d++ = (*src_line++) - weighted_pel;
01001
01002 pixel1 = weight1 * (*ref1_line++);
01003 pixel2 = weight2 * (*ref2_line++);
01004 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01005 *d++ = (*src_line++) - weighted_pel;
01006
01007 pixel1 = weight1 * (*ref1_line++);
01008 pixel2 = weight2 * (*ref2_line++);
01009 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01010 *d++ = (*src_line) - weighted_pel;
01011
01012 ref1_line += img_padded_size_x_m8x8;
01013 ref2_line += img_padded_size_x_m8x8;
01014 src_line += src_size_x;
01015 }
01016 if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
01017 }
01018 src_tmp += src_size_mul;
01019 }
01020 }
01021 return mcost;
01022 }
01023
01024
01025
01026
01027
01028
01029
01030
01031 int computeSSE(imgpel* src_pic,
01032 int blocksize_y,
01033 int blocksize_x,
01034 int min_mcost,
01035 int cand_x,
01036 int cand_y)
01037 {
01038 int mcost = 0;
01039 int y,x;
01040 int *byte_sse = img->quad;
01041 int pad_size_x = img_padded_size_x - blocksize_x;
01042
01043 src_line = src_pic;
01044 ref_line = UMVLine4X (ref_pic_sub.luma, cand_y, cand_x, height_pad, width_pad);
01045 for (y=0; y<blocksize_y; y++)
01046 {
01047 for (x = 0; x < blocksize_x; x+=4)
01048 {
01049 mcost += byte_sse[ *src_line++ - *ref_line++ ];
01050 mcost += byte_sse[ *src_line++ - *ref_line++ ];
01051 mcost += byte_sse[ *src_line++ - *ref_line++ ];
01052 mcost += byte_sse[ *src_line++ - *ref_line++ ];
01053 }
01054 if (mcost >= min_mcost) return mcost;
01055 ref_line += pad_size_x;
01056 }
01057
01058 if ( ChromaMEEnable )
01059 {
01060
01061 int blocksize_x_cr = blocksize_x >> shift_cr_x;
01062 int blocksize_y_cr = blocksize_y >> shift_cr_y;
01063 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
01064 int k;
01065 int mcr_cost = 0;
01066
01067 for (k=0; k<2; k++)
01068 {
01069 mcr_cost = 0;
01070 src_line = src_pic + (256 << k);
01071 ref_line = UMVLine8X_chroma ( ref_pic_sub.crcb[k], cand_y, cand_x, height_pad_cr, width_pad_cr);
01072 for (y=0; y<blocksize_y_cr; y++)
01073 {
01074 for (x = 0; x < blocksize_x_cr; x+=2)
01075 {
01076 mcr_cost += byte_sse[ *src_line++ - *ref_line++ ];
01077 mcr_cost += byte_sse[ *src_line++ - *ref_line++ ];
01078 }
01079 ref_line += cr_pad_size_x;
01080 }
01081 mcost += params->ChromaMEWeight * mcr_cost;
01082 if (mcost >= min_mcost) return mcost;
01083 }
01084 }
01085
01086 return mcost;
01087 }
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097 int computeSSEWP(imgpel* src_pic,
01098 int blocksize_y,
01099 int blocksize_x,
01100 int min_mcost,
01101 int cand_x,
01102 int cand_y)
01103 {
01104 int mcost = 0;
01105 int y,x;
01106 int weighted_pel;
01107 int *byte_sse = img->quad;
01108 int pad_size_x = img_padded_size_x - blocksize_x;
01109
01110 src_line = src_pic;
01111 ref_line = UMVLine4X (ref_pic_sub.luma, cand_y, cand_x, height_pad, width_pad);
01112 for (y=0; y<blocksize_y; y++)
01113 {
01114 for (x = 0; x < blocksize_x; x+=4)
01115 {
01116 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
01117 mcost += byte_sse[ *src_line++ - weighted_pel ];
01118 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
01119 mcost += byte_sse[ *src_line++ - weighted_pel ];
01120 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
01121 mcost += byte_sse[ *src_line++ - weighted_pel ];
01122 weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++ + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
01123 mcost += byte_sse[ *src_line++ - weighted_pel ];
01124 }
01125 if (mcost >= min_mcost) return mcost;
01126 ref_line += pad_size_x;
01127 }
01128
01129 if ( ChromaMEEnable )
01130 {
01131
01132
01133 int blocksize_x_cr = blocksize_x >> shift_cr_x;
01134 int blocksize_y_cr = blocksize_y >> shift_cr_y;
01135 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
01136 int k;
01137 int mcr_cost = 0;
01138 int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
01139
01140 for (k=0; k<2; k++)
01141 {
01142 mcr_cost = 0;
01143 src_line = src_pic + (256 << k);
01144 ref_line = UMVLine8X_chroma ( ref_pic_sub.crcb[k], cand_y, cand_x, height_pad_cr, width_pad_cr);
01145 for (y=0; y<blocksize_y_cr; y++)
01146 {
01147
01148 for (x = 0; x < blocksize_x_cr; x+=2)
01149 {
01150 weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++ + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
01151 mcr_cost += byte_sse[ *src_line++ - weighted_pel ];
01152 weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++ + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
01153 mcr_cost += byte_sse[ *src_line++ - weighted_pel ];
01154 }
01155 ref_line += cr_pad_size_x;
01156 }
01157 mcost += params->ChromaMEWeight * mcr_cost;
01158 if (mcost >= min_mcost) return mcost;
01159 }
01160 }
01161
01162 return mcost;
01163 }
01164
01165
01166
01167
01168
01169
01170
01171 int computeBiPredSSE1(imgpel* src_pic,
01172 int blocksize_y,
01173 int blocksize_x,
01174 int min_mcost,
01175 int cand_x1, int cand_y1,
01176 int cand_x2, int cand_y2)
01177 {
01178 int mcost = 0;
01179 int bi_diff;
01180 int y,x;
01181 int *byte_sse = img->quad;
01182 int pad_size_x = img_padded_size_x - blocksize_x;
01183
01184 src_line = src_pic;
01185 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2, cand_x2, height_pad, width_pad);
01186 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1, cand_x1, height_pad, width_pad);
01187
01188 for (y = 0; y < blocksize_y; y++)
01189 {
01190 for (x = 0; x < blocksize_x; x+=4)
01191 {
01192 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01193 mcost += byte_sse[bi_diff];
01194 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01195 mcost += byte_sse[bi_diff];
01196 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01197 mcost += byte_sse[bi_diff];
01198 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01199 mcost += byte_sse[bi_diff];
01200 }
01201
01202 if (mcost >= min_mcost) return mcost;
01203 ref2_line += pad_size_x;
01204 ref1_line += pad_size_x;
01205 }
01206
01207 if ( ChromaMEEnable )
01208 {
01209
01210 int blocksize_x_cr = blocksize_x >> shift_cr_x;
01211 int blocksize_y_cr = blocksize_y >> shift_cr_y;
01212 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
01213 int k;
01214 int mcr_cost = 0;
01215
01216 for (k=0; k<2; k++)
01217 {
01218 mcr_cost = 0;
01219 src_line = src_pic + (256 << k);
01220 ref2_line = UMVLine8X_chroma ( ref_pic2_sub.crcb[k], cand_y2, cand_x2, height_pad_cr, width_pad_cr);
01221 ref1_line = UMVLine8X_chroma ( ref_pic1_sub.crcb[k], cand_y1, cand_x1, height_pad_cr, width_pad_cr);
01222
01223 for (y=0; y<blocksize_y_cr; y++)
01224 {
01225 for (x = 0; x < blocksize_x_cr; x+=2)
01226 {
01227 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01228 mcr_cost += byte_sse[bi_diff];
01229 bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
01230 mcr_cost += byte_sse[bi_diff];
01231 }
01232 ref2_line += cr_pad_size_x;
01233 ref1_line += cr_pad_size_x;
01234 }
01235 mcost += params->ChromaMEWeight * mcr_cost;
01236 if (mcost >= min_mcost) return mcost;
01237 }
01238 }
01239
01240 return mcost;
01241 }
01242
01243
01244
01245
01246
01247
01248
01249
01250 int computeBiPredSSE2(imgpel* src_pic,
01251 int blocksize_y,
01252 int blocksize_x,
01253 int min_mcost,
01254 int cand_x1, int cand_y1,
01255 int cand_x2, int cand_y2)
01256 {
01257 int mcost = 0;
01258 int bi_diff;
01259 int denom = luma_log_weight_denom + 1;
01260 int lround = 2 * wp_luma_round;
01261 int y,x;
01262 int weighted_pel, pixel1, pixel2;
01263 int pad_size_x = img_padded_size_x - blocksize_x;
01264
01265 src_line = src_pic;
01266 ref2_line = UMVLine4X(ref_pic2_sub.luma, cand_y2, cand_x2, height_pad, width_pad);
01267 ref1_line = UMVLine4X(ref_pic1_sub.luma, cand_y1, cand_x1, height_pad, width_pad);
01268 for (y=0; y<blocksize_y; y++)
01269 {
01270 for (x = 0; x < blocksize_x; x+=4)
01271 {
01272 pixel1 = weight1 * (*ref1_line++);
01273 pixel2 = weight2 * (*ref2_line++);
01274 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01275 bi_diff = (*src_line++) - weighted_pel;
01276 mcost += bi_diff * bi_diff;
01277
01278 pixel1 = weight1 * (*ref1_line++);
01279 pixel2 = weight2 * (*ref2_line++);
01280 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01281 bi_diff = (*src_line++) - weighted_pel;
01282 mcost += bi_diff * bi_diff;
01283
01284 pixel1 = weight1 * (*ref1_line++);
01285 pixel2 = weight2 * (*ref2_line++);
01286 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01287 bi_diff = (*src_line++) - weighted_pel;
01288 mcost += bi_diff * bi_diff;
01289
01290 pixel1 = weight1 * (*ref1_line++);
01291 pixel2 = weight2 * (*ref2_line++);
01292 weighted_pel = iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
01293 bi_diff = (*src_line++) - weighted_pel;
01294 mcost += bi_diff * bi_diff;
01295 }
01296 if (mcost >= min_mcost) return mcost;
01297 ref2_line += pad_size_x;
01298 ref1_line += pad_size_x;
01299 }
01300
01301 if ( ChromaMEEnable )
01302 {
01303
01304 int blocksize_x_cr = blocksize_x >> shift_cr_x;
01305 int blocksize_y_cr = blocksize_y >> shift_cr_y;
01306 int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
01307 int k;
01308 int mcr_cost = 0;
01309 int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
01310
01311 for (k=0; k<2; k++)
01312 {
01313 mcr_cost = 0;
01314 src_line = src_pic + (256 << k);
01315 ref2_line = UMVLine8X_chroma ( ref_pic2_sub.crcb[k], cand_y2, cand_x2, height_pad_cr, width_pad_cr);
01316 ref1_line = UMVLine8X_chroma ( ref_pic1_sub.crcb[k], cand_y1, cand_x1, height_pad_cr, width_pad_cr);
01317
01318 for (y=0; y<blocksize_y_cr; y++)
01319 {
01320 for (x = 0; x < blocksize_x_cr; x+=2)
01321 {
01322 pixel1 = weight1_cr[k] * (*ref1_line++);
01323 pixel2 = weight2_cr[k] * (*ref2_line++);
01324 weighted_pel = iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
01325 bi_diff = (*src_line++) - weighted_pel;
01326 mcr_cost += bi_diff * bi_diff;
01327
01328 pixel1 = weight1_cr[k] * (*ref1_line++);
01329 pixel2 = weight2_cr[k] * (*ref2_line++);
01330 weighted_pel = iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
01331 bi_diff = (*src_line++) - weighted_pel;
01332 mcr_cost += bi_diff * bi_diff;
01333 }
01334 ref2_line += cr_pad_size_x;
01335 ref1_line += cr_pad_size_x;
01336 }
01337 mcost += params->ChromaMEWeight * mcr_cost;
01338 if (mcost >= min_mcost) return mcost;
01339 }
01340 }
01341
01342 return mcost;
01343 }
01344
01345