Reduce pacing buffer padding rate during pushback.
Bug: webrtc:10112 Change-Id: I2cd2d07bd5bcbff5b3808ee63eea251a52e45b79 Reviewed-on: https://webrtc-review.googlesource.com/c/113808 Reviewed-by: Sebastian Jansson <srte@webrtc.org> Commit-Queue: Christoffer Rodbro <crodbro@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25968}
This commit is contained in:

committed by
Commit Bot

parent
7025535b4b
commit
5d4740170a
@ -150,6 +150,7 @@ GoogCcNetworkController::GoogCcNetworkController(RtcEventLog* event_log,
|
|||||||
absl::make_unique<AcknowledgedBitrateEstimator>()),
|
absl::make_unique<AcknowledgedBitrateEstimator>()),
|
||||||
initial_config_(config),
|
initial_config_(config),
|
||||||
last_target_rate_(*config.constraints.starting_rate),
|
last_target_rate_(*config.constraints.starting_rate),
|
||||||
|
pushback_target_rate_(last_target_rate_),
|
||||||
pacing_factor_(config.stream_based_config.pacing_factor.value_or(
|
pacing_factor_(config.stream_based_config.pacing_factor.value_or(
|
||||||
kDefaultPaceMultiplier)),
|
kDefaultPaceMultiplier)),
|
||||||
min_pacing_rate_(config.stream_based_config.min_pacing_rate.value_or(
|
min_pacing_rate_(config.stream_based_config.min_pacing_rate.value_or(
|
||||||
@ -619,6 +620,7 @@ void GoogCcNetworkController::MaybeTriggerOnNetworkChanged(
|
|||||||
pushback_rate);
|
pushback_rate);
|
||||||
target_rate = DataRate::bps(pushback_rate);
|
target_rate = DataRate::bps(pushback_rate);
|
||||||
}
|
}
|
||||||
|
pushback_target_rate_ = target_rate;
|
||||||
|
|
||||||
TargetTransferRate target_rate_msg;
|
TargetTransferRate target_rate_msg;
|
||||||
target_rate_msg.at_time = at_time;
|
target_rate_msg.at_time = at_time;
|
||||||
@ -642,7 +644,7 @@ void GoogCcNetworkController::MaybeTriggerOnNetworkChanged(
|
|||||||
PacerConfig GoogCcNetworkController::GetPacingRates(Timestamp at_time) const {
|
PacerConfig GoogCcNetworkController::GetPacingRates(Timestamp at_time) const {
|
||||||
DataRate pacing_rate =
|
DataRate pacing_rate =
|
||||||
std::max(min_pacing_rate_, last_target_rate_) * pacing_factor_;
|
std::max(min_pacing_rate_, last_target_rate_) * pacing_factor_;
|
||||||
DataRate padding_rate = std::min(max_padding_rate_, last_target_rate_);
|
DataRate padding_rate = std::min(max_padding_rate_, pushback_target_rate_);
|
||||||
PacerConfig msg;
|
PacerConfig msg;
|
||||||
msg.at_time = at_time;
|
msg.at_time = at_time;
|
||||||
msg.time_window = TimeDelta::seconds(1);
|
msg.time_window = TimeDelta::seconds(1);
|
||||||
|
@ -95,6 +95,7 @@ class GoogCcNetworkController : public NetworkControllerInterface {
|
|||||||
std::deque<int64_t> feedback_max_rtts_;
|
std::deque<int64_t> feedback_max_rtts_;
|
||||||
|
|
||||||
DataRate last_target_rate_;
|
DataRate last_target_rate_;
|
||||||
|
DataRate pushback_target_rate_;
|
||||||
|
|
||||||
int32_t last_estimated_bitrate_bps_ = 0;
|
int32_t last_estimated_bitrate_bps_ = 0;
|
||||||
uint8_t last_estimated_fraction_loss_ = 0;
|
uint8_t last_estimated_fraction_loss_ = 0;
|
||||||
|
@ -357,6 +357,43 @@ TEST_F(GoogCcNetworkControllerTest,
|
|||||||
20);
|
20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(GoogCcNetworkControllerTest,
|
||||||
|
PaddingRateLimitedByCongestionWindowInTrial) {
|
||||||
|
ScopedFieldTrials trial(
|
||||||
|
"WebRTC-CongestionWindowPushback/Enabled/WebRTC-CwndExperiment/"
|
||||||
|
"Enabled-200/");
|
||||||
|
|
||||||
|
Scenario s("googcc_unit/padding_limited", false);
|
||||||
|
NetworkNodeConfig net_conf;
|
||||||
|
auto send_net = s.CreateSimulationNode([=](NetworkNodeConfig* c) {
|
||||||
|
c->simulation.bandwidth = DataRate::kbps(1000);
|
||||||
|
c->simulation.delay = TimeDelta::ms(100);
|
||||||
|
c->update_frequency = TimeDelta::ms(5);
|
||||||
|
});
|
||||||
|
auto ret_net = s.CreateSimulationNode([](NetworkNodeConfig* c) {
|
||||||
|
c->simulation.delay = TimeDelta::ms(100);
|
||||||
|
c->update_frequency = TimeDelta::ms(5);
|
||||||
|
});
|
||||||
|
SimulatedTimeClientConfig config;
|
||||||
|
config.transport.cc =
|
||||||
|
TransportControllerConfig::CongestionController::kGoogCc;
|
||||||
|
// Start high so bandwidth drop has max effect.
|
||||||
|
config.transport.rates.start_rate = DataRate::kbps(1000);
|
||||||
|
config.transport.rates.max_rate = DataRate::kbps(2000);
|
||||||
|
config.transport.rates.max_padding_rate = config.transport.rates.max_rate;
|
||||||
|
SimulatedTimeClient* client = s.CreateSimulatedTimeClient(
|
||||||
|
"send", config, {PacketStreamConfig()}, {send_net}, {ret_net});
|
||||||
|
// Run for a few seconds to allow the controller to stabilize.
|
||||||
|
s.RunFor(TimeDelta::seconds(10));
|
||||||
|
|
||||||
|
// Check that padding rate matches target rate.
|
||||||
|
EXPECT_NEAR(client->padding_rate().kbps(), client->target_rate_kbps(), 1);
|
||||||
|
|
||||||
|
// Check this is also the case when congestion window pushback kicks in.
|
||||||
|
send_net->PauseTransmissionUntil(s.Now() + TimeDelta::seconds(1));
|
||||||
|
EXPECT_NEAR(client->padding_rate().kbps(), client->target_rate_kbps(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(GoogCcNetworkControllerTest, LimitsToMinRateIfRttIsHighInTrial) {
|
TEST_F(GoogCcNetworkControllerTest, LimitsToMinRateIfRttIsHighInTrial) {
|
||||||
// The field trial limits maximum RTT to 2 seconds, higher RTT means that the
|
// The field trial limits maximum RTT to 2 seconds, higher RTT means that the
|
||||||
// controller backs off until it reaches the minimum configured bitrate. This
|
// controller backs off until it reaches the minimum configured bitrate. This
|
||||||
|
@ -44,6 +44,7 @@ struct TransportControllerConfig {
|
|||||||
DataRate min_rate = DataRate::kbps(30);
|
DataRate min_rate = DataRate::kbps(30);
|
||||||
DataRate max_rate = DataRate::kbps(3000);
|
DataRate max_rate = DataRate::kbps(3000);
|
||||||
DataRate start_rate = DataRate::kbps(300);
|
DataRate start_rate = DataRate::kbps(300);
|
||||||
|
DataRate max_padding_rate = DataRate::Zero();
|
||||||
} rates;
|
} rates;
|
||||||
enum CongestionController { kBbr, kGoogCc, kGoogCcFeedback } cc = kGoogCc;
|
enum CongestionController { kBbr, kGoogCc, kGoogCcFeedback } cc = kGoogCc;
|
||||||
TimeDelta state_log_interval = TimeDelta::ms(100);
|
TimeDelta state_log_interval = TimeDelta::ms(100);
|
||||||
|
@ -264,6 +264,8 @@ SimulatedTimeClient::SimulatedTimeClient(
|
|||||||
current_contraints_.max_data_rate = config.transport.rates.max_rate;
|
current_contraints_.max_data_rate = config.transport.rates.max_rate;
|
||||||
NetworkControllerConfig initial_config;
|
NetworkControllerConfig initial_config;
|
||||||
initial_config.constraints = current_contraints_;
|
initial_config.constraints = current_contraints_;
|
||||||
|
initial_config.stream_based_config.max_padding_rate =
|
||||||
|
config.transport.rates.max_padding_rate;
|
||||||
congestion_controller_ = network_controller_factory_.Create(initial_config);
|
congestion_controller_ = network_controller_factory_.Create(initial_config);
|
||||||
for (auto& stream_config : stream_configs)
|
for (auto& stream_config : stream_configs)
|
||||||
packet_streams_.emplace_back(new PacketStream(stream_config));
|
packet_streams_.emplace_back(new PacketStream(stream_config));
|
||||||
@ -364,5 +366,9 @@ double SimulatedTimeClient::target_rate_kbps() const {
|
|||||||
return target_rate_.kbps<double>();
|
return target_rate_.kbps<double>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DataRate SimulatedTimeClient::padding_rate() const {
|
||||||
|
return sender_.pacer_config_.pad_rate();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
@ -139,6 +139,7 @@ class SimulatedTimeClient : NetworkReceiverInterface {
|
|||||||
TimeDelta GetNetworkControllerProcessInterval() const;
|
TimeDelta GetNetworkControllerProcessInterval() const;
|
||||||
double target_rate_kbps() const;
|
double target_rate_kbps() const;
|
||||||
DataRate link_capacity() const;
|
DataRate link_capacity() const;
|
||||||
|
DataRate padding_rate() const;
|
||||||
|
|
||||||
bool TryDeliverPacket(rtc::CopyOnWriteBuffer packet,
|
bool TryDeliverPacket(rtc::CopyOnWriteBuffer packet,
|
||||||
uint64_t receiver,
|
uint64_t receiver,
|
||||||
|
Reference in New Issue
Block a user