diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-05-03 23:40:04 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-05-03 23:40:04 +0000 |
commit | c1068d3eb9464eb1e6028869524930c57feb716b (patch) | |
tree | 7aa355fd0b89ec0b2611e17ee84a14c6fa449e22 /source/compare_common.cc | |
parent | ad14b7e1bb4ad1db3cc083b70c9179f86b2e2052 (diff) | |
parent | a270e88f71c875f86ebc612ff3232b204bbc75c9 (diff) | |
download | libyuv-androidx-glance-release.tar.gz |
Merge "Snap for 11801295 from 488a2af021e3e7473f083a9435b1472c0d411f3d to androidx-glance-release" into androidx-glance-releaseandroidx-glance-release
Diffstat (limited to 'source/compare_common.cc')
-rw-r--r-- | source/compare_common.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/source/compare_common.cc b/source/compare_common.cc new file mode 100644 index 00000000..d1cab8d2 --- /dev/null +++ b/source/compare_common.cc @@ -0,0 +1,74 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "libyuv/basic_types.h" + +#include "libyuv/compare_row.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// Hakmem method for hamming distance. +uint32_t HammingDistance_C(const uint8_t* src_a, + const uint8_t* src_b, + int count) { + uint32_t diff = 0u; + + int i; + for (i = 0; i < count - 3; i += 4) { + uint32_t x = *((const uint32_t*)src_a) ^ *((const uint32_t*)src_b); + uint32_t u = x - ((x >> 1) & 0x55555555); + u = ((u >> 2) & 0x33333333) + (u & 0x33333333); + diff += ((((u + (u >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24); + src_a += 4; + src_b += 4; + } + + for (; i < count; ++i) { + uint32_t x = *src_a ^ *src_b; + uint32_t u = x - ((x >> 1) & 0x55); + u = ((u >> 2) & 0x33) + (u & 0x33); + diff += (u + (u >> 4)) & 0x0f; + src_a += 1; + src_b += 1; + } + + return diff; +} + +uint32_t SumSquareError_C(const uint8_t* src_a, + const uint8_t* src_b, + int count) { + uint32_t sse = 0u; + int i; + for (i = 0; i < count; ++i) { + int diff = src_a[i] - src_b[i]; + sse += (uint32_t)(diff * diff); + } + return sse; +} + +// hash seed of 5381 recommended. +// Internal C version of HashDjb2 with int sized count for efficiency. +uint32_t HashDjb2_C(const uint8_t* src, int count, uint32_t seed) { + uint32_t hash = seed; + int i; + for (i = 0; i < count; ++i) { + hash += (hash << 5) + src[i]; + } + return hash; +} + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif |