/*
 *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_
#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_

#include <memory>

#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/video_processing/include/video_processing_defines.h"
#include "webrtc/modules/video_processing/util/denoiser_filter.h"

namespace webrtc {

#define DISPLAY 0      // Rectangle diagnostics
#define DISPLAYNEON 0  // Rectangle diagnostics on NEON

const int kNoiseThreshold = 150;
const int kNoiseThresholdNeon = 70;
const int kConsecLowVarFrame = 6;
const int kAverageLumaMin = 20;
const int kAverageLumaMax = 220;
const int kBlockSelectionVarMax = kNoiseThreshold << 1;

// TODO(jackychen): To test different sampling strategy.
// Collect noise data every NOISE_SUBSAMPLE_INTERVAL blocks.
#define NOISE_SUBSAMPLE_INTERVAL 41

class NoiseEstimation {
 public:
  void Init(int width, int height, CpuType cpu_type);
  // Collect noise data from one qualified block.
  void GetNoise(int mb_index, uint32_t var, uint32_t luma);
  // Reset the counter for consecutive low-var blocks.
  void ResetConsecLowVar(int mb_index);
  // Update noise level for current frame.
  void UpdateNoiseLevel();
  // 0: low noise, 1: high noise
  uint8_t GetNoiseLevel();

 private:
  int width_;
  int height_;
  int mb_rows_;
  int mb_cols_;
  int num_noisy_block_;
  int num_static_block_;
  CpuType cpu_type_;
  uint32_t noise_var_;
  double noise_var_accum_;
  double percent_static_block_;
  std::unique_ptr<uint32_t[]> consec_low_var_;
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_
