Line data Source code
1 : /*
2 : * Copyright (c) 2013 The WebRTC 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 "webrtc/modules/desktop_capture/differ_block.h"
12 :
13 : #include <string.h>
14 :
15 : #include "webrtc/typedefs.h"
16 : #include "webrtc/modules/desktop_capture/differ_vector_sse2.h"
17 : #include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
18 :
19 : namespace webrtc {
20 :
21 : namespace {
22 :
23 0 : bool VectorDifference_C(const uint8_t* image1, const uint8_t* image2) {
24 0 : return memcmp(image1, image2, kBlockSize * kBytesPerPixel) != 0;
25 : }
26 :
27 : } // namespace
28 :
29 0 : bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
30 : static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
31 :
32 0 : if (!diff_proc) {
33 : #if !defined(WEBRTC_ARCH_X86_FAMILY)
34 : // For ARM and MIPS processors, always use C version.
35 : // TODO(hclam): Implement a NEON version.
36 : diff_proc = &VectorDifference_C;
37 : #else
38 0 : bool have_sse2 = WebRtc_GetCPUInfo(kSSE2) != 0;
39 : // For x86 processors, check if SSE2 is supported.
40 0 : if (have_sse2 && kBlockSize == 32) {
41 0 : diff_proc = &VectorDifference_SSE2_W32;
42 : } else if (have_sse2 && kBlockSize == 16) {
43 : diff_proc = &VectorDifference_SSE2_W16;
44 : } else {
45 0 : diff_proc = &VectorDifference_C;
46 : }
47 : #endif
48 : }
49 :
50 0 : return diff_proc(image1, image2);
51 : }
52 :
53 0 : bool BlockDifference(const uint8_t* image1,
54 : const uint8_t* image2,
55 : int height,
56 : int stride) {
57 0 : for (int i = 0; i < height; i++) {
58 0 : if (VectorDifference(image1, image2)) {
59 0 : return true;
60 : }
61 0 : image1 += stride;
62 0 : image2 += stride;
63 : }
64 0 : return false;
65 : }
66 :
67 0 : bool BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride) {
68 0 : return BlockDifference(image1, image2, kBlockSize, stride);
69 : }
70 :
71 : } // namespace webrtc
|