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