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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/video/rampup_tests.h ('k') | webrtc/video/screenshare_loopback.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« 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