Standalone denoiser (off by default).

BUG=webrtc:5255

Review URL: https://codereview.webrtc.org/1466763002

Cr-Commit-Position: refs/heads/master@{#10800}
diff --git a/webrtc/modules/video_processing/frame_preprocessor.cc b/webrtc/modules/video_processing/frame_preprocessor.cc
index a3ec3c8..36e1b9b 100644
--- a/webrtc/modules/video_processing/frame_preprocessor.cc
+++ b/webrtc/modules/video_processing/frame_preprocessor.cc
@@ -13,26 +13,34 @@
 namespace webrtc {
 
 VPMFramePreprocessor::VPMFramePreprocessor()
-    : content_metrics_(NULL),
+    : content_metrics_(nullptr),
       resampled_frame_(),
       enable_ca_(false),
+      enable_denoising_(false),
       frame_cnt_(0) {
   spatial_resampler_ = new VPMSimpleSpatialResampler();
   ca_ = new VPMContentAnalysis(true);
   vd_ = new VPMVideoDecimator();
+  if (enable_denoising_) {
+    denoiser_ = new VideoDenoiser();
+  } else {
+    denoiser_ = nullptr;
+  }
 }
 
 VPMFramePreprocessor::~VPMFramePreprocessor() {
   Reset();
-  delete spatial_resampler_;
   delete ca_;
   delete vd_;
+  if (enable_denoising_)
+    delete denoiser_;
+  delete spatial_resampler_;
 }
 
 void  VPMFramePreprocessor::Reset() {
   ca_->Release();
   vd_->Reset();
-  content_metrics_ = NULL;
+  content_metrics_ = nullptr;
   spatial_resampler_->Reset();
   enable_ca_ = false;
   frame_cnt_ = 0;
@@ -104,11 +112,22 @@
     return 1;  // drop 1 frame
   }
 
-  // Resizing incoming frame if needed. Otherwise, remains NULL.
+  // Resizing incoming frame if needed. Otherwise, remains nullptr.
   // We are not allowed to resample the input frame (must make a copy of it).
-  *processed_frame = NULL;
+  *processed_frame = nullptr;
+  if (denoiser_ != nullptr) {
+    denoiser_->DenoiseFrame(frame, &denoised_frame_);
+    *processed_frame = &denoised_frame_;
+  }
+
   if (spatial_resampler_->ApplyResample(frame.width(), frame.height()))  {
-    int32_t ret = spatial_resampler_->ResampleFrame(frame, &resampled_frame_);
+    int32_t ret;
+    if (enable_denoising_) {
+      ret = spatial_resampler_->ResampleFrame(denoised_frame_,
+                                              &resampled_frame_);
+    } else {
+      ret = spatial_resampler_->ResampleFrame(frame, &resampled_frame_);
+    }
     if (ret != VPM_OK) return ret;
     *processed_frame = &resampled_frame_;
   }
@@ -118,14 +137,14 @@
     // Compute new metrics every |kSkipFramesCA| frames, starting with
     // the first frame.
     if (frame_cnt_ % kSkipFrameCA == 0) {
-      if (*processed_frame == NULL)  {
+      if (*processed_frame == nullptr)  {
         content_metrics_ = ca_->ComputeContentMetrics(frame);
       } else {
-        content_metrics_ = ca_->ComputeContentMetrics(resampled_frame_);
+        content_metrics_ = ca_->ComputeContentMetrics(**processed_frame);
       }
     }
-    ++frame_cnt_;
   }
+  ++frame_cnt_;
   return VPM_OK;
 }