Index: webrtc/video/rampup_tests.cc |
diff --git a/webrtc/video/rampup_tests.cc b/webrtc/video/rampup_tests.cc |
index d308f2ddb72619bd12145c2fd32ac4983b9de6f4..f69f8ce97b5ba562fc421d7ae9339fa1626a58cd 100644 |
--- a/webrtc/video/rampup_tests.cc |
+++ b/webrtc/video/rampup_tests.cc |
@@ -11,14 +11,18 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "webrtc/base/checks.h" |
#include "webrtc/base/common.h" |
+#include "webrtc/base/event.h" |
+#include "webrtc/modules/pacing/include/packet_router.h" |
#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h" |
#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h" |
+#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h" |
#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" |
#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" |
#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" |
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" |
#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
+#include "webrtc/system_wrappers/interface/thread_wrapper.h" |
#include "webrtc/test/testsupport/perf_test.h" |
#include "webrtc/video/rampup_tests.h" |
@@ -70,14 +74,22 @@ StreamObserver::StreamObserver(const SsrcMap& rtx_media_ssrcs, |
rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); |
rtp_rtcp_->SetREMBStatus(true); |
rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); |
+ packet_router_.reset(new PacketRouter()); |
+ packet_router_->AddRtpModule(rtp_rtcp_.get()); |
rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
kAbsSendTimeExtensionId); |
rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
kTransmissionTimeOffsetExtensionId); |
+ rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
+ kTransportSequenceNumberExtensionId); |
payload_registry_->SetRtxPayloadType(RampUpTest::kSendRtxPayloadType, |
RampUpTest::kFakeSendPayloadType); |
} |
+StreamObserver::~StreamObserver() { |
+ packet_router_->RemoveRtpModule(rtp_rtcp_.get()); |
+} |
+ |
void StreamObserver::set_expected_bitrate_bps( |
unsigned int expected_bitrate_bps) { |
rtc::CritScope lock(&crit_); |
@@ -163,6 +175,10 @@ void StreamObserver::SetRemoteBitrateEstimator(RemoteBitrateEstimator* rbe) { |
remote_bitrate_estimator_.reset(rbe); |
} |
+PacketRouter* StreamObserver::GetPacketRouter() { |
+ return packet_router_.get(); |
+} |
+ |
void StreamObserver::ReportResult(const std::string& measurement, |
size_t value, |
const std::string& units) { |
@@ -371,6 +387,49 @@ EventTypeWrapper LowRateStreamObserver::Wait() { |
return test_done_->Wait(test::CallTest::kLongTimeoutMs); |
} |
+class SendBitrateAdapter { |
+ public: |
+ static const int64_t kPollIntervalMs = 250; |
+ |
+ SendBitrateAdapter(const Call& call, |
+ const std::vector<uint32_t>& ssrcs, |
+ RemoteBitrateObserver* bitrate_observer) |
+ : event_(false, false), |
+ call_(call), |
+ ssrcs_(ssrcs), |
+ bitrate_observer_(bitrate_observer) { |
+ RTC_DCHECK(bitrate_observer != nullptr); |
+ poller_thread_ = ThreadWrapper::CreateThread(&SendBitrateAdapterThread, |
+ this, "SendBitratePoller"); |
+ bool thread_start_ok = poller_thread_->Start(); |
+ RTC_DCHECK(thread_start_ok); |
+ } |
+ |
+ virtual ~SendBitrateAdapter() { |
+ event_.Set(); |
+ poller_thread_->Stop(); |
+ } |
+ |
+ private: |
+ static bool SendBitrateAdapterThread(void* obj) { |
+ return static_cast<SendBitrateAdapter*>(obj)->PollStats(); |
+ } |
+ |
+ bool PollStats() { |
+ Call::Stats stats = call_.GetStats(); |
+ |
+ bitrate_observer_->OnReceiveBitrateChanged(ssrcs_, |
+ stats.send_bandwidth_bps); |
+ return !event_.Wait(kPollIntervalMs); |
+ } |
+ |
+ rtc::Event event_; |
+ rtc::scoped_ptr<ThreadWrapper> poller_thread_; |
+ const Call& call_; |
+ const std::vector<uint32_t> ssrcs_; |
+ RemoteBitrateObserver* const bitrate_observer_; |
+}; |
+ |
void RampUpTest::RunRampUpTest(size_t num_streams, |
unsigned int start_bitrate_bps, |
const std::string& extension_type, |
@@ -391,6 +450,8 @@ void RampUpTest::RunRampUpTest(size_t num_streams, |
CreateSendConfig(num_streams, &stream_observer); |
send_config_.rtp.extensions.clear(); |
+ rtc::scoped_ptr<SendBitrateAdapter> send_bitrate_adapter_; |
+ |
if (extension_type == RtpExtension::kAbsSendTime) { |
stream_observer.SetRemoteBitrateEstimator( |
new RemoteBitrateEstimatorAbsSendTime( |
@@ -398,6 +459,11 @@ void RampUpTest::RunRampUpTest(size_t num_streams, |
kRemoteBitrateEstimatorMinBitrateBps)); |
send_config_.rtp.extensions.push_back(RtpExtension( |
extension_type.c_str(), kAbsSendTimeExtensionId)); |
+ } else if (extension_type == RtpExtension::kTransportSequenceNumber) { |
+ stream_observer.SetRemoteBitrateEstimator(new RemoteEstimatorProxy( |
+ Clock::GetRealTimeClock(), stream_observer.GetPacketRouter())); |
+ send_config_.rtp.extensions.push_back(RtpExtension( |
+ extension_type.c_str(), kTransportSequenceNumberExtensionId)); |
} else { |
stream_observer.SetRemoteBitrateEstimator( |
new RemoteBitrateEstimatorSingleStream( |
@@ -449,10 +515,18 @@ void RampUpTest::RunRampUpTest(size_t num_streams, |
CreateStreams(); |
CreateFrameGeneratorCapturer(); |
+ if (extension_type == RtpExtension::kTransportSequenceNumber) { |
+ send_bitrate_adapter_.reset( |
+ new SendBitrateAdapter(*sender_call_.get(), ssrcs, &stream_observer)); |
+ } |
Start(); |
EXPECT_EQ(kEventSignaled, stream_observer.Wait()); |
+ // Destroy the SendBitrateAdapter (if any) to stop the poller thread in it, |
+ // otherwise we might get a data race with the destruction of the call. |
+ send_bitrate_adapter_.reset(); |
+ |
Stop(); |
DestroyStreams(); |
} |
@@ -563,4 +637,25 @@ TEST_F(RampUpTest, AbsSendTimeSingleStreamWithHighStartBitrate) { |
RunRampUpTest(1, 0.9 * kSingleStreamTargetBps, RtpExtension::kAbsSendTime, |
false, false); |
} |
+ |
+TEST_F(RampUpTest, TransportSequenceNumberSingleStream) { |
+ RunRampUpTest(1, 0, RtpExtension::kTransportSequenceNumber, false, false); |
+} |
+ |
+TEST_F(RampUpTest, TransportSequenceNumberSimulcast) { |
+ RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, false, false); |
+} |
+ |
+TEST_F(RampUpTest, TransportSequenceNumberSimulcastWithRtx) { |
+ RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, true, false); |
+} |
+ |
+TEST_F(RampUpTest, TransportSequenceNumberSimulcastByRedWithRtx) { |
+ RunRampUpTest(3, 0, RtpExtension::kTransportSequenceNumber, true, true); |
+} |
+ |
+TEST_F(RampUpTest, TransportSequenceNumberSingleStreamWithHighStartBitrate) { |
+ RunRampUpTest(1, 0.9 * kSingleStreamTargetBps, |
+ RtpExtension::kTransportSequenceNumber, false, false); |
+} |
} // namespace webrtc |