Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / libvpx / source / libvpx / vp9 / encoder / vp9_sad.c
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 sadMxN(m, n) \
37 unsigned int vp9_sad##m##x##n##_c(const uint8_t *src, int src_stride, \
38                                   const uint8_t *ref, int ref_stride, \
39                                   unsigned int max_sad) { \
40   return sad(src, src_stride, ref, ref_stride, m, n); \
41 } \
42 unsigned int vp9_sad##m##x##n##_avg_c(const uint8_t *src, int src_stride, \
43                                       const uint8_t *ref, 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, ref_stride); \
48   return sad(src, src_stride, comp_pred, m, m, n); \
49 }
50
51 #define sadMxNxK(m, n, k) \
52 void vp9_sad##m##x##n##x##k##_c(const uint8_t *src, int src_stride, \
53                                 const uint8_t *ref, int ref_stride, \
54                                 unsigned int *sads) { \
55   int i; \
56   for (i = 0; i < k; ++i) \
57     sads[i] = vp9_sad##m##x##n##_c(src, src_stride, &ref[i], ref_stride, \
58                                    0x7fffffff); \
59 }
60
61 #define sadMxNx4D(m, n) \
62 void vp9_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride, \
63                              const uint8_t *const refs[], int ref_stride, \
64                              unsigned int *sads) { \
65   int i; \
66   for (i = 0; i < 4; ++i) \
67     sads[i] = vp9_sad##m##x##n##_c(src, src_stride, refs[i], ref_stride, \
68                                    0x7fffffff); \
69 }
70
71 // 64x64
72 sadMxN(64, 64)
73 sadMxNxK(64, 64, 3)
74 sadMxNxK(64, 64, 8)
75 sadMxNx4D(64, 64)
76
77 // 64x32
78 sadMxN(64, 32)
79 sadMxNx4D(64, 32)
80
81 // 32x64
82 sadMxN(32, 64)
83 sadMxNx4D(32, 64)
84
85 // 32x32
86 sadMxN(32, 32)
87 sadMxNxK(32, 32, 3)
88 sadMxNxK(32, 32, 8)
89 sadMxNx4D(32, 32)
90
91 // 32x16
92 sadMxN(32, 16)
93 sadMxNx4D(32, 16)
94
95 // 16x32
96 sadMxN(16, 32)
97 sadMxNx4D(16, 32)
98
99 // 16x16
100 sadMxN(16, 16)
101 sadMxNxK(16, 16, 3)
102 sadMxNxK(16, 16, 8)
103 sadMxNx4D(16, 16)
104
105 // 16x8
106 sadMxN(16, 8)
107 sadMxNxK(16, 8, 3)
108 sadMxNxK(16, 8, 8)
109 sadMxNx4D(16, 8)
110
111 // 8x16
112 sadMxN(8, 16)
113 sadMxNxK(8, 16, 3)
114 sadMxNxK(8, 16, 8)
115 sadMxNx4D(8, 16)
116
117 // 8x8
118 sadMxN(8, 8)
119 sadMxNxK(8, 8, 3)
120 sadMxNxK(8, 8, 8)
121 sadMxNx4D(8, 8)
122
123 // 8x4
124 sadMxN(8, 4)
125 sadMxNxK(8, 4, 8)
126 sadMxNx4D(8, 4)
127
128 // 4x8
129 sadMxN(4, 8)
130 sadMxNxK(4, 8, 8)
131 sadMxNx4D(4, 8)
132
133 // 4x4
134 sadMxN(4, 4)
135 sadMxNxK(4, 4, 3)
136 sadMxNxK(4, 4, 8)
137 sadMxNx4D(4, 4)