Line data Source code
1 : /*
2 : * Copyright(c) 2019 Intel Corporation
3 : * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 : */
5 :
6 : #include <stdint.h>
7 :
8 0 : static void variance_c(const uint8_t *a, int a_stride, const uint8_t *b,
9 : int b_stride, int w, int h, uint32_t *sse, int *sum) {
10 : int i, j;
11 :
12 0 : *sum = 0;
13 0 : *sse = 0;
14 :
15 0 : for (i = 0; i < h; ++i) {
16 0 : for (j = 0; j < w; ++j) {
17 0 : const int diff = a[j] - b[j];
18 0 : *sum += diff;
19 0 : *sse += diff * diff;
20 : }
21 :
22 0 : a += a_stride;
23 0 : b += b_stride;
24 : }
25 0 : }
26 :
27 : // TODO: use or implement a simd version of this
28 0 : uint32_t variance_highbd_c(const uint16_t *a,
29 : int a_stride,
30 : const uint16_t *b,
31 : int b_stride,
32 : int w,
33 : int h,
34 : uint32_t *sse) {
35 : int i, j;
36 :
37 0 : int sad = 0;
38 0 : *sse = 0;
39 :
40 0 : for (i = 0; i < h; ++i) {
41 0 : for (j = 0; j < w; ++j) {
42 0 : const int diff = a[j] - b[j];
43 0 : sad += diff;
44 0 : *sse += diff * diff;
45 : }
46 :
47 0 : a += a_stride;
48 0 : b += b_stride;
49 : }
50 :
51 0 : return *sse - (sad * sad)/(w*h);
52 : }
53 :
54 : #define VAR(W, H) \
55 : uint32_t eb_aom_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
56 : const uint8_t *b, int b_stride, \
57 : uint32_t *sse) { \
58 : int sum; \
59 : variance_c(a, a_stride, b, b_stride, W, H, sse, &sum); \
60 : return *sse - (uint32_t)(((int64_t)sum * sum) / (W * H)); \
61 : }
62 :
63 0 : VAR(4, 4)
64 0 : VAR(4, 8)
65 0 : VAR(4, 16)
66 0 : VAR(8, 4)
67 0 : VAR(8, 8)
68 0 : VAR(8, 16)
69 0 : VAR(8, 32)
70 0 : VAR(16, 4)
71 0 : VAR(16, 8)
72 0 : VAR(16, 16)
73 0 : VAR(16, 32)
74 0 : VAR(16, 64)
75 0 : VAR(32, 8)
76 0 : VAR(32, 16)
77 0 : VAR(32, 32)
78 0 : VAR(32, 64)
79 0 : VAR(64, 16)
80 0 : VAR(64, 32)
81 0 : VAR(64, 64)
82 0 : VAR(64, 128)
83 0 : VAR(128, 64)
84 0 : VAR(128, 128)
|