OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |