|  | /* | 
|  | *  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 | 
|  |  | 
|  | #if ORIGINAL_OPT | 
|  | uint32_t HammingDistance_C1(const uint8_t* src_a, | 
|  | const uint8_t* src_b, | 
|  | int count) { | 
|  | uint32_t diff = 0u; | 
|  |  | 
|  | int i; | 
|  | for (i = 0; i < count; ++i) { | 
|  | int x = src_a[i] ^ src_b[i]; | 
|  | if (x & 1) | 
|  | ++diff; | 
|  | if (x & 2) | 
|  | ++diff; | 
|  | if (x & 4) | 
|  | ++diff; | 
|  | if (x & 8) | 
|  | ++diff; | 
|  | if (x & 16) | 
|  | ++diff; | 
|  | if (x & 32) | 
|  | ++diff; | 
|  | if (x & 64) | 
|  | ++diff; | 
|  | if (x & 128) | 
|  | ++diff; | 
|  | } | 
|  | return diff; | 
|  | } | 
|  | #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 |