• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2012 The LibYuv 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 "libyuv/basic_types.h"
12 
13 #include "libyuv/compare_row.h"
14 
15 #ifdef __cplusplus
16 namespace libyuv {
17 extern "C" {
18 #endif
19 
20 #if ORIGINAL_OPT
HammingDistance_C1(const uint8_t * src_a,const uint8_t * src_b,int count)21 uint32_t HammingDistance_C1(const uint8_t* src_a,
22                             const uint8_t* src_b,
23                             int count) {
24   uint32_t diff = 0u;
25 
26   int i;
27   for (i = 0; i < count; ++i) {
28     int x = src_a[i] ^ src_b[i];
29     if (x & 1)
30       ++diff;
31     if (x & 2)
32       ++diff;
33     if (x & 4)
34       ++diff;
35     if (x & 8)
36       ++diff;
37     if (x & 16)
38       ++diff;
39     if (x & 32)
40       ++diff;
41     if (x & 64)
42       ++diff;
43     if (x & 128)
44       ++diff;
45   }
46   return diff;
47 }
48 #endif
49 
50 // Hakmem method for hamming distance.
HammingDistance_C(const uint8_t * src_a,const uint8_t * src_b,int count)51 uint32_t HammingDistance_C(const uint8_t* src_a,
52                            const uint8_t* src_b,
53                            int count) {
54   uint32_t diff = 0u;
55 
56   int i;
57   for (i = 0; i < count - 3; i += 4) {
58     uint32_t x = *((const uint32_t*)src_a) ^ *((const uint32_t*)src_b);
59     uint32_t u = x - ((x >> 1) & 0x55555555);
60     u = ((u >> 2) & 0x33333333) + (u & 0x33333333);
61     diff += ((((u + (u >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24);
62     src_a += 4;
63     src_b += 4;
64   }
65 
66   for (; i < count; ++i) {
67     uint32_t x = *src_a ^ *src_b;
68     uint32_t u = x - ((x >> 1) & 0x55);
69     u = ((u >> 2) & 0x33) + (u & 0x33);
70     diff += (u + (u >> 4)) & 0x0f;
71     src_a += 1;
72     src_b += 1;
73   }
74 
75   return diff;
76 }
77 
SumSquareError_C(const uint8_t * src_a,const uint8_t * src_b,int count)78 uint32_t SumSquareError_C(const uint8_t* src_a,
79                           const uint8_t* src_b,
80                           int count) {
81   uint32_t sse = 0u;
82   int i;
83   for (i = 0; i < count; ++i) {
84     int diff = src_a[i] - src_b[i];
85     sse += (uint32_t)(diff * diff);
86   }
87   return sse;
88 }
89 
90 // hash seed of 5381 recommended.
91 // Internal C version of HashDjb2 with int sized count for efficiency.
HashDjb2_C(const uint8_t * src,int count,uint32_t seed)92 uint32_t HashDjb2_C(const uint8_t* src, int count, uint32_t seed) {
93   uint32_t hash = seed;
94   int i;
95   for (i = 0; i < count; ++i) {
96     hash += (hash << 5) + src[i];
97   }
98   return hash;
99 }
100 
101 #ifdef __cplusplus
102 }  // extern "C"
103 }  // namespace libyuv
104 #endif
105