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

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

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