/*
 *  Copyright (c) 2018 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.
 */

#include "modules/audio_processing/aec3/suppression_gain_limiter.h"

#include <math.h>
#include <algorithm>

#include "modules/audio_processing/aec3/aec3_common.h"

namespace webrtc {
namespace {

// Computes the gain rampup factor to use.
float ComputeGainRampupIncrease(
    const EchoCanceller3Config::EchoRemovalControl::GainRampup& rampup_config) {
  return powf(1.f / rampup_config.first_non_zero_gain,
              1.f / rampup_config.non_zero_gain_blocks);
}

}  // namespace

SuppressionGainUpperLimiter::SuppressionGainUpperLimiter(
    const EchoCanceller3Config& config)
    : rampup_config_(config.echo_removal_control.gain_rampup),
      gain_rampup_increase_(ComputeGainRampupIncrease(rampup_config_)) {
  Reset();
}

void SuppressionGainUpperLimiter::Reset() {
  recent_reset_ = true;
}

void SuppressionGainUpperLimiter::Update(bool render_activity) {
  if (recent_reset_ && !call_startup_phase_) {
    // Only enforce 250 ms full suppression after in-call resets,
    constexpr int kMuteFramesAfterReset = kNumBlocksPerSecond / 4;
    realignment_counter_ = kMuteFramesAfterReset;
  } else if (!active_render_seen_ && render_activity) {
    // Enforce a tailormade suppression limiting during call startup.
    active_render_seen_ = true;
    realignment_counter_ = rampup_config_.full_gain_blocks;
  } else if (realignment_counter_ > 0) {
    if (--realignment_counter_ == 0) {
      call_startup_phase_ = false;
    }
  }
  recent_reset_ = false;

  // Do not enforce any gain limit on the suppressor.
  if (realignment_counter_ <= 0) {
    suppressor_gain_limit_ = 1.f;
    return;
  }

  // Enforce full suppression.
  if (realignment_counter_ > rampup_config_.non_zero_gain_blocks ||
      (!call_startup_phase_ && realignment_counter_ > 0)) {
    suppressor_gain_limit_ = 0.f;
    return;
  }

  // Start increasing the gain limit.
  if (realignment_counter_ == rampup_config_.non_zero_gain_blocks) {
    suppressor_gain_limit_ = rampup_config_.first_non_zero_gain;
    return;
  }

  // Increase the gain limit until it reaches 1.f.
  RTC_DCHECK_LT(0.f, suppressor_gain_limit_);
  suppressor_gain_limit_ =
      std::min(1.f, suppressor_gain_limit_ * gain_rampup_increase_);
  RTC_DCHECK_GE(1.f, suppressor_gain_limit_);
}

}  // namespace webrtc
