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 #include <stdlib.h> 12 13 #include "./vp9_rtcd.h" 14 #include "./vpx_config.h" 15 16 #include "vpx/vpx_integer.h" 17 #include "vp9/encoder/vp9_variance.h" 18 19 static INLINE unsigned int sad(const uint8_t *a, int a_stride, 20 const uint8_t *b, int b_stride, 21 int width, int height) { 22 int y, x; 23 unsigned int sad = 0; 24 25 for (y = 0; y < height; y++) { 26 for (x = 0; x < width; x++) 27 sad += abs(a[x] - b[x]); 28 29 a += a_stride; 30 b += b_stride; 31 } 32 33 return sad; 34 } 35 36 #define sad_mxn_func(m, n) \ 37 unsigned int vp9_sad##m##x##n##_c(const uint8_t *src_ptr, int src_stride, \ 38 const uint8_t *ref_ptr, int ref_stride, \ 39 unsigned int max_sad) { \ 40 return sad(src_ptr, src_stride, ref_ptr, ref_stride, m, n); \ 41 } \ 42 unsigned int vp9_sad##m##x##n##_avg_c(const uint8_t *src_ptr, int src_stride, \ 43 const uint8_t *ref_ptr, int ref_stride, \ 44 const uint8_t *second_pred, \ 45 unsigned int max_sad) { \ 46 uint8_t comp_pred[m * n]; \ 47 vp9_comp_avg_pred(comp_pred, second_pred, m, n, ref_ptr, ref_stride); \ 48 return sad(src_ptr, src_stride, comp_pred, m, m, n); \ 49 } 50 51 sad_mxn_func(64, 64) 52 sad_mxn_func(64, 32) 53 sad_mxn_func(32, 64) 54 sad_mxn_func(32, 32) 55 sad_mxn_func(32, 16) 56 sad_mxn_func(16, 32) 57 sad_mxn_func(16, 16) 58 sad_mxn_func(16, 8) 59 sad_mxn_func(8, 16) 60 sad_mxn_func(8, 8) 61 sad_mxn_func(8, 4) 62 sad_mxn_func(4, 8) 63 sad_mxn_func(4, 4) 64 65 void vp9_sad64x32x4d_c(const uint8_t *src_ptr, int src_stride, 66 const uint8_t* const ref_ptr[], int ref_stride, 67 unsigned int *sad_array) { 68 int i; 69 for (i = 0; i < 4; ++i) 70 sad_array[i] = vp9_sad64x32(src_ptr, src_stride, ref_ptr[i], ref_stride, 71 0x7fffffff); 72 } 73 74 void vp9_sad32x64x4d_c(const uint8_t *src_ptr, int src_stride, 75 const uint8_t* const ref_ptr[], int ref_stride, 76 unsigned int *sad_array) { 77 int i; 78 for (i = 0; i < 4; ++i) 79 sad_array[i] = vp9_sad32x64(src_ptr, src_stride, ref_ptr[i], ref_stride, 80 0x7fffffff); 81 } 82 83 void vp9_sad32x16x4d_c(const uint8_t *src_ptr, int src_stride, 84 const uint8_t* const ref_ptr[], int ref_stride, 85 unsigned int *sad_array) { 86 int i; 87 for (i = 0; i < 4; ++i) 88 sad_array[i] = vp9_sad32x16(src_ptr, src_stride, ref_ptr[i], ref_stride, 89 0x7fffffff); 90 } 91 92 void vp9_sad16x32x4d_c(const uint8_t *src_ptr, int src_stride, 93 const uint8_t* const ref_ptr[], int ref_stride, 94 unsigned int *sad_array) { 95 int i; 96 for (i = 0; i < 4; ++i) 97 sad_array[i] = vp9_sad16x32(src_ptr, src_stride, ref_ptr[i], ref_stride, 98 0x7fffffff); 99 } 100 101 void vp9_sad64x64x3_c(const uint8_t *src_ptr, int src_stride, 102 const uint8_t *ref_ptr, int ref_stride, 103 unsigned int *sad_array) { 104 int i; 105 for (i = 0; i < 3; ++i) 106 sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + i, ref_stride, 107 0x7fffffff); 108 } 109 110 void vp9_sad32x32x3_c(const uint8_t *src_ptr, int src_stride, 111 const uint8_t *ref_ptr, int ref_stride, 112 unsigned int *sad_array) { 113 int i; 114 for (i = 0; i < 3; ++i) 115 sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr + i, ref_stride, 116 0x7fffffff); 117 } 118 119 void vp9_sad64x64x8_c(const uint8_t *src_ptr, int src_stride, 120 const uint8_t *ref_ptr, int ref_stride, 121 unsigned int *sad_array) { 122 int i; 123 for (i = 0; i < 8; ++i) 124 sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr + i, ref_stride, 125 0x7fffffff); 126 } 127 128 void vp9_sad32x32x8_c(const uint8_t *src_ptr, int src_stride, 129 const uint8_t *ref_ptr, int ref_stride, 130 unsigned int *sad_array) { 131 int i; 132 for (i = 0; i < 8; ++i) 133 sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr + i, ref_stride, 134 0x7fffffff); 135 } 136 137 void vp9_sad16x16x3_c(const uint8_t *src_ptr, int src_stride, 138 const uint8_t *ref_ptr, int ref_stride, 139 unsigned int *sad_array) { 140 int i; 141 for (i = 0; i < 3; ++i) 142 sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr + i, ref_stride, 143 0x7fffffff); 144 } 145 146 void vp9_sad16x16x8_c(const uint8_t *src_ptr, int src_stride, 147 const uint8_t *ref_ptr, int ref_stride, 148 uint32_t *sad_array) { 149 int i; 150 for (i = 0; i < 8; ++i) 151 sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr + i, ref_stride, 152 0x7fffffff); 153 } 154 155 void vp9_sad16x8x3_c(const uint8_t *src_ptr, int src_stride, 156 const uint8_t *ref_ptr, int ref_stride, 157 unsigned int *sad_array) { 158 int i; 159 for (i = 0; i < 3; ++i) 160 sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr + i, ref_stride, 161 0x7fffffff); 162 } 163 164 void vp9_sad16x8x8_c(const uint8_t *src_ptr, int src_stride, 165 const uint8_t *ref_ptr, int ref_stride, 166 uint32_t *sad_array) { 167 int i; 168 for (i = 0; i < 8; ++i) 169 sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr + i, ref_stride, 170 0x7fffffff); 171 } 172 173 void vp9_sad8x8x3_c(const uint8_t *src_ptr, int src_stride, 174 const uint8_t *ref_ptr, int ref_stride, 175 unsigned int *sad_array) { 176 int i; 177 for (i = 0; i < 3; ++i) 178 sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr + i, ref_stride, 179 0x7fffffff); 180 } 181 182 void vp9_sad8x8x8_c(const uint8_t *src_ptr, int src_stride, 183 const uint8_t *ref_ptr, int ref_stride, 184 uint32_t *sad_array) { 185 int i; 186 for (i = 0; i < 8; ++i) 187 sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr + i, ref_stride, 188 0x7fffffff); 189 } 190 191 void vp9_sad8x16x3_c(const uint8_t *src_ptr, int src_stride, 192 const uint8_t *ref_ptr, int ref_stride, 193 unsigned int *sad_array) { 194 int i; 195 for (i = 0; i < 3; ++i) 196 sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr + i, ref_stride, 197 0x7fffffff); 198 } 199 200 void vp9_sad8x16x8_c(const uint8_t *src_ptr, int src_stride, 201 const uint8_t *ref_ptr, int ref_stride, 202 uint32_t *sad_array) { 203 int i; 204 for (i = 0; i < 8; ++i) 205 sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr + i, ref_stride, 206 0x7fffffff); 207 } 208 209 void vp9_sad4x4x3_c(const uint8_t *src_ptr, int src_stride, 210 const uint8_t *ref_ptr, int ref_stride, 211 unsigned int *sad_array) { 212 int i; 213 for (i = 0; i < 3; ++i) 214 sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr + i, ref_stride, 215 0x7fffffff); 216 } 217 218 void vp9_sad4x4x8_c(const uint8_t *src_ptr, int src_stride, 219 const uint8_t *ref_ptr, int ref_stride, 220 uint32_t *sad_array) { 221 int i; 222 for (i = 0; i < 8; ++i) 223 sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr + i, ref_stride, 224 0x7fffffff); 225 } 226 227 void vp9_sad64x64x4d_c(const uint8_t *src_ptr, int src_stride, 228 const uint8_t* const ref_ptr[], int ref_stride, 229 unsigned int *sad_array) { 230 int i; 231 for (i = 0; i < 4; ++i) 232 sad_array[i] = vp9_sad64x64(src_ptr, src_stride, ref_ptr[i], ref_stride, 233 0x7fffffff); 234 } 235 236 void vp9_sad32x32x4d_c(const uint8_t *src_ptr, int src_stride, 237 const uint8_t* const ref_ptr[], int ref_stride, 238 unsigned int *sad_array) { 239 int i; 240 for (i = 0; i < 4; ++i) 241 sad_array[i] = vp9_sad32x32(src_ptr, src_stride, ref_ptr[i], ref_stride, 242 0x7fffffff); 243 } 244 245 void vp9_sad16x16x4d_c(const uint8_t *src_ptr, int src_stride, 246 const uint8_t* const ref_ptr[], int ref_stride, 247 unsigned int *sad_array) { 248 int i; 249 for (i = 0; i < 4; ++i) 250 sad_array[i] = vp9_sad16x16(src_ptr, src_stride, ref_ptr[i], ref_stride, 251 0x7fffffff); 252 } 253 254 void vp9_sad16x8x4d_c(const uint8_t *src_ptr, int src_stride, 255 const uint8_t* const ref_ptr[], int ref_stride, 256 unsigned int *sad_array) { 257 int i; 258 for (i = 0; i < 4; ++i) 259 sad_array[i] = vp9_sad16x8(src_ptr, src_stride, ref_ptr[i], ref_stride, 260 0x7fffffff); 261 } 262 263 void vp9_sad8x8x4d_c(const uint8_t *src_ptr, int src_stride, 264 const uint8_t* const ref_ptr[], int ref_stride, 265 unsigned int *sad_array) { 266 int i; 267 for (i = 0; i < 4; ++i) 268 sad_array[i] = vp9_sad8x8(src_ptr, src_stride, ref_ptr[i], ref_stride, 269 0x7fffffff); 270 } 271 272 void vp9_sad8x16x4d_c(const uint8_t *src_ptr, int src_stride, 273 const uint8_t* const ref_ptr[], int ref_stride, 274 unsigned int *sad_array) { 275 int i; 276 for (i = 0; i < 4; ++i) 277 sad_array[i] = vp9_sad8x16(src_ptr, src_stride, ref_ptr[i], ref_stride, 278 0x7fffffff); 279 } 280 281 void vp9_sad8x4x4d_c(const uint8_t *src_ptr, int src_stride, 282 const uint8_t* const ref_ptr[], int ref_stride, 283 unsigned int *sad_array) { 284 int i; 285 for (i = 0; i < 4; ++i) 286 sad_array[i] = vp9_sad8x4(src_ptr, src_stride, ref_ptr[i], ref_stride, 287 0x7fffffff); 288 } 289 290 void vp9_sad8x4x8_c(const uint8_t *src_ptr, int src_stride, 291 const uint8_t *ref_ptr, int ref_stride, 292 uint32_t *sad_array) { 293 int i; 294 for (i = 0; i < 8; ++i) 295 sad_array[i] = vp9_sad8x4(src_ptr, src_stride, ref_ptr + i, ref_stride, 296 0x7fffffff); 297 } 298 299 void vp9_sad4x8x4d_c(const uint8_t *src_ptr, int src_stride, 300 const uint8_t* const ref_ptr[], int ref_stride, 301 unsigned int *sad_array) { 302 int i; 303 for (i = 0; i < 4; ++i) 304 sad_array[i] = vp9_sad4x8(src_ptr, src_stride, ref_ptr[i], ref_stride, 305 0x7fffffff); 306 } 307 308 void vp9_sad4x8x8_c(const uint8_t *src_ptr, int src_stride, 309 const uint8_t *ref_ptr, int ref_stride, 310 uint32_t *sad_array) { 311 int i; 312 for (i = 0; i < 8; ++i) 313 sad_array[i] = vp9_sad4x8(src_ptr, src_stride, ref_ptr + i, ref_stride, 314 0x7fffffff); 315 } 316 317 void vp9_sad4x4x4d_c(const uint8_t *src_ptr, int src_stride, 318 const uint8_t* const ref_ptr[], int ref_stride, 319 unsigned int *sad_array) { 320 int i; 321 for (i = 0; i < 4; ++i) 322 sad_array[i] = vp9_sad4x4(src_ptr, src_stride, ref_ptr[i], ref_stride, 323 0x7fffffff); 324 } 325