1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 #include <stdlib.h> 13 14 unsigned int vp8_sad16x16_c( 15 unsigned char *src_ptr, 16 int src_stride, 17 unsigned char *ref_ptr, 18 int ref_stride, 19 int max_sad) 20 { 21 22 int r, c; 23 unsigned int sad = 0; 24 25 for (r = 0; r < 16; r++) 26 { 27 for (c = 0; c < 16; c++) 28 { 29 sad += abs(src_ptr[c] - ref_ptr[c]); 30 } 31 32 src_ptr += src_stride; 33 ref_ptr += ref_stride; 34 } 35 36 return sad; 37 } 38 39 40 static __inline 41 unsigned int sad_mx_n_c( 42 unsigned char *src_ptr, 43 int src_stride, 44 unsigned char *ref_ptr, 45 int ref_stride, 46 int m, 47 int n) 48 { 49 50 int r, c; 51 unsigned int sad = 0; 52 53 for (r = 0; r < n; r++) 54 { 55 for (c = 0; c < m; c++) 56 { 57 sad += abs(src_ptr[c] - ref_ptr[c]); 58 } 59 60 src_ptr += src_stride; 61 ref_ptr += ref_stride; 62 } 63 64 return sad; 65 } 66 67 68 unsigned int vp8_sad8x8_c( 69 unsigned char *src_ptr, 70 int src_stride, 71 unsigned char *ref_ptr, 72 int ref_stride, 73 int max_sad) 74 { 75 76 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 8); 77 } 78 79 80 unsigned int vp8_sad16x8_c( 81 unsigned char *src_ptr, 82 int src_stride, 83 unsigned char *ref_ptr, 84 int ref_stride, 85 int max_sad) 86 { 87 88 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 8); 89 90 } 91 92 93 unsigned int vp8_sad8x16_c( 94 unsigned char *src_ptr, 95 int src_stride, 96 unsigned char *ref_ptr, 97 int ref_stride, 98 int max_sad) 99 { 100 101 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 8, 16); 102 } 103 104 105 unsigned int vp8_sad4x4_c( 106 unsigned char *src_ptr, 107 int src_stride, 108 unsigned char *ref_ptr, 109 int ref_stride, 110 int max_sad) 111 { 112 113 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 4, 4); 114 } 115 116 void vp8_sad16x16x3_c( 117 unsigned char *src_ptr, 118 int src_stride, 119 unsigned char *ref_ptr, 120 int ref_stride, 121 unsigned int *sad_array 122 ) 123 { 124 sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 125 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 126 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 127 } 128 129 void vp8_sad16x8x3_c( 130 unsigned char *src_ptr, 131 int src_stride, 132 unsigned char *ref_ptr, 133 int ref_stride, 134 unsigned int *sad_array 135 ) 136 { 137 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 138 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 139 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 140 } 141 142 void vp8_sad8x8x3_c( 143 unsigned char *src_ptr, 144 int src_stride, 145 unsigned char *ref_ptr, 146 int ref_stride, 147 unsigned int *sad_array 148 ) 149 { 150 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 151 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 152 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 153 } 154 155 void vp8_sad8x16x3_c( 156 unsigned char *src_ptr, 157 int src_stride, 158 unsigned char *ref_ptr, 159 int ref_stride, 160 unsigned int *sad_array 161 ) 162 { 163 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 164 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 165 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 166 } 167 168 void vp8_sad4x4x3_c( 169 unsigned char *src_ptr, 170 int src_stride, 171 unsigned char *ref_ptr, 172 int ref_stride, 173 unsigned int *sad_array 174 ) 175 { 176 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 177 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 178 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 179 } 180 181 void vp8_sad16x16x4d_c( 182 unsigned char *src_ptr, 183 int src_stride, 184 unsigned char *ref_ptr[], 185 int ref_stride, 186 unsigned int *sad_array 187 ) 188 { 189 sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 190 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 191 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 192 sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 193 } 194 195 void vp8_sad16x8x4d_c( 196 unsigned char *src_ptr, 197 int src_stride, 198 unsigned char *ref_ptr[], 199 int ref_stride, 200 unsigned int *sad_array 201 ) 202 { 203 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 204 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 205 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 206 sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 207 } 208 209 void vp8_sad8x8x4d_c( 210 unsigned char *src_ptr, 211 int src_stride, 212 unsigned char *ref_ptr[], 213 int ref_stride, 214 unsigned int *sad_array 215 ) 216 { 217 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 218 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 219 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 220 sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 221 } 222 223 void vp8_sad8x16x4d_c( 224 unsigned char *src_ptr, 225 int src_stride, 226 unsigned char *ref_ptr[], 227 int ref_stride, 228 unsigned int *sad_array 229 ) 230 { 231 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 232 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 233 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 234 sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 235 } 236 237 void vp8_sad4x4x4d_c( 238 unsigned char *src_ptr, 239 int src_stride, 240 unsigned char *ref_ptr[], 241 int ref_stride, 242 unsigned int *sad_array 243 ) 244 { 245 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 246 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 247 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 248 sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 249 } 250