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 "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "webrtc/base/checks.h" | 12 #include "webrtc/base/checks.h" |
13 #include "webrtc/base/common.h" | 13 #include "webrtc/base/common.h" |
| 14 #include "webrtc/base/event.h" |
| 15 #include "webrtc/modules/pacing/include/packet_router.h" |
14 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_s
end_time.h" | 16 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_s
end_time.h" |
15 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" | 17 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" |
| 18 #include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h" |
16 #include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" | 19 #include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" |
17 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" | 20 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" |
18 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" | 21 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" |
19 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" | 22 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" |
20 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
21 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" | 24 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
| 25 #include "webrtc/system_wrappers/interface/thread_wrapper.h" |
22 #include "webrtc/test/testsupport/perf_test.h" | 26 #include "webrtc/test/testsupport/perf_test.h" |
23 #include "webrtc/video/rampup_tests.h" | 27 #include "webrtc/video/rampup_tests.h" |
24 | 28 |
25 namespace webrtc { | 29 namespace webrtc { |
26 namespace { | 30 namespace { |
27 | 31 |
28 static const int kMaxPacketSize = 1500; | 32 static const int kMaxPacketSize = 1500; |
29 const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; | 33 const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; |
30 | 34 |
31 std::vector<uint32_t> GenerateSsrcs(size_t num_streams, | 35 std::vector<uint32_t> GenerateSsrcs(size_t num_streams, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 // RtpHeaderParser and a RemoteBitrateEstimator here, but due to the current | 67 // RtpHeaderParser and a RemoteBitrateEstimator here, but due to the current |
64 // state of the RTP module we need a full module and receive statistics to | 68 // state of the RTP module we need a full module and receive statistics to |
65 // be able to produce an RTCP with REMB. | 69 // be able to produce an RTCP with REMB. |
66 RtpRtcp::Configuration config; | 70 RtpRtcp::Configuration config; |
67 config.receive_statistics = receive_stats_.get(); | 71 config.receive_statistics = receive_stats_.get(); |
68 feedback_transport_.Enable(); | 72 feedback_transport_.Enable(); |
69 config.outgoing_transport = &feedback_transport_; | 73 config.outgoing_transport = &feedback_transport_; |
70 rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); | 74 rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); |
71 rtp_rtcp_->SetREMBStatus(true); | 75 rtp_rtcp_->SetREMBStatus(true); |
72 rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); | 76 rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); |
| 77 packet_router_.reset(new PacketRouter()); |
| 78 packet_router_->AddRtpModule(rtp_rtcp_.get()); |
73 rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 79 rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
74 kAbsSendTimeExtensionId); | 80 kAbsSendTimeExtensionId); |
75 rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | 81 rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
76 kTransmissionTimeOffsetExtensionId); | 82 kTransmissionTimeOffsetExtensionId); |
| 83 rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
| 84 kTransportSequenceNumberExtensionId); |
77 payload_registry_->SetRtxPayloadType(RampUpTest::kSendRtxPayloadType, | 85 payload_registry_->SetRtxPayloadType(RampUpTest::kSendRtxPayloadType, |
78 RampUpTest::kFakeSendPayloadType); | 86 RampUpTest::kFakeSendPayloadType); |
79 } | 87 } |
80 | 88 |
| 89 StreamObserver::~StreamObserver() { |
| 90 packet_router_->RemoveRtpModule(rtp_rtcp_.get()); |
| 91 } |
| 92 |
81 void StreamObserver::set_expected_bitrate_bps( | 93 void StreamObserver::set_expected_bitrate_bps( |
82 unsigned int expected_bitrate_bps) { | 94 unsigned int expected_bitrate_bps) { |
83 rtc::CritScope lock(&crit_); | 95 rtc::CritScope lock(&crit_); |
84 expected_bitrate_bps_ = expected_bitrate_bps; | 96 expected_bitrate_bps_ = expected_bitrate_bps; |
85 } | 97 } |
86 | 98 |
87 void StreamObserver::set_start_bitrate_bps(unsigned int start_bitrate_bps) { | 99 void StreamObserver::set_start_bitrate_bps(unsigned int start_bitrate_bps) { |
88 rtc::CritScope lock(&crit_); | 100 rtc::CritScope lock(&crit_); |
89 start_bitrate_bps_ = start_bitrate_bps; | 101 start_bitrate_bps_ = start_bitrate_bps; |
90 } | 102 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 168 } |
157 | 169 |
158 EventTypeWrapper StreamObserver::Wait() { | 170 EventTypeWrapper StreamObserver::Wait() { |
159 return test_done_->Wait(test::CallTest::kLongTimeoutMs); | 171 return test_done_->Wait(test::CallTest::kLongTimeoutMs); |
160 } | 172 } |
161 | 173 |
162 void StreamObserver::SetRemoteBitrateEstimator(RemoteBitrateEstimator* rbe) { | 174 void StreamObserver::SetRemoteBitrateEstimator(RemoteBitrateEstimator* rbe) { |
163 remote_bitrate_estimator_.reset(rbe); | 175 remote_bitrate_estimator_.reset(rbe); |
164 } | 176 } |
165 | 177 |
| 178 PacketRouter* StreamObserver::GetPacketRouter() { |
| 179 return packet_router_.get(); |
| 180 } |
| 181 |
166 void StreamObserver::ReportResult(const std::string& measurement, | 182 void StreamObserver::ReportResult(const std::string& measurement, |
167 size_t value, | 183 size_t value, |
168 const std::string& units) { | 184 const std::string& units) { |
169 webrtc::test::PrintResult( | 185 webrtc::test::PrintResult( |
170 measurement, "", | 186 measurement, "", |
171 ::testing::UnitTest::GetInstance()->current_test_info()->name(), | 187 ::testing::UnitTest::GetInstance()->current_test_info()->name(), |
172 value, units, false); | 188 value, units, false); |
173 } | 189 } |
174 | 190 |
175 void StreamObserver::TriggerTestDone() EXCLUSIVE_LOCKS_REQUIRED(crit_) { | 191 void StreamObserver::TriggerTestDone() EXCLUSIVE_LOCKS_REQUIRED(crit_) { |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 } | 380 } |
365 break; | 381 break; |
366 } | 382 } |
367 } | 383 } |
368 } | 384 } |
369 | 385 |
370 EventTypeWrapper LowRateStreamObserver::Wait() { | 386 EventTypeWrapper LowRateStreamObserver::Wait() { |
371 return test_done_->Wait(test::CallTest::kLongTimeoutMs); | 387 return test_done_->Wait(test::CallTest::kLongTimeoutMs); |
372 } | 388 } |
373 | 389 |
| 390 class SendBitrateAdapter { |
| 391 public: |
| 392 static const int64_t kPollIntervalMs = 250; |
| 393 |
| 394 SendBitrateAdapter(const Call& call, |
| 395 const std::vector<uint32_t>& ssrcs, |
| 396 RemoteBitrateObserver* bitrate_observer) |
| 397 : event_(false, false), |
| 398 call_(call), |
| 399 ssrcs_(ssrcs), |
| 400 bitrate_observer_(bitrate_observer) { |
| 401 RTC_DCHECK(bitrate_observer != nullptr); |
| 402 poller_thread_ = ThreadWrapper::CreateThread(&SendBitrateAdapterThread, |
| 403 this, "SendBitratePoller"); |
| 404 bool thread_start_ok = poller_thread_->Start(); |
| 405 RTC_DCHECK(thread_start_ok); |
| 406 } |
| 407 |
| 408 virtual ~SendBitrateAdapter() { |
| 409 event_.Set(); |
| 410 poller_thread_->Stop(); |
| 411 } |
| 412 |
| 413 private: |
| 414 static bool SendBitrateAdapterThread(void* obj) { |
| 415 return static_cast<SendBitrateAdapter*>(obj)->PollStats(); |
| 416 } |
| 417 |
| 418 bool PollStats() { |
| 419 Call::Stats stats = call_.GetStats(); |
| 420 |
| 421 bitrate_observer_->OnReceiveBitrateChanged(ssrcs_, |
| 422 stats.send_bandwidth_bps); |
| 423 return !event_.Wait(kPollIntervalMs); |
| 424 } |
| 425 |
| 426 rtc::Event event_; |
| 427 rtc::scoped_ptr<ThreadWrapper> poller_thread_; |
| 428 const Call& call_; |
| 429 const std::vector<uint32_t> ssrcs_; |
| 430 RemoteBitrateObserver* const bitrate_observer_; |
| 431 }; |
| 432 |
374 void RampUpTest::RunRampUpTest(size_t num_streams, | 433 void RampUpTest::RunRampUpTest(size_t num_streams, |
375 unsigned int start_bitrate_bps, | 434 unsigned int start_bitrate_bps, |
376 const std::string& extension_type, | 435 const std::string& extension_type, |
377 bool rtx, | 436 bool rtx, |
378 bool red) { | 437 bool red) { |
379 std::vector<uint32_t> ssrcs(GenerateSsrcs(num_streams, 100)); | 438 std::vector<uint32_t> ssrcs(GenerateSsrcs(num_streams, 100)); |
380 std::vector<uint32_t> rtx_ssrcs(GenerateSsrcs(num_streams, 200)); | 439 std::vector<uint32_t> rtx_ssrcs(GenerateSsrcs(num_streams, 200)); |
381 StreamObserver::SsrcMap rtx_ssrc_map; | 440 StreamObserver::SsrcMap rtx_ssrc_map; |
382 if (rtx) { | 441 if (rtx) { |
383 for (size_t i = 0; i < ssrcs.size(); ++i) | 442 for (size_t i = 0; i < ssrcs.size(); ++i) |
384 rtx_ssrc_map[rtx_ssrcs[i]] = ssrcs[i]; | 443 rtx_ssrc_map[rtx_ssrcs[i]] = ssrcs[i]; |
385 } | 444 } |
386 | 445 |
387 test::DirectTransport receiver_transport; | 446 test::DirectTransport receiver_transport; |
388 StreamObserver stream_observer(rtx_ssrc_map, &receiver_transport, | 447 StreamObserver stream_observer(rtx_ssrc_map, &receiver_transport, |
389 Clock::GetRealTimeClock()); | 448 Clock::GetRealTimeClock()); |
390 | 449 |
391 CreateSendConfig(num_streams, &stream_observer); | 450 CreateSendConfig(num_streams, &stream_observer); |
392 send_config_.rtp.extensions.clear(); | 451 send_config_.rtp.extensions.clear(); |
393 | 452 |
| 453 rtc::scoped_ptr<SendBitrateAdapter> send_bitrate_adapter_; |
| 454 |
394 if (extension_type == RtpExtension::kAbsSendTime) { | 455 if (extension_type == RtpExtension::kAbsSendTime) { |
395 stream_observer.SetRemoteBitrateEstimator( | 456 stream_observer.SetRemoteBitrateEstimator( |
396 new RemoteBitrateEstimatorAbsSendTime( | 457 new RemoteBitrateEstimatorAbsSendTime( |
397 &stream_observer, Clock::GetRealTimeClock(), | 458 &stream_observer, Clock::GetRealTimeClock(), |
398 kRemoteBitrateEstimatorMinBitrateBps)); | 459 kRemoteBitrateEstimatorMinBitrateBps)); |
399 send_config_.rtp.extensions.push_back(RtpExtension( | 460 send_config_.rtp.extensions.push_back(RtpExtension( |
400 extension_type.c_str(), kAbsSendTimeExtensionId)); | 461 extension_type.c_str(), kAbsSendTimeExtensionId)); |
| 462 } else if (extension_type == RtpExtension::kTransportSequenceNumber) { |
| 463 stream_observer.SetRemoteBitrateEstimator(new RemoteEstimatorProxy( |
| 464 Clock::GetRealTimeClock(), stream_observer.GetPacketRouter())); |
| 465 send_config_.rtp.extensions.push_back(RtpExtension( |
| 466 extension_type.c_str(), kTransportSequenceNumberExtensionId)); |
401 } else { | 467 } else { |
402 stream_observer.SetRemoteBitrateEstimator( | 468 stream_observer.SetRemoteBitrateEstimator( |
403 new RemoteBitrateEstimatorSingleStream( | 469 new RemoteBitrateEstimatorSingleStream( |
404 &stream_observer, Clock::GetRealTimeClock(), | 470 &stream_observer, Clock::GetRealTimeClock(), |
405 kRemoteBitrateEstimatorMinBitrateBps)); | 471 kRemoteBitrateEstimatorMinBitrateBps)); |
406 send_config_.rtp.extensions.push_back(RtpExtension( | 472 send_config_.rtp.extensions.push_back(RtpExtension( |
407 extension_type.c_str(), kTransmissionTimeOffsetExtensionId)); | 473 extension_type.c_str(), kTransmissionTimeOffsetExtensionId)); |
408 } | 474 } |
409 | 475 |
410 Call::Config call_config; | 476 Call::Config call_config; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 int expected_bitrate_bps = encoder_config_.streams.back().min_bitrate_bps; | 508 int expected_bitrate_bps = encoder_config_.streams.back().min_bitrate_bps; |
443 for (size_t i = 0; i < encoder_config_.streams.size() - 1; ++i) { | 509 for (size_t i = 0; i < encoder_config_.streams.size() - 1; ++i) { |
444 expected_bitrate_bps += encoder_config_.streams[i].target_bitrate_bps; | 510 expected_bitrate_bps += encoder_config_.streams[i].target_bitrate_bps; |
445 } | 511 } |
446 stream_observer.set_expected_bitrate_bps(expected_bitrate_bps); | 512 stream_observer.set_expected_bitrate_bps(expected_bitrate_bps); |
447 } | 513 } |
448 | 514 |
449 CreateStreams(); | 515 CreateStreams(); |
450 CreateFrameGeneratorCapturer(); | 516 CreateFrameGeneratorCapturer(); |
451 | 517 |
| 518 if (extension_type == RtpExtension::kTransportSequenceNumber) { |
| 519 send_bitrate_adapter_.reset( |
| 520 new SendBitrateAdapter(*sender_call_.get(), ssrcs, &stream_observer)); |
| 521 } |
452 Start(); | 522 Start(); |
453 | 523 |
454 EXPECT_EQ(kEventSignaled, stream_observer.Wait()); | 524 EXPECT_EQ(kEventSignaled, stream_observer.Wait()); |
455 | 525 |
| 526 // Destroy the SendBitrateAdapter (if any) to stop the poller thread in it, |
| 527 // otherwise we might get a data race with the destruction of the call. |
| 528 send_bitrate_adapter_.reset(); |
| 529 |
456 Stop(); | 530 Stop(); |
457 DestroyStreams(); | 531 DestroyStreams(); |
458 } | 532 } |
459 | 533 |
460 void RampUpTest::RunRampUpDownUpTest(size_t number_of_streams, | 534 void RampUpTest::RunRampUpDownUpTest(size_t number_of_streams, |
461 bool rtx, | 535 bool rtx, |
462 bool red) { | 536 bool red) { |
463 test::DirectTransport receiver_transport; | 537 test::DirectTransport receiver_transport; |
464 LowRateStreamObserver stream_observer( | 538 LowRateStreamObserver stream_observer( |
465 &receiver_transport, Clock::GetRealTimeClock(), number_of_streams, rtx); | 539 &receiver_transport, Clock::GetRealTimeClock(), number_of_streams, rtx); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 } | 630 } |
557 | 631 |
558 TEST_F(RampUpTest, AbsSendTimeSimulcastByRedWithRtx) { | 632 TEST_F(RampUpTest, AbsSendTimeSimulcastByRedWithRtx) { |
559 RunRampUpTest(3, 0, RtpExtension::kAbsSendTime, true, true); | 633 RunRampUpTest(3, 0, RtpExtension::kAbsSendTime, true, true); |
560 } | 634 } |
561 | 635 |
562 TEST_F(RampUpTest, AbsSendTimeSingleStreamWithHighStartBitrate) { | 636 TEST_F(RampUpTest, AbsSendTimeSingleStreamWithHighStartBitrate) { |
563 RunRampUpTest(1, 0.9 * kSingleStreamTargetBps, RtpExtension::kAbsSendTime, | 637 RunRampUpTest(1, 0.9 * kSingleStreamTargetBps, RtpExtension::kAbsSendTime, |
564 false, false); | 638 false, false); |
565 } | 639 } |
| 640 |
| 641 TEST_F(RampUpTest, TransportSequenceNumberSingleStream) { |
| 642 RunRampUpTest(1, 0, RtpExtension::kTransportSequenceNumber, false, false); |
| 643 } |
| 644 |
| 645 TEST_F(RampUpTest, TransportSequenceNumberSimulcast) { |
| 646 RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, false, false); |
| 647 } |
| 648 |
| 649 TEST_F(RampUpTest, TransportSequenceNumberSimulcastWithRtx) { |
| 650 RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, true, false); |
| 651 } |
| 652 |
| 653 TEST_F(RampUpTest, TransportSequenceNumberSimulcastByRedWithRtx) { |
| 654 RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, true, true); |
| 655 } |
| 656 |
| 657 TEST_F(RampUpTest, TransportSequenceNumberSingleStreamWithHighStartBitrate) { |
| 658 RunRampUpTest(1, 0.9 * kSingleStreamTargetBps, |
| 659 RtpExtension::kTransportSequenceNumber, false, false); |
| 660 } |
566 } // namespace webrtc | 661 } // namespace webrtc |
OLD | NEW |