From 820ebd0f661696043959b5105b2814e0edd8b694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Mon, 20 Aug 2018 17:14:25 +0200 Subject: [PATCH] Add field trial flag for increased receive buffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9637 Change-Id: Id84c78fa17fbd959af3ab81209e0636317f3da4b Reviewed-on: https://webrtc-review.googlesource.com/94768 Commit-Queue: Erik Språng Reviewed-by: Stefan Holmer Cr-Commit-Position: refs/heads/master@{#24349} --- media/engine/webrtcvideoengine.cc | 17 ++++++- media/engine/webrtcvideoengine_unittest.cc | 53 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc index 3a72cde891..e518682bb6 100644 --- a/media/engine/webrtcvideoengine.cc +++ b/media/engine/webrtcvideoengine.cc @@ -1511,9 +1511,22 @@ void WebRtcVideoChannel::OnNetworkRouteChanged( void WebRtcVideoChannel::SetInterface(NetworkInterface* iface) { MediaChannel::SetInterface(iface); - // Set the RTP recv/send buffer to a bigger size + // Set the RTP recv/send buffer to a bigger size. + + // The group here can be either a positive integer with an explicit size, in + // which case that is used as size. All other values shall result in the + // default value being used. + const std::string group_name = + webrtc::field_trial::FindFullName("WebRTC-IncreasedReceivebuffers"); + int recv_buffer_size = kVideoRtpBufferSize; + if (!group_name.empty() && + (sscanf(group_name.c_str(), "%d", &recv_buffer_size) != 1 || + recv_buffer_size <= 0)) { + RTC_LOG(LS_WARNING) << "Invalid receive buffer size: " << group_name; + recv_buffer_size = kVideoRtpBufferSize; + } MediaChannel::SetOption(NetworkInterface::ST_RTP, rtc::Socket::OPT_RCVBUF, - kVideoRtpBufferSize); + recv_buffer_size); // Speculative change to increase the outbound socket buffer size. // In b/15152257, we are seeing a significant number of packets discarded diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc index 5361a95f4d..3192866a93 100644 --- a/media/engine/webrtcvideoengine_unittest.cc +++ b/media/engine/webrtcvideoengine_unittest.cc @@ -1436,6 +1436,59 @@ TEST_F(WebRtcVideoChannelBaseTest, SetSendSetsTransportBufferSizes) { EXPECT_EQ(64 * 1024, network_interface_.recvbuf_size()); } +// Test that we properly set the send and recv buffer sizes when overriding +// via field trials. +TEST_F(WebRtcVideoChannelBaseTest, OverridesRecvBufferSize) { + // Set field trial to override the default recv buffer size, and then re-run + // setup where the interface is created and configured. + const int kCustomRecvBufferSize = 123456; + webrtc::test::ScopedFieldTrials field_trial( + "WebRTC-IncreasedReceivebuffers/123456/"); + SetUp(); + + EXPECT_TRUE(SetOneCodec(DefaultCodec())); + EXPECT_TRUE(SetSend(true)); + EXPECT_EQ(64 * 1024, network_interface_.sendbuf_size()); + EXPECT_EQ(kCustomRecvBufferSize, network_interface_.recvbuf_size()); +} + +// Test that we properly set the send and recv buffer sizes when overriding +// via field trials with suffix. +TEST_F(WebRtcVideoChannelBaseTest, OverridesRecvBufferSizeWithSuffix) { + // Set field trial to override the default recv buffer size, and then re-run + // setup where the interface is created and configured. + const int kCustomRecvBufferSize = 123456; + webrtc::test::ScopedFieldTrials field_trial( + "WebRTC-IncreasedReceivebuffers/123456_Dogfood/"); + SetUp(); + + EXPECT_TRUE(SetOneCodec(DefaultCodec())); + EXPECT_TRUE(SetSend(true)); + EXPECT_EQ(64 * 1024, network_interface_.sendbuf_size()); + EXPECT_EQ(kCustomRecvBufferSize, network_interface_.recvbuf_size()); +} + +// Test that we properly set the send and recv buffer sizes when overriding +// via field trials that don't make any sense. +TEST_F(WebRtcVideoChannelBaseTest, InvalidRecvBufferSize) { + // Set bogus field trial values to override the default recv buffer size, and + // then re-run setup where the interface is created and configured. The + // default value should still be used. + + for (std::string group : {" ", "NotANumber", "-1", "0"}) { + std::string field_trial_string = "WebRTC-IncreasedReceivebuffers/"; + field_trial_string += group; + field_trial_string += "/"; + webrtc::test::ScopedFieldTrials field_trial(field_trial_string); + SetUp(); + + EXPECT_TRUE(SetOneCodec(DefaultCodec())); + EXPECT_TRUE(SetSend(true)); + EXPECT_EQ(64 * 1024, network_interface_.sendbuf_size()); + EXPECT_EQ(64 * 1024, network_interface_.recvbuf_size()); + } +} + // Test that stats work properly for a 1-1 call. TEST_F(WebRtcVideoChannelBaseTest, GetStats) { const int kDurationSec = 3;