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

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

Issue 341293003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 6 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_pickmode.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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 int vp9_init_search_range(const SPEED_FEATURES *sf, int size) { 54 int vp9_init_search_range(const SPEED_FEATURES *sf, int size) {
55 int sr = 0; 55 int sr = 0;
56 56
57 // Minimum search size no matter what the passed in value. 57 // Minimum search size no matter what the passed in value.
58 size = MAX(16, size); 58 size = MAX(16, size);
59 59
60 while ((size << sr) < MAX_FULL_PEL_VAL) 60 while ((size << sr) < MAX_FULL_PEL_VAL)
61 sr++; 61 sr++;
62 62
63 sr += sf->reduce_first_step_size; 63 sr += sf->mv.reduce_first_step_size;
64 sr = MIN(sr, (sf->max_step_search_steps - 2)); 64 sr = MIN(sr, (sf->mv.max_step_search_steps - 2));
65 return sr; 65 return sr;
66 } 66 }
67 67
68 static INLINE int mv_cost(const MV *mv, 68 static INLINE int mv_cost(const MV *mv,
69 const int *joint_cost, int *const comp_cost[2]) { 69 const int *joint_cost, int *const comp_cost[2]) {
70 return joint_cost[vp9_get_mv_joint(mv)] + 70 return joint_cost[vp9_get_mv_joint(mv)] +
71 comp_cost[0][mv->row] + comp_cost[1][mv->col]; 71 comp_cost[0][mv->row] + comp_cost[1][mv->col];
72 } 72 }
73 73
74 int vp9_mv_bit_cost(const MV *mv, const MV *ref, 74 int vp9_mv_bit_cost(const MV *mv, const MV *ref,
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 int k = -1; 517 int k = -1;
518 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 518 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
519 int best_init_s = search_param_to_steps[search_param]; 519 int best_init_s = search_param_to_steps[search_param];
520 // adjust ref_mv to make sure it is within MV range 520 // adjust ref_mv to make sure it is within MV range
521 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 521 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
522 br = ref_mv->row; 522 br = ref_mv->row;
523 bc = ref_mv->col; 523 bc = ref_mv->col;
524 524
525 // Work out the start point for the search 525 // Work out the start point for the search
526 bestsad = vfp->sdf(what->buf, what->stride, 526 bestsad = vfp->sdf(what->buf, what->stride,
527 get_buf_from_mv(in_what, ref_mv), in_what->stride, 527 get_buf_from_mv(in_what, ref_mv), in_what->stride) +
528 0x7fffffff) + mvsad_err_cost(x, ref_mv, &fcenter_mv, 528 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
529 sad_per_bit);
530 529
531 // Search all possible scales upto the search param around the center point 530 // Search all possible scales upto the search param around the center point
532 // pick the scale of the point that is best as the starting scale of 531 // pick the scale of the point that is best as the starting scale of
533 // further steps around it. 532 // further steps around it.
534 if (do_init_search) { 533 if (do_init_search) {
535 s = best_init_s; 534 s = best_init_s;
536 best_init_s = -1; 535 best_init_s = -1;
537 for (t = 0; t <= s; ++t) { 536 for (t = 0; t <= s; ++t) {
538 int best_site = -1; 537 int best_site = -1;
539 if (check_bounds(x, br, bc, 1 << t)) { 538 if (check_bounds(x, br, bc, 1 << t)) {
540 for (i = 0; i < num_candidates[t]; i++) { 539 for (i = 0; i < num_candidates[t]; i++) {
541 const MV this_mv = {br + candidates[t][i].row, 540 const MV this_mv = {br + candidates[t][i].row,
542 bc + candidates[t][i].col}; 541 bc + candidates[t][i].col};
543 thissad = vfp->sdf(what->buf, what->stride, 542 thissad = vfp->sdf(what->buf, what->stride,
544 get_buf_from_mv(in_what, &this_mv), 543 get_buf_from_mv(in_what, &this_mv),
545 in_what->stride, bestsad); 544 in_what->stride);
546 CHECK_BETTER 545 CHECK_BETTER
547 } 546 }
548 } else { 547 } else {
549 for (i = 0; i < num_candidates[t]; i++) { 548 for (i = 0; i < num_candidates[t]; i++) {
550 const MV this_mv = {br + candidates[t][i].row, 549 const MV this_mv = {br + candidates[t][i].row,
551 bc + candidates[t][i].col}; 550 bc + candidates[t][i].col};
552 if (!is_mv_in(x, &this_mv)) 551 if (!is_mv_in(x, &this_mv))
553 continue; 552 continue;
554 thissad = vfp->sdf(what->buf, what->stride, 553 thissad = vfp->sdf(what->buf, what->stride,
555 get_buf_from_mv(in_what, &this_mv), 554 get_buf_from_mv(in_what, &this_mv),
556 in_what->stride, bestsad); 555 in_what->stride);
557 CHECK_BETTER 556 CHECK_BETTER
558 } 557 }
559 } 558 }
560 if (best_site == -1) { 559 if (best_site == -1) {
561 continue; 560 continue;
562 } else { 561 } else {
563 best_init_s = t; 562 best_init_s = t;
564 k = best_site; 563 k = best_site;
565 } 564 }
566 } 565 }
(...skipping 11 matching lines...) Expand all
578 577
579 do { 578 do {
580 // No need to search all 6 points the 1st time if initial search was used 579 // No need to search all 6 points the 1st time if initial search was used
581 if (!do_init_search || s != best_init_s) { 580 if (!do_init_search || s != best_init_s) {
582 if (check_bounds(x, br, bc, 1 << s)) { 581 if (check_bounds(x, br, bc, 1 << s)) {
583 for (i = 0; i < num_candidates[s]; i++) { 582 for (i = 0; i < num_candidates[s]; i++) {
584 const MV this_mv = {br + candidates[s][i].row, 583 const MV this_mv = {br + candidates[s][i].row,
585 bc + candidates[s][i].col}; 584 bc + candidates[s][i].col};
586 thissad = vfp->sdf(what->buf, what->stride, 585 thissad = vfp->sdf(what->buf, what->stride,
587 get_buf_from_mv(in_what, &this_mv), 586 get_buf_from_mv(in_what, &this_mv),
588 in_what->stride, bestsad); 587 in_what->stride);
589 CHECK_BETTER 588 CHECK_BETTER
590 } 589 }
591 } else { 590 } else {
592 for (i = 0; i < num_candidates[s]; i++) { 591 for (i = 0; i < num_candidates[s]; i++) {
593 const MV this_mv = {br + candidates[s][i].row, 592 const MV this_mv = {br + candidates[s][i].row,
594 bc + candidates[s][i].col}; 593 bc + candidates[s][i].col};
595 if (!is_mv_in(x, &this_mv)) 594 if (!is_mv_in(x, &this_mv))
596 continue; 595 continue;
597 thissad = vfp->sdf(what->buf, what->stride, 596 thissad = vfp->sdf(what->buf, what->stride,
598 get_buf_from_mv(in_what, &this_mv), 597 get_buf_from_mv(in_what, &this_mv),
599 in_what->stride, bestsad); 598 in_what->stride);
600 CHECK_BETTER 599 CHECK_BETTER
601 } 600 }
602 } 601 }
603 602
604 if (best_site == -1) { 603 if (best_site == -1) {
605 continue; 604 continue;
606 } else { 605 } else {
607 br += candidates[s][best_site].row; 606 br += candidates[s][best_site].row;
608 bc += candidates[s][best_site].col; 607 bc += candidates[s][best_site].col;
609 k = best_site; 608 k = best_site;
610 } 609 }
611 } 610 }
612 611
613 do { 612 do {
614 int next_chkpts_indices[PATTERN_CANDIDATES_REF]; 613 int next_chkpts_indices[PATTERN_CANDIDATES_REF];
615 best_site = -1; 614 best_site = -1;
616 next_chkpts_indices[0] = (k == 0) ? num_candidates[s] - 1 : k - 1; 615 next_chkpts_indices[0] = (k == 0) ? num_candidates[s] - 1 : k - 1;
617 next_chkpts_indices[1] = k; 616 next_chkpts_indices[1] = k;
618 next_chkpts_indices[2] = (k == num_candidates[s] - 1) ? 0 : k + 1; 617 next_chkpts_indices[2] = (k == num_candidates[s] - 1) ? 0 : k + 1;
619 618
620 if (check_bounds(x, br, bc, 1 << s)) { 619 if (check_bounds(x, br, bc, 1 << s)) {
621 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) { 620 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
622 const MV this_mv = {br + candidates[s][next_chkpts_indices[i]].row, 621 const MV this_mv = {br + candidates[s][next_chkpts_indices[i]].row,
623 bc + candidates[s][next_chkpts_indices[i]].col}; 622 bc + candidates[s][next_chkpts_indices[i]].col};
624 thissad = vfp->sdf(what->buf, what->stride, 623 thissad = vfp->sdf(what->buf, what->stride,
625 get_buf_from_mv(in_what, &this_mv), 624 get_buf_from_mv(in_what, &this_mv),
626 in_what->stride, bestsad); 625 in_what->stride);
627 CHECK_BETTER 626 CHECK_BETTER
628 } 627 }
629 } else { 628 } else {
630 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) { 629 for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
631 const MV this_mv = {br + candidates[s][next_chkpts_indices[i]].row, 630 const MV this_mv = {br + candidates[s][next_chkpts_indices[i]].row,
632 bc + candidates[s][next_chkpts_indices[i]].col}; 631 bc + candidates[s][next_chkpts_indices[i]].col};
633 if (!is_mv_in(x, &this_mv)) 632 if (!is_mv_in(x, &this_mv))
634 continue; 633 continue;
635 thissad = vfp->sdf(what->buf, what->stride, 634 thissad = vfp->sdf(what->buf, what->stride,
636 get_buf_from_mv(in_what, &this_mv), 635 get_buf_from_mv(in_what, &this_mv),
637 in_what->stride, bestsad); 636 in_what->stride);
638 CHECK_BETTER 637 CHECK_BETTER
639 } 638 }
640 } 639 }
641 640
642 if (best_site != -1) { 641 if (best_site != -1) {
643 k = next_chkpts_indices[best_site]; 642 k = next_chkpts_indices[best_site];
644 br += candidates[s][k].row; 643 br += candidates[s][k].row;
645 bc += candidates[s][k].col; 644 bc += candidates[s][k].col;
646 } 645 }
647 } while (best_site != -1); 646 } while (best_site != -1);
648 } while (s--); 647 } while (s--);
649 } 648 }
650 649
651 // Check 4 1-away neighbors if do_refine is true. 650 // Check 4 1-away neighbors if do_refine is true.
652 // For most well-designed schemes do_refine will not be necessary. 651 // For most well-designed schemes do_refine will not be necessary.
653 if (do_refine) { 652 if (do_refine) {
654 static const MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}}; 653 static const MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}};
655 654
656 for (j = 0; j < 16; j++) { 655 for (j = 0; j < 16; j++) {
657 int best_site = -1; 656 int best_site = -1;
658 if (check_bounds(x, br, bc, 1)) { 657 if (check_bounds(x, br, bc, 1)) {
659 for (i = 0; i < 4; i++) { 658 for (i = 0; i < 4; i++) {
660 const MV this_mv = {br + neighbors[i].row, 659 const MV this_mv = {br + neighbors[i].row,
661 bc + neighbors[i].col}; 660 bc + neighbors[i].col};
662 thissad = vfp->sdf(what->buf, what->stride, 661 thissad = vfp->sdf(what->buf, what->stride,
663 get_buf_from_mv(in_what, &this_mv), 662 get_buf_from_mv(in_what, &this_mv),
664 in_what->stride, bestsad); 663 in_what->stride);
665 CHECK_BETTER 664 CHECK_BETTER
666 } 665 }
667 } else { 666 } else {
668 for (i = 0; i < 4; i++) { 667 for (i = 0; i < 4; i++) {
669 const MV this_mv = {br + neighbors[i].row, 668 const MV this_mv = {br + neighbors[i].row,
670 bc + neighbors[i].col}; 669 bc + neighbors[i].col};
671 if (!is_mv_in(x, &this_mv)) 670 if (!is_mv_in(x, &this_mv))
672 continue; 671 continue;
673 thissad = vfp->sdf(what->buf, what->stride, 672 thissad = vfp->sdf(what->buf, what->stride,
674 get_buf_from_mv(in_what, &this_mv), 673 get_buf_from_mv(in_what, &this_mv),
675 in_what->stride, bestsad); 674 in_what->stride);
676 CHECK_BETTER 675 CHECK_BETTER
677 } 676 }
678 } 677 }
679 678
680 if (best_site == -1) { 679 if (best_site == -1) {
681 break; 680 break;
682 } else { 681 } else {
683 br += neighbors[best_site].row; 682 br += neighbors[best_site].row;
684 bc += neighbors[best_site].col; 683 bc += neighbors[best_site].col;
685 } 684 }
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 int start_col, end_col, start_row, end_row; 886 int start_col, end_col, start_row, end_row;
888 887
889 // The cfg and search_param parameters are not used in this search variant 888 // The cfg and search_param parameters are not used in this search variant
890 (void)cfg; 889 (void)cfg;
891 (void)search_param; 890 (void)search_param;
892 891
893 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);
894 *best_mv = *ref_mv; 893 *best_mv = *ref_mv;
895 *num00 = 11; 894 *num00 = 11;
896 best_sad = fn_ptr->sdf(what->buf, what->stride, 895 best_sad = fn_ptr->sdf(what->buf, what->stride,
897 get_buf_from_mv(in_what, ref_mv), in_what->stride, 896 get_buf_from_mv(in_what, ref_mv), in_what->stride) +
898 0x7fffffff) +
899 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit); 897 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
900 start_row = MAX(-range, x->mv_row_min - ref_mv->row); 898 start_row = MAX(-range, x->mv_row_min - ref_mv->row);
901 start_col = MAX(-range, x->mv_col_min - ref_mv->col); 899 start_col = MAX(-range, x->mv_col_min - ref_mv->col);
902 end_row = MIN(range, x->mv_row_max - ref_mv->row); 900 end_row = MIN(range, x->mv_row_max - ref_mv->row);
903 end_col = MIN(range, x->mv_col_max - ref_mv->col); 901 end_col = MIN(range, x->mv_col_max - ref_mv->col);
904 902
905 for (r = start_row; r <= end_row; ++r) { 903 for (r = start_row; r <= end_row; ++r) {
906 for (c = start_col; c <= end_col; c += 4) { 904 for (c = start_col; c <= end_col; c += 4) {
907 if (c + 3 <= end_col) { 905 if (c + 3 <= end_col) {
908 unsigned int sads[4]; 906 unsigned int sads[4];
(...skipping 13 matching lines...) Expand all
922 if (sad < best_sad) { 920 if (sad < best_sad) {
923 best_sad = sad; 921 best_sad = sad;
924 *best_mv = mv; 922 *best_mv = mv;
925 } 923 }
926 } 924 }
927 } 925 }
928 } else { 926 } else {
929 for (i = 0; i < end_col - c; ++i) { 927 for (i = 0; i < end_col - c; ++i) {
930 const MV mv = {ref_mv->row + r, ref_mv->col + c + i}; 928 const MV mv = {ref_mv->row + r, ref_mv->col + c + i};
931 unsigned int sad = fn_ptr->sdf(what->buf, what->stride, 929 unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
932 get_buf_from_mv(in_what, &mv), in_what->stride, best_sad); 930 get_buf_from_mv(in_what, &mv), in_what->stride);
933 if (sad < best_sad) { 931 if (sad < best_sad) {
934 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit); 932 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
935 if (sad < best_sad) { 933 if (sad < best_sad) {
936 best_sad = sad; 934 best_sad = sad;
937 *best_mv = mv; 935 *best_mv = mv;
938 } 936 }
939 } 937 }
940 } 938 }
941 } 939 }
942 } 940 }
(...skipping 25 matching lines...) Expand all
968 int i, j, step; 966 int i, j, step;
969 967
970 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 968 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
971 in_what_ref = get_buf_from_mv(in_what, ref_mv); 969 in_what_ref = get_buf_from_mv(in_what, ref_mv);
972 best_address = in_what_ref; 970 best_address = in_what_ref;
973 *num00 = 0; 971 *num00 = 0;
974 *best_mv = *ref_mv; 972 *best_mv = *ref_mv;
975 973
976 // Check the starting position 974 // Check the starting position
977 best_sad = fn_ptr->sdf(what->buf, what->stride, 975 best_sad = fn_ptr->sdf(what->buf, what->stride,
978 best_address, in_what->stride, 0x7fffffff) + 976 best_address, in_what->stride) +
979 mvsad_err_cost(x, best_mv, &fcenter_mv, sad_per_bit); 977 mvsad_err_cost(x, best_mv, &fcenter_mv, sad_per_bit);
980 978
981 i = 1; 979 i = 1;
982 980
983 for (step = 0; step < tot_steps; step++) { 981 for (step = 0; step < tot_steps; step++) {
984 for (j = 0; j < cfg->searches_per_step; j++) { 982 for (j = 0; j < cfg->searches_per_step; j++) {
985 const MV mv = {best_mv->row + ss[i].mv.row, 983 const MV mv = {best_mv->row + ss[i].mv.row,
986 best_mv->col + ss[i].mv.col}; 984 best_mv->col + ss[i].mv.col};
987 if (is_mv_in(x, &mv)) { 985 if (is_mv_in(x, &mv)) {
988 int sad = fn_ptr->sdf(what->buf, what->stride, 986 int sad = fn_ptr->sdf(what->buf, what->stride,
989 best_address + ss[i].offset, in_what->stride, 987 best_address + ss[i].offset, in_what->stride);
990 best_sad);
991 if (sad < best_sad) { 988 if (sad < best_sad) {
992 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit); 989 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
993 if (sad < best_sad) { 990 if (sad < best_sad) {
994 best_sad = sad; 991 best_sad = sad;
995 best_site = i; 992 best_site = i;
996 } 993 }
997 } 994 }
998 } 995 }
999 996
1000 i++; 997 i++;
1001 } 998 }
1002 999
1003 if (best_site != last_site) { 1000 if (best_site != last_site) {
1004 best_mv->row += ss[best_site].mv.row; 1001 best_mv->row += ss[best_site].mv.row;
1005 best_mv->col += ss[best_site].mv.col; 1002 best_mv->col += ss[best_site].mv.col;
1006 best_address += ss[best_site].offset; 1003 best_address += ss[best_site].offset;
1007 last_site = best_site; 1004 last_site = best_site;
1008 #if defined(NEW_DIAMOND_SEARCH) 1005 #if defined(NEW_DIAMOND_SEARCH)
1009 while (1) { 1006 while (1) {
1010 const MV this_mv = {best_mv->row + ss[best_site].mv.row, 1007 const MV this_mv = {best_mv->row + ss[best_site].mv.row,
1011 best_mv->col + ss[best_site].mv.col}; 1008 best_mv->col + ss[best_site].mv.col};
1012 if (is_mv_in(x, &this_mv)) { 1009 if (is_mv_in(x, &this_mv)) {
1013 int sad = fn_ptr->sdf(what->buf, what->stride, 1010 int sad = fn_ptr->sdf(what->buf, what->stride,
1014 best_address + ss[best_site].offset, 1011 best_address + ss[best_site].offset,
1015 in_what->stride, best_sad); 1012 in_what->stride);
1016 if (sad < best_sad) { 1013 if (sad < best_sad) {
1017 sad += mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit); 1014 sad += mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit);
1018 if (sad < best_sad) { 1015 if (sad < best_sad) {
1019 best_sad = sad; 1016 best_sad = sad;
1020 best_mv->row += ss[best_site].mv.row; 1017 best_mv->row += ss[best_site].mv.row;
1021 best_mv->col += ss[best_site].mv.col; 1018 best_mv->col += ss[best_site].mv.col;
1022 best_address += ss[best_site].offset; 1019 best_address += ss[best_site].offset;
1023 continue; 1020 continue;
1024 } 1021 }
1025 } 1022 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 ref_col = ref_mv->col; 1067 ref_col = ref_mv->col;
1071 *num00 = 0; 1068 *num00 = 0;
1072 best_mv->row = ref_row; 1069 best_mv->row = ref_row;
1073 best_mv->col = ref_col; 1070 best_mv->col = ref_col;
1074 1071
1075 // Work out the start point for the search 1072 // Work out the start point for the search
1076 in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col; 1073 in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col;
1077 best_address = in_what; 1074 best_address = in_what;
1078 1075
1079 // Check the starting position 1076 // Check the starting position
1080 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) 1077 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
1081 + mvsad_err_cost(x, best_mv, &fcenter_mv, sad_per_bit); 1078 + mvsad_err_cost(x, best_mv, &fcenter_mv, sad_per_bit);
1082 1079
1083 i = 1; 1080 i = 1;
1084 1081
1085 for (step = 0; step < tot_steps; step++) { 1082 for (step = 0; step < tot_steps; step++) {
1086 int all_in = 1, t; 1083 int all_in = 1, t;
1087 1084
1088 // All_in is true if every one of the points we are checking are within 1085 // All_in is true if every one of the points we are checking are within
1089 // the bounds of the image. 1086 // the bounds of the image.
1090 all_in &= ((best_mv->row + ss[i].mv.row) > x->mv_row_min); 1087 all_in &= ((best_mv->row + ss[i].mv.row) > x->mv_row_min);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 } 1119 }
1123 } else { 1120 } else {
1124 for (j = 0; j < cfg->searches_per_step; j++) { 1121 for (j = 0; j < cfg->searches_per_step; j++) {
1125 // Trap illegal vectors 1122 // Trap illegal vectors
1126 const MV this_mv = {best_mv->row + ss[i].mv.row, 1123 const MV this_mv = {best_mv->row + ss[i].mv.row,
1127 best_mv->col + ss[i].mv.col}; 1124 best_mv->col + ss[i].mv.col};
1128 1125
1129 if (is_mv_in(x, &this_mv)) { 1126 if (is_mv_in(x, &this_mv)) {
1130 const uint8_t *const check_here = ss[i].offset + best_address; 1127 const uint8_t *const check_here = ss[i].offset + best_address;
1131 unsigned int thissad = fn_ptr->sdf(what, what_stride, check_here, 1128 unsigned int thissad = fn_ptr->sdf(what, what_stride, check_here,
1132 in_what_stride, bestsad); 1129 in_what_stride);
1133 1130
1134 if (thissad < bestsad) { 1131 if (thissad < bestsad) {
1135 thissad += mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit); 1132 thissad += mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit);
1136 if (thissad < bestsad) { 1133 if (thissad < bestsad) {
1137 bestsad = thissad; 1134 bestsad = thissad;
1138 best_site = i; 1135 best_site = i;
1139 } 1136 }
1140 } 1137 }
1141 } 1138 }
1142 i++; 1139 i++;
1143 } 1140 }
1144 } 1141 }
1145 if (best_site != last_site) { 1142 if (best_site != last_site) {
1146 best_mv->row += ss[best_site].mv.row; 1143 best_mv->row += ss[best_site].mv.row;
1147 best_mv->col += ss[best_site].mv.col; 1144 best_mv->col += ss[best_site].mv.col;
1148 best_address += ss[best_site].offset; 1145 best_address += ss[best_site].offset;
1149 last_site = best_site; 1146 last_site = best_site;
1150 #if defined(NEW_DIAMOND_SEARCH) 1147 #if defined(NEW_DIAMOND_SEARCH)
1151 while (1) { 1148 while (1) {
1152 const MV this_mv = {best_mv->row + ss[best_site].mv.row, 1149 const MV this_mv = {best_mv->row + ss[best_site].mv.row,
1153 best_mv->col + ss[best_site].mv.col}; 1150 best_mv->col + ss[best_site].mv.col};
1154 if (is_mv_in(x, &this_mv)) { 1151 if (is_mv_in(x, &this_mv)) {
1155 const uint8_t *const check_here = ss[best_site].offset + best_address; 1152 const uint8_t *const check_here = ss[best_site].offset + best_address;
1156 unsigned int thissad = fn_ptr->sdf(what, what_stride, check_here, 1153 unsigned int thissad = fn_ptr->sdf(what, what_stride, check_here,
1157 in_what_stride, bestsad); 1154 in_what_stride);
1158 if (thissad < bestsad) { 1155 if (thissad < bestsad) {
1159 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1156 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1160 mvjsadcost, mvsadcost, sad_per_bit); 1157 mvjsadcost, mvsadcost, sad_per_bit);
1161 if (thissad < bestsad) { 1158 if (thissad < bestsad) {
1162 bestsad = thissad; 1159 bestsad = thissad;
1163 best_mv->row += ss[best_site].mv.row; 1160 best_mv->row += ss[best_site].mv.row;
1164 best_mv->col += ss[best_site].mv.col; 1161 best_mv->col += ss[best_site].mv.col;
1165 best_address += ss[best_site].offset; 1162 best_address += ss[best_site].offset;
1166 continue; 1163 continue;
1167 } 1164 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 int r, c; 1243 int r, c;
1247 const MACROBLOCKD *const xd = &x->e_mbd; 1244 const MACROBLOCKD *const xd = &x->e_mbd;
1248 const struct buf_2d *const what = &x->plane[0].src; 1245 const struct buf_2d *const what = &x->plane[0].src;
1249 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1246 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1250 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min); 1247 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min);
1251 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max); 1248 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max);
1252 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min); 1249 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min);
1253 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max); 1250 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max);
1254 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1251 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1255 int best_sad = fn_ptr->sdf(what->buf, what->stride, 1252 int best_sad = fn_ptr->sdf(what->buf, what->stride,
1256 get_buf_from_mv(in_what, ref_mv), in_what->stride, 0x7fffffff) + 1253 get_buf_from_mv(in_what, ref_mv), in_what->stride) +
1257 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit); 1254 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
1258 *best_mv = *ref_mv; 1255 *best_mv = *ref_mv;
1259 1256
1260 for (r = row_min; r < row_max; ++r) { 1257 for (r = row_min; r < row_max; ++r) {
1261 for (c = col_min; c < col_max; ++c) { 1258 for (c = col_min; c < col_max; ++c) {
1262 const MV mv = {r, c}; 1259 const MV mv = {r, c};
1263 const int sad = fn_ptr->sdf(what->buf, what->stride, 1260 const int sad = fn_ptr->sdf(what->buf, what->stride,
1264 get_buf_from_mv(in_what, &mv), in_what->stride, best_sad) + 1261 get_buf_from_mv(in_what, &mv), in_what->stride) +
1265 mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit); 1262 mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
1266 if (sad < best_sad) { 1263 if (sad < best_sad) {
1267 best_sad = sad; 1264 best_sad = sad;
1268 *best_mv = mv; 1265 *best_mv = mv;
1269 } 1266 }
1270 } 1267 }
1271 } 1268 }
1272 return best_sad; 1269 return best_sad;
1273 } 1270 }
1274 1271
1275 int vp9_full_search_sadx3(const MACROBLOCK *x, const MV *ref_mv, 1272 int vp9_full_search_sadx3(const MACROBLOCK *x, const MV *ref_mv,
1276 int sad_per_bit, int distance, 1273 int sad_per_bit, int distance,
1277 const vp9_variance_fn_ptr_t *fn_ptr, 1274 const vp9_variance_fn_ptr_t *fn_ptr,
1278 const MV *center_mv, MV *best_mv) { 1275 const MV *center_mv, MV *best_mv) {
1279 int r; 1276 int r;
1280 const MACROBLOCKD *const xd = &x->e_mbd; 1277 const MACROBLOCKD *const xd = &x->e_mbd;
1281 const struct buf_2d *const what = &x->plane[0].src; 1278 const struct buf_2d *const what = &x->plane[0].src;
1282 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1279 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1283 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min); 1280 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min);
1284 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max); 1281 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max);
1285 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min); 1282 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min);
1286 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max); 1283 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max);
1287 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1284 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1288 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride, 1285 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride,
1289 get_buf_from_mv(in_what, ref_mv), in_what->stride, 0x7fffffff) + 1286 get_buf_from_mv(in_what, ref_mv), in_what->stride) +
1290 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit); 1287 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
1291 *best_mv = *ref_mv; 1288 *best_mv = *ref_mv;
1292 1289
1293 for (r = row_min; r < row_max; ++r) { 1290 for (r = row_min; r < row_max; ++r) {
1294 int c = col_min; 1291 int c = col_min;
1295 const uint8_t *check_here = &in_what->buf[r * in_what->stride + c]; 1292 const uint8_t *check_here = &in_what->buf[r * in_what->stride + c];
1296 1293
1297 if (fn_ptr->sdx3f != NULL) { 1294 if (fn_ptr->sdx3f != NULL) {
1298 while ((c + 2) < col_max) { 1295 while ((c + 2) < col_max) {
1299 int i; 1296 int i;
(...skipping 13 matching lines...) Expand all
1313 } 1310 }
1314 } 1311 }
1315 ++check_here; 1312 ++check_here;
1316 ++c; 1313 ++c;
1317 } 1314 }
1318 } 1315 }
1319 } 1316 }
1320 1317
1321 while (c < col_max) { 1318 while (c < col_max) {
1322 unsigned int sad = fn_ptr->sdf(what->buf, what->stride, 1319 unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
1323 check_here, in_what->stride, best_sad); 1320 check_here, in_what->stride);
1324 if (sad < best_sad) { 1321 if (sad < best_sad) {
1325 const MV mv = {r, c}; 1322 const MV mv = {r, c};
1326 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit); 1323 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
1327 if (sad < best_sad) { 1324 if (sad < best_sad) {
1328 best_sad = sad; 1325 best_sad = sad;
1329 *best_mv = mv; 1326 *best_mv = mv;
1330 } 1327 }
1331 } 1328 }
1332 ++check_here; 1329 ++check_here;
1333 ++c; 1330 ++c;
(...skipping 10 matching lines...) Expand all
1344 int r; 1341 int r;
1345 const MACROBLOCKD *const xd = &x->e_mbd; 1342 const MACROBLOCKD *const xd = &x->e_mbd;
1346 const struct buf_2d *const what = &x->plane[0].src; 1343 const struct buf_2d *const what = &x->plane[0].src;
1347 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1344 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1348 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min); 1345 const int row_min = MAX(ref_mv->row - distance, x->mv_row_min);
1349 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max); 1346 const int row_max = MIN(ref_mv->row + distance, x->mv_row_max);
1350 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min); 1347 const int col_min = MAX(ref_mv->col - distance, x->mv_col_min);
1351 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max); 1348 const int col_max = MIN(ref_mv->col + distance, x->mv_col_max);
1352 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1349 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1353 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride, 1350 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride,
1354 get_buf_from_mv(in_what, ref_mv), in_what->stride, 0x7fffffff) + 1351 get_buf_from_mv(in_what, ref_mv), in_what->stride) +
1355 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit); 1352 mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
1356 *best_mv = *ref_mv; 1353 *best_mv = *ref_mv;
1357 1354
1358 for (r = row_min; r < row_max; ++r) { 1355 for (r = row_min; r < row_max; ++r) {
1359 int c = col_min; 1356 int c = col_min;
1360 const uint8_t *check_here = &in_what->buf[r * in_what->stride + c]; 1357 const uint8_t *check_here = &in_what->buf[r * in_what->stride + c];
1361 1358
1362 if (fn_ptr->sdx8f != NULL) { 1359 if (fn_ptr->sdx8f != NULL) {
1363 while ((c + 7) < col_max) { 1360 while ((c + 7) < col_max) {
1364 int i; 1361 int i;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 } 1399 }
1403 } 1400 }
1404 ++check_here; 1401 ++check_here;
1405 ++c; 1402 ++c;
1406 } 1403 }
1407 } 1404 }
1408 } 1405 }
1409 1406
1410 while (c < col_max) { 1407 while (c < col_max) {
1411 unsigned int sad = fn_ptr->sdf(what->buf, what->stride, 1408 unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
1412 check_here, in_what->stride, best_sad); 1409 check_here, in_what->stride);
1413 if (sad < best_sad) { 1410 if (sad < best_sad) {
1414 const MV mv = {r, c}; 1411 const MV mv = {r, c};
1415 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit); 1412 sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
1416 if (sad < best_sad) { 1413 if (sad < best_sad) {
1417 best_sad = sad; 1414 best_sad = sad;
1418 *best_mv = mv; 1415 *best_mv = mv;
1419 } 1416 }
1420 } 1417 }
1421 ++check_here; 1418 ++check_here;
1422 ++c; 1419 ++c;
1423 } 1420 }
1424 } 1421 }
1425 1422
1426 return best_sad; 1423 return best_sad;
1427 } 1424 }
1428 1425
1429 int vp9_refining_search_sad_c(const MACROBLOCK *x, 1426 int vp9_refining_search_sad_c(const MACROBLOCK *x,
1430 MV *ref_mv, int error_per_bit, 1427 MV *ref_mv, int error_per_bit,
1431 int search_range, 1428 int search_range,
1432 const vp9_variance_fn_ptr_t *fn_ptr, 1429 const vp9_variance_fn_ptr_t *fn_ptr,
1433 const MV *center_mv) { 1430 const MV *center_mv) {
1434 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}}; 1431 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}};
1435 const MACROBLOCKD *const xd = &x->e_mbd; 1432 const MACROBLOCKD *const xd = &x->e_mbd;
1436 const struct buf_2d *const what = &x->plane[0].src; 1433 const struct buf_2d *const what = &x->plane[0].src;
1437 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1434 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1438 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1435 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1439 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride, 1436 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride,
1440 get_buf_from_mv(in_what, ref_mv), 1437 get_buf_from_mv(in_what, ref_mv),
1441 in_what->stride, 0x7fffffff) + 1438 in_what->stride) +
1442 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit); 1439 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit);
1443 int i, j; 1440 int i, j;
1444 1441
1445 for (i = 0; i < search_range; i++) { 1442 for (i = 0; i < search_range; i++) {
1446 int best_site = -1; 1443 int best_site = -1;
1447 1444
1448 for (j = 0; j < 4; j++) { 1445 for (j = 0; j < 4; j++) {
1449 const MV mv = {ref_mv->row + neighbors[j].row, 1446 const MV mv = {ref_mv->row + neighbors[j].row,
1450 ref_mv->col + neighbors[j].col}; 1447 ref_mv->col + neighbors[j].col};
1451 if (is_mv_in(x, &mv)) { 1448 if (is_mv_in(x, &mv)) {
1452 unsigned int sad = fn_ptr->sdf(what->buf, what->stride, 1449 unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
1453 get_buf_from_mv(in_what, &mv), in_what->stride, best_sad); 1450 get_buf_from_mv(in_what, &mv), in_what->stride);
1454 if (sad < best_sad) { 1451 if (sad < best_sad) {
1455 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit); 1452 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit);
1456 if (sad < best_sad) { 1453 if (sad < best_sad) {
1457 best_sad = sad; 1454 best_sad = sad;
1458 best_site = j; 1455 best_site = j;
1459 } 1456 }
1460 } 1457 }
1461 } 1458 }
1462 } 1459 }
1463 1460
(...skipping 12 matching lines...) Expand all
1476 int search_range, 1473 int search_range,
1477 const vp9_variance_fn_ptr_t *fn_ptr, 1474 const vp9_variance_fn_ptr_t *fn_ptr,
1478 const MV *center_mv) { 1475 const MV *center_mv) {
1479 const MACROBLOCKD *const xd = &x->e_mbd; 1476 const MACROBLOCKD *const xd = &x->e_mbd;
1480 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}}; 1477 const MV neighbors[4] = {{ -1, 0}, {0, -1}, {0, 1}, {1, 0}};
1481 const struct buf_2d *const what = &x->plane[0].src; 1478 const struct buf_2d *const what = &x->plane[0].src;
1482 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1479 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1483 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1480 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1484 const uint8_t *best_address = get_buf_from_mv(in_what, ref_mv); 1481 const uint8_t *best_address = get_buf_from_mv(in_what, ref_mv);
1485 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride, best_address, 1482 unsigned int best_sad = fn_ptr->sdf(what->buf, what->stride, best_address,
1486 in_what->stride, 0x7fffffff) + 1483 in_what->stride) +
1487 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit); 1484 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit);
1488 int i, j; 1485 int i, j;
1489 1486
1490 for (i = 0; i < search_range; i++) { 1487 for (i = 0; i < search_range; i++) {
1491 int best_site = -1; 1488 int best_site = -1;
1492 const int all_in = ((ref_mv->row - 1) > x->mv_row_min) & 1489 const int all_in = ((ref_mv->row - 1) > x->mv_row_min) &
1493 ((ref_mv->row + 1) < x->mv_row_max) & 1490 ((ref_mv->row + 1) < x->mv_row_max) &
1494 ((ref_mv->col - 1) > x->mv_col_min) & 1491 ((ref_mv->col - 1) > x->mv_col_min) &
1495 ((ref_mv->col + 1) < x->mv_col_max); 1492 ((ref_mv->col + 1) < x->mv_col_max);
1496 1493
(...skipping 20 matching lines...) Expand all
1517 } 1514 }
1518 } 1515 }
1519 } else { 1516 } else {
1520 for (j = 0; j < 4; ++j) { 1517 for (j = 0; j < 4; ++j) {
1521 const MV mv = {ref_mv->row + neighbors[j].row, 1518 const MV mv = {ref_mv->row + neighbors[j].row,
1522 ref_mv->col + neighbors[j].col}; 1519 ref_mv->col + neighbors[j].col};
1523 1520
1524 if (is_mv_in(x, &mv)) { 1521 if (is_mv_in(x, &mv)) {
1525 unsigned int sad = fn_ptr->sdf(what->buf, what->stride, 1522 unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
1526 get_buf_from_mv(in_what, &mv), 1523 get_buf_from_mv(in_what, &mv),
1527 in_what->stride, best_sad); 1524 in_what->stride);
1528 if (sad < best_sad) { 1525 if (sad < best_sad) {
1529 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit); 1526 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit);
1530 if (sad < best_sad) { 1527 if (sad < best_sad) {
1531 best_sad = sad; 1528 best_sad = sad;
1532 best_site = j; 1529 best_site = j;
1533 } 1530 }
1534 } 1531 }
1535 } 1532 }
1536 } 1533 }
1537 } 1534 }
(...skipping 18 matching lines...) Expand all
1556 const vp9_variance_fn_ptr_t *fn_ptr, 1553 const vp9_variance_fn_ptr_t *fn_ptr,
1557 const MV *center_mv, 1554 const MV *center_mv,
1558 const uint8_t *second_pred) { 1555 const uint8_t *second_pred) {
1559 const MV neighbors[8] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}, 1556 const MV neighbors[8] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0},
1560 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}}; 1557 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
1561 const MACROBLOCKD *const xd = &x->e_mbd; 1558 const MACROBLOCKD *const xd = &x->e_mbd;
1562 const struct buf_2d *const what = &x->plane[0].src; 1559 const struct buf_2d *const what = &x->plane[0].src;
1563 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 1560 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
1564 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 1561 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
1565 unsigned int best_sad = fn_ptr->sdaf(what->buf, what->stride, 1562 unsigned int best_sad = fn_ptr->sdaf(what->buf, what->stride,
1566 get_buf_from_mv(in_what, ref_mv), in_what->stride, 1563 get_buf_from_mv(in_what, ref_mv), in_what->stride, second_pred) +
1567 second_pred, 0x7fffffff) +
1568 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit); 1564 mvsad_err_cost(x, ref_mv, &fcenter_mv, error_per_bit);
1569 int i, j; 1565 int i, j;
1570 1566
1571 for (i = 0; i < search_range; ++i) { 1567 for (i = 0; i < search_range; ++i) {
1572 int best_site = -1; 1568 int best_site = -1;
1573 1569
1574 for (j = 0; j < 8; ++j) { 1570 for (j = 0; j < 8; ++j) {
1575 const MV mv = {ref_mv->row + neighbors[j].row, 1571 const MV mv = {ref_mv->row + neighbors[j].row,
1576 ref_mv->col + neighbors[j].col}; 1572 ref_mv->col + neighbors[j].col};
1577 1573
1578 if (is_mv_in(x, &mv)) { 1574 if (is_mv_in(x, &mv)) {
1579 unsigned int sad = fn_ptr->sdaf(what->buf, what->stride, 1575 unsigned int sad = fn_ptr->sdaf(what->buf, what->stride,
1580 get_buf_from_mv(in_what, &mv), in_what->stride, 1576 get_buf_from_mv(in_what, &mv), in_what->stride, second_pred);
1581 second_pred, best_sad);
1582 if (sad < best_sad) { 1577 if (sad < best_sad) {
1583 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit); 1578 sad += mvsad_err_cost(x, &mv, &fcenter_mv, error_per_bit);
1584 if (sad < best_sad) { 1579 if (sad < best_sad) {
1585 best_sad = sad; 1580 best_sad = sad;
1586 best_site = j; 1581 best_site = j;
1587 } 1582 }
1588 } 1583 }
1589 } 1584 }
1590 } 1585 }
1591 1586
1592 if (best_site == -1) { 1587 if (best_site == -1) {
1593 break; 1588 break;
1594 } else { 1589 } else {
1595 ref_mv->row += neighbors[best_site].row; 1590 ref_mv->row += neighbors[best_site].row;
1596 ref_mv->col += neighbors[best_site].col; 1591 ref_mv->col += neighbors[best_site].col;
1597 } 1592 }
1598 } 1593 }
1599 return best_sad; 1594 return best_sad;
1600 } 1595 }
1596
1597 int vp9_full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x,
1598 BLOCK_SIZE bsize, MV *mvp_full,
1599 int step_param, int error_per_bit,
1600 const MV *ref_mv, MV *tmp_mv,
1601 int var_max, int rd) {
1602 const SPEED_FEATURES *const sf = &cpi->sf;
1603 const SEARCH_METHODS method = sf->mv.search_method;
1604 vp9_variance_fn_ptr_t *fn_ptr = &cpi->fn_ptr[bsize];
1605 int var = 0;
1606
1607 switch (method) {
1608 case FAST_DIAMOND:
1609 var = vp9_fast_dia_search(x, mvp_full, step_param, error_per_bit, 0,
1610 fn_ptr, 1, ref_mv, tmp_mv);
1611 break;
1612 case FAST_HEX:
1613 var = vp9_fast_hex_search(x, mvp_full, step_param, error_per_bit, 0,
1614 fn_ptr, 1, ref_mv, tmp_mv);
1615 break;
1616 case HEX:
1617 var = vp9_hex_search(x, mvp_full, step_param, error_per_bit, 1,
1618 fn_ptr, 1, ref_mv, tmp_mv);
1619 break;
1620 case SQUARE:
1621 var = vp9_square_search(x, mvp_full, step_param, error_per_bit, 1,
1622 fn_ptr, 1, ref_mv, tmp_mv);
1623 break;
1624 case BIGDIA:
1625 var = vp9_bigdia_search(x, mvp_full, step_param, error_per_bit, 1,
1626 fn_ptr, 1, ref_mv, tmp_mv);
1627 break;
1628 case NSTEP:
1629 var = vp9_full_pixel_diamond(cpi, x, mvp_full, step_param, error_per_bit,
1630 (sf->mv.max_step_search_steps - 1) -
1631 step_param,
1632 1, fn_ptr, ref_mv, tmp_mv);
1633 break;
1634 default:
1635 assert(!"Invalid search method.");
1636 }
1637
1638 if (method != NSTEP && rd && var < var_max)
1639 var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, fn_ptr, 1);
1640
1641 return var;
1642 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_pickmode.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698