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