1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libvpx/vp8/common/sad_c.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,302 @@ 1.4 +/* 1.5 + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license 1.8 + * that can be found in the LICENSE file in the root of the source 1.9 + * tree. An additional intellectual property rights grant can be found 1.10 + * in the file PATENTS. All contributing project authors may 1.11 + * be found in the AUTHORS file in the root of the source tree. 1.12 + */ 1.13 + 1.14 + 1.15 +#include <limits.h> 1.16 +#include <stdlib.h> 1.17 +#include "vpx_config.h" 1.18 +#include "vpx/vpx_integer.h" 1.19 + 1.20 +static unsigned int sad_mx_n_c(const unsigned char *src_ptr, int src_stride, 1.21 + const unsigned char *ref_ptr, int ref_stride, 1.22 + unsigned int max_sad, int m, int n) 1.23 +{ 1.24 + int r, c; 1.25 + unsigned int sad = 0; 1.26 + 1.27 + for (r = 0; r < n; r++) 1.28 + { 1.29 + for (c = 0; c < m; c++) 1.30 + { 1.31 + sad += abs(src_ptr[c] - ref_ptr[c]); 1.32 + } 1.33 + 1.34 + if (sad > max_sad) 1.35 + break; 1.36 + 1.37 + src_ptr += src_stride; 1.38 + ref_ptr += ref_stride; 1.39 + } 1.40 + 1.41 + return sad; 1.42 +} 1.43 + 1.44 +/* max_sad is provided as an optional optimization point. Alternative 1.45 + * implementations of these functions are not required to check it. 1.46 + */ 1.47 + 1.48 +unsigned int vp8_sad16x16_c(const unsigned char *src_ptr, int src_stride, 1.49 + const unsigned char *ref_ptr, int ref_stride, 1.50 + unsigned int max_sad) 1.51 +{ 1.52 + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 16); 1.53 +} 1.54 + 1.55 +unsigned int vp8_sad8x8_c(const unsigned char *src_ptr, int src_stride, 1.56 + const unsigned char *ref_ptr, int ref_stride, 1.57 + unsigned int max_sad) 1.58 +{ 1.59 + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 8); 1.60 +} 1.61 + 1.62 +unsigned int vp8_sad16x8_c(const unsigned char *src_ptr, int src_stride, 1.63 + const unsigned char *ref_ptr, int ref_stride, 1.64 + unsigned int max_sad) 1.65 +{ 1.66 + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 8); 1.67 + 1.68 +} 1.69 + 1.70 +unsigned int vp8_sad8x16_c(const unsigned char *src_ptr, int src_stride, 1.71 + const unsigned char *ref_ptr, int ref_stride, 1.72 + unsigned int max_sad) 1.73 +{ 1.74 + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 16); 1.75 +} 1.76 + 1.77 +unsigned int vp8_sad4x4_c(const unsigned char *src_ptr, int src_stride, 1.78 + const unsigned char *ref_ptr, int ref_stride, 1.79 + unsigned int max_sad) 1.80 +{ 1.81 + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 4, 4); 1.82 +} 1.83 + 1.84 +void vp8_sad16x16x3_c(const unsigned char *src_ptr, int src_stride, 1.85 + const unsigned char *ref_ptr, int ref_stride, 1.86 + unsigned int *sad_array) 1.87 +{ 1.88 + sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.89 + sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.90 + sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.91 +} 1.92 + 1.93 +void vp8_sad16x16x8_c(const unsigned char *src_ptr, int src_stride, 1.94 + const unsigned char *ref_ptr, int ref_stride, 1.95 + unsigned short *sad_array) 1.96 +{ 1.97 + sad_array[0] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.98 + sad_array[1] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.99 + sad_array[2] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.100 + sad_array[3] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 1.101 + sad_array[4] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 1.102 + sad_array[5] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 1.103 + sad_array[6] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 1.104 + sad_array[7] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 1.105 +} 1.106 + 1.107 +void vp8_sad16x8x3_c(const unsigned char *src_ptr, int src_stride, 1.108 + const unsigned char *ref_ptr, int ref_stride, 1.109 + unsigned int *sad_array) 1.110 +{ 1.111 + sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.112 + sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.113 + sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.114 +} 1.115 + 1.116 +void vp8_sad16x8x8_c(const unsigned char *src_ptr, int src_stride, 1.117 + const unsigned char *ref_ptr, int ref_stride, 1.118 + unsigned short *sad_array) 1.119 +{ 1.120 + sad_array[0] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.121 + sad_array[1] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.122 + sad_array[2] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.123 + sad_array[3] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 1.124 + sad_array[4] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 1.125 + sad_array[5] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 1.126 + sad_array[6] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 1.127 + sad_array[7] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 1.128 +} 1.129 + 1.130 +void vp8_sad8x8x3_c(const unsigned char *src_ptr, int src_stride, 1.131 + const unsigned char *ref_ptr, int ref_stride, 1.132 + unsigned int *sad_array) 1.133 +{ 1.134 + sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.135 + sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.136 + sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.137 +} 1.138 + 1.139 +void vp8_sad8x8x8_c(const unsigned char *src_ptr, int src_stride, 1.140 + const unsigned char *ref_ptr, int ref_stride, 1.141 + unsigned short *sad_array) 1.142 +{ 1.143 + sad_array[0] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.144 + sad_array[1] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.145 + sad_array[2] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.146 + sad_array[3] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 1.147 + sad_array[4] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 1.148 + sad_array[5] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 1.149 + sad_array[6] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 1.150 + sad_array[7] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 1.151 +} 1.152 + 1.153 +void vp8_sad8x16x3_c(const unsigned char *src_ptr, int src_stride, 1.154 + const unsigned char *ref_ptr, int ref_stride, 1.155 + unsigned int *sad_array) 1.156 +{ 1.157 + sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.158 + sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.159 + sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.160 +} 1.161 + 1.162 +void vp8_sad8x16x8_c(const unsigned char *src_ptr, int src_stride, 1.163 + const unsigned char *ref_ptr, int ref_stride, 1.164 + unsigned short *sad_array) 1.165 +{ 1.166 + sad_array[0] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.167 + sad_array[1] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.168 + sad_array[2] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.169 + sad_array[3] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 1.170 + sad_array[4] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 1.171 + sad_array[5] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 1.172 + sad_array[6] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 1.173 + sad_array[7] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 1.174 +} 1.175 + 1.176 +void vp8_sad4x4x3_c(const unsigned char *src_ptr, int src_stride, 1.177 + const unsigned char *ref_ptr, int ref_stride, 1.178 + unsigned int *sad_array) 1.179 +{ 1.180 + sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.181 + sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.182 + sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.183 +} 1.184 + 1.185 +void vp8_sad4x4x8_c(const unsigned char *src_ptr, int src_stride, 1.186 + const unsigned char *ref_ptr, int ref_stride, 1.187 + unsigned short *sad_array) 1.188 +{ 1.189 + sad_array[0] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX); 1.190 + sad_array[1] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX); 1.191 + sad_array[2] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX); 1.192 + sad_array[3] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX); 1.193 + sad_array[4] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX); 1.194 + sad_array[5] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX); 1.195 + sad_array[6] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX); 1.196 + sad_array[7] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX); 1.197 +} 1.198 + 1.199 +void vp8_sad16x16x4d_c(const unsigned char *src_ptr, int src_stride, 1.200 + const unsigned char * const ref_ptr[], int ref_stride, 1.201 + unsigned int *sad_array) 1.202 +{ 1.203 + sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 1.204 + sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 1.205 + sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 1.206 + sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 1.207 +} 1.208 + 1.209 +void vp8_sad16x8x4d_c(const unsigned char *src_ptr, int src_stride, 1.210 + const unsigned char * const ref_ptr[], int ref_stride, 1.211 + unsigned int *sad_array) 1.212 +{ 1.213 + sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 1.214 + sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 1.215 + sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 1.216 + sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 1.217 +} 1.218 + 1.219 +void vp8_sad8x8x4d_c(const unsigned char *src_ptr, int src_stride, 1.220 + const unsigned char * const ref_ptr[], int ref_stride, 1.221 + unsigned int *sad_array) 1.222 +{ 1.223 + sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 1.224 + sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 1.225 + sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 1.226 + sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 1.227 +} 1.228 + 1.229 +void vp8_sad8x16x4d_c(const unsigned char *src_ptr, int src_stride, 1.230 + const unsigned char * const ref_ptr[], int ref_stride, 1.231 + unsigned int *sad_array) 1.232 +{ 1.233 + sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 1.234 + sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 1.235 + sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 1.236 + sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 1.237 +} 1.238 + 1.239 +void vp8_sad4x4x4d_c(const unsigned char *src_ptr, int src_stride, 1.240 + const unsigned char * const ref_ptr[], int ref_stride, 1.241 + unsigned int *sad_array) 1.242 +{ 1.243 + sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX); 1.244 + sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX); 1.245 + sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX); 1.246 + sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX); 1.247 +} 1.248 + 1.249 +/* Copy 2 macroblocks to a buffer */ 1.250 +void vp8_copy32xn_c(unsigned char *src_ptr, int src_stride, 1.251 + unsigned char *dst_ptr, int dst_stride, 1.252 + int height) 1.253 +{ 1.254 + int r; 1.255 + 1.256 + for (r = 0; r < height; r++) 1.257 + { 1.258 +#if !(CONFIG_FAST_UNALIGNED) 1.259 + dst_ptr[0] = src_ptr[0]; 1.260 + dst_ptr[1] = src_ptr[1]; 1.261 + dst_ptr[2] = src_ptr[2]; 1.262 + dst_ptr[3] = src_ptr[3]; 1.263 + dst_ptr[4] = src_ptr[4]; 1.264 + dst_ptr[5] = src_ptr[5]; 1.265 + dst_ptr[6] = src_ptr[6]; 1.266 + dst_ptr[7] = src_ptr[7]; 1.267 + dst_ptr[8] = src_ptr[8]; 1.268 + dst_ptr[9] = src_ptr[9]; 1.269 + dst_ptr[10] = src_ptr[10]; 1.270 + dst_ptr[11] = src_ptr[11]; 1.271 + dst_ptr[12] = src_ptr[12]; 1.272 + dst_ptr[13] = src_ptr[13]; 1.273 + dst_ptr[14] = src_ptr[14]; 1.274 + dst_ptr[15] = src_ptr[15]; 1.275 + dst_ptr[16] = src_ptr[16]; 1.276 + dst_ptr[17] = src_ptr[17]; 1.277 + dst_ptr[18] = src_ptr[18]; 1.278 + dst_ptr[19] = src_ptr[19]; 1.279 + dst_ptr[20] = src_ptr[20]; 1.280 + dst_ptr[21] = src_ptr[21]; 1.281 + dst_ptr[22] = src_ptr[22]; 1.282 + dst_ptr[23] = src_ptr[23]; 1.283 + dst_ptr[24] = src_ptr[24]; 1.284 + dst_ptr[25] = src_ptr[25]; 1.285 + dst_ptr[26] = src_ptr[26]; 1.286 + dst_ptr[27] = src_ptr[27]; 1.287 + dst_ptr[28] = src_ptr[28]; 1.288 + dst_ptr[29] = src_ptr[29]; 1.289 + dst_ptr[30] = src_ptr[30]; 1.290 + dst_ptr[31] = src_ptr[31]; 1.291 +#else 1.292 + ((uint32_t *)dst_ptr)[0] = ((uint32_t *)src_ptr)[0] ; 1.293 + ((uint32_t *)dst_ptr)[1] = ((uint32_t *)src_ptr)[1] ; 1.294 + ((uint32_t *)dst_ptr)[2] = ((uint32_t *)src_ptr)[2] ; 1.295 + ((uint32_t *)dst_ptr)[3] = ((uint32_t *)src_ptr)[3] ; 1.296 + ((uint32_t *)dst_ptr)[4] = ((uint32_t *)src_ptr)[4] ; 1.297 + ((uint32_t *)dst_ptr)[5] = ((uint32_t *)src_ptr)[5] ; 1.298 + ((uint32_t *)dst_ptr)[6] = ((uint32_t *)src_ptr)[6] ; 1.299 + ((uint32_t *)dst_ptr)[7] = ((uint32_t *)src_ptr)[7] ; 1.300 +#endif 1.301 + src_ptr += src_stride; 1.302 + dst_ptr += dst_stride; 1.303 + 1.304 + } 1.305 +}