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

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc

Issue 1237393002: Evaluation tests (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing issues: removed to_string(), added static_cast<int> where conversion was implicit 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 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h" 11 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
12 12
13 #include <sstream>
14
13 #include "webrtc/base/common.h" 15 #include "webrtc/base/common.h"
14 #include "webrtc/base/scoped_ptr.h" 16 #include "webrtc/base/scoped_ptr.h"
15 #include "webrtc/modules/interface/module_common_types.h" 17 #include "webrtc/modules/interface/module_common_types.h"
16 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h" 18 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
19 #include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h"
17 #include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h" 20 #include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
18 #include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h" 21 #include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
19 #include "webrtc/system_wrappers/interface/clock.h" 22 #include "webrtc/system_wrappers/interface/clock.h"
20 #include "webrtc/test/testsupport/perf_test.h" 23 #include "webrtc/test/testsupport/perf_test.h"
21 24
22 using std::string; 25 using std::string;
23 using std::vector; 26 using std::vector;
24 27
25 namespace webrtc { 28 namespace webrtc {
26 namespace testing { 29 namespace testing {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 if ((*it)->send_time_us() > end_of_batch_time_us) { 86 if ((*it)->send_time_us() > end_of_batch_time_us) {
84 break; 87 break;
85 } 88 }
86 } 89 }
87 Packets to_transfer; 90 Packets to_transfer;
88 to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it); 91 to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it);
89 batch->merge(to_transfer, DereferencingComparator<Packet>); 92 batch->merge(to_transfer, DereferencingComparator<Packet>);
90 } 93 }
91 94
92 BweTest::BweTest() 95 BweTest::BweTest()
93 : run_time_ms_(0), time_now_ms_(-1), simulation_interval_ms_(-1) { 96 : run_time_ms_(0),
97 time_now_ms_(-1),
98 simulation_interval_ms_(-1),
99 plot_total_available_capacity_(true) {
94 links_.push_back(&uplink_); 100 links_.push_back(&uplink_);
95 links_.push_back(&downlink_); 101 links_.push_back(&downlink_);
96 } 102 }
97 103
98 BweTest::~BweTest() { 104 BweTest::~BweTest() {
99 for (Packet* packet : packets_) 105 for (Packet* packet : packets_)
100 delete packet; 106 delete packet;
101 } 107 }
102 108
103 void BweTest::SetUp() { 109 void BweTest::SetUp() {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 234 }
229 webrtc::test::PrintResult("BwePerformance", GetTestName(), "Fairness", 235 webrtc::test::PrintResult("BwePerformance", GetTestName(), "Fairness",
230 fairness_index * 100, "%", false); 236 fairness_index * 100, "%", false);
231 } 237 }
232 238
233 void BweTest::RunFairnessTest(BandwidthEstimatorType bwe_type, 239 void BweTest::RunFairnessTest(BandwidthEstimatorType bwe_type,
234 size_t num_media_flows, 240 size_t num_media_flows,
235 size_t num_tcp_flows, 241 size_t num_tcp_flows,
236 int64_t run_time_seconds, 242 int64_t run_time_seconds,
237 int capacity_kbps, 243 int capacity_kbps,
238 int max_delay_ms) { 244 int64_t max_delay_ms,
245 int64_t rtt_ms,
246 int64_t max_jitter_ms,
247 const int64_t* offsets_ms) {
239 std::set<int> all_flow_ids; 248 std::set<int> all_flow_ids;
240 std::set<int> media_flow_ids; 249 std::set<int> media_flow_ids;
241 std::set<int> tcp_flow_ids; 250 std::set<int> tcp_flow_ids;
242 int next_flow_id = 0; 251 int next_flow_id = 0;
243 for (size_t i = 0; i < num_media_flows; ++i) { 252 for (size_t i = 0; i < num_media_flows; ++i) {
244 media_flow_ids.insert(next_flow_id); 253 media_flow_ids.insert(next_flow_id);
245 all_flow_ids.insert(next_flow_id); 254 all_flow_ids.insert(next_flow_id);
246 ++next_flow_id; 255 ++next_flow_id;
247 } 256 }
248 for (size_t i = 0; i < num_tcp_flows; ++i) { 257 for (size_t i = 0; i < num_tcp_flows; ++i) {
249 tcp_flow_ids.insert(next_flow_id); 258 tcp_flow_ids.insert(next_flow_id);
250 all_flow_ids.insert(next_flow_id); 259 all_flow_ids.insert(next_flow_id);
251 ++next_flow_id; 260 ++next_flow_id;
252 } 261 }
253 262
254 std::vector<VideoSource*> sources; 263 std::vector<VideoSource*> sources;
255 std::vector<PacketSender*> senders; 264 std::vector<PacketSender*> senders;
265 std::vector<MetricRecorder*> metric_recorders;
256 266
257 size_t i = 1; 267 int64_t max_offset_ms = 0;
268 size_t i = 0;
269
258 for (int media_flow : media_flow_ids) { 270 for (int media_flow : media_flow_ids) {
259 // Streams started 20 seconds apart to give them different advantage when 271 sources.push_back(
260 // competing for the bandwidth. 272 new AdaptiveVideoSource(media_flow, 30, 300, 0, offsets_ms[i]));
261 const int64_t kFlowStartOffsetMs = i++ * (rand() % 10000);
262 sources.push_back(new AdaptiveVideoSource(media_flow, 30, 300, 0,
263 kFlowStartOffsetMs));
264 senders.push_back(new PacedVideoSender(&uplink_, sources.back(), bwe_type)); 273 senders.push_back(new PacedVideoSender(&uplink_, sources.back(), bwe_type));
274 max_offset_ms = std::max(max_offset_ms, offsets_ms[i++]);
265 } 275 }
266 276
267 const int64_t kTcpStartOffsetMs = 5000; 277 const int64_t kTcpStartOffsetMs = 5000;
278 max_offset_ms = std::max(max_offset_ms, kTcpStartOffsetMs);
268 for (int tcp_flow : tcp_flow_ids) 279 for (int tcp_flow : tcp_flow_ids)
269 senders.push_back(new TcpSender(&uplink_, tcp_flow, kTcpStartOffsetMs)); 280 senders.push_back(new TcpSender(&uplink_, tcp_flow, kTcpStartOffsetMs));
270 281
271 ChokeFilter choke(&uplink_, all_flow_ids); 282 ChokeFilter choke(&uplink_, all_flow_ids);
272 choke.set_capacity_kbps(capacity_kbps); 283 choke.set_capacity_kbps(capacity_kbps);
273 choke.set_max_delay_ms(max_delay_ms); 284 choke.set_max_delay_ms(max_delay_ms);
285 LinkShare link_share(&choke);
274 286
287 int64_t one_way_delay_ms = rtt_ms / 2;
275 DelayFilter delay_uplink(&uplink_, all_flow_ids); 288 DelayFilter delay_uplink(&uplink_, all_flow_ids);
276 delay_uplink.SetOneWayDelayMs(25); 289 delay_uplink.SetOneWayDelayMs(one_way_delay_ms);
290
291 JitterFilter jitter(&uplink_, all_flow_ids);
292 jitter.SetMaxJitter(max_jitter_ms);
277 293
278 std::vector<RateCounterFilter*> rate_counters; 294 std::vector<RateCounterFilter*> rate_counters;
279 for (int flow : all_flow_ids) { 295 for (int flow : all_flow_ids) {
280 rate_counters.push_back( 296 rate_counters.push_back(
281 new RateCounterFilter(&uplink_, flow, "receiver_input")); 297 new RateCounterFilter(&uplink_, flow, "receiver_input"));
282 } 298 }
283 299
284 RateCounterFilter total_utilization(&uplink_, all_flow_ids, 300 RateCounterFilter total_utilization(&uplink_, all_flow_ids,
285 "total_utilization"); 301 "total_utilization");
286 302
287 std::vector<PacketReceiver*> receivers; 303 std::vector<PacketReceiver*> receivers;
288 i = 0; 304 i = 0;
305 // Delays is being plotted only for the first flow.
306 // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
289 for (int media_flow : media_flow_ids) { 307 for (int media_flow : media_flow_ids) {
290 receivers.push_back( 308 metric_recorders.push_back(new MetricRecorder(
291 new PacketReceiver(&uplink_, media_flow, bwe_type, i++ == 0, false)); 309 bwe_names[bwe_type], static_cast<int>(i), senders[i], &link_share));
310 receivers.push_back(new PacketReceiver(&uplink_, media_flow, bwe_type,
311 i == 0, false, metric_recorders[i]));
312 metric_recorders[i]->set_plot_available_capacity(
313 i == 0 && plot_total_available_capacity_);
314 metric_recorders[i]->set_start_computing_metrics_ms(max_offset_ms);
315 ++i;
292 } 316 }
317 // Delays is not being plotted only for TCP flows. To plot all of them,
318 // replace first "false" occurence with "true" on new PacketReceiver().
293 for (int tcp_flow : tcp_flow_ids) { 319 for (int tcp_flow : tcp_flow_ids) {
294 receivers.push_back( 320 metric_recorders.push_back(new MetricRecorder(bwe_names[kTcpEstimator],
295 new PacketReceiver(&uplink_, tcp_flow, kTcpEstimator, false, false)); 321 static_cast<int>(i),
322 senders[i], &link_share));
323 receivers.push_back(new PacketReceiver(&uplink_, tcp_flow, kTcpEstimator,
324 false, false, metric_recorders[i]));
325 metric_recorders[i]->set_plot_available_capacity(
326 i == 0 && plot_total_available_capacity_);
327 ++i;
296 } 328 }
297 329
298 DelayFilter delay_downlink(&downlink_, all_flow_ids); 330 DelayFilter delay_downlink(&downlink_, all_flow_ids);
299 delay_downlink.SetOneWayDelayMs(25); 331 delay_downlink.SetOneWayDelayMs(one_way_delay_ms);
300 332
301 RunFor(run_time_seconds * 1000); 333 RunFor(run_time_seconds * 1000);
302 334
303 std::map<int, Stats<double>> flow_throughput_kbps; 335 std::map<int, Stats<double>> flow_throughput_kbps;
304 for (RateCounterFilter* rate_counter : rate_counters) { 336 for (RateCounterFilter* rate_counter : rate_counters) {
305 int flow_id = *rate_counter->flow_ids().begin(); 337 int flow_id = *rate_counter->flow_ids().begin();
306 flow_throughput_kbps[flow_id] = rate_counter->GetBitrateStats(); 338 flow_throughput_kbps[flow_id] = rate_counter->GetBitrateStats();
307 } 339 }
308 340
309 std::map<int, Stats<double>> flow_delay_ms; 341 std::map<int, Stats<double>> flow_delay_ms;
310 for (PacketReceiver* receiver : receivers) { 342 for (PacketReceiver* receiver : receivers) {
311 int flow_id = *receiver->flow_ids().begin(); 343 int flow_id = *receiver->flow_ids().begin();
312 flow_delay_ms[flow_id] = receiver->GetDelayStats(); 344 flow_delay_ms[flow_id] = receiver->GetDelayStats();
313 } 345 }
314 346
315 PrintResults(capacity_kbps, total_utilization.GetBitrateStats(), 347 PrintResults(capacity_kbps, total_utilization.GetBitrateStats(),
316 flow_delay_ms, flow_throughput_kbps); 348 flow_delay_ms, flow_throughput_kbps);
317 349
350 std::string title("5.4_Self_fairness_test");
351 for (size_t i = 0; i < num_media_flows; ++i) {
352 metric_recorders[i]->PlotThroughputHistogram(
353 title, bwe_names[bwe_type], static_cast<int>(num_media_flows), 0);
354 metric_recorders[i]->PlotDelayHistogram(title, bwe_names[bwe_type],
355 static_cast<int>(num_media_flows),
356 one_way_delay_ms);
357 metric_recorders[i]->PlotLossHistogram(title, bwe_names[bwe_type],
358 static_cast<int>(num_media_flows),
359 receivers[i]->GlobalPacketLoss());
360 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], one_way_delay_ms, i);
361 }
362
318 for (VideoSource* source : sources) 363 for (VideoSource* source : sources)
319 delete source; 364 delete source;
320 for (PacketSender* sender : senders) 365 for (PacketSender* sender : senders)
321 delete sender; 366 delete sender;
322 for (RateCounterFilter* rate_counter : rate_counters) 367 for (RateCounterFilter* rate_counter : rate_counters)
323 delete rate_counter; 368 delete rate_counter;
324 for (PacketReceiver* receiver : receivers) 369 for (PacketReceiver* receiver : receivers)
325 delete receiver; 370 delete receiver;
326 } 371 for (MetricRecorder* recorder : metric_recorders)
372 delete recorder;
373 }
374
375 void BweTest::RunChoke(BandwidthEstimatorType bwe_type,
376 std::vector<int> capacities_kbps) {
377 int flow_id = bwe_type;
378 AdaptiveVideoSource source(flow_id, 30, 300, 0, 0);
379 VideoSender sender(&uplink_, &source, bwe_type);
380 ChokeFilter choke(&uplink_, flow_id);
381 LinkShare link_share(&choke);
382 MetricRecorder metric_recorder(bwe_names[bwe_type], flow_id, &sender,
383 &link_share);
384 RateCounterFilter counter(&uplink_, flow_id, "receiver_input");
385 PacketReceiver receiver(&uplink_, flow_id, bwe_type, true, false,
386 &metric_recorder);
387 metric_recorder.set_plot_available_capacity(plot_total_available_capacity_);
388
389 choke.set_max_delay_ms(500);
390 const int64_t kRunTimeMs = 60 * 1000;
391
392 std::stringstream title("Choke");
393 char delimiter = '_';
394
395 for (auto it = capacities_kbps.begin(); it != capacities_kbps.end(); ++it) {
396 choke.set_capacity_kbps(*it);
397 RunFor(kRunTimeMs);
398 title << delimiter << (*it);
399 delimiter = '-';
400 }
401
402 title << "_kbps,_" << (kRunTimeMs / 1000) << "s_each";
403 metric_recorder.PlotThroughputHistogram(title.str(), bwe_names[bwe_type], 1,
404 0);
405 metric_recorder.PlotDelayHistogram(title.str(), bwe_names[bwe_type], 1, 0);
406 // receiver.PlotLossHistogram(title, bwe_names[bwe_type], 1);
407 // receiver.PlotObjectiveHistogram(title, bwe_names[bwe_type], 1);
408 }
409
410 // 5.1. Single Video and Audio media traffic, forward direction.
411 void BweTest::RunVariableCapacitySingleFlow(BandwidthEstimatorType bwe_type) {
412 const int kFlowId = 0; // Arbitrary value.
413 AdaptiveVideoSource source(kFlowId, 30, 300, 0, 0);
414 PacedVideoSender sender(&uplink_, &source, bwe_type);
415 DefaultEvaluationFilter up_filter(&uplink_, kFlowId);
416 DelayFilter down_filter(&downlink_, kFlowId);
417 LinkShare link_share(&(up_filter.choke));
418 MetricRecorder metric_recorder(bwe_names[bwe_type], kFlowId, &sender,
419 &link_share);
420 RateCounterFilter counter(&uplink_, kFlowId, "receiver_input");
421 PacketReceiver receiver(&uplink_, kFlowId, bwe_type, true, true,
422 &metric_recorder);
423 metric_recorder.set_plot_available_capacity(plot_total_available_capacity_);
424
425 down_filter.SetOneWayDelayMs(kOneWayDelayMs);
426 // up_filter.jitter.SetMaxJitter(0);
427
428 // Test also with one way propagation delay = 100ms.
429 // up_filter.delay.SetOneWayDelayMs(100);
430 // down_filter.SetOneWayDelayMs(100);
431
432 up_filter.choke.set_capacity_kbps(1000);
433 RunFor(40 * 1000); // 0-40s.
434 up_filter.choke.set_capacity_kbps(2500);
435 RunFor(20 * 1000); // 40-60s.
436 up_filter.choke.set_capacity_kbps(600);
437 RunFor(20 * 1000); // 60-80s.
438 up_filter.choke.set_capacity_kbps(1000);
439 RunFor(20 * 1000); // 80-100s.
440
441 std::string title("5.1_Variable_capacity_single_flow");
442 metric_recorder.PlotThroughputHistogram(title, bwe_names[bwe_type], 1, 0);
443 metric_recorder.PlotDelayHistogram(title, bwe_names[bwe_type], 1,
444 kOneWayDelayMs);
445 metric_recorder.PlotLossHistogram(title, bwe_names[bwe_type], 1,
446 receiver.GlobalPacketLoss());
447 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, kFlowId);
448 }
449
450 // 5.2. Two forward direction competing flows, variable capacity.
451 void BweTest::RunVariableCapacityTwoFlows(BandwidthEstimatorType bwe_type) {
452 const int kAllFlowIds[] = {0, 1}; // Two RMCAT flows.
453 const size_t kNumFlows = ARRAY_SIZE(kAllFlowIds);
454
455 rtc::scoped_ptr<AdaptiveVideoSource> sources[kNumFlows];
456 rtc::scoped_ptr<VideoSender> senders[kNumFlows];
457 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumFlows];
458 rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
459
460 const int64_t kStartingApartMs = 0; // Flows initialized simultaneously.
461
462 for (size_t i = 0; i < kNumFlows; ++i) {
463 sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
464 i * kStartingApartMs));
465 senders[i].reset(new VideoSender(&uplink_, sources[i].get(), bwe_type));
466 }
467
468 DefaultEvaluationFilter up_filter(&uplink_,
469 CreateFlowIds(kAllFlowIds, kNumFlows));
470
471 LinkShare link_share(&(up_filter.choke));
472
473 DelayFilter down_filter(&downlink_, CreateFlowIds(kAllFlowIds, kNumFlows));
474
475 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
476 for (size_t i = 0; i < kNumFlows; ++i) {
477 rate_counters[i].reset(new RateCounterFilter(
478 &uplink_, CreateFlowIds(&kAllFlowIds[i], 1), "receiver_input"));
479 }
480
481 RateCounterFilter total_utilization(
482 &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization");
483
484 // Delays is being plotted only for the first flow.
485 // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
486 for (size_t i = 0; i < kNumFlows; ++i) {
487 metric_recorders[i].reset(
488 new MetricRecorder(bwe_names[bwe_type], static_cast<int>(i),
489 senders[i].get(), &link_share));
490
491 receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], bwe_type,
492 i == 0, false,
493 metric_recorders[i].get()));
494 metric_recorders[i].get()->set_plot_available_capacity(
495 i == 0 && plot_total_available_capacity_);
496 }
497
498 down_filter.SetOneWayDelayMs(kOneWayDelayMs);
499 // Test also with one way propagation delay = 100ms.
500 // up_filter.delay.SetOneWayDelayMs(100);
501 // down_filter.SetOneWayDelayMs(100);
502
503 up_filter.choke.set_capacity_kbps(4000);
504 RunFor(25 * 1000); // 0-25s.
505 up_filter.choke.set_capacity_kbps(2000);
506 RunFor(25 * 1000); // 25-50s.
507 up_filter.choke.set_capacity_kbps(3500);
508 RunFor(25 * 1000); // 50-75s.
509 up_filter.choke.set_capacity_kbps(1000);
510 RunFor(25 * 1000); // 75-100s.
511 up_filter.choke.set_capacity_kbps(2000);
512 RunFor(25 * 1000); // 100-125s.
513
514 std::string title("5.2_Variable_capacity_two_flows");
515 for (size_t i = 0; i < kNumFlows; ++i) {
516 metric_recorders[i].get()->PlotThroughputHistogram(
517 title, bwe_names[bwe_type], kNumFlows, 0);
518 metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
519 kNumFlows, kOneWayDelayMs);
520 metric_recorders[i].get()->PlotLossHistogram(
521 title, bwe_names[bwe_type], kNumFlows,
522 receivers[i].get()->GlobalPacketLoss());
523 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
524 }
525 }
526
527 // 5.3. Bi-directional RMCAT flows.
528 void BweTest::RunBidirectionalFlow(BandwidthEstimatorType bwe_type) {
529 enum direction { kForward = 0, kBackward };
530 const size_t kNumFlows = 2;
531 rtc::scoped_ptr<AdaptiveVideoSource> sources[kNumFlows];
532 rtc::scoped_ptr<VideoSender> senders[kNumFlows];
533 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumFlows];
534 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
535 rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
536
537 sources[kForward].reset(new AdaptiveVideoSource(kForward, 30, 300, 0, 0));
538 senders[kForward].reset(
539 new VideoSender(&uplink_, sources[kForward].get(), bwe_type));
540
541 sources[kBackward].reset(new AdaptiveVideoSource(kBackward, 30, 300, 0, 0));
542 senders[kBackward].reset(
543 new VideoSender(&downlink_, sources[kBackward].get(), bwe_type));
544
545 DefaultEvaluationFilter up_filter(&uplink_, kForward);
546 DefaultEvaluationFilter down_filter(&downlink_, kBackward);
547 LinkShare up_link_share(&(up_filter.choke));
548 LinkShare down_link_share(&(down_filter.choke));
549
550 metric_recorders[kForward].reset(new MetricRecorder(
551 bwe_names[bwe_type], kForward, senders[kForward].get(), &up_link_share));
552 rate_counters[kForward].reset(
553 new RateCounterFilter(&uplink_, kForward, "fwd_receiver_input"));
554 receivers[kForward].reset(
555 new PacketReceiver(&uplink_, kForward, bwe_type, true, false,
556 metric_recorders[kForward].get()));
557
558 metric_recorders[kForward].get()->set_plot_available_capacity(
559 plot_total_available_capacity_);
560
561 metric_recorders[kBackward].reset(
562 new MetricRecorder(bwe_names[bwe_type], kBackward,
563 senders[kBackward].get(), &down_link_share));
564 rate_counters[kBackward].reset(
565 new RateCounterFilter(&downlink_, kBackward, "bwd_receiver_input"));
566 receivers[kBackward].reset(
567 new PacketReceiver(&downlink_, kBackward, bwe_type, true, false,
568 metric_recorders[kBackward].get()));
569
570 metric_recorders[kBackward].get()->set_plot_available_capacity(
571 plot_total_available_capacity_);
572
573 // Test also with one way propagation delay = 100ms.
574 // up_filter.delay.SetOneWayDelayMs(100);
575 // down_filter.delay.SetOneWayDelayMs(100);
576
577 up_filter.choke.set_capacity_kbps(2000);
578 down_filter.choke.set_capacity_kbps(2000);
579 RunFor(20 * 1000); // 0-20s.
580
581 up_filter.choke.set_capacity_kbps(1000);
582 RunFor(15 * 1000); // 20-35s.
583
584 down_filter.choke.set_capacity_kbps(800);
585 RunFor(5 * 1000); // 35-40s.
586
587 up_filter.choke.set_capacity_kbps(500);
588 RunFor(20 * 1000); // 40-60s.
589
590 up_filter.choke.set_capacity_kbps(2000);
591 RunFor(10 * 1000); // 60-70s.
592
593 down_filter.choke.set_capacity_kbps(2000);
594 RunFor(30 * 1000); // 70-100s.
595
596 std::string title("5.3_Bidirectional_flows");
597 for (size_t i = 0; i < kNumFlows; ++i) {
598 metric_recorders[i].get()->PlotThroughputHistogram(
599 title, bwe_names[bwe_type], kNumFlows, 0);
600 metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
601 kNumFlows, kOneWayDelayMs);
602 metric_recorders[i].get()->PlotLossHistogram(
603 title, bwe_names[bwe_type], kNumFlows,
604 receivers[i].get()->GlobalPacketLoss());
605 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
606 }
607 }
608
609 // 5.5. Five competing RMCAT flows under different RTTs.
610 void BweTest::RunRoundTripTimeFairness(BandwidthEstimatorType bwe_type) {
611 const int kAllFlowIds[] = {0, 1, 2, 3, 4}; // Five RMCAT flows.
612 const int64_t kAllOneWayDelayMs[] = {10, 25, 50, 100, 150};
613 const size_t kNumFlows = ARRAY_SIZE(kAllFlowIds);
614 rtc::scoped_ptr<AdaptiveVideoSource> sources[kNumFlows];
615 rtc::scoped_ptr<VideoSender> senders[kNumFlows];
616 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumFlows];
617
618 // Flows initialized 10 seconds apart.
619 const int64_t kStartingApartMs = 10 * 1000;
620
621 for (size_t i = 0; i < kNumFlows; ++i) {
622 sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
623 i * kStartingApartMs));
624 senders[i].reset(new VideoSender(&uplink_, sources[i].get(), bwe_type));
625 }
626
627 ChokeFilter choke_filter(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
628 JitterFilter jitter_filter(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
629 rtc::scoped_ptr<DelayFilter> up_delay_filters[kNumFlows];
630 rtc::scoped_ptr<DelayFilter> down_delay_filters[kNumFlows];
631
632 LinkShare link_share(&choke_filter);
633
634 for (size_t i = 0; i < kNumFlows; ++i) {
635 up_delay_filters[i].reset(new DelayFilter(&uplink_, kAllFlowIds[i]));
636 down_delay_filters[i].reset(new DelayFilter(&downlink_, kAllFlowIds[i]));
637 }
638
639 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
640 for (size_t i = 0; i < kNumFlows; ++i) {
641 rate_counters[i].reset(
642 new RateCounterFilter(&uplink_, CreateFlowIds(&kAllFlowIds[i], 1),
643 "receiver_input", i * kStartingApartMs));
644 }
645
646 RateCounterFilter total_utilization(
647 &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization");
648
649 // Delays is being plotted only for the first flow.
650 // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
651 rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
652 for (size_t i = 0; i < kNumFlows; ++i) {
653 metric_recorders[i].reset(
654 new MetricRecorder(bwe_names[bwe_type], static_cast<int>(i),
655 senders[i].get(), &link_share));
656
657 receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], bwe_type,
658 i == 0, false,
659 metric_recorders[i].get()));
660 metric_recorders[i].get()->set_start_computing_metrics_ms(kStartingApartMs *
661 (kNumFlows - 1));
662 metric_recorders[i].get()->set_plot_available_capacity(
663 i == 0 && plot_total_available_capacity_);
664 }
665
666 jitter_filter.SetMaxJitter(kMaxJitterMs);
667 choke_filter.set_max_delay_ms(kMaxQueueingDelayMs);
668
669 for (size_t i = 0; i < kNumFlows; ++i) {
670 up_delay_filters[i]->SetOneWayDelayMs(kAllOneWayDelayMs[i]);
671 down_delay_filters[i]->SetOneWayDelayMs(kAllOneWayDelayMs[i]);
672 }
673
674 choke_filter.set_capacity_kbps(3500);
675
676 RunFor(300 * 1000); // 0-300s.
677
678 std::string title("5.5_Round_Trip_Time_Fairness");
679 for (size_t i = 0; i < kNumFlows; ++i) {
680 metric_recorders[i].get()->PlotThroughputHistogram(
681 title, bwe_names[bwe_type], kNumFlows, 0);
682 metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
683 kNumFlows, kOneWayDelayMs);
684 metric_recorders[i].get()->PlotLossHistogram(
685 title, bwe_names[bwe_type], kNumFlows,
686 receivers[i].get()->GlobalPacketLoss());
687 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kAllOneWayDelayMs[i],
688 i);
689 }
690 }
691
692 // 5.6. RMCAT Flow competing with a long TCP Flow.
693 void BweTest::RunLongTcpFairness(BandwidthEstimatorType bwe_type) {
694 enum flow_ids { kRmcatId = 0, kTcpId };
695 const size_t kNumFlows = 2;
696
697 rtc::scoped_ptr<PacketSender> senders[kNumFlows];
698 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumFlows];
699 rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
700
701 // Flows initialized 5 seconds apart.
702 const int64_t kStartingApartMs = 5 * 1000;
703
704 // Starting at t=0;
705 senders[kTcpId].reset(new TcpSender(&uplink_, kTcpId, 0));
706
707 AdaptiveVideoSource rmcat_source(kRmcatId, 30, 300, 0, kStartingApartMs);
708 senders[kRmcatId].reset(new VideoSender(&uplink_, &rmcat_source, bwe_type));
709
710 DefaultEvaluationFilter up_filter(&uplink_,
711 CreateFlowIdRange(kRmcatId, kTcpId));
712 DelayFilter down_filter(&downlink_, CreateFlowIdRange(kRmcatId, kTcpId));
713
714 LinkShare link_share(&(up_filter.choke));
715
716 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
717 for (int id = kRmcatId; id <= kTcpId; ++id) {
718 rate_counters[id].reset(
719 new RateCounterFilter(&uplink_, id, "receiver_input"));
720 }
721
722 RateCounterFilter total_utilization(
723 &uplink_, CreateFlowIdRange(kRmcatId, kTcpId), "total_utilization");
724
725 metric_recorders[kTcpId].reset(new MetricRecorder(
726 bwe_names[kTcpEstimator], kTcpId, senders[kTcpId].get(), &link_share));
727 receivers[kTcpId].reset(new PacketReceiver(&uplink_, kTcpId, kTcpEstimator,
728 true, false,
729 metric_recorders[kTcpId].get()));
730 metric_recorders[kTcpId].get()->set_start_computing_metrics_ms(
731 kStartingApartMs);
732 metric_recorders[kTcpId].get()->set_plot_available_capacity(
733 plot_total_available_capacity_);
734
735 metric_recorders[kRmcatId].reset(new MetricRecorder(
736 bwe_names[bwe_type], kRmcatId, senders[kRmcatId].get(), &link_share));
737 receivers[kRmcatId].reset(
738 new PacketReceiver(&uplink_, kRmcatId, bwe_type, true, false,
739 metric_recorders[kRmcatId].get()));
740 metric_recorders[kRmcatId].get()->set_start_computing_metrics_ms(
741 kStartingApartMs);
742 metric_recorders[kRmcatId].get()->set_plot_available_capacity(false);
743
744 down_filter.SetOneWayDelayMs(kOneWayDelayMs);
745 // Test also with one way propagation delay = 100ms.
746 // up_filter.delay.SetOneWayDelayMs(100);
747 // down_filter.SetOneWayDelayMs(100);
748
749 // Test also with bottleneck queue size = 20ms and 1000ms.
750 // up_filter.choke.set_max_delay_ms(20);
751 // up_filter.choke.set_max_delay_ms(1000);
752
753 // Test also with no Jitter:
754 // up_filter.jitter.SetMaxJitter(0);
755
756 up_filter.choke.set_capacity_kbps(2000);
757
758 RunFor(120 * 1000); // 0-120s.
759
760 std::string title("5.6_Long_TCP_Fairness");
761 std::string flow_name(bwe_names[bwe_type] + 'x' + bwe_names[kTcpEstimator]);
762 for (size_t i = 0; i < kNumFlows; ++i) {
763 metric_recorders[i].get()->PlotThroughputHistogram(title, flow_name,
764 kNumFlows, 0);
765 metric_recorders[i].get()->PlotLossHistogram(
766 title, flow_name, kNumFlows, receivers[i].get()->GlobalPacketLoss());
767 }
768 // Pointless to show delay plot for TCP flow.
769 metric_recorders[kRmcatId].get()->PlotDelayHistogram(
770 title, bwe_names[bwe_type], 1, kOneWayDelayMs);
771 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs,
772 kRmcatId);
773 }
774
775 // 5.7. RMCAT Flows competing with multiple short TCP Flows.
776 void BweTest::RunMultipleShortTcpFairness(
777 BandwidthEstimatorType bwe_type,
778 std::vector<int> tcp_file_sizes_bytes,
779 std::vector<int64_t> tcp_starting_times_ms) {
780 // Two RMCAT flows and ten TCP flows.
781 const int kAllRmcatFlowIds[] = {0, 1};
782 const int kAllTcpFlowIds[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
783
784 assert(tcp_starting_times_ms.size() == tcp_file_sizes_bytes.size() &&
785 tcp_starting_times_ms.size() == ARRAY_SIZE(kAllTcpFlowIds));
786
787 const size_t kNumRmcatFlows = ARRAY_SIZE(kAllRmcatFlowIds);
788 const size_t kNumTotalFlows = kNumRmcatFlows + ARRAY_SIZE(kAllTcpFlowIds);
789
790 rtc::scoped_ptr<AdaptiveVideoSource> sources[kNumRmcatFlows];
791 rtc::scoped_ptr<PacketSender> senders[kNumTotalFlows];
792 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumTotalFlows];
793 rtc::scoped_ptr<PacketReceiver> receivers[kNumTotalFlows];
794
795 // RMCAT Flows are initialized simultaneosly at t=5 seconds.
796 const int64_t kRmcatStartingTimeMs = 5 * 1000;
797 for (size_t id : kAllRmcatFlowIds) {
798 sources[id].reset(new AdaptiveVideoSource(static_cast<int>(id), 30, 300, 0,
799 kRmcatStartingTimeMs));
800 senders[id].reset(new VideoSender(&uplink_, sources[id].get(), bwe_type));
801 }
802
803 for (size_t id : kAllTcpFlowIds) {
804 senders[id].reset(new TcpSender(&uplink_, static_cast<int>(id),
805 tcp_starting_times_ms[id - kNumRmcatFlows],
806 tcp_file_sizes_bytes[id - kNumRmcatFlows]));
807 }
808
809 FlowIds flow_ids = CreateFlowIdRange(0, static_cast<int>(kNumTotalFlows - 1));
810 DefaultEvaluationFilter up_filter(&uplink_, flow_ids);
811 DelayFilter down_filter(&downlink_, flow_ids);
812
813 LinkShare link_share(&(up_filter.choke));
814
815 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumTotalFlows];
816 for (size_t id = 0; id < kNumTotalFlows; ++id) {
817 rate_counters[id].reset(new RateCounterFilter(
818 &uplink_, static_cast<int>(id), "receiver_input"));
819 }
820
821 RateCounterFilter total_utilization(&uplink_, flow_ids, "total_utilization");
822
823 // Delays is being plotted only for the first flow.
824 // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
825 for (size_t id : kAllRmcatFlowIds) {
826 metric_recorders[id].reset(
827 new MetricRecorder(bwe_names[bwe_type], static_cast<int>(id),
828 senders[id].get(), &link_share));
829 receivers[id].reset(new PacketReceiver(&uplink_, static_cast<int>(id),
830 bwe_type, id == 0, false,
831 metric_recorders[id].get()));
832 metric_recorders[id].get()->set_start_computing_metrics_ms(
833 kRmcatStartingTimeMs);
834 metric_recorders[id].get()->set_plot_available_capacity(
835 id == 0 && plot_total_available_capacity_);
836 }
837
838 // Delays is not being plotted only for TCP flows. To plot all of them,
839 // replace first "false" occurence with "true" on new PacketReceiver().
840 for (size_t id : kAllTcpFlowIds) {
841 metric_recorders[id].reset(
842 new MetricRecorder(bwe_names[kTcpEstimator], static_cast<int>(id),
843 senders[id].get(), &link_share));
844 receivers[id].reset(new PacketReceiver(&uplink_, static_cast<int>(id),
845 kTcpEstimator, false, false,
846 metric_recorders[id].get()));
847 metric_recorders[id].get()->set_plot_available_capacity(
848 id == 0 && plot_total_available_capacity_);
849 }
850
851 down_filter.SetOneWayDelayMs(kOneWayDelayMs);
852
853 // Test also with one way propagation delay = 100ms.
854 // up_filter.delay.SetOneWayDelayMs(100);
855 // down_filter.SetOneWayDelayms(100);
856
857 // Test also with bottleneck queue size = 20ms and 1000ms.
858 // up_filter.choke.set_max_delay_ms(20);
859 // up_filter.choke.set_max_delay_ms(1000);
860
861 // Test also with no Jitter:
862 // up_filter.jitter.SetMaxJitter(0);
863
864 up_filter.choke.set_capacity_kbps(2000);
865
866 RunFor(300 * 1000); // 0-300s.
867
868 std::string title("5.7_Multiple_short_TCP_flows");
869 for (size_t id : kAllRmcatFlowIds) {
870 metric_recorders[id].get()->PlotThroughputHistogram(
871 title, bwe_names[bwe_type], kNumRmcatFlows, 0);
872 metric_recorders[id].get()->PlotDelayHistogram(
873 title, bwe_names[bwe_type], kNumRmcatFlows, kOneWayDelayMs);
874 metric_recorders[id].get()->PlotLossHistogram(
875 title, bwe_names[bwe_type], kNumRmcatFlows,
876 receivers[id].get()->GlobalPacketLoss());
877 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, id);
878 }
879 }
880
881 // 5.8. Three forward direction competing flows, constant capacity.
882 // During the test, one of the flows is paused and later resumed.
883 void BweTest::RunPauseResumeFlows(BandwidthEstimatorType bwe_type) {
884 const int kAllFlowIds[] = {0, 1, 2}; // Three RMCAT flows.
885 const size_t kNumFlows = ARRAY_SIZE(kAllFlowIds);
886
887 rtc::scoped_ptr<AdaptiveVideoSource> sources[kNumFlows];
888 rtc::scoped_ptr<VideoSender> senders[kNumFlows];
889 rtc::scoped_ptr<MetricRecorder> metric_recorders[kNumFlows];
890 rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
891
892 // Flows initialized simultaneously.
893 const int64_t kStartingApartMs = 0;
894
895 for (size_t i = 0; i < kNumFlows; ++i) {
896 sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
897 i * kStartingApartMs));
898 senders[i].reset(new VideoSender(&uplink_, sources[i].get(), bwe_type));
899 }
900
901 DefaultEvaluationFilter filter(&uplink_,
902 CreateFlowIds(kAllFlowIds, kNumFlows));
903
904 LinkShare link_share(&(filter.choke));
905
906 rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
907 for (size_t i = 0; i < kNumFlows; ++i) {
908 rate_counters[i].reset(new RateCounterFilter(
909 &uplink_, CreateFlowIds(&kAllFlowIds[i], 1), "receiver_input"));
910 }
911
912 RateCounterFilter total_utilization(
913 &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization");
914
915 // Delays is being plotted only for the first flow.
916 // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
917 for (size_t i = 0; i < kNumFlows; ++i) {
918 metric_recorders[i].reset(
919 new MetricRecorder(bwe_names[bwe_type], static_cast<int>(i),
920 senders[i].get(), &link_share));
921 receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], bwe_type,
922 i == 0, false,
923 metric_recorders[i].get()));
924 metric_recorders[i].get()->set_start_computing_metrics_ms(kStartingApartMs *
925 (kNumFlows - 1));
926 metric_recorders[i].get()->set_plot_available_capacity(
927 i == 0 && plot_total_available_capacity_);
928 }
929
930 // Test also with one way propagation delay = 100ms.
931 // filter.delay.SetOneWayDelayMs(100);
932 filter.choke.set_capacity_kbps(3500);
933
934 RunFor(40 * 1000); // 0-40s.
935
936 senders[0].get()->Pause();
937 metric_recorders[0].get()->PauseFlow();
938 RunFor(20 * 1000); // 40-60s.
939
940 senders[0].get()->Resume();
941 metric_recorders[0].get()->ResumeFlow(20 * 1000);
942 RunFor(60 * 1000); // 60-120s.
943
944 int64_t paused[] = {20 * 1000, 0, 0};
945
946 // First flow is being paused, hence having a different optimum.
947 const std::string optima_lines[] = {"1", "2", "2"};
948
949 std::string title("5.8_Pause_and_resume_media_flow");
950 for (size_t i = 0; i < kNumFlows; ++i) {
951 metric_recorders[i].get()->PlotThroughputHistogram(
952 title, bwe_names[bwe_type], kNumFlows, paused[i], optima_lines[i]);
953 metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
954 kNumFlows, kOneWayDelayMs);
955 metric_recorders[i].get()->PlotLossHistogram(
956 title, bwe_names[bwe_type], kNumFlows,
957 receivers[i].get()->GlobalPacketLoss());
958 BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
959 }
960 }
961
962 // Following functions are used for randomizing TCP file size and
963 // starting time, used on 5.7 RunMultipleShortTcpFairness.
964 // They are pseudo-random generators, creating always the same
965 // value sequence for a given Random seed.
966
967 std::vector<int> BweTest::GetFileSizesBytes(int num_files) {
968 // File size chosen from uniform distribution between [100,1000] kB.
969 const int kMinKbytes = 100;
970 const int kMaxKbytes = 1000;
971
972 Random random(0x12345678);
973 std::vector<int> tcp_file_sizes_bytes;
974
975 while (num_files-- > 0) {
976 tcp_file_sizes_bytes.push_back(random.Rand(kMinKbytes, kMaxKbytes) * 1000);
977 }
978
979 return tcp_file_sizes_bytes;
980 }
981
982 std::vector<int64_t> BweTest::GetStartingTimesMs(int num_files) {
983 // OFF state behaves as an exp. distribution with mean = 10 seconds.
984 const float kMeanMs = 10000.0f;
985 Random random(0x12345678);
986
987 std::vector<int64_t> tcp_starting_times_ms;
988
989 // Two TCP Flows are initialized simultaneosly at t=0 seconds.
990 for (int i = 0; i < 2; ++i, --num_files) {
991 tcp_starting_times_ms.push_back(0);
992 }
993
994 // Other TCP Flows are initialized in an OFF state.
995 while (num_files-- > 0) {
996 tcp_starting_times_ms.push_back(
997 static_cast<int64_t>(random.Exponential(1.0f / kMeanMs)));
998 }
999
1000 return tcp_starting_times_ms;
1001 }
1002
327 } // namespace bwe 1003 } // namespace bwe
328 } // namespace testing 1004 } // namespace testing
329 } // namespace webrtc 1005 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698