• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "modules/desktop_capture/differ_block.h"
12 
13 #include <string.h>
14 
15 #include "modules/desktop_capture/differ_vector_sse2.h"
16 #include "rtc_base/system/arch.h"
17 #include "system_wrappers/include/cpu_features_wrapper.h"
18 
19 namespace webrtc {
20 
21 namespace {
22 
VectorDifference_C(const uint8_t * image1,const uint8_t * image2)23 bool VectorDifference_C(const uint8_t* image1, const uint8_t* image2) {
24   return memcmp(image1, image2, kBlockSize * kBytesPerPixel) != 0;
25 }
26 
27 }  // namespace
28 
VectorDifference(const uint8_t * image1,const uint8_t * image2)29 bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
30   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
31 
32   if (!diff_proc) {
33 #if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_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     bool have_sse2 = WebRtc_GetCPUInfo(kSSE2) != 0;
39     // For x86 processors, check if SSE2 is supported.
40     if (have_sse2 && kBlockSize == 32) {
41       diff_proc = &VectorDifference_SSE2_W32;
42     } else if (have_sse2 && kBlockSize == 16) {
43       diff_proc = &VectorDifference_SSE2_W16;
44     } else {
45       diff_proc = &VectorDifference_C;
46     }
47 #endif
48   }
49 
50   return diff_proc(image1, image2);
51 }
52 
BlockDifference(const uint8_t * image1,const uint8_t * image2,int height,int stride)53 bool BlockDifference(const uint8_t* image1,
54                      const uint8_t* image2,
55                      int height,
56                      int stride) {
57   for (int i = 0; i < height; i++) {
58     if (VectorDifference(image1, image2)) {
59       return true;
60     }
61     image1 += stride;
62     image2 += stride;
63   }
64   return false;
65 }
66 
BlockDifference(const uint8_t * image1,const uint8_t * image2,int stride)67 bool BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride) {
68   return BlockDifference(image1, image2, kBlockSize, stride);
69 }
70 
71 }  // namespace webrtc
72