Adds TCP fairness test to receive side congestion controller.

Bug: webrtc:9883
Change-Id: I3697491285e4f70b8f7857198e4e1ccb0097da5b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/140883
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28196}
This commit is contained in:
Sebastian Jansson 2019-06-07 15:24:57 +02:00 committed by Commit Bot
parent f6c914aa59
commit 24cf2606e4
3 changed files with 55 additions and 6 deletions

View File

@ -101,6 +101,7 @@ if (rtc_include_tests) {
"../../system_wrappers",
"../../test:field_trial",
"../../test:test_support",
"../../test/scenario",
"../bitrate_controller",
"../pacing",
"../pacing:mock_paced_sender",

View File

@ -13,6 +13,7 @@
#include "system_wrappers/include/clock.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/scenario/scenario.h"
using ::testing::_;
using ::testing::AtLeast;
@ -71,5 +72,47 @@ TEST(ReceiveSideCongestionControllerTest, OnReceivedPacketWithAbsSendTime) {
EXPECT_EQ(header.ssrc, ssrcs[0]);
}
TEST(ReceiveSideCongestionControllerTest, ConvergesToCapacity) {
Scenario s("recieve_cc_unit/converge");
NetworkSimulationConfig net_conf;
net_conf.bandwidth = DataRate::kbps(1000);
net_conf.delay = TimeDelta::ms(50);
auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.rates.start_rate = DataRate::kbps(300);
});
auto* route = s.CreateRoutes(client, {s.CreateSimulationNode(net_conf)},
s.CreateClient("return", CallClientConfig()),
{s.CreateSimulationNode(net_conf)});
VideoStreamConfig video;
video.stream.packet_feedback = false;
s.CreateVideoStream(route->forward(), video);
s.RunFor(TimeDelta::seconds(30));
EXPECT_NEAR(client->send_bandwidth().kbps(), 900, 150);
}
TEST(ReceiveSideCongestionControllerTest, IsFairToTCP) {
Scenario s("recieve_cc_unit/tcp_fairness");
NetworkSimulationConfig net_conf;
net_conf.bandwidth = DataRate::kbps(1000);
net_conf.delay = TimeDelta::ms(50);
auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
c->transport.rates.start_rate = DataRate::kbps(1000);
});
auto send_net = {s.CreateSimulationNode(net_conf)};
auto ret_net = {s.CreateSimulationNode(net_conf)};
auto* route = s.CreateRoutes(
client, send_net, s.CreateClient("return", CallClientConfig()), ret_net);
VideoStreamConfig video;
video.stream.packet_feedback = false;
s.CreateVideoStream(route->forward(), video);
s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net),
s.net()->CreateRoute(ret_net),
FakeTcpConfig());
s.RunFor(TimeDelta::seconds(30));
// For some reason we get outcompeted by TCP here, this should probably be
// fixed and a lower bound should be added to the test.
EXPECT_LT(client->send_bandwidth().kbps(), 750);
}
} // namespace test
} // namespace webrtc

View File

@ -88,12 +88,16 @@ InterLayerPredMode ToInterLayerPredMode(
}
std::vector<RtpExtension> GetVideoRtpExtensions(
const VideoStreamConfig config) {
return {RtpExtension(RtpExtension::kTransportSequenceNumberUri,
kTransportSequenceNumberExtensionId),
RtpExtension(RtpExtension::kVideoContentTypeUri,
kVideoContentTypeExtensionId),
RtpExtension(RtpExtension::kVideoRotationUri,
kVideoRotationRtpExtensionId)};
std::vector<RtpExtension> res = {
RtpExtension(RtpExtension::kVideoContentTypeUri,
kVideoContentTypeExtensionId),
RtpExtension(RtpExtension::kVideoRotationUri,
kVideoRotationRtpExtensionId)};
if (config.stream.packet_feedback) {
res.push_back(RtpExtension(RtpExtension::kTransportSequenceNumberUri,
kTransportSequenceNumberExtensionId));
}
return res;
}
std::string TransformFilePath(std::string path) {
@ -311,6 +315,7 @@ VideoReceiveStream::Config CreateVideoReceiveStreamConfig(
recv.rtp.transport_cc = config.stream.packet_feedback;
recv.rtp.local_ssrc = local_ssrc;
recv.rtp.extensions = GetVideoRtpExtensions(config);
RTC_DCHECK(!config.stream.use_rtx ||
config.stream.nack_history_time > TimeDelta::Zero());
recv.rtp.nack.rtp_history_ms = config.stream.nack_history_time.ms();