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

Side by Side Diff: source/libvpx/vp8/encoder/mcomp.c

Issue 1124333011: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: only update to last nights LKGR Created 5 years, 7 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
« no previous file with comments | « source/libvpx/vp8/encoder/firstpass.c ('k') | source/libvpx/vp8/encoder/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
11 11
12 #include "./vp8_rtcd.h"
13 #include "./vpx_dsp_rtcd.h"
12 #include "onyx_int.h" 14 #include "onyx_int.h"
13 #include "mcomp.h" 15 #include "mcomp.h"
14 #include "vpx_mem/vpx_mem.h" 16 #include "vpx_mem/vpx_mem.h"
15 #include "vpx_config.h" 17 #include "vpx_config.h"
16 #include <stdio.h> 18 #include <stdio.h>
17 #include <limits.h> 19 #include <limits.h>
18 #include <math.h> 20 #include <math.h>
19 #include "vp8/common/findnearmv.h" 21 #include "vp8/common/findnearmv.h"
20 #include "vp8/common/common.h" 22 #include "vp8/common/common.h"
21 23
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 /* adjust ref_mv to make sure it is within MV range */ 895 /* adjust ref_mv to make sure it is within MV range */
894 vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_ max); 896 vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_ max);
895 br = ref_mv->as_mv.row; 897 br = ref_mv->as_mv.row;
896 bc = ref_mv->as_mv.col; 898 bc = ref_mv->as_mv.col;
897 899
898 /* Work out the start point for the search */ 900 /* Work out the start point for the search */
899 base_offset = (unsigned char *)(base_pre + d->offset); 901 base_offset = (unsigned char *)(base_pre + d->offset);
900 this_offset = base_offset + (br * (pre_stride)) + bc; 902 this_offset = base_offset + (br * (pre_stride)) + bc;
901 this_mv.as_mv.row = br; 903 this_mv.as_mv.row = br;
902 this_mv.as_mv.col = bc; 904 this_mv.as_mv.col = bc;
903 bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride, UINT_MAX) 905 bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride)
904 + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit); 906 + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);
905 907
906 #if CONFIG_MULTI_RES_ENCODING 908 #if CONFIG_MULTI_RES_ENCODING
907 /* Lower search range based on prediction info */ 909 /* Lower search range based on prediction info */
908 if (search_param >= 6) goto cal_neighbors; 910 if (search_param >= 6) goto cal_neighbors;
909 else if (search_param >= 5) hex_range = 4; 911 else if (search_param >= 5) hex_range = 4;
910 else if (search_param >= 4) hex_range = 6; 912 else if (search_param >= 4) hex_range = 6;
911 else if (search_param >= 3) hex_range = 15; 913 else if (search_param >= 3) hex_range = 15;
912 else if (search_param >= 2) hex_range = 31; 914 else if (search_param >= 2) hex_range = 31;
913 else if (search_param >= 1) hex_range = 63; 915 else if (search_param >= 1) hex_range = 63;
914 916
915 dia_range = 8; 917 dia_range = 8;
916 #else 918 #else
917 (void)search_param; 919 (void)search_param;
918 #endif 920 #endif
919 921
920 /* hex search */ 922 /* hex search */
921 CHECK_BOUNDS(2) 923 CHECK_BOUNDS(2)
922 924
923 if(all_in) 925 if(all_in)
924 { 926 {
925 for (i = 0; i < 6; i++) 927 for (i = 0; i < 6; i++)
926 { 928 {
927 this_mv.as_mv.row = br + hex[i].row; 929 this_mv.as_mv.row = br + hex[i].row;
928 this_mv.as_mv.col = bc + hex[i].col; 930 this_mv.as_mv.col = bc + hex[i].col;
929 this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + t his_mv.as_mv.col; 931 this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + t his_mv.as_mv.col;
930 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, b estsad); 932 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
931 CHECK_BETTER 933 CHECK_BETTER
932 } 934 }
933 }else 935 }else
934 { 936 {
935 for (i = 0; i < 6; i++) 937 for (i = 0; i < 6; i++)
936 { 938 {
937 this_mv.as_mv.row = br + hex[i].row; 939 this_mv.as_mv.row = br + hex[i].row;
938 this_mv.as_mv.col = bc + hex[i].col; 940 this_mv.as_mv.col = bc + hex[i].col;
939 CHECK_POINT 941 CHECK_POINT
940 this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + t his_mv.as_mv.col; 942 this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + t his_mv.as_mv.col;
941 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride, b estsad); 943 thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
942 CHECK_BETTER 944 CHECK_BETTER
943 } 945 }
944 } 946 }
945 947
946 if (best_site == -1) 948 if (best_site == -1)
947 goto cal_neighbors; 949 goto cal_neighbors;
948 else 950 else
949 { 951 {
950 br += hex[best_site].row; 952 br += hex[best_site].row;
951 bc += hex[best_site].col; 953 bc += hex[best_site].col;
952 k = best_site; 954 k = best_site;
953 } 955 }
954 956
955 for (j = 1; j < hex_range; j++) 957 for (j = 1; j < hex_range; j++)
956 { 958 {
957 best_site = -1; 959 best_site = -1;
958 CHECK_BOUNDS(2) 960 CHECK_BOUNDS(2)
959 961
960 if(all_in) 962 if(all_in)
961 { 963 {
962 for (i = 0; i < 3; i++) 964 for (i = 0; i < 3; i++)
963 { 965 {
964 this_mv.as_mv.row = br + next_chkpts[k][i].row; 966 this_mv.as_mv.row = br + next_chkpts[k][i].row;
965 this_mv.as_mv.col = bc + next_chkpts[k][i].col; 967 this_mv.as_mv.col = bc + next_chkpts[k][i].col;
966 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col; 968 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col;
967 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e, bestsad); 969 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e);
968 CHECK_BETTER 970 CHECK_BETTER
969 } 971 }
970 }else 972 }else
971 { 973 {
972 for (i = 0; i < 3; i++) 974 for (i = 0; i < 3; i++)
973 { 975 {
974 this_mv.as_mv.row = br + next_chkpts[k][i].row; 976 this_mv.as_mv.row = br + next_chkpts[k][i].row;
975 this_mv.as_mv.col = bc + next_chkpts[k][i].col; 977 this_mv.as_mv.col = bc + next_chkpts[k][i].col;
976 CHECK_POINT 978 CHECK_POINT
977 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col; 979 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col;
978 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e, bestsad); 980 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e);
979 CHECK_BETTER 981 CHECK_BETTER
980 } 982 }
981 } 983 }
982 984
983 if (best_site == -1) 985 if (best_site == -1)
984 break; 986 break;
985 else 987 else
986 { 988 {
987 br += next_chkpts[k][best_site].row; 989 br += next_chkpts[k][best_site].row;
988 bc += next_chkpts[k][best_site].col; 990 bc += next_chkpts[k][best_site].col;
(...skipping 10 matching lines...) Expand all
999 best_site = -1; 1001 best_site = -1;
1000 CHECK_BOUNDS(1) 1002 CHECK_BOUNDS(1)
1001 1003
1002 if(all_in) 1004 if(all_in)
1003 { 1005 {
1004 for (i = 0; i < 4; i++) 1006 for (i = 0; i < 4; i++)
1005 { 1007 {
1006 this_mv.as_mv.row = br + neighbors[i].row; 1008 this_mv.as_mv.row = br + neighbors[i].row;
1007 this_mv.as_mv.col = bc + neighbors[i].col; 1009 this_mv.as_mv.col = bc + neighbors[i].col;
1008 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col; 1010 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col;
1009 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e, bestsad); 1011 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e);
1010 CHECK_BETTER 1012 CHECK_BETTER
1011 } 1013 }
1012 }else 1014 }else
1013 { 1015 {
1014 for (i = 0; i < 4; i++) 1016 for (i = 0; i < 4; i++)
1015 { 1017 {
1016 this_mv.as_mv.row = br + neighbors[i].row; 1018 this_mv.as_mv.row = br + neighbors[i].row;
1017 this_mv.as_mv.col = bc + neighbors[i].col; 1019 this_mv.as_mv.col = bc + neighbors[i].col;
1018 CHECK_POINT 1020 CHECK_POINT
1019 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col; 1021 this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride )) + this_mv.as_mv.col;
1020 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e, bestsad); 1022 thissad = vfp->sdf(what, what_stride, this_offset, in_what_strid e);
1021 CHECK_BETTER 1023 CHECK_BETTER
1022 } 1024 }
1023 } 1025 }
1024 1026
1025 if (best_site == -1) 1027 if (best_site == -1)
1026 break; 1028 break;
1027 else 1029 else
1028 { 1030 {
1029 br += neighbors[best_site].row; 1031 br += neighbors[best_site].row;
1030 bc += neighbors[best_site].col; 1032 bc += neighbors[best_site].col;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 ref_col = ref_mv->as_mv.col; 1096 ref_col = ref_mv->as_mv.col;
1095 *num00 = 0; 1097 *num00 = 0;
1096 best_mv->as_mv.row = ref_row; 1098 best_mv->as_mv.row = ref_row;
1097 best_mv->as_mv.col = ref_col; 1099 best_mv->as_mv.col = ref_col;
1098 1100
1099 /* Work out the start point for the search */ 1101 /* Work out the start point for the search */
1100 in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col); 1102 in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
1101 best_address = in_what; 1103 best_address = in_what;
1102 1104
1103 /* Check the starting position */ 1105 /* Check the starting position */
1104 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, UINT_MAX) 1106 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
1105 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); 1107 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
1106 1108
1107 /* search_param determines the length of the initial step and hence 1109 /* search_param determines the length of the initial step and hence
1108 * the number of iterations 0 = initial step (MAX_FIRST_STEP) pel : 1110 * the number of iterations 0 = initial step (MAX_FIRST_STEP) pel :
1109 * 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc. 1111 * 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
1110 */ 1112 */
1111 ss = &x->ss[search_param * x->searches_per_step]; 1113 ss = &x->ss[search_param * x->searches_per_step];
1112 tot_steps = (x->ss_count / x->searches_per_step) - search_param; 1114 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1113 1115
1114 i = 1; 1116 i = 1;
1115 1117
1116 for (step = 0; step < tot_steps ; step++) 1118 for (step = 0; step < tot_steps ; step++)
1117 { 1119 {
1118 for (j = 0 ; j < x->searches_per_step ; j++) 1120 for (j = 0 ; j < x->searches_per_step ; j++)
1119 { 1121 {
1120 /* Trap illegal vectors */ 1122 /* Trap illegal vectors */
1121 this_row_offset = best_mv->as_mv.row + ss[i].mv.row; 1123 this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
1122 this_col_offset = best_mv->as_mv.col + ss[i].mv.col; 1124 this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
1123 1125
1124 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_co l_max) && 1126 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_co l_max) &&
1125 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_ma x)) 1127 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_ma x))
1126 1128
1127 { 1129 {
1128 check_here = ss[i].offset + best_address; 1130 check_here = ss[i].offset + best_address;
1129 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_str ide, bestsad); 1131 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_str ide);
1130 1132
1131 if (thissad < bestsad) 1133 if (thissad < bestsad)
1132 { 1134 {
1133 this_mv.as_mv.row = this_row_offset; 1135 this_mv.as_mv.row = this_row_offset;
1134 this_mv.as_mv.col = this_col_offset; 1136 this_mv.as_mv.col = this_col_offset;
1135 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1137 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1136 mvsadcost, sad_per_bit); 1138 mvsadcost, sad_per_bit);
1137 1139
1138 if (thissad < bestsad) 1140 if (thissad < bestsad)
1139 { 1141 {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 ref_col = ref_mv->as_mv.col; 1220 ref_col = ref_mv->as_mv.col;
1219 *num00 = 0; 1221 *num00 = 0;
1220 best_mv->as_mv.row = ref_row; 1222 best_mv->as_mv.row = ref_row;
1221 best_mv->as_mv.col = ref_col; 1223 best_mv->as_mv.col = ref_col;
1222 1224
1223 /* Work out the start point for the search */ 1225 /* Work out the start point for the search */
1224 in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col); 1226 in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
1225 best_address = in_what; 1227 best_address = in_what;
1226 1228
1227 /* Check the starting position */ 1229 /* Check the starting position */
1228 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, UINT_MAX) 1230 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
1229 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); 1231 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
1230 1232
1231 /* search_param determines the length of the initial step and hence the 1233 /* search_param determines the length of the initial step and hence the
1232 * number of iterations 0 = initial step (MAX_FIRST_STEP) pel : 1 = 1234 * number of iterations 0 = initial step (MAX_FIRST_STEP) pel : 1 =
1233 * (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc. 1235 * (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
1234 */ 1236 */
1235 ss = &x->ss[search_param * x->searches_per_step]; 1237 ss = &x->ss[search_param * x->searches_per_step];
1236 tot_steps = (x->ss_count / x->searches_per_step) - search_param; 1238 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1237 1239
1238 i = 1; 1240 i = 1;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 for (j = 0 ; j < x->searches_per_step ; j++) 1288 for (j = 0 ; j < x->searches_per_step ; j++)
1287 { 1289 {
1288 /* Trap illegal vectors */ 1290 /* Trap illegal vectors */
1289 this_row_offset = best_mv->as_mv.row + ss[i].mv.row; 1291 this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
1290 this_col_offset = best_mv->as_mv.col + ss[i].mv.col; 1292 this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
1291 1293
1292 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->m v_col_max) && 1294 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->m v_col_max) &&
1293 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_ro w_max)) 1295 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_ro w_max))
1294 { 1296 {
1295 check_here = ss[i].offset + best_address; 1297 check_here = ss[i].offset + best_address;
1296 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what _stride, bestsad); 1298 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what _stride);
1297 1299
1298 if (thissad < bestsad) 1300 if (thissad < bestsad)
1299 { 1301 {
1300 this_mv.as_mv.row = this_row_offset; 1302 this_mv.as_mv.row = this_row_offset;
1301 this_mv.as_mv.col = this_col_offset; 1303 this_mv.as_mv.col = this_col_offset;
1302 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1304 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1303 mvsadcost, sad_per_bit); 1305 mvsadcost, sad_per_bit);
1304 1306
1305 if (thissad < bestsad) 1307 if (thissad < bestsad)
1306 { 1308 {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; 1371 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1370 1372
1371 /* Work out the mid point for the search */ 1373 /* Work out the mid point for the search */
1372 in_what = base_pre + d->offset; 1374 in_what = base_pre + d->offset;
1373 bestaddress = in_what + (ref_row * pre_stride) + ref_col; 1375 bestaddress = in_what + (ref_row * pre_stride) + ref_col;
1374 1376
1375 best_mv->as_mv.row = ref_row; 1377 best_mv->as_mv.row = ref_row;
1376 best_mv->as_mv.col = ref_col; 1378 best_mv->as_mv.col = ref_col;
1377 1379
1378 /* Baseline value at the centre */ 1380 /* Baseline value at the centre */
1379 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, 1381 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
1380 in_what_stride, UINT_MAX)
1381 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); 1382 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
1382 1383
1383 /* Apply further limits to prevent us looking using vectors that 1384 /* Apply further limits to prevent us looking using vectors that
1384 * stretch beyiond the UMV border 1385 * stretch beyiond the UMV border
1385 */ 1386 */
1386 if (col_min < x->mv_col_min) 1387 if (col_min < x->mv_col_min)
1387 col_min = x->mv_col_min; 1388 col_min = x->mv_col_min;
1388 1389
1389 if (col_max > x->mv_col_max) 1390 if (col_max > x->mv_col_max)
1390 col_max = x->mv_col_max; 1391 col_max = x->mv_col_max;
1391 1392
1392 if (row_min < x->mv_row_min) 1393 if (row_min < x->mv_row_min)
1393 row_min = x->mv_row_min; 1394 row_min = x->mv_row_min;
1394 1395
1395 if (row_max > x->mv_row_max) 1396 if (row_max > x->mv_row_max)
1396 row_max = x->mv_row_max; 1397 row_max = x->mv_row_max;
1397 1398
1398 for (r = row_min; r < row_max ; r++) 1399 for (r = row_min; r < row_max ; r++)
1399 { 1400 {
1400 this_mv.as_mv.row = r; 1401 this_mv.as_mv.row = r;
1401 check_here = r * mv_stride + in_what + col_min; 1402 check_here = r * mv_stride + in_what + col_min;
1402 1403
1403 for (c = col_min; c < col_max; c++) 1404 for (c = col_min; c < col_max; c++)
1404 { 1405 {
1405 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad); 1406 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride) ;
1406 1407
1407 this_mv.as_mv.col = c; 1408 this_mv.as_mv.col = c;
1408 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1409 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1409 mvsadcost, sad_per_bit); 1410 mvsadcost, sad_per_bit);
1410 1411
1411 if (thissad < bestsad) 1412 if (thissad < bestsad)
1412 { 1413 {
1413 bestsad = thissad; 1414 bestsad = thissad;
1414 best_mv->as_mv.row = r; 1415 best_mv->as_mv.row = r;
1415 best_mv->as_mv.col = c; 1416 best_mv->as_mv.col = c;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; 1468 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1468 1469
1469 /* Work out the mid point for the search */ 1470 /* Work out the mid point for the search */
1470 in_what = base_pre + d->offset; 1471 in_what = base_pre + d->offset;
1471 bestaddress = in_what + (ref_row * pre_stride) + ref_col; 1472 bestaddress = in_what + (ref_row * pre_stride) + ref_col;
1472 1473
1473 best_mv->as_mv.row = ref_row; 1474 best_mv->as_mv.row = ref_row;
1474 best_mv->as_mv.col = ref_col; 1475 best_mv->as_mv.col = ref_col;
1475 1476
1476 /* Baseline value at the centre */ 1477 /* Baseline value at the centre */
1477 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, 1478 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
1478 in_what_stride, UINT_MAX)
1479 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); 1479 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
1480 1480
1481 /* Apply further limits to prevent us looking using vectors that stretch 1481 /* Apply further limits to prevent us looking using vectors that stretch
1482 * beyond the UMV border 1482 * beyond the UMV border
1483 */ 1483 */
1484 if (col_min < x->mv_col_min) 1484 if (col_min < x->mv_col_min)
1485 col_min = x->mv_col_min; 1485 col_min = x->mv_col_min;
1486 1486
1487 if (col_max > x->mv_col_max) 1487 if (col_max > x->mv_col_max)
1488 col_max = x->mv_col_max; 1488 col_max = x->mv_col_max;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1524 } 1524 }
1525 } 1525 }
1526 1526
1527 check_here++; 1527 check_here++;
1528 c++; 1528 c++;
1529 } 1529 }
1530 } 1530 }
1531 1531
1532 while (c < col_max) 1532 while (c < col_max)
1533 { 1533 {
1534 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad); 1534 thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride) ;
1535 1535
1536 if (thissad < bestsad) 1536 if (thissad < bestsad)
1537 { 1537 {
1538 this_mv.as_mv.col = c; 1538 this_mv.as_mv.col = c;
1539 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1539 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1540 mvsadcost, sad_per_bit); 1540 mvsadcost, sad_per_bit);
1541 1541
1542 if (thissad < bestsad) 1542 if (thissad < bestsad)
1543 { 1543 {
1544 bestsad = thissad; 1544 bestsad = thissad;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 unsigned char *check_here; 1583 unsigned char *check_here;
1584 1584
1585 int ref_row = ref_mv->as_mv.row; 1585 int ref_row = ref_mv->as_mv.row;
1586 int ref_col = ref_mv->as_mv.col; 1586 int ref_col = ref_mv->as_mv.col;
1587 1587
1588 int row_min = ref_row - distance; 1588 int row_min = ref_row - distance;
1589 int row_max = ref_row + distance; 1589 int row_max = ref_row + distance;
1590 int col_min = ref_col - distance; 1590 int col_min = ref_col - distance;
1591 int col_max = ref_col + distance; 1591 int col_max = ref_col + distance;
1592 1592
1593 DECLARE_ALIGNED_ARRAY(16, unsigned short, sad_array8, 8); 1593 // TODO(johannkoenig): check if this alignment is necessary.
1594 DECLARE_ALIGNED(16, unsigned int, sad_array8[8]);
1594 unsigned int sad_array[3]; 1595 unsigned int sad_array[3];
1595 1596
1596 int *mvsadcost[2]; 1597 int *mvsadcost[2];
1597 int_mv fcenter_mv; 1598 int_mv fcenter_mv;
1598 1599
1599 mvsadcost[0] = x->mvsadcost[0]; 1600 mvsadcost[0] = x->mvsadcost[0];
1600 mvsadcost[1] = x->mvsadcost[1]; 1601 mvsadcost[1] = x->mvsadcost[1];
1601 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; 1602 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1602 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; 1603 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1603 1604
1604 /* Work out the mid point for the search */ 1605 /* Work out the mid point for the search */
1605 in_what = base_pre + d->offset; 1606 in_what = base_pre + d->offset;
1606 bestaddress = in_what + (ref_row * pre_stride) + ref_col; 1607 bestaddress = in_what + (ref_row * pre_stride) + ref_col;
1607 1608
1608 best_mv->as_mv.row = ref_row; 1609 best_mv->as_mv.row = ref_row;
1609 best_mv->as_mv.col = ref_col; 1610 best_mv->as_mv.col = ref_col;
1610 1611
1611 /* Baseline value at the centre */ 1612 /* Baseline value at the centre */
1612 bestsad = fn_ptr->sdf(what, what_stride, 1613 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
1613 bestaddress, in_what_stride, UINT_MAX)
1614 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); 1614 + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
1615 1615
1616 /* Apply further limits to prevent us looking using vectors that stretch 1616 /* Apply further limits to prevent us looking using vectors that stretch
1617 * beyond the UMV border 1617 * beyond the UMV border
1618 */ 1618 */
1619 if (col_min < x->mv_col_min) 1619 if (col_min < x->mv_col_min)
1620 col_min = x->mv_col_min; 1620 col_min = x->mv_col_min;
1621 1621
1622 if (col_max > x->mv_col_max) 1622 if (col_max > x->mv_col_max)
1623 col_max = x->mv_col_max; 1623 col_max = x->mv_col_max;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1689 } 1689 }
1690 } 1690 }
1691 1691
1692 check_here++; 1692 check_here++;
1693 c++; 1693 c++;
1694 } 1694 }
1695 } 1695 }
1696 1696
1697 while (c < col_max) 1697 while (c < col_max)
1698 { 1698 {
1699 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride , bestsad); 1699 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride );
1700 1700
1701 if (thissad < bestsad) 1701 if (thissad < bestsad)
1702 { 1702 {
1703 this_mv.as_mv.col = c; 1703 this_mv.as_mv.col = c;
1704 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, 1704 thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
1705 mvsadcost, sad_per_bit); 1705 mvsadcost, sad_per_bit);
1706 1706
1707 if (thissad < bestsad) 1707 if (thissad < bestsad)
1708 { 1708 {
1709 bestsad = thissad; 1709 bestsad = thissad;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1747 unsigned int thissad; 1747 unsigned int thissad;
1748 1748
1749 int *mvsadcost[2]; 1749 int *mvsadcost[2];
1750 int_mv fcenter_mv; 1750 int_mv fcenter_mv;
1751 1751
1752 mvsadcost[0] = x->mvsadcost[0]; 1752 mvsadcost[0] = x->mvsadcost[0];
1753 mvsadcost[1] = x->mvsadcost[1]; 1753 mvsadcost[1] = x->mvsadcost[1];
1754 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; 1754 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1755 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; 1755 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1756 1756
1757 bestsad = fn_ptr->sdf(what, what_stride, best_address, 1757 bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
1758 in_what_stride, UINT_MAX)
1759 + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit); 1758 + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
1760 1759
1761 for (i=0; i<search_range; i++) 1760 for (i=0; i<search_range; i++)
1762 { 1761 {
1763 int best_site = -1; 1762 int best_site = -1;
1764 1763
1765 for (j = 0 ; j < 4 ; j++) 1764 for (j = 0 ; j < 4 ; j++)
1766 { 1765 {
1767 this_row_offset = ref_mv->as_mv.row + neighbors[j].row; 1766 this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
1768 this_col_offset = ref_mv->as_mv.col + neighbors[j].col; 1767 this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
1769 1768
1770 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_co l_max) && 1769 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_co l_max) &&
1771 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_ma x)) 1770 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_ma x))
1772 { 1771 {
1773 check_here = (neighbors[j].row)*in_what_stride + neighbors[j].co l + best_address; 1772 check_here = (neighbors[j].row)*in_what_stride + neighbors[j].co l + best_address;
1774 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_st ride, bestsad); 1773 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_st ride);
1775 1774
1776 if (thissad < bestsad) 1775 if (thissad < bestsad)
1777 { 1776 {
1778 this_mv.as_mv.row = this_row_offset; 1777 this_mv.as_mv.row = this_row_offset;
1779 this_mv.as_mv.col = this_col_offset; 1778 this_mv.as_mv.col = this_col_offset;
1780 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit); 1779 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1781 1780
1782 if (thissad < bestsad) 1781 if (thissad < bestsad)
1783 { 1782 {
1784 bestsad = thissad; 1783 bestsad = thissad;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1827 unsigned int thissad; 1826 unsigned int thissad;
1828 1827
1829 int *mvsadcost[2]; 1828 int *mvsadcost[2];
1830 int_mv fcenter_mv; 1829 int_mv fcenter_mv;
1831 1830
1832 mvsadcost[0] = x->mvsadcost[0]; 1831 mvsadcost[0] = x->mvsadcost[0];
1833 mvsadcost[1] = x->mvsadcost[1]; 1832 mvsadcost[1] = x->mvsadcost[1];
1834 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; 1833 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1835 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; 1834 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1836 1835
1837 bestsad = fn_ptr->sdf(what, what_stride, best_address, 1836 bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
1838 in_what_stride, UINT_MAX)
1839 + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit); 1837 + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
1840 1838
1841 for (i=0; i<search_range; i++) 1839 for (i=0; i<search_range; i++)
1842 { 1840 {
1843 int best_site = -1; 1841 int best_site = -1;
1844 int all_in = 1; 1842 int all_in = 1;
1845 1843
1846 all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min); 1844 all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min);
1847 all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max); 1845 all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max);
1848 all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min); 1846 all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min);
(...skipping 30 matching lines...) Expand all
1879 { 1877 {
1880 for (j = 0 ; j < 4 ; j++) 1878 for (j = 0 ; j < 4 ; j++)
1881 { 1879 {
1882 this_row_offset = ref_mv->as_mv.row + neighbors[j].row; 1880 this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
1883 this_col_offset = ref_mv->as_mv.col + neighbors[j].col; 1881 this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
1884 1882
1885 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->m v_col_max) && 1883 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->m v_col_max) &&
1886 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_ro w_max)) 1884 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_ro w_max))
1887 { 1885 {
1888 check_here = (neighbors[j].row)*in_what_stride + neighbors[j ].col + best_address; 1886 check_here = (neighbors[j].row)*in_what_stride + neighbors[j ].col + best_address;
1889 thissad = fn_ptr->sdf(what, what_stride, check_here , in_wha t_stride, bestsad); 1887 thissad = fn_ptr->sdf(what, what_stride, check_here , in_wha t_stride);
1890 1888
1891 if (thissad < bestsad) 1889 if (thissad < bestsad)
1892 { 1890 {
1893 this_mv.as_mv.row = this_row_offset; 1891 this_mv.as_mv.row = this_row_offset;
1894 this_mv.as_mv.col = this_col_offset; 1892 this_mv.as_mv.col = this_col_offset;
1895 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadco st, error_per_bit); 1893 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadco st, error_per_bit);
1896 1894
1897 if (thissad < bestsad) 1895 if (thissad < bestsad)
1898 { 1896 {
1899 bestsad = thissad; 1897 bestsad = thissad;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 } 1969 }
1972 1970
1973 fprintf(f, "};\n"); 1971 fprintf(f, "};\n");
1974 fclose(f); 1972 fclose(f);
1975 } 1973 }
1976 1974
1977 /* MV ref count VP8_ENTROPY_STATS stats code */ 1975 /* MV ref count VP8_ENTROPY_STATS stats code */
1978 #ifdef VP8_ENTROPY_STATS 1976 #ifdef VP8_ENTROPY_STATS
1979 void init_mv_ref_counts() 1977 void init_mv_ref_counts()
1980 { 1978 {
1981 vpx_memset(mv_ref_ct, 0, sizeof(mv_ref_ct)); 1979 memset(mv_ref_ct, 0, sizeof(mv_ref_ct));
1982 vpx_memset(mv_mode_cts, 0, sizeof(mv_mode_cts)); 1980 memset(mv_mode_cts, 0, sizeof(mv_mode_cts));
1983 } 1981 }
1984 1982
1985 void accum_mv_refs(MB_PREDICTION_MODE m, const int ct[4]) 1983 void accum_mv_refs(MB_PREDICTION_MODE m, const int ct[4])
1986 { 1984 {
1987 if (m == ZEROMV) 1985 if (m == ZEROMV)
1988 { 1986 {
1989 ++mv_ref_ct [ct[0]] [0] [0]; 1987 ++mv_ref_ct [ct[0]] [0] [0];
1990 ++mv_mode_cts[0][0]; 1988 ++mv_mode_cts[0][0];
1991 } 1989 }
1992 else 1990 else
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 ++mv_mode_cts[3][1]; 2023 ++mv_mode_cts[3][1];
2026 } 2024 }
2027 } 2025 }
2028 } 2026 }
2029 } 2027 }
2030 } 2028 }
2031 2029
2032 #endif/* END MV ref count VP8_ENTROPY_STATS stats code */ 2030 #endif/* END MV ref count VP8_ENTROPY_STATS stats code */
2033 2031
2034 #endif 2032 #endif
OLDNEW
« no previous file with comments | « source/libvpx/vp8/encoder/firstpass.c ('k') | source/libvpx/vp8/encoder/onyx_if.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698