/*
 *  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/api/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_
