14b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org/*
24b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
34b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *
44b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  Use of this source code is governed by a BSD-style license
54b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  that can be found in the LICENSE file in the root of the source
64b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  tree. An additional intellectual property rights grant can be found
74b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  in the file PATENTS.  All contributing project authors may
84b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
94b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org */
104b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
11c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
12c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
134b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
14bcf0a1019f34cac346bd8349c2206f9d06adbe4epbos@webrtc.org#include <assert.h>
15bcf0a1019f34cac346bd8349c2206f9d06adbe4epbos@webrtc.org#include <math.h>
16bcf0a1019f34cac346bd8349c2206f9d06adbe4epbos@webrtc.org
174b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include <algorithm>
184b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include <list>
194b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include <numeric>
20caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org#include <sstream>
214b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include <string>
224b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include <vector>
234b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
244b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org#include "webrtc/modules/interface/module_common_types.h"
25c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org#include "webrtc/modules/pacing/include/paced_sender.h"
26c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
27c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org#include "webrtc/system_wrappers/interface/clock.h"
28de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
294b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
304b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.orgnamespace webrtc {
314b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.orgnamespace testing {
324b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.orgnamespace bwe {
334b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
34b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.orgclass DelayCapHelper;
35de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.orgclass RateCounter;
36de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org
3751ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org
3851ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.orgtypedef std::vector<int> FlowIds;
3951ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.orgconst FlowIds CreateFlowIds(const int *flow_ids_array, size_t num_flow_ids);
4051ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org
414b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.orgtemplate<typename T> class Stats {
424b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
434b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  Stats()
444b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      : data_(),
454b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        last_mean_count_(0),
464b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        last_variance_count_(0),
474b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        last_minmax_count_(0),
484b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        mean_(0),
494b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        variance_(0),
504b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        min_(0),
514b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        max_(0) {
524b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
534b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
544b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  void Push(T data_point) {
554b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    data_.push_back(data_point);
564b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
574b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
584b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T GetMean() {
594b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    if (last_mean_count_ != data_.size()) {
604b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      last_mean_count_ = data_.size();
614b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      mean_ = std::accumulate(data_.begin(), data_.end(), static_cast<T>(0));
624b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      assert(last_mean_count_ != 0);
634b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      mean_ /= static_cast<T>(last_mean_count_);
644b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    }
654b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    return mean_;
664b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
674b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T GetVariance() {
684b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    if (last_variance_count_ != data_.size()) {
694b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      last_variance_count_ = data_.size();
704b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      T mean = GetMean();
714b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      variance_ = 0;
724b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      for (typename std::vector<T>::const_iterator it = data_.begin();
734b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org          it != data_.end(); ++it) {
744b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        T diff = (*it - mean);
754b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        variance_ += diff * diff;
764b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      }
774b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      assert(last_variance_count_ != 0);
784b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      variance_ /= static_cast<T>(last_variance_count_);
794b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    }
804b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    return variance_;
814b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
824b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T GetStdDev() {
83bcf0a1019f34cac346bd8349c2206f9d06adbe4epbos@webrtc.org    return sqrt(static_cast<double>(GetVariance()));
844b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
854b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T GetMin() {
864b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    RefreshMinMax();
874b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    return min_;
884b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
894b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T GetMax() {
904b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    RefreshMinMax();
914b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    return max_;
924b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
934b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
94caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  std::string AsString() {
95caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org    std::stringstream ss;
96caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org    ss << (GetMean() >= 0 ? GetMean() : -1) << ", " <<
97caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org        (GetStdDev() >= 0 ? GetStdDev() : -1);
98caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org    return ss.str();
99caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  }
100caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org
1014b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  void Log(const std::string& units) {
102c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    BWE_TEST_LOGGING_LOG5("", "%f %s\t+/-%f\t[%f,%f]",
1034b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        GetMean(), units.c_str(), GetStdDev(), GetMin(), GetMax());
1044b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
1054b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
1064b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
1074b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  void RefreshMinMax() {
1084b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    if (last_minmax_count_ != data_.size()) {
1094b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      last_minmax_count_ = data_.size();
1104b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      min_ = max_ = 0;
1114b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      if (data_.empty()) {
1124b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        return;
1134b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      }
1144b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      typename std::vector<T>::const_iterator it = data_.begin();
1154b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      min_ = max_ = *it;
1164b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      while (++it != data_.end()) {
1174b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        min_ = std::min(min_, *it);
1184b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org        max_ = std::max(max_, *it);
1194b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org      }
1204b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org    }
1214b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  }
1224b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
1234b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  std::vector<T> data_;
1244b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  typename std::vector<T>::size_type last_mean_count_;
1254b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  typename std::vector<T>::size_type last_variance_count_;
1264b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  typename std::vector<T>::size_type last_minmax_count_;
1274b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T mean_;
1284b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T variance_;
1294b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T min_;
1304b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  T max_;
1314b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
1324b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
133cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass Random {
1344b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
135cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit Random(uint32_t seed);
1364b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
137cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // Return pseudo random number in the interval [0.0, 1.0].
138cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  float Rand();
1394b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
140cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // Normal Distribution.
141cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  int Gaussian(int mean, int standard_deviation);
1424b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
143cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // TODO(solenberg): Random from histogram.
144cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // template<typename T> int Distribution(const std::vector<T> histogram) {
1454b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
146cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org private:
147cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t a_;
148cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t b_;
149cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
150cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(Random);
151cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org};
152cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
153cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass Packet {
154cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org public:
155cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  Packet();
15651ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  Packet(int flow_id, int64_t send_time_us, uint32_t payload_size,
157df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org         const RTPHeader& header);
158cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  Packet(int64_t send_time_us, uint32_t sequence_number);
159cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
160cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  bool operator<(const Packet& rhs) const;
161cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
16251ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  int flow_id() const { return flow_id_; }
163df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  int64_t creation_time_us() const { return creation_time_us_; }
164cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void set_send_time_us(int64_t send_time_us);
1654b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t send_time_us() const { return send_time_us_; }
166c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  void SetAbsSendTimeMs(int64_t abs_send_time_ms);
1674b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  uint32_t payload_size() const { return payload_size_; }
1684b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  const RTPHeader& header() const { return header_; }
1694b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
1704b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
17151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  int flow_id_;
172df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  int64_t creation_time_us_;  // Time when the packet was created.
1734b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t send_time_us_;   // Time the packet left last processor touching it.
1744b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  uint32_t payload_size_;  // Size of the (non-existent, simulated) payload.
1754b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  RTPHeader header_;       // Actual contents.
1764b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
1774b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
178cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgtypedef std::list<Packet> Packets;
179cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgtypedef std::list<Packet>::iterator PacketsIt;
180cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgtypedef std::list<Packet>::const_iterator PacketsConstIt;
1814b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
1824b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.orgbool IsTimeSorted(const Packets& packets);
1834b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
184cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass PacketProcessor;
185cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
186cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass PacketProcessorListener {
1874b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
188cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual ~PacketProcessorListener() {}
1894b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
19051ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  virtual void AddPacketProcessor(PacketProcessor* processor,
19151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                                  bool is_sender) = 0;
192cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RemovePacketProcessor(PacketProcessor* processor) = 0;
1934b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
1944b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
195cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass PacketProcessor {
1964b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
19751ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  PacketProcessor(PacketProcessorListener* listener, bool is_sender);
19851ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  PacketProcessor(PacketProcessorListener* listener, const FlowIds& flow_ids,
19951ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                  bool is_sender);
200cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual ~PacketProcessor();
2014b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
202df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  // Called after each simulation batch to allow the processor to plot any
203df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  // internal data.
204df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  virtual void Plot(int64_t timestamp_ms) {}
205df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org
206cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // Run simulation for |time_ms| micro seconds, consuming packets from, and
207cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // producing packets into in_out. The outgoing packet list must be sorted on
208cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // |send_time_us_|. The simulation time |time_ms| is optional to use.
209cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out) = 0;
2104b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
21151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  const FlowIds& flow_ids() const { return flow_ids_; }
21251ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org
2134b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
214cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  PacketProcessorListener* listener_;
21551ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  FlowIds flow_ids_;
2164b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
217cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_COPY_AND_ASSIGN(PacketProcessor);
2184b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
2194b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
220cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass RateCounterFilter : public PacketProcessor {
2214b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
222cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit RateCounterFilter(PacketProcessorListener* listener);
223df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  RateCounterFilter(PacketProcessorListener* listener,
224de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org                    const std::string& name);
22551ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  RateCounterFilter(PacketProcessorListener* listener,
22651ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                    const FlowIds& flow_ids,
22751ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                    const std::string& name);
228cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual ~RateCounterFilter();
2294b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
230de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  uint32_t packets_per_second() const;
231de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  uint32_t bits_per_second() const;
2324b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
233cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void LogStats();
234e823012b65d4260205a91a9381fd9cdf2057d6ddstefan@webrtc.org  Stats<double> GetBitrateStats() const;
235df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  virtual void Plot(int64_t timestamp_ms);
236cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
2374b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
2384b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
239de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  scoped_ptr<RateCounter> rate_counter_;
240caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  Stats<double> packets_per_second_stats_;
2414b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  Stats<double> kbps_stats_;
242df1f99ff019b1c666a15bf65e222cb2518d4e62cstefan@webrtc.org  std::string name_;
2434b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
244cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(RateCounterFilter);
2454b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
2464b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
247cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass LossFilter : public PacketProcessor {
2484b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
249cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit LossFilter(PacketProcessorListener* listener);
2504b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  virtual ~LossFilter() {}
2514b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
252cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetLoss(float loss_percent);
253cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
2544b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
2554b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
2564b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  Random random_;
2574b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  float loss_fraction_;
2584b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
259cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(LossFilter);
2604b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
2614b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
262cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass DelayFilter : public PacketProcessor {
2634b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
264cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit DelayFilter(PacketProcessorListener* listener);
2654b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  virtual ~DelayFilter() {}
2664b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
267cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetDelay(int64_t delay_ms);
268cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
2694b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
2704b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
2714b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t delay_us_;
2724b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t last_send_time_us_;
2734b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
274cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(DelayFilter);
2754b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
2764b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
277cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass JitterFilter : public PacketProcessor {
2784b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
279cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit JitterFilter(PacketProcessorListener* listener);
2804b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  virtual ~JitterFilter() {}
2814b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
282cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetJitter(int64_t stddev_jitter_ms);
283cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
2844b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
2854b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
2864b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  Random random_;
2874b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t stddev_jitter_us_;
2884b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t last_send_time_us_;
2894b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
290cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(JitterFilter);
2914b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
2924b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
293cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass ReorderFilter : public PacketProcessor {
2944b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
295cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit ReorderFilter(PacketProcessorListener* listener);
2964b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  virtual ~ReorderFilter() {}
2974b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
298cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetReorder(float reorder_percent);
299cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
3004b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
3014b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
3024b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  Random random_;
3034b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  float reorder_fraction_;
3044b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
305cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(ReorderFilter);
3064b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
3074b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
3084b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org// Apply a bitrate choke with an infinite queue on the packet stream.
309cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass ChokeFilter : public PacketProcessor {
3104b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org public:
311cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit ChokeFilter(PacketProcessorListener* listener);
31251ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  ChokeFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
313b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  virtual ~ChokeFilter();
3144b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
315cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetCapacity(uint32_t kbps);
316b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  void SetMaxDelay(int max_delay_ms);
317cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
3184b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
319b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  Stats<double> GetDelayStats() const;
320b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org
3214b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org private:
3224b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  uint32_t kbps_;
3234b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org  int64_t last_send_time_us_;
324b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  scoped_ptr<DelayCapHelper> delay_cap_helper_;
3254b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
326cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(ChokeFilter);
327cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org};
328cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
329ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.orgclass TraceBasedDeliveryFilter : public PacketProcessor {
330ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org public:
331ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  explicit TraceBasedDeliveryFilter(PacketProcessorListener* listener);
332de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  TraceBasedDeliveryFilter(PacketProcessorListener* listener,
333de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org                           const std::string& name);
334de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  virtual ~TraceBasedDeliveryFilter();
335ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org
336ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  // The file should contain nanosecond timestamps corresponding to the time
337ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  // when the network can accept another packet. The timestamps should be
338ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  // separated by new lines, e.g., "100000000\n125000000\n321000000\n..."
339ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  bool Init(const std::string& filename);
340de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  virtual void Plot(int64_t timestamp_ms);
341ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out);
342ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org
343b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  void SetMaxDelay(int max_delay_ms);
344b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  Stats<double> GetDelayStats() const;
345caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  Stats<double> GetBitrateStats() const;
346b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org
347ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org private:
348ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  void ProceedToNextSlot();
349ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org
350ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  typedef std::vector<int64_t> TimeList;
3517a560797ddeafa0472a0bd85aa9ad62b2530ffbastefan@webrtc.org  int64_t current_offset_us_;
352ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  TimeList delivery_times_us_;
353ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  TimeList::const_iterator next_delivery_it_;
354ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  int64_t local_time_us_;
355de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  scoped_ptr<RateCounter> rate_counter_;
356de93ce079f7ee5a42592e670d9f30d880e760a25stefan@webrtc.org  std::string name_;
357b67e9b7527bc6b4a4d189f50de6f051985ac954estefan@webrtc.org  scoped_ptr<DelayCapHelper> delay_cap_helper_;
358caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  Stats<double> packets_per_second_stats_;
359caa56eb9a5ef6074f59a321bdf60f2a43503f805stefan@webrtc.org  Stats<double> kbps_stats_;
360ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org
361ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org  DISALLOW_COPY_AND_ASSIGN(TraceBasedDeliveryFilter);
362ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org};
363ef6a602db36bf9d4fc7c2f1d69b2f04a56349edfstefan@webrtc.org
364cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass PacketSender : public PacketProcessor {
365cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org public:
366cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  struct Feedback {
367af00735ca7a7b0eab3e31d9d274340b3589fa5e4solenberg@webrtc.org    uint32_t estimated_bps;
368cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  };
369cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
370cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  explicit PacketSender(PacketProcessorListener* listener);
37151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  PacketSender(PacketProcessorListener* listener, const FlowIds& flow_ids);
372cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual ~PacketSender() {}
373cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
374cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual uint32_t GetCapacityKbps() const { return 0; }
375cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
376cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // Call GiveFeedback() with the returned interval in milliseconds, provided
377cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  // there is a new estimate available.
37876dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  // Note that changing the feedback interval affects the timing of when the
37976dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  // output of the estimators is sampled and therefore the baseline files may
38076dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  // have to be regenerated.
38151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  virtual int GetFeedbackIntervalMs() const { return 1000; }
382cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual void GiveFeedback(const Feedback& feedback) {}
383cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
384cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org private:
385cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_COPY_AND_ASSIGN(PacketSender);
386cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org};
387cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
388cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.orgclass VideoSender : public PacketSender {
389cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org public:
39051ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  VideoSender(int flow_id, PacketProcessorListener* listener, float fps,
39151ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org              uint32_t kbps, uint32_t ssrc, float first_frame_offset);
392cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  virtual ~VideoSender() {}
393cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
394cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t max_payload_size_bytes() const { return kMaxPayloadSizeBytes; }
395cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t bytes_per_second() const { return bytes_per_second_; }
396cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
397c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual uint32_t GetCapacityKbps() const OVERRIDE;
398cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
399c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out) OVERRIDE;
400cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
40176dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org protected:
402cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  const uint32_t kMaxPayloadSizeBytes;
403cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  const uint32_t kTimestampBase;
40476dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  const double frame_period_ms_;
405cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t bytes_per_second_;
406cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  uint32_t frame_size_bytes_;
40776dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org
40876dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org private:
40976dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  double next_frame_ms_;
41076dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  double now_ms_;
411cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  RTPHeader prototype_header_;
412cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
413cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(VideoSender);
4144b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org};
41576dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org
41676dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.orgclass AdaptiveVideoSender : public VideoSender {
41776dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org public:
41851ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org  AdaptiveVideoSender(int flow_id, PacketProcessorListener* listener,
41951ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                      float fps, uint32_t kbps, uint32_t ssrc,
42051ef6b0a9d93b12a6a2d31a8ecb3b5e5dcc0cbe3stefan@webrtc.org                      float first_frame_offset);
42176dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  virtual ~AdaptiveVideoSender() {}
42276dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org
423c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual int GetFeedbackIntervalMs() const OVERRIDE { return 100; }
424c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual void GiveFeedback(const Feedback& feedback) OVERRIDE;
42576dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org
426c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org private:
42776dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(AdaptiveVideoSender);
42876dcaae0f350051ae2a9364ee92f65f9683c5b24stefan@webrtc.org};
429c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
430c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.orgclass PacedVideoSender : public PacketSender, public PacedSender::Callback {
431c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org public:
432c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  PacedVideoSender(PacketProcessorListener* listener,
433c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org                   uint32_t kbps, AdaptiveVideoSender* source);
434c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual ~PacedVideoSender() {}
435c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
436c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual int GetFeedbackIntervalMs() const OVERRIDE { return 100; }
437c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual void GiveFeedback(const Feedback& feedback) OVERRIDE;
438c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual void RunFor(int64_t time_ms, Packets* in_out) OVERRIDE;
439c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
440c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  // Implements PacedSender::Callback.
441c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual bool TimeToSendPacket(uint32_t ssrc,
442c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org                                uint16_t sequence_number,
443c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org                                int64_t capture_time_ms,
444c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org                                bool retransmission) OVERRIDE;
445c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  virtual int TimeToSendPadding(int bytes) OVERRIDE;
446c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
447c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org private:
448c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  void QueuePackets(Packets* batch, int64_t end_of_batch_time_us);
449c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
450c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  static const int64_t kInitialTimeMs = 0;
451c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  SimulatedClock clock_;
452c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  int64_t start_of_run_ms_;
453c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  PacedSender pacer_;
454c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  Packets pacer_queue_;
455c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  Packets queue_;
456c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  AdaptiveVideoSender* source_;
457c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org
458c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org  DISALLOW_IMPLICIT_CONSTRUCTORS(PacedVideoSender);
459c9995bc06a99f8b82a0ca0ddf5a5bb982cb0c11bstefan@webrtc.org};
4604b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org}  // namespace bwe
4614b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org}  // namespace testing
4624b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org}  // namespace webrtc
4634b3ff2d418644bf4ce29763db9a406fd1e16cbf5solenberg@webrtc.org
464c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
465