Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(664)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_mcomp.c

Issue 168343002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: libvpx: Pull from upstream Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_onyx_if.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 ((mvjcost[((r) != rr) * 2 + ((c) != rc)] + \ 177 ((mvjcost[((r) != rr) * 2 + ((c) != rc)] + \
178 mvcost[0][((r) - rr)] + mvcost[1][((c) - rc)]) * \ 178 mvcost[0][((r) - rr)] + mvcost[1][((c) - rc)]) * \
179 error_per_bit + 4096) >> 13 : 0) 179 error_per_bit + 4096) >> 13 : 0)
180 180
181 181
182 // convert motion vector component to offset for svf calc 182 // convert motion vector component to offset for svf calc
183 static INLINE int sp(int x) { 183 static INLINE int sp(int x) {
184 return (x & 7) << 1; 184 return (x & 7) << 1;
185 } 185 }
186 186
187 static INLINE uint8_t *pre(uint8_t *buf, int stride, int r, int c, int offset) { 187 static INLINE const uint8_t *pre(const uint8_t *buf, int stride, int r, int c,
188 int offset) {
188 return &buf[(r >> 3) * stride + (c >> 3) - offset]; 189 return &buf[(r >> 3) * stride + (c >> 3) - offset];
189 } 190 }
190 191
191 /* returns subpixel variance error function */ 192 /* returns subpixel variance error function */
192 #define DIST(r, c) \ 193 #define DIST(r, c) \
193 vfp->svf(pre(y, y_stride, r, c, offset), y_stride, sp(c), sp(r), z, \ 194 vfp->svf(pre(y, y_stride, r, c, offset), y_stride, sp(c), sp(r), z, \
194 src_stride, &sse) 195 src_stride, &sse)
195 196
196 /* checks if (r, c) has better score than previous best */ 197 /* checks if (r, c) has better score than previous best */
197 #define CHECK_BETTER(v, r, c) \ 198 #define CHECK_BETTER(v, r, c) \
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 CHECK_BETTER(second, tr + kr, tc + hstep); \ 267 CHECK_BETTER(second, tr + kr, tc + hstep); \
267 break; \ 268 break; \
268 case 1: \ 269 case 1: \
269 case 3: \ 270 case 3: \
270 CHECK_BETTER(second, tr + kr, tc - hstep); \ 271 CHECK_BETTER(second, tr + kr, tc - hstep); \
271 break; \ 272 break; \
272 } \ 273 } \
273 } \ 274 } \
274 } 275 }
275 276
276 int vp9_find_best_sub_pixel_tree(MACROBLOCK *x, 277 int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
277 MV *bestmv, const MV *ref_mv, 278 MV *bestmv, const MV *ref_mv,
278 int allow_hp, 279 int allow_hp,
279 int error_per_bit, 280 int error_per_bit,
280 const vp9_variance_fn_ptr_t *vfp, 281 const vp9_variance_fn_ptr_t *vfp,
281 int forced_stop, 282 int forced_stop,
282 int iters_per_step, 283 int iters_per_step,
283 int *mvjcost, int *mvcost[2], 284 int *mvjcost, int *mvcost[2],
284 int *distortion, 285 int *distortion,
285 unsigned int *sse1) { 286 unsigned int *sse1) {
286 uint8_t *z = x->plane[0].src.buf; 287 const uint8_t *z = x->plane[0].src.buf;
287 const int src_stride = x->plane[0].src.stride; 288 const int src_stride = x->plane[0].src.stride;
288 MACROBLOCKD *xd = &x->e_mbd; 289 const MACROBLOCKD *xd = &x->e_mbd;
289 unsigned int besterr = INT_MAX; 290 unsigned int besterr = INT_MAX;
290 unsigned int sse; 291 unsigned int sse;
291 unsigned int whichdir; 292 unsigned int whichdir;
292 int thismse; 293 int thismse;
293 unsigned int halfiters = iters_per_step; 294 unsigned int halfiters = iters_per_step;
294 unsigned int quarteriters = iters_per_step; 295 unsigned int quarteriters = iters_per_step;
295 unsigned int eighthiters = iters_per_step; 296 unsigned int eighthiters = iters_per_step;
296 297
297 const int y_stride = xd->plane[0].pre[0].stride; 298 const int y_stride = xd->plane[0].pre[0].stride;
298 const int offset = bestmv->row * y_stride + bestmv->col; 299 const int offset = bestmv->row * y_stride + bestmv->col;
299 uint8_t *y = xd->plane[0].pre[0].buf + offset; 300 const uint8_t *y = xd->plane[0].pre[0].buf + offset;
300 301
301 int rr = ref_mv->row; 302 int rr = ref_mv->row;
302 int rc = ref_mv->col; 303 int rc = ref_mv->col;
303 int br = bestmv->row * 8; 304 int br = bestmv->row * 8;
304 int bc = bestmv->col * 8; 305 int bc = bestmv->col * 8;
305 int hstep = 4; 306 int hstep = 4;
306 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX); 307 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX);
307 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX); 308 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX);
308 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX); 309 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX);
309 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX); 310 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 342
342 if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) { 343 if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
343 hstep >>= 1; 344 hstep >>= 1;
344 FIRST_LEVEL_CHECKS; 345 FIRST_LEVEL_CHECKS;
345 if (eighthiters > 1) { 346 if (eighthiters > 1) {
346 SECOND_LEVEL_CHECKS; 347 SECOND_LEVEL_CHECKS;
347 } 348 }
348 tr = br; 349 tr = br;
349 tc = bc; 350 tc = bc;
350 } 351 }
352 // These lines insure static analysis doesn't warn that
353 // tr and tc aren't used after the above point.
354 (void) tr;
355 (void) tc;
351 356
352 bestmv->row = br; 357 bestmv->row = br;
353 bestmv->col = bc; 358 bestmv->col = bc;
354 359
355 if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) || 360 if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) ||
356 (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3))) 361 (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3)))
357 return INT_MAX; 362 return INT_MAX;
358 363
359 return besterr; 364 return besterr;
360 } 365 }
361 366
362 #undef DIST 367 #undef DIST
363 /* returns subpixel variance error function */ 368 /* returns subpixel variance error function */
364 #define DIST(r, c) \ 369 #define DIST(r, c) \
365 vfp->svaf(pre(y, y_stride, r, c, offset), y_stride, sp(c), sp(r), \ 370 vfp->svaf(pre(y, y_stride, r, c, offset), y_stride, sp(c), sp(r), \
366 z, src_stride, &sse, second_pred) 371 z, src_stride, &sse, second_pred)
367 372
368 int vp9_find_best_sub_pixel_comp_tree(MACROBLOCK *x, 373 int vp9_find_best_sub_pixel_comp_tree(const MACROBLOCK *x,
369 MV *bestmv, const MV *ref_mv, 374 MV *bestmv, const MV *ref_mv,
370 int allow_hp, 375 int allow_hp,
371 int error_per_bit, 376 int error_per_bit,
372 const vp9_variance_fn_ptr_t *vfp, 377 const vp9_variance_fn_ptr_t *vfp,
373 int forced_stop, 378 int forced_stop,
374 int iters_per_step, 379 int iters_per_step,
375 int *mvjcost, int *mvcost[2], 380 int *mvjcost, int *mvcost[2],
376 int *distortion, 381 int *distortion,
377 unsigned int *sse1, 382 unsigned int *sse1,
378 const uint8_t *second_pred, 383 const uint8_t *second_pred,
379 int w, int h) { 384 int w, int h) {
380 uint8_t *z = x->plane[0].src.buf; 385 const uint8_t *z = x->plane[0].src.buf;
381 const int src_stride = x->plane[0].src.stride; 386 const int src_stride = x->plane[0].src.stride;
382 MACROBLOCKD *xd = &x->e_mbd; 387 const MACROBLOCKD *xd = &x->e_mbd;
383 unsigned int besterr = INT_MAX; 388 unsigned int besterr = INT_MAX;
384 unsigned int sse; 389 unsigned int sse;
385 unsigned int whichdir; 390 unsigned int whichdir;
386 int thismse; 391 int thismse;
387 unsigned int halfiters = iters_per_step; 392 unsigned int halfiters = iters_per_step;
388 unsigned int quarteriters = iters_per_step; 393 unsigned int quarteriters = iters_per_step;
389 unsigned int eighthiters = iters_per_step; 394 unsigned int eighthiters = iters_per_step;
390 395
391 DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64); 396 DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
392 const int y_stride = xd->plane[0].pre[0].stride; 397 const int y_stride = xd->plane[0].pre[0].stride;
393 const int offset = bestmv->row * y_stride + bestmv->col; 398 const int offset = bestmv->row * y_stride + bestmv->col;
394 uint8_t *y = xd->plane[0].pre[0].buf + offset; 399 const uint8_t *y = xd->plane[0].pre[0].buf + offset;
395 400
396 int rr = ref_mv->row; 401 int rr = ref_mv->row;
397 int rc = ref_mv->col; 402 int rc = ref_mv->col;
398 int br = bestmv->row * 8; 403 int br = bestmv->row * 8;
399 int bc = bestmv->col * 8; 404 int bc = bestmv->col * 8;
400 int hstep = 4; 405 int hstep = 4;
401 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX); 406 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX);
402 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX); 407 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX);
403 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX); 408 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX);
404 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX); 409 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 449
445 if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) { 450 if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
446 hstep >>= 1; 451 hstep >>= 1;
447 FIRST_LEVEL_CHECKS; 452 FIRST_LEVEL_CHECKS;
448 if (eighthiters > 1) { 453 if (eighthiters > 1) {
449 SECOND_LEVEL_CHECKS; 454 SECOND_LEVEL_CHECKS;
450 } 455 }
451 tr = br; 456 tr = br;
452 tc = bc; 457 tc = bc;
453 } 458 }
459 // These lines insure static analysis doesn't warn that
460 // tr and tc aren't used after the above point.
461 (void) tr;
462 (void) tc;
463
454 bestmv->row = br; 464 bestmv->row = br;
455 bestmv->col = bc; 465 bestmv->col = bc;
456 466
457 if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) || 467 if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) ||
458 (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3))) 468 (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3)))
459 return INT_MAX; 469 return INT_MAX;
460 470
461 return besterr; 471 return besterr;
462 } 472 }
463 473
464 #undef MVC 474 #undef MVC
465 #undef PRE 475 #undef PRE
466 #undef DIST 476 #undef DIST
467 #undef CHECK_BETTER 477 #undef CHECK_BETTER
468 #undef SP
469 478
470 static INLINE int check_bounds(const MACROBLOCK *x, int row, int col, 479 static INLINE int check_bounds(const MACROBLOCK *x, int row, int col,
471 int range) { 480 int range) {
472 return ((row - range) >= x->mv_row_min) & 481 return ((row - range) >= x->mv_row_min) &
473 ((row + range) <= x->mv_row_max) & 482 ((row + range) <= x->mv_row_max) &
474 ((col - range) >= x->mv_col_min) & 483 ((col - range) >= x->mv_col_min) &
475 ((col + range) <= x->mv_col_max); 484 ((col + range) <= x->mv_col_max);
476 } 485 }
477 486
478 static INLINE int check_point(const MACROBLOCK *x, const MV *mv) { 487 static INLINE int is_mv_in(const MACROBLOCK *x, const MV *mv) {
479 return (mv->col < x->mv_col_min) | 488 return (mv->col >= x->mv_col_min) && (mv->col <= x->mv_col_max) &&
480 (mv->col > x->mv_col_max) | 489 (mv->row >= x->mv_row_min) && (mv->row <= x->mv_row_max);
481 (mv->row < x->mv_row_min) |
482 (mv->row > x->mv_row_max);
483 } 490 }
484 491
485 #define CHECK_BETTER \ 492 #define CHECK_BETTER \
486 {\ 493 {\
487 if (thissad < bestsad)\ 494 if (thissad < bestsad) {\
488 {\
489 if (use_mvcost) \ 495 if (use_mvcost) \
490 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, \ 496 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, \
491 mvjsadcost, mvsadcost, \ 497 mvjsadcost, mvsadcost, sad_per_bit);\
492 sad_per_bit);\ 498 if (thissad < bestsad) {\
493 if (thissad < bestsad)\
494 {\
495 bestsad = thissad;\ 499 bestsad = thissad;\
496 best_site = i;\ 500 best_site = i;\
497 }\ 501 }\
498 }\ 502 }\
499 } 503 }
500 504
501 #define get_next_chkpts(list, i, n) \
502 list[0] = ((i) == 0 ? (n) - 1 : (i) - 1); \
503 list[1] = (i); \
504 list[2] = ((i) == (n) - 1 ? 0 : (i) + 1);
505
506 #define MAX_PATTERN_SCALES 11 505 #define MAX_PATTERN_SCALES 11
507 #define MAX_PATTERN_CANDIDATES 8 // max number of canddiates per scale 506 #define MAX_PATTERN_CANDIDATES 8 // max number of canddiates per scale
508 #define PATTERN_CANDIDATES_REF 3 // number of refinement candidates 507 #define PATTERN_CANDIDATES_REF 3 // number of refinement candidates
509 508
510 // Generic pattern search function that searches over multiple scales. 509 // Generic pattern search function that searches over multiple scales.
511 // Each scale can have a different number of candidates and shape of 510 // Each scale can have a different number of candidates and shape of
512 // candidates as indicated in the num_candidates and candidates arrays 511 // candidates as indicated in the num_candidates and candidates arrays
513 // passed into this function 512 // passed into this function
514 static int vp9_pattern_search(MACROBLOCK *x, 513 static int vp9_pattern_search(const MACROBLOCK *x,
515 MV *ref_mv, 514 MV *ref_mv,
516 int search_param, 515 int search_param,
517 int sad_per_bit, 516 int sad_per_bit,
518 int do_init_search, 517 int do_init_search,
519 int do_refine, 518 int do_refine,
520 const vp9_variance_fn_ptr_t *vfp, 519 const vp9_variance_fn_ptr_t *vfp,
521 int use_mvcost, 520 int use_mvcost,
522 const MV *center_mv, MV *best_mv, 521 const MV *center_mv, MV *best_mv,
523 const int num_candidates[MAX_PATTERN_SCALES], 522 const int num_candidates[MAX_PATTERN_SCALES],
524 const MV candidates[MAX_PATTERN_SCALES] 523 const MV candidates[MAX_PATTERN_SCALES]
525 [MAX_PATTERN_CANDIDATES]) { 524 [MAX_PATTERN_CANDIDATES]) {
526 const MACROBLOCKD* const xd = &x->e_mbd; 525 const MACROBLOCKD *const xd = &x->e_mbd;
527 static const int search_param_to_steps[MAX_MVSEARCH_STEPS] = { 526 static const int search_param_to_steps[MAX_MVSEARCH_STEPS] = {
528 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 527 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
529 }; 528 };
530 int i, j, s, t; 529 int i, j, s, t;
531 uint8_t *what = x->plane[0].src.buf; 530 const uint8_t *what = x->plane[0].src.buf;
532 int what_stride = x->plane[0].src.stride; 531 const int what_stride = x->plane[0].src.stride;
533 int in_what_stride = xd->plane[0].pre[0].stride; 532 const int in_what_stride = xd->plane[0].pre[0].stride;
534 int br, bc; 533 int br, bc;
535 MV this_mv; 534 MV this_mv;
536 int bestsad = INT_MAX; 535 int bestsad = INT_MAX;
537 int thissad; 536 int thissad;
538 uint8_t *base_offset; 537 const uint8_t *base_offset;
539 uint8_t *this_offset; 538 const uint8_t *this_offset;
540 int k = -1; 539 int k = -1;
541 int best_site = -1; 540 int best_site = -1;
542 MV fcenter_mv; 541 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
543 int best_init_s = search_param_to_steps[search_param]; 542 int best_init_s = search_param_to_steps[search_param];
544 int *mvjsadcost = x->nmvjointsadcost; 543 const int *mvjsadcost = x->nmvjointsadcost;
545 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 544 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
546 545
547 fcenter_mv.row = center_mv->row >> 3;
548 fcenter_mv.col = center_mv->col >> 3;
549
550 // adjust ref_mv to make sure it is within MV range 546 // adjust ref_mv to make sure it is within MV range
551 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 547 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
552 br = ref_mv->row; 548 br = ref_mv->row;
553 bc = ref_mv->col; 549 bc = ref_mv->col;
554 550
555 // Work out the start point for the search 551 // Work out the start point for the search
556 base_offset = (uint8_t *)(xd->plane[0].pre[0].buf); 552 base_offset = xd->plane[0].pre[0].buf;
557 this_offset = base_offset + (br * in_what_stride) + bc; 553 this_offset = base_offset + (br * in_what_stride) + bc;
558 this_mv.row = br; 554 this_mv.row = br;
559 this_mv.col = bc; 555 this_mv.col = bc;
560 bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 0x7fffffff) 556 bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 0x7fffffff)
561 + mvsad_err_cost(&this_mv, &fcenter_mv, 557 + mvsad_err_cost(&this_mv, &fcenter_mv,
562 mvjsadcost, mvsadcost, sad_per_bit); 558 mvjsadcost, mvsadcost, sad_per_bit);
563 559
564 // Search all possible scales upto the search param around the center point 560 // Search all possible scales upto the search param around the center point
565 // pick the scale of the point that is best as the starting scale of 561 // pick the scale of the point that is best as the starting scale of
566 // further steps around it. 562 // further steps around it.
567 if (do_init_search) { 563 if (do_init_search) {
568 s = best_init_s; 564 s = best_init_s;
569 best_init_s = -1; 565 best_init_s = -1;
570 for (t = 0; t <= s; ++t) { 566 for (t = 0; t <= s; ++t) {
571 best_site = -1; 567 best_site = -1;
572 if (check_bounds(x, br, bc, 1 << t)) { 568 if (check_bounds(x, br, bc, 1 << t)) {
573 for (i = 0; i < num_candidates[t]; i++) { 569 for (i = 0; i < num_candidates[t]; i++) {
574 this_mv.row = br + candidates[t][i].row; 570 this_mv.row = br + candidates[t][i].row;
575 this_mv.col = bc + candidates[t][i].col; 571 this_mv.col = bc + candidates[t][i].col;
576 this_offset = base_offset + (this_mv.row * in_what_stride) + 572 this_offset = base_offset + (this_mv.row * in_what_stride) +
577 this_mv.col; 573 this_mv.col;
578 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 574 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
579 bestsad); 575 bestsad);
580 CHECK_BETTER 576 CHECK_BETTER
581 } 577 }
582 } else { 578 } else {
583 for (i = 0; i < num_candidates[t]; i++) { 579 for (i = 0; i < num_candidates[t]; i++) {
584 this_mv.row = br + candidates[t][i].row; 580 this_mv.row = br + candidates[t][i].row;
585 this_mv.col = bc + candidates[t][i].col; 581 this_mv.col = bc + candidates[t][i].col;
586 if (check_point(x, &this_mv)) 582 if (!is_mv_in(x, &this_mv))
587 continue; 583 continue;
588 this_offset = base_offset + (this_mv.row * in_what_stride) + 584 this_offset = base_offset + (this_mv.row * in_what_stride) +
589 this_mv.col; 585 this_mv.col;
590 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 586 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
591 bestsad); 587 bestsad);
592 CHECK_BETTER 588 CHECK_BETTER
593 } 589 }
594 } 590 }
595 if (best_site == -1) { 591 if (best_site == -1) {
596 continue; 592 continue;
(...skipping 23 matching lines...) Expand all
620 this_offset = base_offset + (this_mv.row * in_what_stride) + 616 this_offset = base_offset + (this_mv.row * in_what_stride) +
621 this_mv.col; 617 this_mv.col;
622 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 618 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
623 bestsad); 619 bestsad);
624 CHECK_BETTER 620 CHECK_BETTER
625 } 621 }
626 } else { 622 } else {
627 for (i = 0; i < num_candidates[s]; i++) { 623 for (i = 0; i < num_candidates[s]; i++) {
628 this_mv.row = br + candidates[s][i].row; 624 this_mv.row = br + candidates[s][i].row;
629 this_mv.col = bc + candidates[s][i].col; 625 this_mv.col = bc + candidates[s][i].col;
630 if (check_point(x, &this_mv)) 626 if (!is_mv_in(x, &this_mv))
631 continue; 627 continue;
632 this_offset = base_offset + (this_mv.row * in_what_stride) + 628 this_offset = base_offset + (this_mv.row * in_what_stride) +
633 this_mv.col; 629 this_mv.col;
634 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 630 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
635 bestsad); 631 bestsad);
636 CHECK_BETTER 632 CHECK_BETTER
637 } 633 }
638 } 634 }
639 635
640 if (best_site == -1) { 636 if (best_site == -1) {
641 continue; 637 continue;
642 } else { 638 } else {
643 br += candidates[s][best_site].row; 639 br += candidates[s][best_site].row;
644 bc += candidates[s][best_site].col; 640 bc += candidates[s][best_site].col;
645 k = best_site; 641 k = best_site;
646 } 642 }
647 } 643 }
648 644
649 do { 645 do {
650 int next_chkpts_indices[PATTERN_CANDIDATES_REF]; 646 int next_chkpts_indices[PATTERN_CANDIDATES_REF];
651 best_site = -1; 647 best_site = -1;
652 get_next_chkpts(next_chkpts_indices, k, num_candidates[s]); 648 next_chkpts_indices[0] = (k == 0) ? num_candidates[s] - 1 : k - 1;
649 next_chkpts_indices[1] = k;
650 next_chkpts_indices[2] = (k == num_candidates[s] - 1) ? 0 : k + 1;
651
653 if (check_bounds(x, br, bc, 1 << s)) { 652 if (check_bounds(x, br, bc, 1 << s)) {
654 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) { 653 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
655 this_mv.row = br + candidates[s][next_chkpts_indices[i]].row; 654 this_mv.row = br + candidates[s][next_chkpts_indices[i]].row;
656 this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col; 655 this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col;
657 this_offset = base_offset + (this_mv.row * (in_what_stride)) + 656 this_offset = base_offset + (this_mv.row * (in_what_stride)) +
658 this_mv.col; 657 this_mv.col;
659 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 658 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
660 bestsad); 659 bestsad);
661 CHECK_BETTER 660 CHECK_BETTER
662 } 661 }
663 } else { 662 } else {
664 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) { 663 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
665 this_mv.row = br + candidates[s][next_chkpts_indices[i]].row; 664 this_mv.row = br + candidates[s][next_chkpts_indices[i]].row;
666 this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col; 665 this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col;
667 if (check_point(x, &this_mv)) 666 if (!is_mv_in(x, &this_mv))
668 continue; 667 continue;
669 this_offset = base_offset + (this_mv.row * (in_what_stride)) + 668 this_offset = base_offset + (this_mv.row * (in_what_stride)) +
670 this_mv.col; 669 this_mv.col;
671 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 670 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
672 bestsad); 671 bestsad);
673 CHECK_BETTER 672 CHECK_BETTER
674 } 673 }
675 } 674 }
676 675
677 if (best_site != -1) { 676 if (best_site != -1) {
678 k = next_chkpts_indices[best_site]; 677 k = next_chkpts_indices[best_site];
679 br += candidates[s][k].row; 678 br += candidates[s][k].row;
680 bc += candidates[s][k].col; 679 bc += candidates[s][k].col;
681 } 680 }
682 } while (best_site != -1); 681 } while (best_site != -1);
683 } while (s--); 682 } while (s--);
684 } 683 }
685 684
686 // Check 4 1-away neighbors if do_refine is true. 685 // Check 4 1-away neighbors if do_refine is true.
687 // For most well-designed schemes do_refine will not be necessary. 686 // For most well-designed schemes do_refine will not be necessary.
688 if (do_refine) { 687 if (do_refine) {
689 static const MV neighbors[4] = { 688 static const MV neighbors[4] = { {0, -1}, { -1, 0}, {1, 0}, {0, 1} };
690 {0, -1}, { -1, 0}, {1, 0}, {0, 1},
691 };
692 for (j = 0; j < 16; j++) { 689 for (j = 0; j < 16; j++) {
693 best_site = -1; 690 best_site = -1;
694 if (check_bounds(x, br, bc, 1)) { 691 if (check_bounds(x, br, bc, 1)) {
695 for (i = 0; i < 4; i++) { 692 for (i = 0; i < 4; i++) {
696 this_mv.row = br + neighbors[i].row; 693 this_mv.row = br + neighbors[i].row;
697 this_mv.col = bc + neighbors[i].col; 694 this_mv.col = bc + neighbors[i].col;
698 this_offset = base_offset + (this_mv.row * (in_what_stride)) + 695 this_offset = base_offset + this_mv.row * in_what_stride +
699 this_mv.col; 696 this_mv.col;
700 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 697 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
701 bestsad); 698 bestsad);
702 CHECK_BETTER 699 CHECK_BETTER
703 } 700 }
704 } else { 701 } else {
705 for (i = 0; i < 4; i++) { 702 for (i = 0; i < 4; i++) {
706 this_mv.row = br + neighbors[i].row; 703 this_mv.row = br + neighbors[i].row;
707 this_mv.col = bc + neighbors[i].col; 704 this_mv.col = bc + neighbors[i].col;
708 if (check_point(x, &this_mv)) 705 if (!is_mv_in(x, &this_mv))
709 continue; 706 continue;
710 this_offset = base_offset + (this_mv.row * (in_what_stride)) + 707 this_offset = base_offset + this_mv.row * in_what_stride +
711 this_mv.col; 708 this_mv.col;
712 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 709 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
713 bestsad); 710 bestsad);
714 CHECK_BETTER 711 CHECK_BETTER
715 } 712 }
716 } 713 }
717 714
718 if (best_site == -1) { 715 if (best_site == -1) {
719 break; 716 break;
720 } else { 717 } else {
721 br += neighbors[best_site].row; 718 br += neighbors[best_site].row;
722 bc += neighbors[best_site].col; 719 bc += neighbors[best_site].col;
723 } 720 }
724 } 721 }
725 } 722 }
726 723
727 best_mv->row = br; 724 best_mv->row = br;
728 best_mv->col = bc; 725 best_mv->col = bc;
729 726
730 this_offset = base_offset + (best_mv->row * in_what_stride) + 727 this_offset = base_offset + (best_mv->row * in_what_stride) +
731 best_mv->col; 728 best_mv->col;
732 this_mv.row = best_mv->row * 8; 729 this_mv.row = best_mv->row * 8;
733 this_mv.col = best_mv->col * 8; 730 this_mv.col = best_mv->col * 8;
734 if (bestsad == INT_MAX) 731 if (bestsad == INT_MAX)
735 return INT_MAX; 732 return INT_MAX;
736 733
737 return vfp->vf(what, what_stride, this_offset, in_what_stride, 734 return vfp->vf(what, what_stride, this_offset, in_what_stride,
738 (unsigned int *)&bestsad) + 735 (unsigned int *)&bestsad) +
739 use_mvcost ? mv_err_cost(&this_mv, center_mv, 736 use_mvcost ? mv_err_cost(&this_mv, center_mv,
740 x->nmvjointcost, x->mvcost, x->errorperbit) 737 x->nmvjointcost, x->mvcost, x->errorperbit)
741 : 0; 738 : 0;
742 } 739 }
743 740
744 741
745 int vp9_hex_search(MACROBLOCK *x, 742 int vp9_hex_search(const MACROBLOCK *x,
746 MV *ref_mv, 743 MV *ref_mv,
747 int search_param, 744 int search_param,
748 int sad_per_bit, 745 int sad_per_bit,
749 int do_init_search, 746 int do_init_search,
750 const vp9_variance_fn_ptr_t *vfp, 747 const vp9_variance_fn_ptr_t *vfp,
751 int use_mvcost, 748 int use_mvcost,
752 const MV *center_mv, MV *best_mv) { 749 const MV *center_mv, MV *best_mv) {
753 // First scale has 8-closest points, the rest have 6 points in hex shape 750 // First scale has 8-closest points, the rest have 6 points in hex shape
754 // at increasing scales 751 // at increasing scales
755 static const int hex_num_candidates[MAX_PATTERN_SCALES] = { 752 static const int hex_num_candidates[MAX_PATTERN_SCALES] = {
756 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 753 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
757 }; 754 };
758 // Note that the largest candidate step at each scale is 2^scale 755 // Note that the largest candidate step at each scale is 2^scale
759 static const MV hex_candidates[MAX_PATTERN_SCALES][MAX_PATTERN_CANDIDATES] = { 756 static const MV hex_candidates[MAX_PATTERN_SCALES][MAX_PATTERN_CANDIDATES] = {
760 {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, { 0, 1}, { -1, 1}, {-1, 0}}, 757 {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, { 0, 1}, { -1, 1}, {-1, 0}},
761 {{-1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0}}, 758 {{-1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0}},
762 {{-2, -4}, {2, -4}, {4, 0}, {2, 4}, { -2, 4}, { -4, 0}}, 759 {{-2, -4}, {2, -4}, {4, 0}, {2, 4}, { -2, 4}, { -4, 0}},
763 {{-4, -8}, {4, -8}, {8, 0}, {4, 8}, { -4, 8}, { -8, 0}}, 760 {{-4, -8}, {4, -8}, {8, 0}, {4, 8}, { -4, 8}, { -8, 0}},
764 {{-8, -16}, {8, -16}, {16, 0}, {8, 16}, { -8, 16}, { -16, 0}}, 761 {{-8, -16}, {8, -16}, {16, 0}, {8, 16}, { -8, 16}, { -16, 0}},
765 {{-16, -32}, {16, -32}, {32, 0}, {16, 32}, { -16, 32}, { -32, 0}}, 762 {{-16, -32}, {16, -32}, {32, 0}, {16, 32}, { -16, 32}, { -32, 0}},
766 {{-32, -64}, {32, -64}, {64, 0}, {32, 64}, { -32, 64}, { -64, 0}}, 763 {{-32, -64}, {32, -64}, {64, 0}, {32, 64}, { -32, 64}, { -64, 0}},
767 {{-64, -128}, {64, -128}, {128, 0}, {64, 128}, { -64, 128}, { -128, 0}}, 764 {{-64, -128}, {64, -128}, {128, 0}, {64, 128}, { -64, 128}, { -128, 0}},
768 {{-128, -256}, {128, -256}, {256, 0}, {128, 256}, { -128, 256}, { -256, 0}}, 765 {{-128, -256}, {128, -256}, {256, 0}, {128, 256}, { -128, 256}, { -256, 0}},
769 {{-256, -512}, {256, -512}, {512, 0}, {256, 512}, { -256, 512}, { -512, 0}}, 766 {{-256, -512}, {256, -512}, {512, 0}, {256, 512}, { -256, 512}, { -512, 0}},
770 {{-512, -1024}, {512, -1024}, {1024, 0}, {512, 1024}, { -512, 1024}, 767 {{-512, -1024}, {512, -1024}, {1024, 0}, {512, 1024}, { -512, 1024},
771 { -1024, 0}}, 768 { -1024, 0}},
772 }; 769 };
773 return 770 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
774 vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 771 do_init_search, 0, vfp, use_mvcost,
775 do_init_search, 0, vfp, use_mvcost, 772 center_mv, best_mv,
776 center_mv, best_mv, 773 hex_num_candidates, hex_candidates);
777 hex_num_candidates, hex_candidates);
778 } 774 }
779 775
780 int vp9_bigdia_search(MACROBLOCK *x, 776 int vp9_bigdia_search(const MACROBLOCK *x,
781 MV *ref_mv, 777 MV *ref_mv,
782 int search_param, 778 int search_param,
783 int sad_per_bit, 779 int sad_per_bit,
784 int do_init_search, 780 int do_init_search,
785 const vp9_variance_fn_ptr_t *vfp, 781 const vp9_variance_fn_ptr_t *vfp,
786 int use_mvcost, 782 int use_mvcost,
787 const MV *center_mv, 783 const MV *center_mv,
788 MV *best_mv) { 784 MV *best_mv) {
789 // First scale has 4-closest points, the rest have 8 points in diamond 785 // First scale has 4-closest points, the rest have 8 points in diamond
790 // shape at increasing scales 786 // shape at increasing scales
(...skipping 20 matching lines...) Expand all
811 {-256, 256}, {-512, 0}}, 807 {-256, 256}, {-512, 0}},
812 {{-512, -512}, {0, -1024}, {512, -512}, {1024, 0}, {512, 512}, {0, 1024}, 808 {{-512, -512}, {0, -1024}, {512, -512}, {1024, 0}, {512, 512}, {0, 1024},
813 {-512, 512}, {-1024, 0}}, 809 {-512, 512}, {-1024, 0}},
814 }; 810 };
815 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 811 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
816 do_init_search, 0, vfp, use_mvcost, 812 do_init_search, 0, vfp, use_mvcost,
817 center_mv, best_mv, 813 center_mv, best_mv,
818 bigdia_num_candidates, bigdia_candidates); 814 bigdia_num_candidates, bigdia_candidates);
819 } 815 }
820 816
821 int vp9_square_search(MACROBLOCK *x, 817 int vp9_square_search(const MACROBLOCK *x,
822 MV *ref_mv, 818 MV *ref_mv,
823 int search_param, 819 int search_param,
824 int sad_per_bit, 820 int sad_per_bit,
825 int do_init_search, 821 int do_init_search,
826 const vp9_variance_fn_ptr_t *vfp, 822 const vp9_variance_fn_ptr_t *vfp,
827 int use_mvcost, 823 int use_mvcost,
828 const MV *center_mv, 824 const MV *center_mv,
829 MV *best_mv) { 825 MV *best_mv) {
830 // All scales have 8 closest points in square shape 826 // All scales have 8 closest points in square shape
831 static const int square_num_candidates[MAX_PATTERN_SCALES] = { 827 static const int square_num_candidates[MAX_PATTERN_SCALES] = {
(...skipping 22 matching lines...) Expand all
854 {0, 1024}, {-1024, 1024}, {-1024, 0}}, 850 {0, 1024}, {-1024, 1024}, {-1024, 0}},
855 }; 851 };
856 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 852 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
857 do_init_search, 0, vfp, use_mvcost, 853 do_init_search, 0, vfp, use_mvcost,
858 center_mv, best_mv, 854 center_mv, best_mv,
859 square_num_candidates, square_candidates); 855 square_num_candidates, square_candidates);
860 }; 856 };
861 857
862 #undef CHECK_BETTER 858 #undef CHECK_BETTER
863 859
864 int vp9_full_range_search_c(MACROBLOCK *x, MV *ref_mv, MV *best_mv, 860 int vp9_full_range_search_c(const MACROBLOCK *x, MV *ref_mv, MV *best_mv,
865 int search_param, int sad_per_bit, int *num00, 861 int search_param, int sad_per_bit, int *num00,
866 vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost, 862 const vp9_variance_fn_ptr_t *fn_ptr,
867 int *mvcost[2], const MV *center_mv) { 863 int *mvjcost, int *mvcost[2],
868 const MACROBLOCKD* const xd = &x->e_mbd; 864 const MV *center_mv) {
869 uint8_t *what = x->plane[0].src.buf; 865 const MACROBLOCKD *const xd = &x->e_mbd;
870 int what_stride = x->plane[0].src.stride; 866 const uint8_t *what = x->plane[0].src.buf;
871 uint8_t *in_what; 867 const int what_stride = x->plane[0].src.stride;
872 int in_what_stride = xd->plane[0].pre[0].stride; 868 const uint8_t *in_what;
873 uint8_t *best_address; 869 const int in_what_stride = xd->plane[0].pre[0].stride;
870 const uint8_t *best_address;
874 871
875 MV this_mv; 872 MV this_mv;
876 873
877 int bestsad = INT_MAX; 874 int bestsad = INT_MAX;
878 int ref_row, ref_col; 875 int ref_row, ref_col;
879 876
880 uint8_t *check_here;
881 int thissad; 877 int thissad;
882 MV fcenter_mv; 878 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
883 879
884 int *mvjsadcost = x->nmvjointsadcost; 880 const int *mvjsadcost = x->nmvjointsadcost;
885 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 881 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
886 882
887 int tr, tc; 883 int tr, tc;
888 int best_tr = 0; 884 int best_tr = 0;
889 int best_tc = 0; 885 int best_tc = 0;
890 int range = 64; 886 int range = 64;
891 887
892 int start_col, end_col; 888 int start_col, end_col;
893 int start_row, end_row; 889 int start_row, end_row;
894 int i; 890 int i;
895 891
896 fcenter_mv.row = center_mv->row >> 3;
897 fcenter_mv.col = center_mv->col >> 3;
898
899 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 892 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
900 ref_row = ref_mv->row; 893 ref_row = ref_mv->row;
901 ref_col = ref_mv->col; 894 ref_col = ref_mv->col;
902 *num00 = 11; 895 *num00 = 11;
903 best_mv->row = ref_row; 896 best_mv->row = ref_row;
904 best_mv->col = ref_col; 897 best_mv->col = ref_col;
905 898
906 // Work out the start point for the search 899 // Work out the start point for the search
907 in_what = (uint8_t *)(xd->plane[0].pre[0].buf + 900 in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col;
908 (ref_row * (xd->plane[0].pre[0].stride)) + ref_col);
909 best_address = in_what; 901 best_address = in_what;
910 902
911 // Check the starting position 903 // Check the starting position
912 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) 904 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
913 + mvsad_err_cost(best_mv, &fcenter_mv, 905 + mvsad_err_cost(best_mv, &fcenter_mv,
914 mvjsadcost, mvsadcost, sad_per_bit); 906 mvjsadcost, mvsadcost, sad_per_bit);
915 907
916 start_row = MAX(-range, x->mv_row_min - ref_row); 908 start_row = MAX(-range, x->mv_row_min - ref_row);
917 start_col = MAX(-range, x->mv_col_min - ref_col); 909 start_col = MAX(-range, x->mv_col_min - ref_col);
918 end_row = MIN(range, x->mv_row_max - ref_row); 910 end_row = MIN(range, x->mv_row_max - ref_row);
(...skipping 18 matching lines...) Expand all
937 mvjsadcost, mvsadcost, sad_per_bit); 929 mvjsadcost, mvsadcost, sad_per_bit);
938 if (thissad < bestsad) { 930 if (thissad < bestsad) {
939 bestsad = thissad; 931 bestsad = thissad;
940 best_tr = tr; 932 best_tr = tr;
941 best_tc = tc + i; 933 best_tc = tc + i;
942 } 934 }
943 } 935 }
944 } 936 }
945 } else { 937 } else {
946 for (i = 0; i < end_col - tc; ++i) { 938 for (i = 0; i < end_col - tc; ++i) {
947 check_here = in_what + tr * in_what_stride + tc + i; 939 const uint8_t *check_here = in_what + tr * in_what_stride + tc + i;
948 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, 940 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
949 bestsad); 941 bestsad);
950 942
951 if (thissad < bestsad) { 943 if (thissad < bestsad) {
952 this_mv.row = ref_row + tr; 944 this_mv.row = ref_row + tr;
953 this_mv.col = ref_col + tc + i; 945 this_mv.col = ref_col + tc + i;
954 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 946 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
955 mvjsadcost, mvsadcost, sad_per_bit); 947 mvjsadcost, mvsadcost, sad_per_bit);
956 948
957 if (thissad < bestsad) { 949 if (thissad < bestsad) {
(...skipping 15 matching lines...) Expand all
973 965
974 if (bestsad == INT_MAX) 966 if (bestsad == INT_MAX)
975 return INT_MAX; 967 return INT_MAX;
976 968
977 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, 969 return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
978 (unsigned int *)(&thissad)) + 970 (unsigned int *)(&thissad)) +
979 mv_err_cost(&this_mv, center_mv, 971 mv_err_cost(&this_mv, center_mv,
980 mvjcost, mvcost, x->errorperbit); 972 mvjcost, mvcost, x->errorperbit);
981 } 973 }
982 974
983 int vp9_diamond_search_sad_c(MACROBLOCK *x, 975 int vp9_diamond_search_sad_c(const MACROBLOCK *x,
984 MV *ref_mv, MV *best_mv, 976 MV *ref_mv, MV *best_mv,
985 int search_param, int sad_per_bit, int *num00, 977 int search_param, int sad_per_bit, int *num00,
986 vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost, 978 const vp9_variance_fn_ptr_t *fn_ptr,
987 int *mvcost[2], const MV *center_mv) { 979 int *mvjcost, int *mvcost[2],
980 const MV *center_mv) {
988 int i, j, step; 981 int i, j, step;
989 982
990 const MACROBLOCKD* const xd = &x->e_mbd; 983 const MACROBLOCKD *const xd = &x->e_mbd;
991 uint8_t *what = x->plane[0].src.buf; 984 const uint8_t *what = x->plane[0].src.buf;
992 int what_stride = x->plane[0].src.stride; 985 const int what_stride = x->plane[0].src.stride;
993 uint8_t *in_what; 986 const uint8_t *in_what;
994 int in_what_stride = xd->plane[0].pre[0].stride; 987 const int in_what_stride = xd->plane[0].pre[0].stride;
995 uint8_t *best_address; 988 const uint8_t *best_address;
996 989
997 int tot_steps;
998 MV this_mv; 990 MV this_mv;
999 991
1000 int bestsad = INT_MAX; 992 int bestsad = INT_MAX;
1001 int best_site = 0; 993 int best_site = 0;
1002 int last_site = 0; 994 int last_site = 0;
1003 995
1004 int ref_row, ref_col; 996 int ref_row, ref_col;
1005 int this_row_offset, this_col_offset; 997 int this_row_offset, this_col_offset;
1006 search_site *ss;
1007 998
1008 uint8_t *check_here; 999 // search_param determines the length of the initial step and hence the number
1000 // of iterations
1001 // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 =
1002 // (MAX_FIRST_STEP/4) pel... etc.
1003 const search_site *const ss = &x->ss[search_param * x->searches_per_step];
1004 const int tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1005
1009 int thissad; 1006 int thissad;
1010 MV fcenter_mv; 1007 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1011 1008
1012 int *mvjsadcost = x->nmvjointsadcost; 1009 const int *mvjsadcost = x->nmvjointsadcost;
1013 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1010 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1014 1011
1015 fcenter_mv.row = center_mv->row >> 3;
1016 fcenter_mv.col = center_mv->col >> 3;
1017
1018 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 1012 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
1019 ref_row = ref_mv->row; 1013 ref_row = ref_mv->row;
1020 ref_col = ref_mv->col; 1014 ref_col = ref_mv->col;
1021 *num00 = 0; 1015 *num00 = 0;
1022 best_mv->row = ref_row; 1016 best_mv->row = ref_row;
1023 best_mv->col = ref_col; 1017 best_mv->col = ref_col;
1024 1018
1025 // Work out the start point for the search 1019 // Work out the start point for the search
1026 in_what = (uint8_t *)(xd->plane[0].pre[0].buf + 1020 in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col;
1027 ref_row * in_what_stride + ref_col);
1028 best_address = in_what; 1021 best_address = in_what;
1029 1022
1030 // Check the starting position 1023 // Check the starting position
1031 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) 1024 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
1032 + mvsad_err_cost(best_mv, &fcenter_mv, 1025 + mvsad_err_cost(best_mv, &fcenter_mv,
1033 mvjsadcost, mvsadcost, sad_per_bit); 1026 mvjsadcost, mvsadcost, sad_per_bit);
1034 1027
1035 // search_param determines the length of the initial step and hence the number
1036 // of iterations
1037 // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 =
1038 // (MAX_FIRST_STEP/4) pel... etc.
1039 ss = &x->ss[search_param * x->searches_per_step];
1040 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1041
1042 i = 1; 1028 i = 1;
1043 1029
1044 for (step = 0; step < tot_steps; step++) { 1030 for (step = 0; step < tot_steps; step++) {
1045 for (j = 0; j < x->searches_per_step; j++) { 1031 for (j = 0; j < x->searches_per_step; j++) {
1046 // Trap illegal vectors 1032 // Trap illegal vectors
1047 this_row_offset = best_mv->row + ss[i].mv.row; 1033 this_row_offset = best_mv->row + ss[i].mv.row;
1048 this_col_offset = best_mv->col + ss[i].mv.col; 1034 this_col_offset = best_mv->col + ss[i].mv.col;
1049 1035
1050 if ((this_col_offset > x->mv_col_min) && 1036 if ((this_col_offset > x->mv_col_min) &&
1051 (this_col_offset < x->mv_col_max) && 1037 (this_col_offset < x->mv_col_max) &&
1052 (this_row_offset > x->mv_row_min) && 1038 (this_row_offset > x->mv_row_min) &&
1053 (this_row_offset < x->mv_row_max)) { 1039 (this_row_offset < x->mv_row_max)) {
1054 check_here = ss[i].offset + best_address; 1040 const uint8_t *const check_here = ss[i].offset + best_address;
1055 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, 1041 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1056 bestsad); 1042 bestsad);
1057 1043
1058 if (thissad < bestsad) { 1044 if (thissad < bestsad) {
1059 this_mv.row = this_row_offset; 1045 this_mv.row = this_row_offset;
1060 this_mv.col = this_col_offset; 1046 this_mv.col = this_col_offset;
1061 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1047 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1062 mvjsadcost, mvsadcost, sad_per_bit); 1048 mvjsadcost, mvsadcost, sad_per_bit);
1063 1049
1064 if (thissad < bestsad) { 1050 if (thissad < bestsad) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 1100
1115 if (bestsad == INT_MAX) 1101 if (bestsad == INT_MAX)
1116 return INT_MAX; 1102 return INT_MAX;
1117 1103
1118 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, 1104 return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
1119 (unsigned int *)(&thissad)) + 1105 (unsigned int *)(&thissad)) +
1120 mv_err_cost(&this_mv, center_mv, 1106 mv_err_cost(&this_mv, center_mv,
1121 mvjcost, mvcost, x->errorperbit); 1107 mvjcost, mvcost, x->errorperbit);
1122 } 1108 }
1123 1109
1124 int vp9_diamond_search_sadx4(MACROBLOCK *x, 1110 int vp9_diamond_search_sadx4(const MACROBLOCK *x,
1125 MV *ref_mv, MV *best_mv, int search_param, 1111 MV *ref_mv, MV *best_mv, int search_param,
1126 int sad_per_bit, int *num00, 1112 int sad_per_bit, int *num00,
1127 vp9_variance_fn_ptr_t *fn_ptr, 1113 const vp9_variance_fn_ptr_t *fn_ptr,
1128 int *mvjcost, int *mvcost[2], 1114 int *mvjcost, int *mvcost[2],
1129 const MV *center_mv) { 1115 const MV *center_mv) {
1130 int i, j, step; 1116 int i, j, step;
1131 1117
1132 const MACROBLOCKD* const xd = &x->e_mbd; 1118 const MACROBLOCKD *const xd = &x->e_mbd;
1133 uint8_t *what = x->plane[0].src.buf; 1119 uint8_t *what = x->plane[0].src.buf;
1134 int what_stride = x->plane[0].src.stride; 1120 const int what_stride = x->plane[0].src.stride;
1135 uint8_t *in_what; 1121 const uint8_t *in_what;
1136 int in_what_stride = xd->plane[0].pre[0].stride; 1122 const int in_what_stride = xd->plane[0].pre[0].stride;
1137 uint8_t *best_address; 1123 const uint8_t *best_address;
1138 1124
1139 int tot_steps;
1140 MV this_mv; 1125 MV this_mv;
1141 1126
1142 unsigned int bestsad = INT_MAX; 1127 unsigned int bestsad = INT_MAX;
1143 int best_site = 0; 1128 int best_site = 0;
1144 int last_site = 0; 1129 int last_site = 0;
1145 1130
1146 int ref_row; 1131 int ref_row;
1147 int ref_col; 1132 int ref_col;
1148 int this_row_offset; 1133 int this_row_offset;
1149 int this_col_offset; 1134 int this_col_offset;
1150 search_site *ss;
1151 1135
1152 uint8_t *check_here; 1136 // search_param determines the length of the initial step and hence the number
1137 // of iterations.
1138 // 0 = initial step (MAX_FIRST_STEP) pel
1139 // 1 = (MAX_FIRST_STEP/2) pel,
1140 // 2 = (MAX_FIRST_STEP/4) pel...
1141 const search_site *ss = &x->ss[search_param * x->searches_per_step];
1142 const int tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1143
1153 unsigned int thissad; 1144 unsigned int thissad;
1154 MV fcenter_mv; 1145 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1155 1146
1156 int *mvjsadcost = x->nmvjointsadcost; 1147 const int *mvjsadcost = x->nmvjointsadcost;
1157 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1148 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1158 1149
1159 fcenter_mv.row = center_mv->row >> 3;
1160 fcenter_mv.col = center_mv->col >> 3;
1161
1162 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 1150 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
1163 ref_row = ref_mv->row; 1151 ref_row = ref_mv->row;
1164 ref_col = ref_mv->col; 1152 ref_col = ref_mv->col;
1165 *num00 = 0; 1153 *num00 = 0;
1166 best_mv->row = ref_row; 1154 best_mv->row = ref_row;
1167 best_mv->col = ref_col; 1155 best_mv->col = ref_col;
1168 1156
1169 // Work out the start point for the search 1157 // Work out the start point for the search
1170 in_what = (uint8_t *)(xd->plane[0].pre[0].buf + 1158 in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col;
1171 ref_row * in_what_stride + ref_col);
1172 best_address = in_what; 1159 best_address = in_what;
1173 1160
1174 // Check the starting position 1161 // Check the starting position
1175 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) 1162 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
1176 + mvsad_err_cost(best_mv, &fcenter_mv, 1163 + mvsad_err_cost(best_mv, &fcenter_mv,
1177 mvjsadcost, mvsadcost, sad_per_bit); 1164 mvjsadcost, mvsadcost, sad_per_bit);
1178 1165
1179 // search_param determines the length of the initial step and hence the number
1180 // of iterations.
1181 // 0 = initial step (MAX_FIRST_STEP) pel
1182 // 1 = (MAX_FIRST_STEP/2) pel,
1183 // 2 = (MAX_FIRST_STEP/4) pel...
1184 ss = &x->ss[search_param * x->searches_per_step];
1185 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1186
1187 i = 1; 1166 i = 1;
1188 1167
1189 for (step = 0; step < tot_steps; step++) { 1168 for (step = 0; step < tot_steps; step++) {
1190 int all_in = 1, t; 1169 int all_in = 1, t;
1191 1170
1192 // All_in is true if every one of the points we are checking are within 1171 // All_in is true if every one of the points we are checking are within
1193 // the bounds of the image. 1172 // the bounds of the image.
1194 all_in &= ((best_mv->row + ss[i].mv.row) > x->mv_row_min); 1173 all_in &= ((best_mv->row + ss[i].mv.row) > x->mv_row_min);
1195 all_in &= ((best_mv->row + ss[i + 1].mv.row) < x->mv_row_max); 1174 all_in &= ((best_mv->row + ss[i + 1].mv.row) < x->mv_row_max);
1196 all_in &= ((best_mv->col + ss[i + 2].mv.col) > x->mv_col_min); 1175 all_in &= ((best_mv->col + ss[i + 2].mv.col) > x->mv_col_min);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 } else { 1207 } else {
1229 for (j = 0; j < x->searches_per_step; j++) { 1208 for (j = 0; j < x->searches_per_step; j++) {
1230 // Trap illegal vectors 1209 // Trap illegal vectors
1231 this_row_offset = best_mv->row + ss[i].mv.row; 1210 this_row_offset = best_mv->row + ss[i].mv.row;
1232 this_col_offset = best_mv->col + ss[i].mv.col; 1211 this_col_offset = best_mv->col + ss[i].mv.col;
1233 1212
1234 if ((this_col_offset > x->mv_col_min) && 1213 if ((this_col_offset > x->mv_col_min) &&
1235 (this_col_offset < x->mv_col_max) && 1214 (this_col_offset < x->mv_col_max) &&
1236 (this_row_offset > x->mv_row_min) && 1215 (this_row_offset > x->mv_row_min) &&
1237 (this_row_offset < x->mv_row_max)) { 1216 (this_row_offset < x->mv_row_max)) {
1238 check_here = ss[i].offset + best_address; 1217 const uint8_t *const check_here = ss[i].offset + best_address;
1239 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, 1218 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1240 bestsad); 1219 bestsad);
1241 1220
1242 if (thissad < bestsad) { 1221 if (thissad < bestsad) {
1243 this_mv.row = this_row_offset; 1222 this_mv.row = this_row_offset;
1244 this_mv.col = this_col_offset; 1223 this_mv.col = this_col_offset;
1245 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1224 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1246 mvjsadcost, mvsadcost, sad_per_bit); 1225 mvjsadcost, mvsadcost, sad_per_bit);
1247 1226
1248 if (thissad < bestsad) { 1227 if (thissad < bestsad) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 mv_err_cost(&this_mv, center_mv, 1282 mv_err_cost(&this_mv, center_mv,
1304 mvjcost, mvcost, x->errorperbit); 1283 mvjcost, mvcost, x->errorperbit);
1305 } 1284 }
1306 1285
1307 /* do_refine: If last step (1-away) of n-step search doesn't pick the center 1286 /* do_refine: If last step (1-away) of n-step search doesn't pick the center
1308 point as the best match, we will do a final 1-away diamond 1287 point as the best match, we will do a final 1-away diamond
1309 refining search */ 1288 refining search */
1310 1289
1311 int vp9_full_pixel_diamond(VP9_COMP *cpi, MACROBLOCK *x, 1290 int vp9_full_pixel_diamond(VP9_COMP *cpi, MACROBLOCK *x,
1312 MV *mvp_full, int step_param, 1291 MV *mvp_full, int step_param,
1313 int sadpb, int further_steps, 1292 int sadpb, int further_steps, int do_refine,
1314 int do_refine, vp9_variance_fn_ptr_t *fn_ptr, 1293 const vp9_variance_fn_ptr_t *fn_ptr,
1315 const MV *ref_mv, int_mv *dst_mv) { 1294 const MV *ref_mv, MV *dst_mv) {
1316 int_mv temp_mv; 1295 MV temp_mv;
1317 int thissme, n, num00; 1296 int thissme, n, num00 = 0;
1318 int bestsme = cpi->diamond_search_sad(x, mvp_full, &temp_mv.as_mv, 1297 int bestsme = cpi->diamond_search_sad(x, mvp_full, &temp_mv,
1319 step_param, sadpb, &num00, 1298 step_param, sadpb, &n,
1320 fn_ptr, x->nmvjointcost, 1299 fn_ptr, x->nmvjointcost,
1321 x->mvcost, ref_mv); 1300 x->mvcost, ref_mv);
1322 dst_mv->as_int = temp_mv.as_int; 1301 *dst_mv = temp_mv;
1323 1302
1324 n = num00; 1303 // If there won't be more n-step search, check to see if refining search is
1325 num00 = 0; 1304 // needed.
1326
1327 /* If there won't be more n-step search, check to see if refining search is
1328 * needed. */
1329 if (n > further_steps) 1305 if (n > further_steps)
1330 do_refine = 0; 1306 do_refine = 0;
1331 1307
1332 while (n < further_steps) { 1308 while (n < further_steps) {
1333 n++; 1309 ++n;
1334 1310
1335 if (num00) { 1311 if (num00) {
1336 num00--; 1312 num00--;
1337 } else { 1313 } else {
1338 thissme = cpi->diamond_search_sad(x, mvp_full, &temp_mv.as_mv, 1314 thissme = cpi->diamond_search_sad(x, mvp_full, &temp_mv,
1339 step_param + n, sadpb, &num00, 1315 step_param + n, sadpb, &num00,
1340 fn_ptr, x->nmvjointcost, x->mvcost, 1316 fn_ptr, x->nmvjointcost, x->mvcost,
1341 ref_mv); 1317 ref_mv);
1342 1318
1343 /* check to see if refining search is needed. */ 1319 // check to see if refining search is needed.
1344 if (num00 > (further_steps - n)) 1320 if (num00 > further_steps - n)
1345 do_refine = 0; 1321 do_refine = 0;
1346 1322
1347 if (thissme < bestsme) { 1323 if (thissme < bestsme) {
1348 bestsme = thissme; 1324 bestsme = thissme;
1349 dst_mv->as_int = temp_mv.as_int; 1325 *dst_mv = temp_mv;
1350 } 1326 }
1351 } 1327 }
1352 } 1328 }
1353 1329
1354 /* final 1-away diamond refining search */ 1330 // final 1-away diamond refining search
1355 if (do_refine == 1) { 1331 if (do_refine) {
1356 int search_range = 8; 1332 const int search_range = 8;
1357 int_mv best_mv; 1333 MV best_mv = *dst_mv;
1358 best_mv.as_int = dst_mv->as_int; 1334 thissme = cpi->refining_search_sad(x, &best_mv, sadpb, search_range,
1359 thissme = cpi->refining_search_sad(x, &best_mv.as_mv, sadpb, search_range,
1360 fn_ptr, x->nmvjointcost, x->mvcost, 1335 fn_ptr, x->nmvjointcost, x->mvcost,
1361 ref_mv); 1336 ref_mv);
1362
1363 if (thissme < bestsme) { 1337 if (thissme < bestsme) {
1364 bestsme = thissme; 1338 bestsme = thissme;
1365 dst_mv->as_int = best_mv.as_int; 1339 *dst_mv = best_mv;
1366 } 1340 }
1367 } 1341 }
1342
1368 return bestsme; 1343 return bestsme;
1369 } 1344 }
1370 1345
1371 int vp9_full_search_sad_c(MACROBLOCK *x, MV *ref_mv, 1346 int vp9_full_search_sad_c(const MACROBLOCK *x, const MV *ref_mv,
1372 int sad_per_bit, int distance, 1347 int sad_per_bit, int distance,
1373 vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost, 1348 const vp9_variance_fn_ptr_t *fn_ptr,
1374 int *mvcost[2], 1349 int *mvjcost, int *mvcost[2],
1375 const MV *center_mv, int n) { 1350 const MV *center_mv, int block) {
1376 const MACROBLOCKD* const xd = &x->e_mbd; 1351 int r, c;
1352 const MACROBLOCKD *const xd = &x->e_mbd;
1377 const uint8_t *const what = x->plane[0].src.buf; 1353 const uint8_t *const what = x->plane[0].src.buf;
1378 const int what_stride = x->plane[0].src.stride; 1354 const int what_stride = x->plane[0].src.stride;
1379 const uint8_t *const in_what = xd->plane[0].pre[0].buf; 1355 const uint8_t *const in_what = xd->plane[0].pre[0].buf;
1380 const int in_what_stride = xd->plane[0].pre[0].stride; 1356 const int in_what_stride = xd->plane[0].pre[0].stride;
1381 const uint8_t *bestaddress; 1357 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min);
1382 MV *best_mv = &x->e_mbd.mi_8x8[0]->bmi[n].as_mv[0].as_mv; 1358 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max);
1383 MV this_mv; 1359 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min);
1384 int bestsad = INT_MAX; 1360 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max);
1385 int r, c; 1361 const int *mvjsadcost = x->nmvjointsadcost;
1386 int thissad; 1362 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1387 int ref_row = ref_mv->row; 1363 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1388 int ref_col = ref_mv->col; 1364 const uint8_t *best_address = &in_what[ref_mv->row * in_what_stride +
1389 int row_min = ref_row - distance; 1365 ref_mv->col];
1390 int row_max = ref_row + distance; 1366 int best_sad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride,
1391 int col_min = ref_col - distance; 1367 0x7fffffff) +
1392 int col_max = ref_col + distance; 1368 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, sad_per_bit);
1393 MV fcenter_mv; 1369 MV *best_mv = &xd->mi_8x8[0]->bmi[block].as_mv[0].as_mv;
1370 *best_mv = *ref_mv;
1394 1371
1395 int *mvjsadcost = x->nmvjointsadcost; 1372 for (r = row_min; r < row_max; ++r) {
1396 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1373 for (c = col_min; c < col_max; ++c) {
1374 const MV this_mv = {r, c};
1375 const uint8_t *check_here = &in_what[r * in_what_stride + c];
1376 const int sad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1377 best_sad) +
1378 mvsad_err_cost(&this_mv, &fcenter_mv,
1379 mvjsadcost, mvsadcost, sad_per_bit);
1397 1380
1398 fcenter_mv.row = center_mv->row >> 3; 1381 if (sad < best_sad) {
1399 fcenter_mv.col = center_mv->col >> 3; 1382 best_sad = sad;
1400 1383 *best_mv = this_mv;
1401 // Work out the mid point for the search 1384 best_address = check_here;
1402 bestaddress = &in_what[ref_row * in_what_stride + ref_col];
1403
1404 best_mv->row = ref_row;
1405 best_mv->col = ref_col;
1406
1407 // Baseline value at the centre
1408 bestsad = fn_ptr->sdf(what, what_stride, bestaddress,
1409 in_what_stride, 0x7fffffff)
1410 + mvsad_err_cost(best_mv, &fcenter_mv,
1411 mvjsadcost, mvsadcost, sad_per_bit);
1412
1413 // Apply further limits to prevent us looking using vectors that stretch
1414 // beyond the UMV border
1415 col_min = MAX(col_min, x->mv_col_min);
1416 col_max = MIN(col_max, x->mv_col_max);
1417 row_min = MAX(row_min, x->mv_row_min);
1418 row_max = MIN(row_max, x->mv_row_max);
1419
1420 for (r = row_min; r < row_max; r++) {
1421 const uint8_t *check_here = &in_what[r * in_what_stride + col_min];
1422 this_mv.row = r;
1423
1424 for (c = col_min; c < col_max; c++) {
1425 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1426 bestsad);
1427
1428 this_mv.col = c;
1429 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1430 mvjsadcost, mvsadcost, sad_per_bit);
1431
1432 if (thissad < bestsad) {
1433 bestsad = thissad;
1434 best_mv->row = r;
1435 best_mv->col = c;
1436 bestaddress = check_here;
1437 } 1385 }
1438
1439 check_here++;
1440 } 1386 }
1441 } 1387 }
1442 1388
1443 this_mv.row = best_mv->row * 8; 1389 if (best_sad < INT_MAX) {
1444 this_mv.col = best_mv->col * 8; 1390 unsigned int unused;
1445 1391 const MV mv = {best_mv->row * 8, best_mv->col * 8};
1446 if (bestsad < INT_MAX) 1392 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &unused)
1447 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, 1393 + mv_err_cost(&mv, center_mv, mvjcost, mvcost, x->errorperbit);
1448 (unsigned int *)(&thissad)) + 1394 } else {
1449 mv_err_cost(&this_mv, center_mv,
1450 mvjcost, mvcost, x->errorperbit);
1451 else
1452 return INT_MAX; 1395 return INT_MAX;
1396 }
1453 } 1397 }
1454 1398
1455 int vp9_full_search_sadx3(MACROBLOCK *x, MV *ref_mv, 1399 int vp9_full_search_sadx3(const MACROBLOCK *x, const MV *ref_mv,
1456 int sad_per_bit, int distance, 1400 int sad_per_bit, int distance,
1457 vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost, 1401 const vp9_variance_fn_ptr_t *fn_ptr,
1458 int *mvcost[2], const MV *center_mv, int n) { 1402 int *mvjcost, int *mvcost[2],
1459 const MACROBLOCKD* const xd = &x->e_mbd; 1403 const MV *center_mv, int n) {
1404 const MACROBLOCKD *const xd = &x->e_mbd;
1460 const uint8_t *const what = x->plane[0].src.buf; 1405 const uint8_t *const what = x->plane[0].src.buf;
1461 const int what_stride = x->plane[0].src.stride; 1406 const int what_stride = x->plane[0].src.stride;
1462 const uint8_t *const in_what = xd->plane[0].pre[0].buf; 1407 const uint8_t *const in_what = xd->plane[0].pre[0].buf;
1463 const int in_what_stride = xd->plane[0].pre[0].stride; 1408 const int in_what_stride = xd->plane[0].pre[0].stride;
1464 const uint8_t *bestaddress; 1409 MV *best_mv = &xd->mi_8x8[0]->bmi[n].as_mv[0].as_mv;
1465 MV *best_mv = &x->e_mbd.mi_8x8[0]->bmi[n].as_mv[0].as_mv;
1466 MV this_mv; 1410 MV this_mv;
1467 unsigned int bestsad = INT_MAX; 1411 unsigned int bestsad = INT_MAX;
1468 int r, c; 1412 int r, c;
1469 unsigned int thissad; 1413 unsigned int thissad;
1470 int ref_row = ref_mv->row; 1414 int ref_row = ref_mv->row;
1471 int ref_col = ref_mv->col; 1415 int ref_col = ref_mv->col;
1472 int row_min = ref_row - distance; 1416
1473 int row_max = ref_row + distance; 1417 // Apply further limits to prevent us looking using vectors that stretch
1474 int col_min = ref_col - distance; 1418 // beyond the UMV border
1475 int col_max = ref_col + distance; 1419 const int row_min = MAX(ref_row - distance, x->mv_row_min);
1420 const int row_max = MIN(ref_row + distance, x->mv_row_max);
1421 const int col_min = MAX(ref_col - distance, x->mv_col_min);
1422 const int col_max = MIN(ref_col + distance, x->mv_col_max);
1476 unsigned int sad_array[3]; 1423 unsigned int sad_array[3];
1477 MV fcenter_mv; 1424 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1478 int *mvjsadcost = x->nmvjointsadcost; 1425 const int *mvjsadcost = x->nmvjointsadcost;
1479 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1426 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1480 1427
1481 fcenter_mv.row = center_mv->row >> 3;
1482 fcenter_mv.col = center_mv->col >> 3;
1483
1484 // Work out the mid point for the search 1428 // Work out the mid point for the search
1485 bestaddress = &in_what[ref_row * in_what_stride + ref_col]; 1429 const uint8_t *bestaddress = &in_what[ref_row * in_what_stride + ref_col];
1486 1430
1487 best_mv->row = ref_row; 1431 best_mv->row = ref_row;
1488 best_mv->col = ref_col; 1432 best_mv->col = ref_col;
1489 1433
1490 // Baseline value at the centre 1434 // Baseline value at the centre
1491 bestsad = fn_ptr->sdf(what, what_stride, 1435 bestsad = fn_ptr->sdf(what, what_stride,
1492 bestaddress, in_what_stride, 0x7fffffff) 1436 bestaddress, in_what_stride, 0x7fffffff)
1493 + mvsad_err_cost(best_mv, &fcenter_mv, 1437 + mvsad_err_cost(best_mv, &fcenter_mv,
1494 mvjsadcost, mvsadcost, sad_per_bit); 1438 mvjsadcost, mvsadcost, sad_per_bit);
1495 1439
1496 // Apply further limits to prevent us looking using vectors that stretch
1497 // beyond the UMV border
1498 col_min = MAX(col_min, x->mv_col_min);
1499 col_max = MIN(col_max, x->mv_col_max);
1500 row_min = MAX(row_min, x->mv_row_min);
1501 row_max = MIN(row_max, x->mv_row_max);
1502
1503 for (r = row_min; r < row_max; r++) { 1440 for (r = row_min; r < row_max; r++) {
1504 const uint8_t *check_here = &in_what[r * in_what_stride + col_min]; 1441 const uint8_t *check_here = &in_what[r * in_what_stride + col_min];
1505 this_mv.row = r; 1442 this_mv.row = r;
1506 c = col_min; 1443 c = col_min;
1507 1444
1508 while ((c + 2) < col_max && fn_ptr->sdx3f != NULL) { 1445 while ((c + 2) < col_max && fn_ptr->sdx3f != NULL) {
1509 int i; 1446 int i;
1510 1447
1511 fn_ptr->sdx3f(what, what_stride, check_here, in_what_stride, sad_array); 1448 fn_ptr->sdx3f(what, what_stride, check_here, in_what_stride, sad_array);
1512 1449
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 1495
1559 if (bestsad < INT_MAX) 1496 if (bestsad < INT_MAX)
1560 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, 1497 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
1561 (unsigned int *)(&thissad)) + 1498 (unsigned int *)(&thissad)) +
1562 mv_err_cost(&this_mv, center_mv, 1499 mv_err_cost(&this_mv, center_mv,
1563 mvjcost, mvcost, x->errorperbit); 1500 mvjcost, mvcost, x->errorperbit);
1564 else 1501 else
1565 return INT_MAX; 1502 return INT_MAX;
1566 } 1503 }
1567 1504
1568 int vp9_full_search_sadx8(MACROBLOCK *x, MV *ref_mv, 1505 int vp9_full_search_sadx8(const MACROBLOCK *x, const MV *ref_mv,
1569 int sad_per_bit, int distance, 1506 int sad_per_bit, int distance,
1570 vp9_variance_fn_ptr_t *fn_ptr, 1507 const vp9_variance_fn_ptr_t *fn_ptr,
1571 int *mvjcost, int *mvcost[2], 1508 int *mvjcost, int *mvcost[2],
1572 const MV *center_mv, int n) { 1509 const MV *center_mv, int n) {
1573 const MACROBLOCKD* const xd = &x->e_mbd; 1510 const MACROBLOCKD *const xd = &x->e_mbd;
1574 const uint8_t *const what = x->plane[0].src.buf; 1511 const uint8_t *const what = x->plane[0].src.buf;
1575 const int what_stride = x->plane[0].src.stride; 1512 const int what_stride = x->plane[0].src.stride;
1576 const uint8_t *const in_what = xd->plane[0].pre[0].buf; 1513 const uint8_t *const in_what = xd->plane[0].pre[0].buf;
1577 const int in_what_stride = xd->plane[0].pre[0].stride; 1514 const int in_what_stride = xd->plane[0].pre[0].stride;
1578 const uint8_t *bestaddress; 1515 MV *best_mv = &xd->mi_8x8[0]->bmi[n].as_mv[0].as_mv;
1579 MV *best_mv = &x->e_mbd.mi_8x8[0]->bmi[n].as_mv[0].as_mv;
1580 MV this_mv; 1516 MV this_mv;
1581 unsigned int bestsad = INT_MAX; 1517 unsigned int bestsad = INT_MAX;
1582 int r, c; 1518 int r, c;
1583 unsigned int thissad; 1519 unsigned int thissad;
1584 int ref_row = ref_mv->row; 1520 int ref_row = ref_mv->row;
1585 int ref_col = ref_mv->col; 1521 int ref_col = ref_mv->col;
1586 int row_min = ref_row - distance; 1522
1587 int row_max = ref_row + distance; 1523 // Apply further limits to prevent us looking using vectors that stretch
1588 int col_min = ref_col - distance; 1524 // beyond the UMV border
1589 int col_max = ref_col + distance; 1525 const int row_min = MAX(ref_row - distance, x->mv_row_min);
1526 const int row_max = MIN(ref_row + distance, x->mv_row_max);
1527 const int col_min = MAX(ref_col - distance, x->mv_col_min);
1528 const int col_max = MIN(ref_col + distance, x->mv_col_max);
1590 DECLARE_ALIGNED_ARRAY(16, uint32_t, sad_array8, 8); 1529 DECLARE_ALIGNED_ARRAY(16, uint32_t, sad_array8, 8);
1591 unsigned int sad_array[3]; 1530 unsigned int sad_array[3];
1592 MV fcenter_mv; 1531 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1593 1532
1594 int *mvjsadcost = x->nmvjointsadcost; 1533 const int *mvjsadcost = x->nmvjointsadcost;
1595 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1534 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1596 1535
1597 fcenter_mv.row = center_mv->row >> 3;
1598 fcenter_mv.col = center_mv->col >> 3;
1599
1600 // Work out the mid point for the search 1536 // Work out the mid point for the search
1601 bestaddress = &in_what[ref_row * in_what_stride + ref_col]; 1537 const uint8_t *bestaddress = &in_what[ref_row * in_what_stride + ref_col];
1602 1538
1603 best_mv->row = ref_row; 1539 best_mv->row = ref_row;
1604 best_mv->col = ref_col; 1540 best_mv->col = ref_col;
1605 1541
1606 // Baseline value at the center 1542 // Baseline value at the center
1607 bestsad = fn_ptr->sdf(what, what_stride, 1543 bestsad = fn_ptr->sdf(what, what_stride,
1608 bestaddress, in_what_stride, 0x7fffffff) 1544 bestaddress, in_what_stride, 0x7fffffff)
1609 + mvsad_err_cost(best_mv, &fcenter_mv, 1545 + mvsad_err_cost(best_mv, &fcenter_mv,
1610 mvjsadcost, mvsadcost, sad_per_bit); 1546 mvjsadcost, mvsadcost, sad_per_bit);
1611 1547
1612 // Apply further limits to prevent us looking using vectors that stretch
1613 // beyond the UMV border
1614 col_min = MAX(col_min, x->mv_col_min);
1615 col_max = MIN(col_max, x->mv_col_max);
1616 row_min = MAX(row_min, x->mv_row_min);
1617 row_max = MIN(row_max, x->mv_row_max);
1618
1619 for (r = row_min; r < row_max; r++) { 1548 for (r = row_min; r < row_max; r++) {
1620 const uint8_t *check_here = &in_what[r * in_what_stride + col_min]; 1549 const uint8_t *check_here = &in_what[r * in_what_stride + col_min];
1621 this_mv.row = r; 1550 this_mv.row = r;
1622 c = col_min; 1551 c = col_min;
1623 1552
1624 while ((c + 7) < col_max) { 1553 while ((c + 7) < col_max) {
1625 int i; 1554 int i;
1626 1555
1627 fn_ptr->sdx8f(what, what_stride, check_here, in_what_stride, sad_array8); 1556 fn_ptr->sdx8f(what, what_stride, check_here, in_what_stride, sad_array8);
1628 1557
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, 1631 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
1703 (unsigned int *)(&thissad)) + 1632 (unsigned int *)(&thissad)) +
1704 mv_err_cost(&this_mv, center_mv, 1633 mv_err_cost(&this_mv, center_mv,
1705 mvjcost, mvcost, x->errorperbit); 1634 mvjcost, mvcost, x->errorperbit);
1706 else 1635 else
1707 return INT_MAX; 1636 return INT_MAX;
1708 } 1637 }
1709 1638
1710 int vp9_refining_search_sad_c(const MACROBLOCK *x, 1639 int vp9_refining_search_sad_c(const MACROBLOCK *x,
1711 MV *ref_mv, int error_per_bit, 1640 MV *ref_mv, int error_per_bit,
1712 int search_range, vp9_variance_fn_ptr_t *fn_ptr, 1641 int search_range,
1642 const vp9_variance_fn_ptr_t *fn_ptr,
1713 int *mvjcost, int *mvcost[2], 1643 int *mvjcost, int *mvcost[2],
1714 const MV *center_mv) { 1644 const MV *center_mv) {
1715 const MACROBLOCKD *const xd = &x->e_mbd; 1645 const MACROBLOCKD *const xd = &x->e_mbd;
1716 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}}; 1646 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}};
1717 int i, j; 1647 int i, j;
1718 1648
1719 const int what_stride = x->plane[0].src.stride; 1649 const int what_stride = x->plane[0].src.stride;
1720 const uint8_t *const what = x->plane[0].src.buf; 1650 const uint8_t *const what = x->plane[0].src.buf;
1721 const int in_what_stride = xd->plane[0].pre[0].stride; 1651 const int in_what_stride = xd->plane[0].pre[0].stride;
1722 const uint8_t *const in_what = xd->plane[0].pre[0].buf; 1652 const uint8_t *const in_what = xd->plane[0].pre[0].buf;
(...skipping 11 matching lines...) Expand all
1734 in_what_stride, 0x7fffffff) + 1664 in_what_stride, 0x7fffffff) +
1735 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit); 1665 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
1736 1666
1737 for (i = 0; i < search_range; i++) { 1667 for (i = 0; i < search_range; i++) {
1738 int best_site = -1; 1668 int best_site = -1;
1739 1669
1740 for (j = 0; j < 4; j++) { 1670 for (j = 0; j < 4; j++) {
1741 this_mv.row = ref_mv->row + neighbors[j].row; 1671 this_mv.row = ref_mv->row + neighbors[j].row;
1742 this_mv.col = ref_mv->col + neighbors[j].col; 1672 this_mv.col = ref_mv->col + neighbors[j].col;
1743 1673
1744 if ((this_mv.col > x->mv_col_min) && 1674 if (is_mv_in(x, &this_mv)) {
1745 (this_mv.col < x->mv_col_max) &&
1746 (this_mv.row > x->mv_row_min) &&
1747 (this_mv.row < x->mv_row_max)) {
1748 const uint8_t *check_here = &in_what[this_mv.row * in_what_stride + 1675 const uint8_t *check_here = &in_what[this_mv.row * in_what_stride +
1749 this_mv.col]; 1676 this_mv.col];
1750 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, 1677 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1751 bestsad); 1678 bestsad);
1752 1679
1753 if (thissad < bestsad) { 1680 if (thissad < bestsad) {
1754 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1681 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1755 mvjsadcost, mvsadcost, error_per_bit); 1682 mvjsadcost, mvsadcost, error_per_bit);
1756 1683
1757 if (thissad < bestsad) { 1684 if (thissad < bestsad) {
(...skipping 19 matching lines...) Expand all
1777 if (bestsad < INT_MAX) 1704 if (bestsad < INT_MAX)
1778 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, 1705 return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
1779 (unsigned int *)(&thissad)) + 1706 (unsigned int *)(&thissad)) +
1780 mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit); 1707 mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
1781 else 1708 else
1782 return INT_MAX; 1709 return INT_MAX;
1783 } 1710 }
1784 1711
1785 int vp9_refining_search_sadx4(const MACROBLOCK *x, 1712 int vp9_refining_search_sadx4(const MACROBLOCK *x,
1786 MV *ref_mv, int error_per_bit, 1713 MV *ref_mv, int error_per_bit,
1787 int search_range, vp9_variance_fn_ptr_t *fn_ptr, 1714 int search_range,
1715 const vp9_variance_fn_ptr_t *fn_ptr,
1788 int *mvjcost, int *mvcost[2], 1716 int *mvjcost, int *mvcost[2],
1789 const MV *center_mv) { 1717 const MV *center_mv) {
1790 const MACROBLOCKD* const xd = &x->e_mbd; 1718 const MACROBLOCKD *const xd = &x->e_mbd;
1791 MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}}; 1719 MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}};
1792 int i, j; 1720 int i, j;
1793 int this_row_offset, this_col_offset; 1721 int this_row_offset, this_col_offset;
1794 1722
1795 int what_stride = x->plane[0].src.stride; 1723 const int what_stride = x->plane[0].src.stride;
1796 int in_what_stride = xd->plane[0].pre[0].stride; 1724 const int in_what_stride = xd->plane[0].pre[0].stride;
1797 uint8_t *what = x->plane[0].src.buf; 1725 const uint8_t *what = x->plane[0].src.buf;
1798 uint8_t *best_address = xd->plane[0].pre[0].buf + 1726 const uint8_t *best_address = xd->plane[0].pre[0].buf +
1799 (ref_mv->row * xd->plane[0].pre[0].stride) + 1727 (ref_mv->row * xd->plane[0].pre[0].stride) +
1800 ref_mv->col; 1728 ref_mv->col;
1801 uint8_t *check_here;
1802 unsigned int thissad; 1729 unsigned int thissad;
1803 MV this_mv; 1730 MV this_mv;
1804 unsigned int bestsad = INT_MAX; 1731
1805 MV fcenter_mv; 1732 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1806 1733
1807 const int *mvjsadcost = x->nmvjointsadcost; 1734 const int *mvjsadcost = x->nmvjointsadcost;
1808 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]}; 1735 int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
1809 1736
1810 fcenter_mv.row = center_mv->row >> 3; 1737 unsigned int bestsad = fn_ptr->sdf(what, what_stride, best_address,
1811 fcenter_mv.col = center_mv->col >> 3; 1738 in_what_stride, 0x7fffffff) +
1812 1739 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
1813 bestsad = fn_ptr->sdf(what, what_stride, best_address,
1814 in_what_stride, 0x7fffffff) +
1815 mvsad_err_cost(ref_mv, &fcenter_mv,
1816 mvjsadcost, mvsadcost, error_per_bit);
1817 1740
1818 for (i = 0; i < search_range; i++) { 1741 for (i = 0; i < search_range; i++) {
1819 int best_site = -1; 1742 int best_site = -1;
1820 int all_in = ((ref_mv->row - 1) > x->mv_row_min) & 1743 int all_in = ((ref_mv->row - 1) > x->mv_row_min) &
1821 ((ref_mv->row + 1) < x->mv_row_max) & 1744 ((ref_mv->row + 1) < x->mv_row_max) &
1822 ((ref_mv->col - 1) > x->mv_col_min) & 1745 ((ref_mv->col - 1) > x->mv_col_min) &
1823 ((ref_mv->col + 1) < x->mv_col_max); 1746 ((ref_mv->col + 1) < x->mv_col_max);
1824 1747
1825 if (all_in) { 1748 if (all_in) {
1826 unsigned int sad_array[4]; 1749 unsigned int sad_array[4];
1827 unsigned char const *block_offset[4]; 1750 uint8_t const *block_offset[4] = {
1828 block_offset[0] = best_address - in_what_stride; 1751 best_address - in_what_stride,
1829 block_offset[1] = best_address - 1; 1752 best_address - 1,
1830 block_offset[2] = best_address + 1; 1753 best_address + 1,
1831 block_offset[3] = best_address + in_what_stride; 1754 best_address + in_what_stride
1755 };
1832 1756
1833 fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, 1757 fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride,
1834 sad_array); 1758 sad_array);
1835 1759
1836 for (j = 0; j < 4; j++) { 1760 for (j = 0; j < 4; j++) {
1837 if (sad_array[j] < bestsad) { 1761 if (sad_array[j] < bestsad) {
1838 this_mv.row = ref_mv->row + neighbors[j].row; 1762 this_mv.row = ref_mv->row + neighbors[j].row;
1839 this_mv.col = ref_mv->col + neighbors[j].col; 1763 this_mv.col = ref_mv->col + neighbors[j].col;
1840 sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv, 1764 sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv,
1841 mvjsadcost, mvsadcost, error_per_bit); 1765 mvjsadcost, mvsadcost, error_per_bit);
1842 1766
1843 if (sad_array[j] < bestsad) { 1767 if (sad_array[j] < bestsad) {
1844 bestsad = sad_array[j]; 1768 bestsad = sad_array[j];
1845 best_site = j; 1769 best_site = j;
1846 } 1770 }
1847 } 1771 }
1848 } 1772 }
1849 } else { 1773 } else {
1850 for (j = 0; j < 4; j++) { 1774 for (j = 0; j < 4; j++) {
1851 this_row_offset = ref_mv->row + neighbors[j].row; 1775 this_row_offset = ref_mv->row + neighbors[j].row;
1852 this_col_offset = ref_mv->col + neighbors[j].col; 1776 this_col_offset = ref_mv->col + neighbors[j].col;
1853 1777
1854 if ((this_col_offset > x->mv_col_min) && 1778 if ((this_col_offset > x->mv_col_min) &&
1855 (this_col_offset < x->mv_col_max) && 1779 (this_col_offset < x->mv_col_max) &&
1856 (this_row_offset > x->mv_row_min) && 1780 (this_row_offset > x->mv_row_min) &&
1857 (this_row_offset < x->mv_row_max)) { 1781 (this_row_offset < x->mv_row_max)) {
1858 check_here = (neighbors[j].row) * in_what_stride + neighbors[j].col + 1782 const uint8_t *check_here = neighbors[j].row * in_what_stride +
1859 best_address; 1783 neighbors[j].col + best_address;
1860 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, 1784 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
1861 bestsad); 1785 bestsad);
1862 1786
1863 if (thissad < bestsad) { 1787 if (thissad < bestsad) {
1864 this_mv.row = this_row_offset; 1788 this_mv.row = this_row_offset;
1865 this_mv.col = this_col_offset; 1789 this_mv.col = this_col_offset;
1866 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1790 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1867 mvjsadcost, mvsadcost, error_per_bit); 1791 mvjsadcost, mvsadcost, error_per_bit);
1868 1792
1869 if (thissad < bestsad) { 1793 if (thissad < bestsad) {
(...skipping 24 matching lines...) Expand all
1894 mv_err_cost(&this_mv, center_mv, 1818 mv_err_cost(&this_mv, center_mv,
1895 mvjcost, mvcost, x->errorperbit); 1819 mvjcost, mvcost, x->errorperbit);
1896 else 1820 else
1897 return INT_MAX; 1821 return INT_MAX;
1898 } 1822 }
1899 1823
1900 // This function is called when we do joint motion search in comp_inter_inter 1824 // This function is called when we do joint motion search in comp_inter_inter
1901 // mode. 1825 // mode.
1902 int vp9_refining_search_8p_c(const MACROBLOCK *x, 1826 int vp9_refining_search_8p_c(const MACROBLOCK *x,
1903 MV *ref_mv, int error_per_bit, 1827 MV *ref_mv, int error_per_bit,
1904 int search_range, vp9_variance_fn_ptr_t *fn_ptr, 1828 int search_range,
1905 int *mvjcost, int *mvcost[2], const MV *center_mv, 1829 const vp9_variance_fn_ptr_t *fn_ptr,
1830 int *mvjcost, int *mvcost[2],
1831 const MV *center_mv,
1906 const uint8_t *second_pred, int w, int h) { 1832 const uint8_t *second_pred, int w, int h) {
1907 const MACROBLOCKD *const xd = &x->e_mbd; 1833 const MACROBLOCKD *const xd = &x->e_mbd;
1908 const MV neighbors[8] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}, 1834 const MV neighbors[8] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0},
1909 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}}; 1835 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
1910 int i, j; 1836 int i, j;
1911 1837
1912 const uint8_t *what = x->plane[0].src.buf; 1838 const uint8_t *what = x->plane[0].src.buf;
1913 const int what_stride = x->plane[0].src.stride; 1839 const int what_stride = x->plane[0].src.stride;
1914 const uint8_t *in_what = xd->plane[0].pre[0].buf; 1840 const uint8_t *in_what = xd->plane[0].pre[0].buf;
1915 const int in_what_stride = xd->plane[0].pre[0].stride; 1841 const int in_what_stride = xd->plane[0].pre[0].stride;
(...skipping 12 matching lines...) Expand all
1928 second_pred, 0x7fffffff) + 1854 second_pred, 0x7fffffff) +
1929 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit); 1855 mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
1930 1856
1931 for (i = 0; i < search_range; ++i) { 1857 for (i = 0; i < search_range; ++i) {
1932 int best_site = -1; 1858 int best_site = -1;
1933 1859
1934 for (j = 0; j < 8; j++) { 1860 for (j = 0; j < 8; j++) {
1935 this_mv.row = ref_mv->row + neighbors[j].row; 1861 this_mv.row = ref_mv->row + neighbors[j].row;
1936 this_mv.col = ref_mv->col + neighbors[j].col; 1862 this_mv.col = ref_mv->col + neighbors[j].col;
1937 1863
1938 if ((this_mv.col > x->mv_col_min) && 1864 if (is_mv_in(x, &this_mv)) {
1939 (this_mv.col < x->mv_col_max) &&
1940 (this_mv.row > x->mv_row_min) &&
1941 (this_mv.row < x->mv_row_max)) {
1942 const uint8_t *check_here = &in_what[this_mv.row * in_what_stride + 1865 const uint8_t *check_here = &in_what[this_mv.row * in_what_stride +
1943 this_mv.col]; 1866 this_mv.col];
1944 1867
1945 thissad = fn_ptr->sdaf(what, what_stride, check_here, in_what_stride, 1868 thissad = fn_ptr->sdaf(what, what_stride, check_here, in_what_stride,
1946 second_pred, bestsad); 1869 second_pred, bestsad);
1947 if (thissad < bestsad) { 1870 if (thissad < bestsad) {
1948 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1871 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1949 mvjsadcost, mvsadcost, error_per_bit); 1872 mvjsadcost, mvsadcost, error_per_bit);
1950 if (thissad < bestsad) { 1873 if (thissad < bestsad) {
1951 bestsad = thissad; 1874 bestsad = thissad;
(...skipping 19 matching lines...) Expand all
1971 // FIXME(rbultje, yunqing): add full-pixel averaging variance functions 1894 // FIXME(rbultje, yunqing): add full-pixel averaging variance functions
1972 // so we don't have to use the subpixel with xoff=0,yoff=0 here. 1895 // so we don't have to use the subpixel with xoff=0,yoff=0 here.
1973 return fn_ptr->svaf(best_address, in_what_stride, 0, 0, what, what_stride, 1896 return fn_ptr->svaf(best_address, in_what_stride, 0, 0, what, what_stride,
1974 (unsigned int *)(&thissad), second_pred) + 1897 (unsigned int *)(&thissad), second_pred) +
1975 mv_err_cost(&this_mv, center_mv, 1898 mv_err_cost(&this_mv, center_mv,
1976 mvjcost, mvcost, x->errorperbit); 1899 mvjcost, mvcost, x->errorperbit);
1977 } else { 1900 } else {
1978 return INT_MAX; 1901 return INT_MAX;
1979 } 1902 }
1980 } 1903 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_onyx_if.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698