Avoid busy looping in case of send failure while probing.

BUG=webrtc:7255

Review-Url: https://codereview.webrtc.org/2719183004
Cr-Commit-Position: refs/heads/master@{#16908}
This commit is contained in:
philipel 2017-02-28 07:05:23 -08:00 committed by Commit bot
parent 13f54b2c56
commit b61927c687
3 changed files with 35 additions and 3 deletions

View File

@ -255,6 +255,7 @@ PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender)
media_budget_(new paced_sender::IntervalBudget(0)),
padding_budget_(new paced_sender::IntervalBudget(0)),
prober_(new BitrateProber()),
probing_send_failure_(false),
estimated_bitrate_bps_(0),
min_send_bitrate_kbps_(0u),
max_padding_bitrate_kbps_(0u),
@ -374,7 +375,7 @@ int64_t PacedSender::TimeUntilNextProcess() {
CriticalSectionScoped cs(critsect_.get());
if (prober_->IsProbing()) {
int64_t ret = prober_->TimeUntilNextProbe(clock_->TimeInMilliseconds());
if (ret >= 0)
if (ret > 0 || (ret == 0 && !probing_send_failure_))
return ret;
}
int64_t elapsed_time_us = clock_->TimeInMicroseconds() - time_last_update_us_;
@ -448,8 +449,11 @@ void PacedSender::Process() {
bytes_sent += SendPadding(padding_needed, pacing_info);
}
}
if (is_probing && bytes_sent > 0)
prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent);
if (is_probing) {
probing_send_failure_ = bytes_sent == 0;
if (!probing_send_failure_)
prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent);
}
alr_detector_->OnBytesSent(bytes_sent, now_us / 1000);
}

View File

@ -169,6 +169,7 @@ class PacedSender : public Module, public RtpPacketSender {
GUARDED_BY(critsect_);
std::unique_ptr<BitrateProber> prober_ GUARDED_BY(critsect_);
bool probing_send_failure_;
// Actual configured bitrates (media_budget_ may temporarily be higher in
// order to meet pace time constraint).
uint32_t estimated_bitrate_bps_ GUARDED_BY(critsect_);

View File

@ -1046,5 +1046,32 @@ TEST_F(PacedSenderTest, ProbeClusterId) {
send_bucket_->Process();
}
TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
send_bucket_->SetProbingEnabled(true);
send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
sequence_number, clock_.TimeInMilliseconds(),
kPacketSize, false);
EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
.WillOnce(Return(true));
send_bucket_->Process();
EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
clock_.AdvanceTimeMilliseconds(9);
EXPECT_CALL(callback_, TimeToSendPadding(_, _))
.Times(2)
.WillRepeatedly(Return(0));
send_bucket_->Process();
EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
clock_.AdvanceTimeMilliseconds(1);
send_bucket_->Process();
EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
}
} // namespace test
} // namespace webrtc