Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h

Issue 1202253003: More Simulation Framework features (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Adapted PacedVideoSender::TimeToSendPacket Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_ 11 #ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
12 #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_ 12 #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
13 13
14 #include <assert.h> 14 #include <assert.h>
15 #include <math.h> 15 #include <math.h>
16 16
17 #include <algorithm> 17 #include <algorithm>
18 #include <list> 18 #include <list>
19 #include <numeric> 19 #include <numeric>
20 #include <sstream> 20 #include <sstream>
21 #include <string> 21 #include <string>
22 #include <vector> 22 #include <vector>
23 23
24 #include "webrtc/base/common.h"
24 #include "webrtc/base/scoped_ptr.h" 25 #include "webrtc/base/scoped_ptr.h"
25 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" 26 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
26 #include "webrtc/modules/interface/module_common_types.h" 27 #include "webrtc/modules/interface/module_common_types.h"
27 #include "webrtc/modules/pacing/include/paced_sender.h" 28 #include "webrtc/modules/pacing/include/paced_sender.h"
28 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimat or.h" 29 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimat or.h"
29 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h" 30 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
30 #include "webrtc/modules/remote_bitrate_estimator/test/packet.h" 31 #include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
31 #include "webrtc/modules/remote_bitrate_estimator/test/random.h" 32 #include "webrtc/modules/remote_bitrate_estimator/test/random.h"
32 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 33 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
33 #include "webrtc/system_wrappers/interface/clock.h" 34 #include "webrtc/system_wrappers/interface/clock.h"
34 35
35 namespace webrtc { 36 namespace webrtc {
36 37
37 class RtcpBandwidthObserver; 38 class RtcpBandwidthObserver;
38 39
39 namespace testing { 40 namespace testing {
40 namespace bwe { 41 namespace bwe {
41 42
42 class DelayCapHelper; 43 class DelayCapHelper;
43 class RateCounter; 44
45 class RateCounter {
46 public:
47 RateCounter(int64_t window_size_ms)
48 : window_size_us_(1000 * window_size_ms),
49 recently_received_packets_(0),
50 recently_received_bytes_(0),
51 last_accumulated_us_(0),
52 window_() {}
53
54 RateCounter() : RateCounter(1000) {}
55
56 void UpdateRates(int64_t send_time_us, uint32_t payload_size);
57
58 int64_t window_size_ms() const { return window_size_us_ / 1000; }
59 uint32_t packets_per_second() const;
60 uint32_t bits_per_second() const;
61
62 double BitrateWindowS() const;
63
64 private:
65 typedef std::pair<int64_t, uint32_t> TimeSizePair;
66
67 int64_t window_size_us_;
68 uint32_t recently_received_packets_;
69 uint32_t recently_received_bytes_;
70 int64_t last_accumulated_us_;
71 std::list<TimeSizePair> window_;
72 };
44 73
45 typedef std::set<int> FlowIds; 74 typedef std::set<int> FlowIds;
46 const FlowIds CreateFlowIds(const int *flow_ids_array, size_t num_flow_ids); 75 const FlowIds CreateFlowIds(const int *flow_ids_array, size_t num_flow_ids);
76 const FlowIds CreateFlowIdRange(int initial_value, int last_value);
47 77
48 template <typename T> 78 template <typename T>
49 bool DereferencingComparator(const T* const& a, const T* const& b) { 79 bool DereferencingComparator(const T* const& a, const T* const& b) {
50 assert(a != NULL); 80 assert(a != NULL);
51 assert(b != NULL); 81 assert(b != NULL);
52 return *a < *b; 82 return *a < *b;
53 } 83 }
54 84
55 template<typename T> class Stats { 85 template<typename T> class Stats {
56 public: 86 public:
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 std::vector<T> data_; 166 std::vector<T> data_;
137 typename std::vector<T>::size_type last_mean_count_; 167 typename std::vector<T>::size_type last_mean_count_;
138 typename std::vector<T>::size_type last_variance_count_; 168 typename std::vector<T>::size_type last_variance_count_;
139 typename std::vector<T>::size_type last_minmax_count_; 169 typename std::vector<T>::size_type last_minmax_count_;
140 T mean_; 170 T mean_;
141 T variance_; 171 T variance_;
142 T min_; 172 T min_;
143 T max_; 173 T max_;
144 }; 174 };
145 175
176 class Random {
177 public:
178 explicit Random(uint32_t seed);
179
180 // Return pseudo random number in the interval [0.0, 1.0].
181 float Rand();
182
183 // Return pseudo rounded random number in interval [low, high].
184 int Rand(int low, int high);
185
186 // Normal Distribution.
187 int Gaussian(int mean, int standard_deviation);
188
189 // Exponential Distribution.
190 int Exponential(float lambda);
191
192 // TODO(solenberg): Random from histogram.
193 // template<typename T> int Distribution(const std::vector<T> histogram) {
194
195 private:
196 uint32_t a_;
197 uint32_t b_;
198
199 DISALLOW_IMPLICIT_CONSTRUCTORS(Random);
200 };
201
146 bool IsTimeSorted(const Packets& packets); 202 bool IsTimeSorted(const Packets& packets);
147 203
148 class PacketProcessor; 204 class PacketProcessor;
149 205
150 enum ProcessorType { kSender, kReceiver, kRegular }; 206 enum ProcessorType { kSender, kReceiver, kRegular };
151 207
152 class PacketProcessorListener { 208 class PacketProcessorListener {
153 public: 209 public:
154 virtual ~PacketProcessorListener() {} 210 virtual ~PacketProcessorListener() {}
155 211
(...skipping 16 matching lines...) Expand all
172 // internal data. 228 // internal data.
173 virtual void Plot(int64_t timestamp_ms) {} 229 virtual void Plot(int64_t timestamp_ms) {}
174 230
175 // Run simulation for |time_ms| milliseconds, consuming packets from, and 231 // Run simulation for |time_ms| milliseconds, consuming packets from, and
176 // producing packets into in_out. The outgoing packet list must be sorted on 232 // producing packets into in_out. The outgoing packet list must be sorted on
177 // |send_time_us_|. The simulation time |time_ms| is optional to use. 233 // |send_time_us_|. The simulation time |time_ms| is optional to use.
178 virtual void RunFor(int64_t time_ms, Packets* in_out) = 0; 234 virtual void RunFor(int64_t time_ms, Packets* in_out) = 0;
179 235
180 const FlowIds& flow_ids() const { return flow_ids_; } 236 const FlowIds& flow_ids() const { return flow_ids_; }
181 237
238 uint32_t packets_per_second() const;
239 uint32_t bits_per_second() const;
240
241 protected:
242 RateCounter rate_counter_;
243
182 private: 244 private:
183 PacketProcessorListener* listener_; 245 PacketProcessorListener* listener_;
184 const FlowIds flow_ids_; 246 const FlowIds flow_ids_;
185 247
186 DISALLOW_COPY_AND_ASSIGN(PacketProcessor); 248 DISALLOW_COPY_AND_ASSIGN(PacketProcessor);
187 }; 249 };
188 250
189 class RateCounterFilter : public PacketProcessor { 251 class RateCounterFilter : public PacketProcessor {
190 public: 252 public:
191 RateCounterFilter(PacketProcessorListener* listener, 253 RateCounterFilter(PacketProcessorListener* listener,
192 int flow_id, 254 int flow_id,
193 const char* name); 255 const char* name);
194 RateCounterFilter(PacketProcessorListener* listener, 256 RateCounterFilter(PacketProcessorListener* listener,
195 const FlowIds& flow_ids, 257 const FlowIds& flow_ids,
196 const char* name); 258 const char* name);
259 RateCounterFilter(PacketProcessorListener* listener,
260 const FlowIds& flow_ids,
261 const char* name,
262 int64_t start_plotting_time_ms);
197 virtual ~RateCounterFilter(); 263 virtual ~RateCounterFilter();
198 264
199 uint32_t packets_per_second() const;
200 uint32_t bits_per_second() const;
201
202 void LogStats(); 265 void LogStats();
203 Stats<double> GetBitrateStats() const; 266 Stats<double> GetBitrateStats() const;
204 virtual void Plot(int64_t timestamp_ms); 267 virtual void Plot(int64_t timestamp_ms);
205 virtual void RunFor(int64_t time_ms, Packets* in_out); 268 virtual void RunFor(int64_t time_ms, Packets* in_out);
206 269
207 private: 270 private:
208 rtc::scoped_ptr<RateCounter> rate_counter_;
209 Stats<double> packets_per_second_stats_; 271 Stats<double> packets_per_second_stats_;
210 Stats<double> kbps_stats_; 272 Stats<double> kbps_stats_;
211 std::string name_; 273 std::string name_;
274 int64_t start_plotting_time_ms_;
212 275
213 DISALLOW_IMPLICIT_CONSTRUCTORS(RateCounterFilter); 276 DISALLOW_IMPLICIT_CONSTRUCTORS(RateCounterFilter);
214 }; 277 };
215 278
216 class LossFilter : public PacketProcessor { 279 class LossFilter : public PacketProcessor {
217 public: 280 public:
218 LossFilter(PacketProcessorListener* listener, int flow_id); 281 LossFilter(PacketProcessorListener* listener, int flow_id);
219 LossFilter(PacketProcessorListener* listener, const FlowIds& flow_ids); 282 LossFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
220 virtual ~LossFilter() {} 283 virtual ~LossFilter() {}
221 284
222 void SetLoss(float loss_percent); 285 void SetLoss(float loss_percent);
223 virtual void RunFor(int64_t time_ms, Packets* in_out); 286 virtual void RunFor(int64_t time_ms, Packets* in_out);
224 287
225 private: 288 private:
226 Random random_; 289 Random random_;
227 float loss_fraction_; 290 float loss_fraction_;
228 291
229 DISALLOW_IMPLICIT_CONSTRUCTORS(LossFilter); 292 DISALLOW_IMPLICIT_CONSTRUCTORS(LossFilter);
230 }; 293 };
231 294
232 class DelayFilter : public PacketProcessor { 295 class DelayFilter : public PacketProcessor {
233 public: 296 public:
234 DelayFilter(PacketProcessorListener* listener, int flow_id); 297 DelayFilter(PacketProcessorListener* listener, int flow_id);
235 DelayFilter(PacketProcessorListener* listener, const FlowIds& flow_ids); 298 DelayFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
236 virtual ~DelayFilter() {} 299 virtual ~DelayFilter() {}
237 300
238 void SetDelayMs(int64_t delay_ms); 301 void SetOneWayDelayMs(int64_t one_way_delay_ms);
239 virtual void RunFor(int64_t time_ms, Packets* in_out); 302 virtual void RunFor(int64_t time_ms, Packets* in_out);
240 303
241 private: 304 private:
242 int64_t delay_us_; 305 int64_t one_way_delay_us_;
243 int64_t last_send_time_us_; 306 int64_t last_send_time_us_;
244 307
245 DISALLOW_IMPLICIT_CONSTRUCTORS(DelayFilter); 308 DISALLOW_IMPLICIT_CONSTRUCTORS(DelayFilter);
246 }; 309 };
247 310
248 class JitterFilter : public PacketProcessor { 311 class JitterFilter : public PacketProcessor {
249 public: 312 public:
250 JitterFilter(PacketProcessorListener* listener, int flow_id); 313 JitterFilter(PacketProcessorListener* listener, int flow_id);
251 JitterFilter(PacketProcessorListener* listener, const FlowIds& flow_ids); 314 JitterFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
252 virtual ~JitterFilter() {} 315 virtual ~JitterFilter() {}
(...skipping 26 matching lines...) Expand all
279 DISALLOW_IMPLICIT_CONSTRUCTORS(ReorderFilter); 342 DISALLOW_IMPLICIT_CONSTRUCTORS(ReorderFilter);
280 }; 343 };
281 344
282 // Apply a bitrate choke with an infinite queue on the packet stream. 345 // Apply a bitrate choke with an infinite queue on the packet stream.
283 class ChokeFilter : public PacketProcessor { 346 class ChokeFilter : public PacketProcessor {
284 public: 347 public:
285 ChokeFilter(PacketProcessorListener* listener, int flow_id); 348 ChokeFilter(PacketProcessorListener* listener, int flow_id);
286 ChokeFilter(PacketProcessorListener* listener, const FlowIds& flow_ids); 349 ChokeFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
287 virtual ~ChokeFilter(); 350 virtual ~ChokeFilter();
288 351
289 void SetCapacity(uint32_t kbps); 352 void set_capacity_kbps(uint32_t kbps);
290 void SetMaxDelay(int max_delay_ms); 353 void set_max_delay_ms(int64_t max_queueing_delay_ms);
354
355 uint32_t capacity_kbps();
356
291 virtual void RunFor(int64_t time_ms, Packets* in_out); 357 virtual void RunFor(int64_t time_ms, Packets* in_out);
292 358
293 Stats<double> GetDelayStats() const; 359 Stats<double> GetDelayStats() const;
294 360
295 private: 361 private:
296 uint32_t kbps_; 362 uint32_t capacity_kbps_;
297 int64_t last_send_time_us_; 363 int64_t last_send_time_us_;
298 rtc::scoped_ptr<DelayCapHelper> delay_cap_helper_; 364 rtc::scoped_ptr<DelayCapHelper> delay_cap_helper_;
365 int64_t max_delay_us_;
299 366
300 DISALLOW_IMPLICIT_CONSTRUCTORS(ChokeFilter); 367 DISALLOW_IMPLICIT_CONSTRUCTORS(ChokeFilter);
301 }; 368 };
302 369
303 class TraceBasedDeliveryFilter : public PacketProcessor { 370 class TraceBasedDeliveryFilter : public PacketProcessor {
304 public: 371 public:
305 TraceBasedDeliveryFilter(PacketProcessorListener* listener, int flow_id); 372 TraceBasedDeliveryFilter(PacketProcessorListener* listener, int flow_id);
306 TraceBasedDeliveryFilter(PacketProcessorListener* listener, 373 TraceBasedDeliveryFilter(PacketProcessorListener* listener,
307 const FlowIds& flow_ids); 374 const FlowIds& flow_ids);
308 TraceBasedDeliveryFilter(PacketProcessorListener* listener, 375 TraceBasedDeliveryFilter(PacketProcessorListener* listener,
309 int flow_id, 376 int flow_id,
310 const char* name); 377 const char* name);
311 virtual ~TraceBasedDeliveryFilter(); 378 virtual ~TraceBasedDeliveryFilter();
312 379
313 // The file should contain nanosecond timestamps corresponding to the time 380 // The file should contain nanosecond timestamps corresponding to the time
314 // when the network can accept another packet. The timestamps should be 381 // when the network can accept another packet. The timestamps should be
315 // separated by new lines, e.g., "100000000\n125000000\n321000000\n..." 382 // separated by new lines, e.g., "100000000\n125000000\n321000000\n..."
316 bool Init(const std::string& filename); 383 bool Init(const std::string& filename);
317 virtual void Plot(int64_t timestamp_ms); 384 virtual void Plot(int64_t timestamp_ms);
318 virtual void RunFor(int64_t time_ms, Packets* in_out); 385 virtual void RunFor(int64_t time_ms, Packets* in_out);
319 386
320 void SetMaxDelay(int max_delay_ms); 387 void set_max_delay_ms(int64_t max_delay_ms);
321 Stats<double> GetDelayStats() const; 388 Stats<double> GetDelayStats() const;
322 Stats<double> GetBitrateStats() const; 389 Stats<double> GetBitrateStats() const;
323 390
324 private: 391 private:
325 void ProceedToNextSlot(); 392 void ProceedToNextSlot();
326 393
327 typedef std::vector<int64_t> TimeList; 394 typedef std::vector<int64_t> TimeList;
328 int64_t current_offset_us_; 395 int64_t current_offset_us_;
329 TimeList delivery_times_us_; 396 TimeList delivery_times_us_;
330 TimeList::const_iterator next_delivery_it_; 397 TimeList::const_iterator next_delivery_it_;
(...skipping 15 matching lines...) Expand all
346 uint32_t ssrc, 413 uint32_t ssrc,
347 int64_t first_frame_offset_ms); 414 int64_t first_frame_offset_ms);
348 virtual ~VideoSource() {} 415 virtual ~VideoSource() {}
349 416
350 virtual void RunFor(int64_t time_ms, Packets* in_out); 417 virtual void RunFor(int64_t time_ms, Packets* in_out);
351 418
352 virtual int flow_id() const { return flow_id_; } 419 virtual int flow_id() const { return flow_id_; }
353 virtual void SetBitrateBps(int bitrate_bps) {} 420 virtual void SetBitrateBps(int bitrate_bps) {}
354 uint32_t bits_per_second() const { return bits_per_second_; } 421 uint32_t bits_per_second() const { return bits_per_second_; }
355 uint32_t max_payload_size_bytes() const { return kMaxPayloadSizeBytes; } 422 uint32_t max_payload_size_bytes() const { return kMaxPayloadSizeBytes; }
356 int64_t GetTimeUntilNextFrameMs() const { return next_frame_ms_ - now_ms_; } 423 int64_t GetTimeUntilNextFrameMs() const { return next_frame_ms_ - now_ms_; }
stefan-webrtc 2015/07/14 13:49:04 Make sure this takes the randomization into accoun
magalhaesc 2015/07/14 17:19:33 Done.
357 424
358 protected: 425 protected:
359 virtual uint32_t NextFrameSize(); 426 virtual uint32_t NextFrameSize();
360 virtual uint32_t NextPacketSize(uint32_t frame_size, 427 virtual uint32_t NextPacketSize(uint32_t frame_size,
361 uint32_t remaining_payload); 428 uint32_t remaining_payload);
362 429
363 const uint32_t kMaxPayloadSizeBytes; 430 const uint32_t kMaxPayloadSizeBytes;
364 const uint32_t kTimestampBase; 431 const uint32_t kTimestampBase;
365 const double frame_period_ms_; 432 const double frame_period_ms_;
366 uint32_t bits_per_second_; 433 uint32_t bits_per_second_;
367 uint32_t frame_size_bytes_; 434 uint32_t frame_size_bytes_;
368 435
369 private: 436 private:
370 const int flow_id_; 437 const int flow_id_;
371 int64_t next_frame_ms_; 438 int64_t next_frame_ms_;
372 int64_t now_ms_; 439 int64_t now_ms_;
373 RTPHeader prototype_header_; 440 RTPHeader prototype_header_;
441 int64_t start_plotting_ms_;
442 uint32_t previous_bitrate_bps_;
374 443
375 DISALLOW_IMPLICIT_CONSTRUCTORS(VideoSource); 444 DISALLOW_IMPLICIT_CONSTRUCTORS(VideoSource);
376 }; 445 };
377 446
378 class AdaptiveVideoSource : public VideoSource { 447 class AdaptiveVideoSource : public VideoSource {
379 public: 448 public:
380 AdaptiveVideoSource(int flow_id, 449 AdaptiveVideoSource(int flow_id,
381 float fps, 450 float fps,
382 uint32_t kbps, 451 uint32_t kbps,
383 uint32_t ssrc, 452 uint32_t ssrc,
(...skipping 26 matching lines...) Expand all
410 uint32_t frame_counter_; 479 uint32_t frame_counter_;
411 int compensation_bytes_; 480 int compensation_bytes_;
412 int compensation_per_frame_; 481 int compensation_per_frame_;
413 DISALLOW_IMPLICIT_CONSTRUCTORS(PeriodicKeyFrameSource); 482 DISALLOW_IMPLICIT_CONSTRUCTORS(PeriodicKeyFrameSource);
414 }; 483 };
415 } // namespace bwe 484 } // namespace bwe
416 } // namespace testing 485 } // namespace testing
417 } // namespace webrtc 486 } // namespace webrtc
418 487
419 #endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_ 488 #endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698