OLD | NEW |
| (Empty) |
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, U
INT_MAX); | |
109 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, U
INT_MAX); | |
110 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, U
INT_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, UI
NT_MAX); | |
132 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UI
NT_MAX); | |
133 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UI
NT_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, U
INT_MAX); | |
155 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, U
INT_MAX); | |
156 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, U
INT_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, UI
NT_MAX); | |
178 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UI
NT_MAX); | |
179 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UI
NT_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, U
INT_MAX); | |
201 sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, U
INT_MAX); | |
202 sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, U
INT_MAX); | |
203 sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, U
INT_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, UI
NT_MAX); | |
211 sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UI
NT_MAX); | |
212 sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UI
NT_MAX); | |
213 sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UI
NT_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, UIN
T_MAX); | |
221 sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UIN
T_MAX); | |
222 sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UIN
T_MAX); | |
223 sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UIN
T_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, UI
NT_MAX); | |
231 sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UI
NT_MAX); | |
232 sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UI
NT_MAX); | |
233 sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UI
NT_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, UIN
T_MAX); | |
241 sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UIN
T_MAX); | |
242 sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UIN
T_MAX); | |
243 sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UIN
T_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 } | |
OLD | NEW |