/*
 *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_

#include <cstdint>
#include <limits>
#include <list>

#include "webrtc/rtc_base/optional.h"

namespace webrtc {
namespace testing {
namespace bwe {

// Average rtt for past |kRttFilterSize| packets should grow by
// |kRttIncreaseThresholdForExpiry| in order to enter PROBE_RTT mode and expire.
// old min_rtt estimate.
const float kRttIncreaseThresholdForExpiry = 2.3f;
const size_t kRttFilterSize = 25;

class MinRttFilter {
 public:
  // This class implements a simple filter to ensure that PROBE_RTT is only
  // entered when RTTs start to increase, instead of fixed 10 second window as
  // in orginal BBR design doc, to avoid unnecessary freezes in stream.
  MinRttFilter() {}
  ~MinRttFilter() {}

  rtc::Optional<int64_t> min_rtt_ms() { return min_rtt_ms_; }
  void AddRttSample(int64_t rtt_ms, int64_t now_ms) {
    if (!min_rtt_ms_ || rtt_ms <= *min_rtt_ms_ || MinRttExpired(now_ms)) {
      min_rtt_ms_.emplace(rtt_ms);
    }
    rtt_samples_.push_back(rtt_ms);
    if (rtt_samples_.size() > kRttFilterSize)
      rtt_samples_.pop_front();
  }

  // Checks whether or not last RTT values for past |kRttFilterSize| packets
  // started to increase, meaning we have to update min_rtt estimate.
  bool MinRttExpired(int64_t now_ms) {
    if (rtt_samples_.size() < kRttFilterSize || !min_rtt_ms_)
      return false;
    int64_t sum_of_rtts_ms = 0;
    for (int64_t i : rtt_samples_)
      sum_of_rtts_ms += i;
    if (sum_of_rtts_ms >=
        *min_rtt_ms_ * kRttIncreaseThresholdForExpiry * kRttFilterSize) {
      rtt_samples_.clear();
      return true;
    }
    return false;
  }

 private:
  rtc::Optional<int64_t> min_rtt_ms_;
  std::list<int64_t> rtt_samples_;
};
}  // namespace bwe
}  // namespace testing
}  // namespace webrtc

#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
