16c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org/* 26c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 36c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * 46c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * Use of this source code is governed by a BSD-style license 56c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * that can be found in the LICENSE file in the root of the source 66c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * tree. An additional intellectual property rights grant can be found 76c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * in the file PATENTS. All contributing project authors may 86c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * be found in the AUTHORS file in the root of the source tree. 96c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org */ 106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/differ_block.h" 126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include <string.h> 146c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 156c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "build/build_config.h" 166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/differ_block_sse2.h" 176c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/system_wrappers/interface/cpu_features_wrapper.h" 186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgnamespace webrtc { 206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgint BlockDifference_C(const uint8_t* image1, 226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org const uint8_t* image2, 236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org int stride) { 246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org int width_bytes = kBlockSize * kBytesPerPixel; 256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org for (int y = 0; y < kBlockSize; y++) { 276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org if (memcmp(image1, image2, width_bytes) != 0) 286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org return 1; 296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org image1 += stride; 306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org image2 += stride; 316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } 326c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org return 0; 336c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 346c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 356c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgint BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride) { 366c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org static int (*diff_proc)(const uint8_t*, const uint8_t*, int) = NULL; 376c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 386c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org if (!diff_proc) { 396c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) 406c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org // For ARM and MIPS processors, always use C version. 416c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org // TODO(hclam): Implement a NEON version. 426c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org diff_proc = &BlockDifference_C; 436c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#else 446c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org bool have_sse2 = WebRtc_GetCPUInfo(kSSE2) != 0; 456c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org // For x86 processors, check if SSE2 is supported. 466c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org if (have_sse2 && kBlockSize == 32) { 476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org diff_proc = &BlockDifference_SSE2_W32; 486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } else if (have_sse2 && kBlockSize == 16) { 496c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org diff_proc = &BlockDifference_SSE2_W16; 506c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } else { 516c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org diff_proc = &BlockDifference_C; 526c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } 536c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#endif 546c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } 556c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 566c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org return diff_proc(image1, image2, stride); 576c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 586c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 596c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} // namespace webrtc 60