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 <limits.h> 13 #include <stdlib.h> 14 #include "vpx_config.h" 15 #include "vpx/vpx_integer.h" 16 17 static unsigned int sad_mx_n_c(const unsigned char *src_ptr, int src_stride, 18 const unsigned char *ref_ptr, int ref_stride, 19 unsigned int max_sad, int m, int n) 20 { 21 int r, c; 22 unsigned int sad = 0; 23 24 for (r = 0; r < n; r++) 25 { 26 for (c = 0; c < m; c++) 27 { 28 sad += abs(src_ptr[c] - ref_ptr[c]); 29 } 30 31 if (sad > max_sad) 32 break; 33 34 src_ptr += src_stride; 35 ref_ptr += ref_stride; 36 } 37 38 return sad; 39 } 40 41 /* max_sad is provided as an optional optimization point. Alternative 42 * implementations of these functions are not required to check it. 43 */ 44 45 unsigned int vp8_sad16x16_c(const unsigned char *src_ptr, int src_stride, 46 const unsigned char *ref_ptr, int ref_stride, 47 unsigned int max_sad) 48 { 49 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 16); 50 } 51 52 unsigned int vp8_sad8x8_c(const unsigned char *src_ptr, int src_stride, 53 const unsigned char *ref_ptr, int ref_stride, 54 unsigned int max_sad) 55 { 56 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 8); 57 } 58 59 unsigned int vp8_sad16x8_c(const unsigned char *src_ptr, int src_stride, 60 const unsigned char *ref_ptr, int ref_stride, 61 unsigned int max_sad) 62 { 63 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 8); 64 65 } 66 67 unsigned int vp8_sad8x16_c(const unsigned char *src_ptr, int src_stride, 68 const unsigned char *ref_ptr, int ref_stride, 69 unsigned int max_sad) 70 { 71 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 16); 72 } 73 74 unsigned int vp8_sad4x4_c(const unsigned char *src_ptr, int src_stride, 75 const unsigned char *ref_ptr, int ref_stride, 76 unsigned int max_sad) 77 { 78 return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 4, 4); 79 } 80 81 void vp8_sad16x16x3_c(const unsigned char *src_ptr, int src_stride, 82 const unsigned char *ref_ptr, int ref_stride, 83 unsigned int *sad_array) 84 { 85 sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 86 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 87 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 88 } 89 90 void vp8_sad16x16x8_c(const unsigned char *src_ptr, int src_stride, 91 const unsigned char *ref_ptr, int ref_stride, 92 unsigned short *sad_array) 93 { 94 sad_array[0] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 95 sad_array[1] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 96 sad_array[2] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 97 sad_array[3] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 98 sad_array[4] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 99 sad_array[5] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 100 sad_array[6] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 101 sad_array[7] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 102 } 103 104 void vp8_sad16x8x3_c(const unsigned char *src_ptr, int src_stride, 105 const unsigned char *ref_ptr, int ref_stride, 106 unsigned int *sad_array) 107 { 108 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 109 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 110 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 111 } 112 113 void vp8_sad16x8x8_c(const unsigned char *src_ptr, int src_stride, 114 const unsigned char *ref_ptr, int ref_stride, 115 unsigned short *sad_array) 116 { 117 sad_array[0] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 118 sad_array[1] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 119 sad_array[2] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 120 sad_array[3] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 121 sad_array[4] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 122 sad_array[5] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 123 sad_array[6] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 124 sad_array[7] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 125 } 126 127 void vp8_sad8x8x3_c(const unsigned char *src_ptr, int src_stride, 128 const unsigned char *ref_ptr, int ref_stride, 129 unsigned int *sad_array) 130 { 131 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 132 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 133 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 134 } 135 136 void vp8_sad8x8x8_c(const unsigned char *src_ptr, int src_stride, 137 const unsigned char *ref_ptr, int ref_stride, 138 unsigned short *sad_array) 139 { 140 sad_array[0] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 141 sad_array[1] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 142 sad_array[2] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 143 sad_array[3] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 144 sad_array[4] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 145 sad_array[5] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 146 sad_array[6] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 147 sad_array[7] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 148 } 149 150 void vp8_sad8x16x3_c(const unsigned char *src_ptr, int src_stride, 151 const unsigned char *ref_ptr, int ref_stride, 152 unsigned int *sad_array) 153 { 154 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 155 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 156 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 157 } 158 159 void vp8_sad8x16x8_c(const unsigned char *src_ptr, int src_stride, 160 const unsigned char *ref_ptr, int ref_stride, 161 unsigned short *sad_array) 162 { 163 sad_array[0] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 164 sad_array[1] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 165 sad_array[2] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 166 sad_array[3] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 167 sad_array[4] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 168 sad_array[5] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 169 sad_array[6] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 170 sad_array[7] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 171 } 172 173 void vp8_sad4x4x3_c(const unsigned char *src_ptr, int src_stride, 174 const unsigned char *ref_ptr, int ref_stride, 175 unsigned int *sad_array) 176 { 177 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 178 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 179 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 180 } 181 182 void vp8_sad4x4x8_c(const unsigned char *src_ptr, int src_stride, 183 const unsigned char *ref_ptr, int ref_stride, 184 unsigned short *sad_array) 185 { 186 sad_array[0] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 187 sad_array[1] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 188 sad_array[2] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 189 sad_array[3] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 190 sad_array[4] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 191 sad_array[5] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 192 sad_array[6] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 193 sad_array[7] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 194 } 195 196 void vp8_sad16x16x4d_c(const unsigned char *src_ptr, int src_stride, 197 const unsigned char * const ref_ptr[], int ref_stride, 198 unsigned int *sad_array) 199 { 200 sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 201 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 202 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 203 sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 204 } 205 206 void vp8_sad16x8x4d_c(const unsigned char *src_ptr, int src_stride, 207 const unsigned char * const ref_ptr[], int ref_stride, 208 unsigned int *sad_array) 209 { 210 sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 211 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 212 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 213 sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 214 } 215 216 void vp8_sad8x8x4d_c(const unsigned char *src_ptr, int src_stride, 217 const unsigned char * const ref_ptr[], int ref_stride, 218 unsigned int *sad_array) 219 { 220 sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 221 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 222 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 223 sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 224 } 225 226 void vp8_sad8x16x4d_c(const unsigned char *src_ptr, int src_stride, 227 const unsigned char * const ref_ptr[], int ref_stride, 228 unsigned int *sad_array) 229 { 230 sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 231 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 232 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 233 sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 234 } 235 236 void vp8_sad4x4x4d_c(const unsigned char *src_ptr, int src_stride, 237 const unsigned char * const ref_ptr[], int ref_stride, 238 unsigned int *sad_array) 239 { 240 sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 241 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 242 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 243 sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 244 } 245 246 /* Copy 2 macroblocks to a buffer */ 247 void vp8_copy32xn_c(unsigned char *src_ptr, int src_stride, 248 unsigned char *dst_ptr, int dst_stride, 249 int height) 250 { 251 int r; 252 253 for (r = 0; r < height; r++) 254 { 255 #if !(CONFIG_FAST_UNALIGNED) 256 dst_ptr[0] = src_ptr[0]; 257 dst_ptr[1] = src_ptr[1]; 258 dst_ptr[2] = src_ptr[2]; 259 dst_ptr[3] = src_ptr[3]; 260 dst_ptr[4] = src_ptr[4]; 261 dst_ptr[5] = src_ptr[5]; 262 dst_ptr[6] = src_ptr[6]; 263 dst_ptr[7] = src_ptr[7]; 264 dst_ptr[8] = src_ptr[8]; 265 dst_ptr[9] = src_ptr[9]; 266 dst_ptr[10] = src_ptr[10]; 267 dst_ptr[11] = src_ptr[11]; 268 dst_ptr[12] = src_ptr[12]; 269 dst_ptr[13] = src_ptr[13]; 270 dst_ptr[14] = src_ptr[14]; 271 dst_ptr[15] = src_ptr[15]; 272 dst_ptr[16] = src_ptr[16]; 273 dst_ptr[17] = src_ptr[17]; 274 dst_ptr[18] = src_ptr[18]; 275 dst_ptr[19] = src_ptr[19]; 276 dst_ptr[20] = src_ptr[20]; 277 dst_ptr[21] = src_ptr[21]; 278 dst_ptr[22] = src_ptr[22]; 279 dst_ptr[23] = src_ptr[23]; 280 dst_ptr[24] = src_ptr[24]; 281 dst_ptr[25] = src_ptr[25]; 282 dst_ptr[26] = src_ptr[26]; 283 dst_ptr[27] = src_ptr[27]; 284 dst_ptr[28] = src_ptr[28]; 285 dst_ptr[29] = src_ptr[29]; 286 dst_ptr[30] = src_ptr[30]; 287 dst_ptr[31] = src_ptr[31]; 288 #else 289 ((uint32_t *)dst_ptr)[0] = ((uint32_t *)src_ptr)[0] ; 290 ((uint32_t *)dst_ptr)[1] = ((uint32_t *)src_ptr)[1] ; 291 ((uint32_t *)dst_ptr)[2] = ((uint32_t *)src_ptr)[2] ; 292 ((uint32_t *)dst_ptr)[3] = ((uint32_t *)src_ptr)[3] ; 293 ((uint32_t *)dst_ptr)[4] = ((uint32_t *)src_ptr)[4] ; 294 ((uint32_t *)dst_ptr)[5] = ((uint32_t *)src_ptr)[5] ; 295 ((uint32_t *)dst_ptr)[6] = ((uint32_t *)src_ptr)[6] ; 296 ((uint32_t *)dst_ptr)[7] = ((uint32_t *)src_ptr)[7] ; 297 #endif 298 src_ptr += src_stride; 299 dst_ptr += dst_stride; 300 301 } 302 } 303