/*
 *  Copyright (c) 2013 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_RATE_STATISTICS_H_
#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_RATE_STATISTICS_H_

#include "webrtc/base/scoped_ptr.h"
#include "webrtc/typedefs.h"

namespace webrtc {

class RateStatistics {
 public:
  // window_size = window size in ms for the rate estimation
  // scale = coefficient to convert counts/ms to desired units,
  //         ex: if counts represents bytes, use 8*1000 to go to bits/s
  RateStatistics(uint32_t window_size_ms, float scale);
  ~RateStatistics();

  void Reset();
  void Update(size_t count, int64_t now_ms);
  uint32_t Rate(int64_t now_ms);

 private:
  void EraseOld(int64_t now_ms);

  // Counters are kept in buckets (circular buffer), with one bucket
  // per millisecond.
  const int num_buckets_;
  rtc::scoped_ptr<size_t[]> buckets_;

  // Total count recorded in buckets.
  size_t accumulated_count_;

  // Oldest time recorded in buckets.
  int64_t oldest_time_;

  // Bucket index of oldest counter recorded in buckets.
  int oldest_index_;

  // To convert counts/ms to desired units
  const float scale_;
};
}  // namespace webrtc

#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_RATE_STATISTICS_H_
