Index: media/video/capture/screen/differ_block.cc |
diff --git a/media/video/capture/screen/differ_block.cc b/media/video/capture/screen/differ_block.cc |
index d263ac4312ad5e2ddbd9b5cea9dcd85e180b6def..5c3c93a93d7dbf8745dac54d78733db4e4d5ead6 100644 |
--- a/media/video/capture/screen/differ_block.cc |
+++ b/media/video/capture/screen/differ_block.cc |
@@ -9,6 +9,8 @@ |
#include "media/video/capture/screen/differ_block_sse2.h" |
namespace media { |
+typedef int (*BlockDifferenceProc)(const uint8*, const uint8*, int); |
+static BlockDifferenceProc g_block_difference_proc_ = NULL; |
int BlockDifference_C(const uint8* image1, const uint8* image2, int stride) { |
int width_bytes = kBlockSize * kBytesPerPixel; |
@@ -22,28 +24,28 @@ int BlockDifference_C(const uint8* image1, const uint8* image2, int stride) { |
return 0; |
} |
-int BlockDifference(const uint8* image1, const uint8* image2, int stride) { |
- static int (*diff_proc)(const uint8*, const uint8*, int) = NULL; |
+void InitializeCPUSpecificBlockDifference() { |
+ g_block_difference_proc_ = &BlockDifference_C; |
- if (!diff_proc) { |
-#if defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_MIPS_FAMILY) |
- // For ARM and MIPS processors, always use C version. |
- // TODO(hclam): Implement a NEON version. |
- diff_proc = &BlockDifference_C; |
+#if defined(ARCH_CPU_X86_FAMILY) |
+#if defined(__SSE2__) |
+ const bool kHasSSE2 = true; |
#else |
- base::CPU cpu; |
- // For x86 processors, check if SSE2 is supported. |
- if (cpu.has_sse2() && kBlockSize == 32) { |
- diff_proc = &BlockDifference_SSE2_W32; |
- } else if (cpu.has_sse2() && kBlockSize == 16) { |
- diff_proc = &BlockDifference_SSE2_W16; |
- } else { |
- diff_proc = &BlockDifference_C; |
- } |
+ const bool kHasSSE2 = base::CPU().has_sse2(); |
#endif |
+ |
+ if (kHasSSE2) { |
+ if (kBlockSize == 32) { |
+ g_block_difference_proc_ = &BlockDifference_SSE2_W32; |
+ } else if (kBlockSize == 16) { |
+ g_block_difference_proc_ = &BlockDifference_SSE2_W16; |
+ } |
} |
+#endif |
+} |
- return diff_proc(image1, image2, stride); |
+int BlockDifference(const uint8* image1, const uint8* image2, int stride) { |
+ return g_block_difference_proc_(image1, image2, stride); |
} |
} // namespace media |