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