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

Side by Side Diff: webrtc/video/rampup_tests.cc

Issue 1362303002: Reland "Wire up send-side bandwidth estimation." (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « webrtc/video/rampup_tests.h ('k') | webrtc/video/screenshare_loopback.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/video/rampup_tests.h ('k') | webrtc/video/screenshare_loopback.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698