Index: webrtc/modules/desktop_capture/differ_block.cc |
diff --git a/webrtc/modules/desktop_capture/differ_block.cc b/webrtc/modules/desktop_capture/differ_block.cc |
index d4cbda3601f44b4e5c65d3352fec816df2f84c03..bcdaa91246c04f9dce6b8fd04b20493930e14223 100644 |
--- a/webrtc/modules/desktop_capture/differ_block.cc |
+++ b/webrtc/modules/desktop_capture/differ_block.cc |
@@ -13,49 +13,62 @@ |
#include <string.h> |
#include "webrtc/typedefs.h" |
-#include "webrtc/modules/desktop_capture/differ_block_sse2.h" |
+#include "webrtc/modules/desktop_capture/differ_vector_sse2.h" |
#include "webrtc/system_wrappers/include/cpu_features_wrapper.h" |
namespace webrtc { |
-bool BlockDifference_C(const uint8_t* image1, |
- const uint8_t* image2, |
- int stride) { |
- int width_bytes = kBlockSize * kBytesPerPixel; |
+namespace { |
- for (int y = 0; y < kBlockSize; y++) { |
- if (memcmp(image1, image2, width_bytes) != 0) |
- return true; |
- image1 += stride; |
- image2 += stride; |
- } |
- return false; |
+bool VectorDifference_C(const uint8_t* image1, |
+ const uint8_t* image2) { |
+ return memcmp(image1, image2, kBlockSize * kBytesPerPixel) != 0; |
} |
-bool BlockDifference(const uint8_t* image1, |
- const uint8_t* image2, |
- int stride) { |
- static bool (*diff_proc)(const uint8_t*, const uint8_t*, int) = NULL; |
+} // namespace |
+ |
+bool VectorDifference(const uint8_t* image1, const uint8_t* image2) { |
+ static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr; |
if (!diff_proc) { |
#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY) |
// For ARM and MIPS processors, always use C version. |
// TODO(hclam): Implement a NEON version. |
- diff_proc = &BlockDifference_C; |
+ diff_proc = &VectorDifference_C; |
#else |
bool have_sse2 = WebRtc_GetCPUInfo(kSSE2) != 0; |
// For x86 processors, check if SSE2 is supported. |
if (have_sse2 && kBlockSize == 32) { |
- diff_proc = &BlockDifference_SSE2_W32; |
+ diff_proc = &VectorDifference_SSE2_W32; |
} else if (have_sse2 && kBlockSize == 16) { |
- diff_proc = &BlockDifference_SSE2_W16; |
+ diff_proc = &VectorDifference_SSE2_W16; |
} else { |
- diff_proc = &BlockDifference_C; |
+ diff_proc = &VectorDifference_C; |
} |
#endif |
} |
- return diff_proc(image1, image2, stride); |
+ return diff_proc(image1, image2); |
+} |
+ |
+bool BlockDifference(const uint8_t* image1, |
+ const uint8_t* image2, |
+ int height, |
+ int stride) { |
+ for (int i = 0; i < height; i++) { |
+ if (VectorDifference(image1, image2)) { |
+ return true; |
+ } |
+ image1 += stride; |
+ image2 += stride; |
+ } |
+ return false; |
+} |
+ |
+bool BlockDifference(const uint8_t* image1, |
+ const uint8_t* image2, |
+ int stride) { |
+ return BlockDifference(image1, image2, kBlockSize, stride); |
} |
} // namespace webrtc |