Set default for field value "WebRTC-Bwe-ProbingBehavior/min_probe_delta:2ms"
And add a unit test that verifies that next probe time is set at is the expected if the recommended probe size is used. Bug: webrtc:14392 Change-Id: I239bb3a1c8eefc85509aacc82037c64e3ce49ed7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272648 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Per Kjellander <perkj@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37901}
This commit is contained in:
parent
263acfeb4b
commit
ffd99aa069
@ -34,7 +34,7 @@ constexpr TimeDelta kProbeClusterTimeout = TimeDelta::Seconds(5);
|
|||||||
|
|
||||||
BitrateProberConfig::BitrateProberConfig(
|
BitrateProberConfig::BitrateProberConfig(
|
||||||
const FieldTrialsView* key_value_config)
|
const FieldTrialsView* key_value_config)
|
||||||
: min_probe_delta("min_probe_delta", TimeDelta::Millis(1)),
|
: min_probe_delta("min_probe_delta", TimeDelta::Millis(2)),
|
||||||
max_probe_delay("max_probe_delay", TimeDelta::Millis(10)) {
|
max_probe_delay("max_probe_delay", TimeDelta::Millis(10)) {
|
||||||
ParseFieldTrial({&min_probe_delta, &max_probe_delay},
|
ParseFieldTrial({&min_probe_delta, &max_probe_delay},
|
||||||
key_value_config->Lookup("WebRTC-Bwe-ProbingBehavior"));
|
key_value_config->Lookup("WebRTC-Bwe-ProbingBehavior"));
|
||||||
@ -107,6 +107,7 @@ void BitrateProber::CreateProbeCluster(
|
|||||||
<< cluster.pace_info.send_bitrate_bps << ":"
|
<< cluster.pace_info.send_bitrate_bps << ":"
|
||||||
<< cluster.pace_info.probe_cluster_min_bytes << ":"
|
<< cluster.pace_info.probe_cluster_min_bytes << ":"
|
||||||
<< cluster.pace_info.probe_cluster_min_probes << ")";
|
<< cluster.pace_info.probe_cluster_min_probes << ")";
|
||||||
|
|
||||||
// If we are already probing, continue to do so. Otherwise set it to
|
// If we are already probing, continue to do so. Otherwise set it to
|
||||||
// kInactive and wait for OnIncomingPacket to start the probing.
|
// kInactive and wait for OnIncomingPacket to start the probing.
|
||||||
if (probing_state_ != ProbingState::kActive)
|
if (probing_state_ != ProbingState::kActive)
|
||||||
@ -145,16 +146,13 @@ absl::optional<PacedPacketInfo> BitrateProber::CurrentCluster(Timestamp now) {
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Probe size is recommended based on the probe bitrate required. We choose
|
|
||||||
// a minimum of twice `kMinProbeDeltaMs` interval to allow scheduling to be
|
|
||||||
// feasible.
|
|
||||||
DataSize BitrateProber::RecommendedMinProbeSize() const {
|
DataSize BitrateProber::RecommendedMinProbeSize() const {
|
||||||
if (clusters_.empty()) {
|
if (clusters_.empty()) {
|
||||||
return DataSize::Zero();
|
return DataSize::Zero();
|
||||||
}
|
}
|
||||||
DataRate send_rate =
|
DataRate send_rate =
|
||||||
DataRate::BitsPerSec(clusters_.front().pace_info.send_bitrate_bps);
|
DataRate::BitsPerSec(clusters_.front().pace_info.send_bitrate_bps);
|
||||||
return 2 * send_rate * config_.min_probe_delta;
|
return send_rate * config_.min_probe_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitrateProber::ProbeSent(Timestamp now, DataSize size) {
|
void BitrateProber::ProbeSent(Timestamp now, DataSize size) {
|
||||||
@ -197,6 +195,7 @@ Timestamp BitrateProber::CalculateNextProbeTime(
|
|||||||
DataSize sent_bytes = DataSize::Bytes(cluster.sent_bytes);
|
DataSize sent_bytes = DataSize::Bytes(cluster.sent_bytes);
|
||||||
DataRate send_bitrate =
|
DataRate send_bitrate =
|
||||||
DataRate::BitsPerSec(cluster.pace_info.send_bitrate_bps);
|
DataRate::BitsPerSec(cluster.pace_info.send_bitrate_bps);
|
||||||
|
|
||||||
TimeDelta delta = sent_bytes / send_bitrate;
|
TimeDelta delta = sent_bytes / send_bitrate;
|
||||||
return cluster.started_at + delta;
|
return cluster.started_at + delta;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,7 +66,8 @@ class BitrateProber {
|
|||||||
absl::optional<PacedPacketInfo> CurrentCluster(Timestamp now);
|
absl::optional<PacedPacketInfo> CurrentCluster(Timestamp now);
|
||||||
|
|
||||||
// Returns the minimum number of bytes that the prober recommends for
|
// Returns the minimum number of bytes that the prober recommends for
|
||||||
// the next probe, or zero if not probing.
|
// the next probe, or zero if not probing. A probe can consist of multiple
|
||||||
|
// packets that are sent back to back.
|
||||||
DataSize RecommendedMinProbeSize() const;
|
DataSize RecommendedMinProbeSize() const;
|
||||||
|
|
||||||
// Called to report to the prober that a probe has been sent. In case of
|
// Called to report to the prober that a probe has been sent. In case of
|
||||||
|
|||||||
@ -170,6 +170,30 @@ TEST(BitrateProberTest, VerifyProbeSizeOnHighBitrate) {
|
|||||||
kHighBitrate * TimeDelta::Millis(1));
|
kHighBitrate * TimeDelta::Millis(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(BitrateProberTest, ProbeSizeCanBeSetWithFieldTrial) {
|
||||||
|
const test::ExplicitKeyValueConfig trials(
|
||||||
|
"WebRTC-Bwe-ProbingBehavior/min_probe_delta:20ms/");
|
||||||
|
BitrateProber prober(trials);
|
||||||
|
prober.SetEnabled(true);
|
||||||
|
|
||||||
|
const DataRate kHighBitrate = DataRate::KilobitsPerSec(10000); // 10 Mbps
|
||||||
|
|
||||||
|
prober.CreateProbeCluster({.at_time = Timestamp::Zero(),
|
||||||
|
.target_data_rate = kHighBitrate,
|
||||||
|
.target_duration = TimeDelta::Millis(15),
|
||||||
|
.target_probe_count = 5,
|
||||||
|
.id = 0});
|
||||||
|
EXPECT_EQ(prober.RecommendedMinProbeSize(),
|
||||||
|
kHighBitrate * TimeDelta::Millis(20));
|
||||||
|
|
||||||
|
prober.OnIncomingPacket(DataSize::Bytes(1000));
|
||||||
|
// Next time to send probe should be "min_probe_delta" if the recommended
|
||||||
|
// number of bytes has been sent.
|
||||||
|
prober.ProbeSent(Timestamp::Zero(), prober.RecommendedMinProbeSize());
|
||||||
|
EXPECT_EQ(prober.NextProbeTime(Timestamp::Zero()),
|
||||||
|
Timestamp::Zero() + TimeDelta::Millis(20));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(BitrateProberTest, MinumumNumberOfProbingPackets) {
|
TEST(BitrateProberTest, MinumumNumberOfProbingPackets) {
|
||||||
const FieldTrialBasedConfig config;
|
const FieldTrialBasedConfig config;
|
||||||
BitrateProber prober(config);
|
BitrateProber prober(config);
|
||||||
|
|||||||
@ -459,9 +459,9 @@ TEST(TaskQueuePacedSenderTest, SchedulesProbeAtSentTime) {
|
|||||||
|
|
||||||
TEST(TaskQueuePacedSenderTest, NoMinSleepTimeWhenProbing) {
|
TEST(TaskQueuePacedSenderTest, NoMinSleepTimeWhenProbing) {
|
||||||
// Set min_probe_delta to be less than kMinSleepTime (1ms).
|
// Set min_probe_delta to be less than kMinSleepTime (1ms).
|
||||||
const TimeDelta kMinProbeDelta = TimeDelta::Micros(100);
|
const TimeDelta kMinProbeDelta = TimeDelta::Micros(200);
|
||||||
ScopedKeyValueConfig trials(
|
ScopedKeyValueConfig trials(
|
||||||
"WebRTC-Bwe-ProbingBehavior/min_probe_delta:100us/");
|
"WebRTC-Bwe-ProbingBehavior/min_probe_delta:200us/");
|
||||||
GlobalSimulatedTimeController time_controller(Timestamp::Millis(1234));
|
GlobalSimulatedTimeController time_controller(Timestamp::Millis(1234));
|
||||||
MockPacketRouter packet_router;
|
MockPacketRouter packet_router;
|
||||||
TaskQueuePacedSender pacer(time_controller.GetClock(), &packet_router, trials,
|
TaskQueuePacedSender pacer(time_controller.GetClock(), &packet_router, trials,
|
||||||
@ -495,7 +495,7 @@ TEST(TaskQueuePacedSenderTest, NoMinSleepTimeWhenProbing) {
|
|||||||
|
|
||||||
// Advance time less than PacingController::kMinSleepTime, probing packets
|
// Advance time less than PacingController::kMinSleepTime, probing packets
|
||||||
// for the first millisecond should be sent immediately. Min delta between
|
// for the first millisecond should be sent immediately. Min delta between
|
||||||
// probes is 2x 100us, meaning 4 times per ms we will get least one call to
|
// probes is 200us, meaning 4 times per ms we will get least one call to
|
||||||
// SendPacket().
|
// SendPacket().
|
||||||
DataSize data_sent = DataSize::Zero();
|
DataSize data_sent = DataSize::Zero();
|
||||||
EXPECT_CALL(packet_router,
|
EXPECT_CALL(packet_router,
|
||||||
@ -515,7 +515,7 @@ TEST(TaskQueuePacedSenderTest, NoMinSleepTimeWhenProbing) {
|
|||||||
// Verify the amount of probing data sent.
|
// Verify the amount of probing data sent.
|
||||||
// Probe always starts with a small (1 byte) padding packet that's not
|
// Probe always starts with a small (1 byte) padding packet that's not
|
||||||
// counted into the probe rate here.
|
// counted into the probe rate here.
|
||||||
const DataSize kMinProbeSize = 2 * kMinProbeDelta * kProbingRate;
|
const DataSize kMinProbeSize = kMinProbeDelta * kProbingRate;
|
||||||
EXPECT_EQ(data_sent, DataSize::Bytes(1) + kPacketSize + 4 * kMinProbeSize);
|
EXPECT_EQ(data_sent, DataSize::Bytes(1) + kPacketSize + 4 * kMinProbeSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user