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 14unsigned int vp8_sad16x16_c( 15 const unsigned char *src_ptr, 16 int src_stride, 17 const 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 40static __inline 41unsigned int sad_mx_n_c( 42 const unsigned char *src_ptr, 43 int src_stride, 44 const 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 68unsigned int vp8_sad8x8_c( 69 const unsigned char *src_ptr, 70 int src_stride, 71 const 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 80unsigned int vp8_sad16x8_c( 81 const unsigned char *src_ptr, 82 int src_stride, 83 const 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 93unsigned int vp8_sad8x16_c( 94 const unsigned char *src_ptr, 95 int src_stride, 96 const 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 105unsigned int vp8_sad4x4_c( 106 const unsigned char *src_ptr, 107 int src_stride, 108 const 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 116void vp8_sad16x16x3_c( 117 const unsigned char *src_ptr, 118 int src_stride, 119 const 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 129void vp8_sad16x16x8_c( 130 const unsigned char *src_ptr, 131 int src_stride, 132 const unsigned char *ref_ptr, 133 int ref_stride, 134 unsigned short *sad_array 135) 136{ 137 sad_array[0] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 138 sad_array[1] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 139 sad_array[2] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 140 sad_array[3] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 3 , ref_stride, 0x7fffffff); 141 sad_array[4] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); 142 sad_array[5] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); 143 sad_array[6] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 6 , ref_stride, 0x7fffffff); 144 sad_array[7] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); 145} 146 147void vp8_sad16x8x3_c( 148 const unsigned char *src_ptr, 149 int src_stride, 150 const unsigned char *ref_ptr, 151 int ref_stride, 152 unsigned int *sad_array 153) 154{ 155 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 156 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 157 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 158} 159 160void vp8_sad16x8x8_c( 161 const unsigned char *src_ptr, 162 int src_stride, 163 const unsigned char *ref_ptr, 164 int ref_stride, 165 unsigned short *sad_array 166) 167{ 168 sad_array[0] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 169 sad_array[1] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 170 sad_array[2] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 171 sad_array[3] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 3 , ref_stride, 0x7fffffff); 172 sad_array[4] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); 173 sad_array[5] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); 174 sad_array[6] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 6 , ref_stride, 0x7fffffff); 175 sad_array[7] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); 176} 177 178void vp8_sad8x8x3_c( 179 const unsigned char *src_ptr, 180 int src_stride, 181 const unsigned char *ref_ptr, 182 int ref_stride, 183 unsigned int *sad_array 184) 185{ 186 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 187 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 188 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 189} 190 191void vp8_sad8x8x8_c( 192 const unsigned char *src_ptr, 193 int src_stride, 194 const unsigned char *ref_ptr, 195 int ref_stride, 196 unsigned short *sad_array 197) 198{ 199 sad_array[0] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 200 sad_array[1] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 201 sad_array[2] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 202 sad_array[3] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 3 , ref_stride, 0x7fffffff); 203 sad_array[4] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); 204 sad_array[5] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); 205 sad_array[6] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 6 , ref_stride, 0x7fffffff); 206 sad_array[7] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); 207} 208 209void vp8_sad8x16x3_c( 210 const unsigned char *src_ptr, 211 int src_stride, 212 const unsigned char *ref_ptr, 213 int ref_stride, 214 unsigned int *sad_array 215) 216{ 217 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 218 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 219 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 220} 221 222void vp8_sad8x16x8_c( 223 const unsigned char *src_ptr, 224 int src_stride, 225 const unsigned char *ref_ptr, 226 int ref_stride, 227 unsigned short *sad_array 228) 229{ 230 sad_array[0] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 231 sad_array[1] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 232 sad_array[2] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 233 sad_array[3] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 3 , ref_stride, 0x7fffffff); 234 sad_array[4] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); 235 sad_array[5] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); 236 sad_array[6] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 6 , ref_stride, 0x7fffffff); 237 sad_array[7] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); 238} 239 240void vp8_sad4x4x3_c( 241 const unsigned char *src_ptr, 242 int src_stride, 243 const unsigned char *ref_ptr, 244 int ref_stride, 245 unsigned int *sad_array 246) 247{ 248 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 249 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 250 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 251} 252 253void vp8_sad4x4x8_c( 254 const unsigned char *src_ptr, 255 int src_stride, 256 const unsigned char *ref_ptr, 257 int ref_stride, 258 unsigned short *sad_array 259) 260{ 261 sad_array[0] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr , ref_stride, 0x7fffffff); 262 sad_array[1] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); 263 sad_array[2] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); 264 sad_array[3] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 3 , ref_stride, 0x7fffffff); 265 sad_array[4] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); 266 sad_array[5] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); 267 sad_array[6] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 6 , ref_stride, 0x7fffffff); 268 sad_array[7] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); 269} 270 271void vp8_sad16x16x4d_c( 272 const unsigned char *src_ptr, 273 int src_stride, 274 unsigned char *ref_ptr[], 275 int ref_stride, 276 unsigned int *sad_array 277) 278{ 279 sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 280 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 281 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 282 sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 283} 284 285void vp8_sad16x8x4d_c( 286 const unsigned char *src_ptr, 287 int src_stride, 288 unsigned char *ref_ptr[], 289 int ref_stride, 290 unsigned int *sad_array 291) 292{ 293 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 294 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 295 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 296 sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 297} 298 299void vp8_sad8x8x4d_c( 300 const unsigned char *src_ptr, 301 int src_stride, 302 unsigned char *ref_ptr[], 303 int ref_stride, 304 unsigned int *sad_array 305) 306{ 307 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 308 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 309 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 310 sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 311} 312 313void vp8_sad8x16x4d_c( 314 const unsigned char *src_ptr, 315 int src_stride, 316 unsigned char *ref_ptr[], 317 int ref_stride, 318 unsigned int *sad_array 319) 320{ 321 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 322 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 323 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 324 sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 325} 326 327void vp8_sad4x4x4d_c( 328 const unsigned char *src_ptr, 329 int src_stride, 330 unsigned char *ref_ptr[], 331 int ref_stride, 332 unsigned int *sad_array 333) 334{ 335 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); 336 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); 337 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); 338 sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); 339} 340