| 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 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 test_start_ms_(-1), | 48 test_start_ms_(-1), |
| 49 ramp_up_finished_ms_(-1), | 49 ramp_up_finished_ms_(-1), |
| 50 extension_type_(extension_type), | 50 extension_type_(extension_type), |
| 51 video_ssrcs_(GenerateSsrcs(num_video_streams_, 100)), | 51 video_ssrcs_(GenerateSsrcs(num_video_streams_, 100)), |
| 52 video_rtx_ssrcs_(GenerateSsrcs(num_video_streams_, 200)), | 52 video_rtx_ssrcs_(GenerateSsrcs(num_video_streams_, 200)), |
| 53 audio_ssrcs_(GenerateSsrcs(num_audio_streams_, 300)), | 53 audio_ssrcs_(GenerateSsrcs(num_audio_streams_, 300)), |
| 54 poller_thread_(&BitrateStatsPollingThread, | 54 poller_thread_(&BitrateStatsPollingThread, |
| 55 this, | 55 this, |
| 56 "BitrateStatsPollingThread"), | 56 "BitrateStatsPollingThread"), |
| 57 sender_call_(nullptr) { | 57 sender_call_(nullptr) { |
| 58 EXPECT_LE(num_audio_streams_, 1u); |
| 58 if (rtx_) { | 59 if (rtx_) { |
| 59 for (size_t i = 0; i < video_ssrcs_.size(); ++i) | 60 for (size_t i = 0; i < video_ssrcs_.size(); ++i) |
| 60 rtx_ssrc_map_[video_rtx_ssrcs_[i]] = video_ssrcs_[i]; | 61 rtx_ssrc_map_[video_rtx_ssrcs_[i]] = video_ssrcs_[i]; |
| 61 } | 62 } |
| 62 } | 63 } |
| 63 | 64 |
| 64 RampUpTester::~RampUpTester() { | 65 RampUpTester::~RampUpTester() { |
| 65 event_.Set(); | 66 event_.Set(); |
| 66 } | 67 } |
| 67 | 68 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 84 send_transport_ = new test::PacketTransport(sender_call, this, | 85 send_transport_ = new test::PacketTransport(sender_call, this, |
| 85 test::PacketTransport::kSender, | 86 test::PacketTransport::kSender, |
| 86 forward_transport_config_); | 87 forward_transport_config_); |
| 87 return send_transport_; | 88 return send_transport_; |
| 88 } | 89 } |
| 89 | 90 |
| 90 size_t RampUpTester::GetNumVideoStreams() const { | 91 size_t RampUpTester::GetNumVideoStreams() const { |
| 91 return num_video_streams_; | 92 return num_video_streams_; |
| 92 } | 93 } |
| 93 | 94 |
| 95 size_t RampUpTester::GetNumAudioStreams() const { |
| 96 return num_audio_streams_; |
| 97 } |
| 98 |
| 94 void RampUpTester::ModifyVideoConfigs( | 99 void RampUpTester::ModifyVideoConfigs( |
| 95 VideoSendStream::Config* send_config, | 100 VideoSendStream::Config* send_config, |
| 96 std::vector<VideoReceiveStream::Config>* receive_configs, | 101 std::vector<VideoReceiveStream::Config>* receive_configs, |
| 97 VideoEncoderConfig* encoder_config) { | 102 VideoEncoderConfig* encoder_config) { |
| 98 send_config->suspend_below_min_bitrate = true; | 103 send_config->suspend_below_min_bitrate = true; |
| 99 | 104 |
| 100 if (num_video_streams_ == 1) { | 105 if (num_video_streams_ == 1) { |
| 101 encoder_config->streams[0].target_bitrate_bps = | 106 encoder_config->streams[0].target_bitrate_bps = |
| 102 encoder_config->streams[0].max_bitrate_bps = 2000000; | 107 encoder_config->streams[0].max_bitrate_bps = 2000000; |
| 103 // For single stream rampup until 1mbps | 108 // For single stream rampup until 1mbps |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 if (rtx_) { | 169 if (rtx_) { |
| 165 recv_config.rtp.rtx[send_config->encoder_settings.payload_type].ssrc = | 170 recv_config.rtp.rtx[send_config->encoder_settings.payload_type].ssrc = |
| 166 video_rtx_ssrcs_[i]; | 171 video_rtx_ssrcs_[i]; |
| 167 recv_config.rtp.rtx[send_config->encoder_settings.payload_type] | 172 recv_config.rtp.rtx[send_config->encoder_settings.payload_type] |
| 168 .payload_type = send_config->rtp.rtx.payload_type; | 173 .payload_type = send_config->rtp.rtx.payload_type; |
| 169 } | 174 } |
| 170 ++i; | 175 ++i; |
| 171 } | 176 } |
| 172 } | 177 } |
| 173 | 178 |
| 179 void RampUpTester::ModifyAudioConfigs( |
| 180 AudioSendStream::Config* send_config, |
| 181 std::vector<AudioReceiveStream::Config>* receive_configs) { |
| 182 if (num_audio_streams_ == 0) |
| 183 return; |
| 184 |
| 185 EXPECT_NE(RtpExtension::kTOffset, extension_type_) |
| 186 << "Audio BWE not supported with toffset."; |
| 187 |
| 188 send_config->rtp.ssrc = audio_ssrcs_[0]; |
| 189 send_config->rtp.extensions.clear(); |
| 190 |
| 191 bool transport_cc = false; |
| 192 if (extension_type_ == RtpExtension::kAbsSendTime) { |
| 193 transport_cc = false; |
| 194 send_config->rtp.extensions.push_back( |
| 195 RtpExtension(extension_type_.c_str(), kAbsSendTimeExtensionId)); |
| 196 } else if (extension_type_ == RtpExtension::kTransportSequenceNumber) { |
| 197 transport_cc = true; |
| 198 send_config->rtp.extensions.push_back(RtpExtension( |
| 199 extension_type_.c_str(), kTransportSequenceNumberExtensionId)); |
| 200 } |
| 201 |
| 202 for (AudioReceiveStream::Config& recv_config : *receive_configs) { |
| 203 recv_config.combined_audio_video_bwe = true; |
| 204 recv_config.rtp.transport_cc = transport_cc; |
| 205 recv_config.rtp.extensions = send_config->rtp.extensions; |
| 206 recv_config.rtp.remote_ssrc = send_config->rtp.ssrc; |
| 207 } |
| 208 } |
| 209 |
| 174 void RampUpTester::OnCallsCreated(Call* sender_call, Call* receiver_call) { | 210 void RampUpTester::OnCallsCreated(Call* sender_call, Call* receiver_call) { |
| 175 sender_call_ = sender_call; | 211 sender_call_ = sender_call; |
| 176 } | 212 } |
| 177 | 213 |
| 178 bool RampUpTester::BitrateStatsPollingThread(void* obj) { | 214 bool RampUpTester::BitrateStatsPollingThread(void* obj) { |
| 179 return static_cast<RampUpTester*>(obj)->PollStats(); | 215 return static_cast<RampUpTester*>(obj)->PollStats(); |
| 180 } | 216 } |
| 181 | 217 |
| 182 bool RampUpTester::PollStats() { | 218 bool RampUpTester::PollStats() { |
| 183 if (sender_call_) { | 219 if (sender_call_) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 stream.rtp_stats.fec.TotalBytes(); | 260 stream.rtp_stats.fec.TotalBytes(); |
| 225 *padding_sent += stream.rtp_stats.transmitted.padding_bytes + | 261 *padding_sent += stream.rtp_stats.transmitted.padding_bytes + |
| 226 stream.rtp_stats.retransmitted.padding_bytes + | 262 stream.rtp_stats.retransmitted.padding_bytes + |
| 227 stream.rtp_stats.fec.padding_bytes; | 263 stream.rtp_stats.fec.padding_bytes; |
| 228 *media_sent += stream.rtp_stats.MediaPayloadBytes(); | 264 *media_sent += stream.rtp_stats.MediaPayloadBytes(); |
| 229 } | 265 } |
| 230 | 266 |
| 231 void RampUpTester::TriggerTestDone() { | 267 void RampUpTester::TriggerTestDone() { |
| 232 RTC_DCHECK_GE(test_start_ms_, 0); | 268 RTC_DCHECK_GE(test_start_ms_, 0); |
| 233 | 269 |
| 270 // TODO(holmer): Add audio send stats here too when those APIs are available. |
| 234 VideoSendStream::Stats send_stats = send_stream_->GetStats(); | 271 VideoSendStream::Stats send_stats = send_stream_->GetStats(); |
| 235 | 272 |
| 236 size_t total_packets_sent = 0; | 273 size_t total_packets_sent = 0; |
| 237 size_t total_sent = 0; | 274 size_t total_sent = 0; |
| 238 size_t padding_sent = 0; | 275 size_t padding_sent = 0; |
| 239 size_t media_sent = 0; | 276 size_t media_sent = 0; |
| 240 for (uint32_t ssrc : video_ssrcs_) { | 277 for (uint32_t ssrc : video_ssrcs_) { |
| 241 AccumulateStats(send_stats.substreams[ssrc], &total_packets_sent, | 278 AccumulateStats(send_stats.substreams[ssrc], &total_packets_sent, |
| 242 &total_sent, &padding_sent, &media_sent); | 279 &total_sent, &padding_sent, &media_sent); |
| 243 } | 280 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 257 ReportResult("ramp-up-padding-sent", padding_sent, "bytes"); | 294 ReportResult("ramp-up-padding-sent", padding_sent, "bytes"); |
| 258 ReportResult("ramp-up-rtx-total-packets-sent", rtx_total_packets_sent, | 295 ReportResult("ramp-up-rtx-total-packets-sent", rtx_total_packets_sent, |
| 259 "packets"); | 296 "packets"); |
| 260 ReportResult("ramp-up-rtx-total-sent", rtx_total_sent, "bytes"); | 297 ReportResult("ramp-up-rtx-total-sent", rtx_total_sent, "bytes"); |
| 261 ReportResult("ramp-up-rtx-media-sent", rtx_media_sent, "bytes"); | 298 ReportResult("ramp-up-rtx-media-sent", rtx_media_sent, "bytes"); |
| 262 ReportResult("ramp-up-rtx-padding-sent", rtx_padding_sent, "bytes"); | 299 ReportResult("ramp-up-rtx-padding-sent", rtx_padding_sent, "bytes"); |
| 263 if (ramp_up_finished_ms_ >= 0) { | 300 if (ramp_up_finished_ms_ >= 0) { |
| 264 ReportResult("ramp-up-time", ramp_up_finished_ms_ - test_start_ms_, | 301 ReportResult("ramp-up-time", ramp_up_finished_ms_ - test_start_ms_, |
| 265 "milliseconds"); | 302 "milliseconds"); |
| 266 } | 303 } |
| 304 ReportResult("ramp-up-average-network-latency", |
| 305 send_transport_->GetAverageDelayMs(), "milliseconds"); |
| 267 } | 306 } |
| 268 | 307 |
| 269 void RampUpTester::PerformTest() { | 308 void RampUpTester::PerformTest() { |
| 270 test_start_ms_ = clock_->TimeInMilliseconds(); | 309 test_start_ms_ = clock_->TimeInMilliseconds(); |
| 271 poller_thread_.Start(); | 310 poller_thread_.Start(); |
| 272 EXPECT_TRUE(Wait()) << "Timed out while waiting for ramp-up to complete."; | 311 EXPECT_TRUE(Wait()) << "Timed out while waiting for ramp-up to complete."; |
| 273 TriggerTestDone(); | 312 TriggerTestDone(); |
| 274 poller_thread_.Stop(); | 313 poller_thread_.Stop(); |
| 275 } | 314 } |
| 276 | 315 |
| 277 RampUpDownUpTester::RampUpDownUpTester(size_t num_streams, | 316 RampUpDownUpTester::RampUpDownUpTester(size_t num_video_streams, |
| 317 size_t num_audio_streams, |
| 278 unsigned int start_bitrate_bps, | 318 unsigned int start_bitrate_bps, |
| 279 const std::string& extension_type, | 319 const std::string& extension_type, |
| 280 bool rtx, | 320 bool rtx, |
| 281 bool red) | 321 bool red) |
| 282 : RampUpTester(num_streams, 0, start_bitrate_bps, extension_type, rtx, red), | 322 : RampUpTester(num_video_streams, |
| 323 num_audio_streams, |
| 324 start_bitrate_bps, |
| 325 extension_type, |
| 326 rtx, |
| 327 red), |
| 283 test_state_(kFirstRampup), | 328 test_state_(kFirstRampup), |
| 284 state_start_ms_(clock_->TimeInMilliseconds()), | 329 state_start_ms_(clock_->TimeInMilliseconds()), |
| 285 interval_start_ms_(clock_->TimeInMilliseconds()), | 330 interval_start_ms_(clock_->TimeInMilliseconds()), |
| 286 sent_bytes_(0) { | 331 sent_bytes_(0) { |
| 287 forward_transport_config_.link_capacity_kbps = kHighBandwidthLimitBps / 1000; | 332 forward_transport_config_.link_capacity_kbps = kHighBandwidthLimitBps / 1000; |
| 288 } | 333 } |
| 289 | 334 |
| 290 RampUpDownUpTester::~RampUpDownUpTester() {} | 335 RampUpDownUpTester::~RampUpDownUpTester() {} |
| 291 | 336 |
| 292 bool RampUpDownUpTester::PollStats() { | 337 bool RampUpDownUpTester::PollStats() { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 interval_start_ms_ = now; | 413 interval_start_ms_ = now; |
| 369 sent_bytes_ = 0; | 414 sent_bytes_ = 0; |
| 370 } | 415 } |
| 371 break; | 416 break; |
| 372 } | 417 } |
| 373 case kSecondRampup: { | 418 case kSecondRampup: { |
| 374 if (bitrate_bps > kExpectedHighBitrateBps && !suspended) { | 419 if (bitrate_bps > kExpectedHighBitrateBps && !suspended) { |
| 375 webrtc::test::PrintResult("ramp_up_down_up", GetModifierString(), | 420 webrtc::test::PrintResult("ramp_up_down_up", GetModifierString(), |
| 376 "second_rampup", now - state_start_ms_, "ms", | 421 "second_rampup", now - state_start_ms_, "ms", |
| 377 false); | 422 false); |
| 423 ReportResult("ramp-up-down-up-average-network-latency", |
| 424 send_transport_->GetAverageDelayMs(), "milliseconds"); |
| 378 observation_complete_.Set(); | 425 observation_complete_.Set(); |
| 379 } | 426 } |
| 380 break; | 427 break; |
| 381 } | 428 } |
| 382 } | 429 } |
| 383 } | 430 } |
| 384 | 431 |
| 385 class RampUpTest : public test::CallTest { | 432 class RampUpTest : public test::CallTest { |
| 386 public: | 433 public: |
| 387 RampUpTest() {} | 434 RampUpTest() {} |
| (...skipping 26 matching lines...) Expand all Loading... |
| 414 | 461 |
| 415 TEST_F(RampUpTest, SingleStreamWithHighStartBitrate) { | 462 TEST_F(RampUpTest, SingleStreamWithHighStartBitrate) { |
| 416 RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps, RtpExtension::kTOffset, | 463 RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps, RtpExtension::kTOffset, |
| 417 false, false); | 464 false, false); |
| 418 RunBaseTest(&test); | 465 RunBaseTest(&test); |
| 419 } | 466 } |
| 420 | 467 |
| 421 // Disabled on Mac due to flakiness, see | 468 // Disabled on Mac due to flakiness, see |
| 422 // https://bugs.chromium.org/p/webrtc/issues/detail?id=5407 | 469 // https://bugs.chromium.org/p/webrtc/issues/detail?id=5407 |
| 423 #ifndef WEBRTC_MAC | 470 #ifndef WEBRTC_MAC |
| 471 |
| 472 static const uint32_t kStartBitrateBps = 60000; |
| 473 |
| 424 TEST_F(RampUpTest, UpDownUpOneStream) { | 474 TEST_F(RampUpTest, UpDownUpOneStream) { |
| 425 RampUpDownUpTester test(1, 60000, RtpExtension::kAbsSendTime, false, false); | 475 RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 476 false, false); |
| 426 RunBaseTest(&test); | 477 RunBaseTest(&test); |
| 427 } | 478 } |
| 428 | 479 |
| 429 TEST_F(RampUpTest, UpDownUpThreeStreams) { | 480 TEST_F(RampUpTest, UpDownUpThreeStreams) { |
| 430 RampUpDownUpTester test(3, 60000, RtpExtension::kAbsSendTime, false, false); | 481 RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 482 false, false); |
| 431 RunBaseTest(&test); | 483 RunBaseTest(&test); |
| 432 } | 484 } |
| 433 | 485 |
| 434 TEST_F(RampUpTest, UpDownUpOneStreamRtx) { | 486 TEST_F(RampUpTest, UpDownUpOneStreamRtx) { |
| 435 RampUpDownUpTester test(1, 60000, RtpExtension::kAbsSendTime, true, false); | 487 RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 488 true, false); |
| 436 RunBaseTest(&test); | 489 RunBaseTest(&test); |
| 437 } | 490 } |
| 438 | 491 |
| 439 TEST_F(RampUpTest, UpDownUpThreeStreamsRtx) { | 492 TEST_F(RampUpTest, UpDownUpThreeStreamsRtx) { |
| 440 RampUpDownUpTester test(3, 60000, RtpExtension::kAbsSendTime, true, false); | 493 RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 494 true, false); |
| 441 RunBaseTest(&test); | 495 RunBaseTest(&test); |
| 442 } | 496 } |
| 443 | 497 |
| 444 TEST_F(RampUpTest, UpDownUpOneStreamByRedRtx) { | 498 TEST_F(RampUpTest, UpDownUpOneStreamByRedRtx) { |
| 445 RampUpDownUpTester test(1, 60000, RtpExtension::kAbsSendTime, true, true); | 499 RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 500 true, true); |
| 446 RunBaseTest(&test); | 501 RunBaseTest(&test); |
| 447 } | 502 } |
| 448 | 503 |
| 449 TEST_F(RampUpTest, UpDownUpThreeStreamsByRedRtx) { | 504 TEST_F(RampUpTest, UpDownUpThreeStreamsByRedRtx) { |
| 450 RampUpDownUpTester test(3, 60000, RtpExtension::kAbsSendTime, true, true); | 505 RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime, |
| 506 true, true); |
| 451 RunBaseTest(&test); | 507 RunBaseTest(&test); |
| 452 } | 508 } |
| 509 |
| 510 TEST_F(RampUpTest, SendSideVideoUpDownUpRtx) { |
| 511 RampUpDownUpTester test(3, 0, kStartBitrateBps, |
| 512 RtpExtension::kTransportSequenceNumber, true, false); |
| 513 RunBaseTest(&test); |
| 514 } |
| 515 |
| 516 // TODO(holmer): Enable when audio bitrates are included in the bitrate |
| 517 // allocation. |
| 518 TEST_F(RampUpTest, DISABLED_SendSideAudioVideoUpDownUpRtx) { |
| 519 RampUpDownUpTester test(3, 1, kStartBitrateBps, |
| 520 RtpExtension::kTransportSequenceNumber, true, false); |
| 521 RunBaseTest(&test); |
| 522 } |
| 523 |
| 453 #endif | 524 #endif |
| 454 | 525 |
| 455 TEST_F(RampUpTest, AbsSendTimeSingleStream) { | 526 TEST_F(RampUpTest, AbsSendTimeSingleStream) { |
| 456 RampUpTester test(1, 0, 0, RtpExtension::kAbsSendTime, false, false); | 527 RampUpTester test(1, 0, 0, RtpExtension::kAbsSendTime, false, false); |
| 457 RunBaseTest(&test); | 528 RunBaseTest(&test); |
| 458 } | 529 } |
| 459 | 530 |
| 460 TEST_F(RampUpTest, AbsSendTimeSimulcast) { | 531 TEST_F(RampUpTest, AbsSendTimeSimulcast) { |
| 461 RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTime, false, false); | 532 RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTime, false, false); |
| 462 RunBaseTest(&test); | 533 RunBaseTest(&test); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 489 false); | 560 false); |
| 490 RunBaseTest(&test); | 561 RunBaseTest(&test); |
| 491 } | 562 } |
| 492 | 563 |
| 493 TEST_F(RampUpTest, TransportSequenceNumberSimulcastWithRtx) { | 564 TEST_F(RampUpTest, TransportSequenceNumberSimulcastWithRtx) { |
| 494 RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true, | 565 RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true, |
| 495 false); | 566 false); |
| 496 RunBaseTest(&test); | 567 RunBaseTest(&test); |
| 497 } | 568 } |
| 498 | 569 |
| 570 TEST_F(RampUpTest, AudioVideoTransportSequenceNumberSimulcastWithRtx) { |
| 571 RampUpTester test(3, 1, 0, RtpExtension::kTransportSequenceNumber, true, |
| 572 false); |
| 573 RunBaseTest(&test); |
| 574 } |
| 575 |
| 499 TEST_F(RampUpTest, TransportSequenceNumberSimulcastByRedWithRtx) { | 576 TEST_F(RampUpTest, TransportSequenceNumberSimulcastByRedWithRtx) { |
| 500 RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true, | 577 RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true, |
| 501 true); | 578 true); |
| 502 RunBaseTest(&test); | 579 RunBaseTest(&test); |
| 503 } | 580 } |
| 504 | 581 |
| 505 TEST_F(RampUpTest, TransportSequenceNumberSingleStreamWithHighStartBitrate) { | 582 TEST_F(RampUpTest, TransportSequenceNumberSingleStreamWithHighStartBitrate) { |
| 506 RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps, | 583 RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps, |
| 507 RtpExtension::kTransportSequenceNumber, false, false); | 584 RtpExtension::kTransportSequenceNumber, false, false); |
| 508 RunBaseTest(&test); | 585 RunBaseTest(&test); |
| 509 } | 586 } |
| 510 } // namespace webrtc | 587 } // namespace webrtc |
| OLD | NEW |