Perform probing on network route change.

BUG=webrtc:7208

Review-Url: https://codereview.webrtc.org/2714503002
Cr-Commit-Position: refs/heads/master@{#17096}
This commit is contained in:
philipel 2017-03-07 06:30:59 -08:00 committed by Commit bot
parent f89a738626
commit cb9ba301f0
7 changed files with 68 additions and 13 deletions

View File

@ -230,10 +230,14 @@ void CongestionController::ResetBweAndBitrates(int bitrate_bps,
// no longer exposed outside CongestionController.
remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
transport_feedback_adapter_.ClearSendTimeHistory();
transport_feedback_adapter_.InitBwe();
transport_feedback_adapter_.SetStartBitrate(bitrate_bps);
transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps);
// TODO(holmer): Trigger a new probe once mid-call probing is implemented.
probe_controller_->Reset();
probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps);
MaybeTriggerOnNetworkChanged();
}

View File

@ -59,6 +59,8 @@ class CongestionControllerTest : public ::testing::Test {
// to be updated.
EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps, _, _, _));
EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps));
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 3));
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 5));
controller_->SetBweBitrates(0, kInitialBitrateBps, 5 * kInitialBitrateBps);
}
@ -143,6 +145,7 @@ TEST_F(CongestionControllerTest, SignalNetworkState) {
TEST_F(CongestionControllerTest, ResetBweAndBitrates) {
int new_bitrate = 200000;
testing::Mock::VerifyAndClearExpectations(pacer_);
EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _));
EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate));
controller_->ResetBweAndBitrates(new_bitrate, -1, -1);
@ -240,5 +243,15 @@ TEST_F(CongestionControllerTest, OnReceivedPacketWithAbsSendTime) {
ASSERT_EQ(1u, ssrcs.size());
EXPECT_EQ(header.ssrc, ssrcs[0]);
}
TEST_F(CongestionControllerTest, ProbeOnBweReset) {
testing::Mock::VerifyAndClearExpectations(pacer_);
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 6));
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 12));
EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));
controller_->ResetBweAndBitrates(2 * kInitialBitrateBps, 0,
20 * kInitialBitrateBps);
}
} // namespace test
} // namespace webrtc

View File

@ -48,18 +48,9 @@ constexpr int kRepeatedProbeMinPercentage = 70;
} // namespace
ProbeController::ProbeController(PacedSender* pacer, Clock* clock)
: pacer_(pacer),
clock_(clock),
network_state_(kNetworkUp),
state_(State::kInit),
min_bitrate_to_probe_further_bps_(kExponentialProbingDisabled),
time_last_probing_initiated_ms_(0),
estimated_bitrate_bps_(0),
start_bitrate_bps_(0),
max_bitrate_bps_(0),
last_alr_probing_time_(clock_->TimeInMilliseconds()),
enable_periodic_alr_probing_(false),
mid_call_probing_waiting_for_result_(false) {}
: pacer_(pacer), clock_(clock), enable_periodic_alr_probing_(false) {
Reset();
}
void ProbeController::SetBitrates(int64_t min_bitrate_bps,
int64_t start_bitrate_bps,
@ -186,6 +177,19 @@ void ProbeController::EnablePeriodicAlrProbing(bool enable) {
enable_periodic_alr_probing_ = enable;
}
void ProbeController::Reset() {
rtc::CritScope cs(&critsect_);
network_state_ = kNetworkUp;
state_ = State::kInit;
min_bitrate_to_probe_further_bps_ = kExponentialProbingDisabled;
time_last_probing_initiated_ms_ = 0;
estimated_bitrate_bps_ = 0;
start_bitrate_bps_ = 0;
max_bitrate_bps_ = 0;
last_alr_probing_time_ = clock_->TimeInMilliseconds();
mid_call_probing_waiting_for_result_ = false;
}
void ProbeController::Process() {
rtc::CritScope cs(&critsect_);

View File

@ -37,6 +37,11 @@ class ProbeController {
void SetEstimatedBitrate(int64_t bitrate_bps);
void EnablePeriodicAlrProbing(bool enable);
// Resets the ProbeController to a state equivalent to as if it was just
// created EXCEPT for |enable_periodic_alr_probing_|.
void Reset();
void Process();
private:

View File

@ -99,6 +99,11 @@ int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const {
return delay_based_bwe_->GetProbingIntervalMs();
}
void TransportFeedbackAdapter::ClearSendTimeHistory() {
rtc::CritScope cs(&lock_);
send_time_history_.Clear();
}
std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector(
const rtcp::TransportFeedback& feedback) {
int64_t timestamp_us = feedback.GetBaseTimeUs();

View File

@ -57,6 +57,8 @@ class TransportFeedbackAdapter : public TransportFeedbackObserver,
int64_t GetProbingIntervalMs() const;
void ClearSendTimeHistory();
private:
std::vector<PacketFeedback> GetPacketFeedbackVector(
const rtcp::TransportFeedback& feedback);

View File

@ -213,5 +213,27 @@ TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) {
EXPECT_EQ(packets[2], packet3);
}
TEST_F(SendTimeHistoryTest, Clear) {
const uint16_t kSeqNo = 1;
const int64_t kTimestamp = 2;
const PacedPacketInfo kPacingInfo(0, 5, 1200);
PacketFeedback packets[] = {{0, kTimestamp, kSeqNo, 0, kPacingInfo},
{0, kTimestamp + 1, kSeqNo + 1, 0, kPacingInfo}};
AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size,
packets[0].send_time_ms, kPacingInfo);
AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size,
packets[1].send_time_ms, kPacingInfo);
PacketFeedback info(0, 0, packets[0].sequence_number, 0, kPacingInfo);
EXPECT_TRUE(history_.GetFeedback(&info, true));
EXPECT_EQ(packets[0], info);
history_.Clear();
PacketFeedback info2(0, 0, packets[1].sequence_number, 0, kPacingInfo);
EXPECT_FALSE(history_.GetFeedback(&info2, true));
}
} // namespace test
} // namespace webrtc