18f9902a0ff2c4673b3e470026017e858f2992838jackychen/* 28f9902a0ff2c4673b3e470026017e858f2992838jackychen * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 38f9902a0ff2c4673b3e470026017e858f2992838jackychen * 48f9902a0ff2c4673b3e470026017e858f2992838jackychen * Use of this source code is governed by a BSD-style license 58f9902a0ff2c4673b3e470026017e858f2992838jackychen * that can be found in the LICENSE file in the root of the source 68f9902a0ff2c4673b3e470026017e858f2992838jackychen * tree. An additional intellectual property rights grant can be found 78f9902a0ff2c4673b3e470026017e858f2992838jackychen * in the file PATENTS. All contributing project authors may 88f9902a0ff2c4673b3e470026017e858f2992838jackychen * be found in the AUTHORS file in the root of the source tree. 98f9902a0ff2c4673b3e470026017e858f2992838jackychen */ 108f9902a0ff2c4673b3e470026017e858f2992838jackychen 11a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen#include "webrtc/base/checks.h" 128f9902a0ff2c4673b3e470026017e858f2992838jackychen#include "webrtc/modules/video_processing/util/denoiser_filter.h" 138f9902a0ff2c4673b3e470026017e858f2992838jackychen#include "webrtc/modules/video_processing/util/denoiser_filter_c.h" 148f9902a0ff2c4673b3e470026017e858f2992838jackychen#include "webrtc/modules/video_processing/util/denoiser_filter_neon.h" 158f9902a0ff2c4673b3e470026017e858f2992838jackychen#include "webrtc/modules/video_processing/util/denoiser_filter_sse2.h" 168f9902a0ff2c4673b3e470026017e858f2992838jackychen#include "webrtc/system_wrappers/include/cpu_features_wrapper.h" 178f9902a0ff2c4673b3e470026017e858f2992838jackychen 188f9902a0ff2c4673b3e470026017e858f2992838jackychennamespace webrtc { 198f9902a0ff2c4673b3e470026017e858f2992838jackychen 208f9902a0ff2c4673b3e470026017e858f2992838jackychenconst int kMotionMagnitudeThreshold = 8 * 3; 218f9902a0ff2c4673b3e470026017e858f2992838jackychenconst int kSumDiffThreshold = 16 * 16 * 2; 228f9902a0ff2c4673b3e470026017e858f2992838jackychenconst int kSumDiffThresholdHigh = 600; 238f9902a0ff2c4673b3e470026017e858f2992838jackychen 24a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychenrtc::scoped_ptr<DenoiserFilter> DenoiserFilter::Create( 25a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen bool runtime_cpu_detection) { 26a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen rtc::scoped_ptr<DenoiserFilter> filter; 278f9902a0ff2c4673b3e470026017e858f2992838jackychen 2867e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen if (runtime_cpu_detection) { 2999ab9447d1b48043adf6bfdf72cf820bbda3ee3fmflodman// If we know the minimum architecture at compile time, avoid CPU detection. 308f9902a0ff2c4673b3e470026017e858f2992838jackychen#if defined(WEBRTC_ARCH_X86_FAMILY) 3167e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen // x86 CPU detection required. 3267e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen if (WebRtc_GetCPUInfo(kSSE2)) { 33a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterSSE2()); 3467e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen } else { 35a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterC()); 3667e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen } 378f9902a0ff2c4673b3e470026017e858f2992838jackychen#elif defined(WEBRTC_DETECT_NEON) 3867e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen if (WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) { 39a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterNEON()); 4067e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen } else { 41a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterC()); 4267e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen } 4367e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen#else 44a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterC()); 4567e94fb6f2a84cad97ba96abce3506c29f8ebb24jackychen#endif 468f9902a0ff2c4673b3e470026017e858f2992838jackychen } else { 47a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen filter.reset(new DenoiserFilterC()); 488f9902a0ff2c4673b3e470026017e858f2992838jackychen } 498f9902a0ff2c4673b3e470026017e858f2992838jackychen 50a276e731683c673388cf3aeaa1888a5bcc3e1dc0jackychen RTC_DCHECK(filter.get() != nullptr); 518f9902a0ff2c4673b3e470026017e858f2992838jackychen return filter; 528f9902a0ff2c4673b3e470026017e858f2992838jackychen} 538f9902a0ff2c4673b3e470026017e858f2992838jackychen 548f9902a0ff2c4673b3e470026017e858f2992838jackychen} // namespace webrtc 55