Check input parameter in RemoteEstimatorProxy::IncomingPacket without lock

Also inlined RemoteEstimatorProxy::OnPacketArrival

BUG=NONE

Change-Id: I61c94eafb41ea269baeeb0ef13add79672a1488d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151909
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29109}
This commit is contained in:
Per Kjellander 2019-09-09 10:31:21 +02:00 committed by Commit Bot
parent ee3d995091
commit f7cb16ff51
2 changed files with 48 additions and 59 deletions

View file

@ -57,10 +57,55 @@ void RemoteEstimatorProxy::IncomingPacket(int64_t arrival_time_ms,
"is missing the transport sequence number extension!"; "is missing the transport sequence number extension!";
return; return;
} }
if (arrival_time_ms < 0 || arrival_time_ms > kMaxTimeMs) {
RTC_LOG(LS_WARNING) << "Arrival time out of bounds: " << arrival_time_ms;
return;
}
rtc::CritScope cs(&lock_); rtc::CritScope cs(&lock_);
media_ssrc_ = header.ssrc; media_ssrc_ = header.ssrc;
OnPacketArrival(header.extension.transportSequenceNumber, arrival_time_ms,
header.extension.feedback_request); int64_t seq = unwrapper_.Unwrap(header.extension.transportSequenceNumber);
if (send_periodic_feedback_) {
if (periodic_window_start_seq_ &&
packet_arrival_times_.lower_bound(*periodic_window_start_seq_) ==
packet_arrival_times_.end()) {
// Start new feedback packet, cull old packets.
for (auto it = packet_arrival_times_.begin();
it != packet_arrival_times_.end() && it->first < seq &&
arrival_time_ms - it->second >= send_config_.back_window->ms();) {
it = packet_arrival_times_.erase(it);
}
}
if (!periodic_window_start_seq_ || seq < *periodic_window_start_seq_) {
periodic_window_start_seq_ = seq;
}
}
// We are only interested in the first time a packet is received.
if (packet_arrival_times_.find(seq) != packet_arrival_times_.end())
return;
packet_arrival_times_[seq] = arrival_time_ms;
// Limit the range of sequence numbers to send feedback for.
auto first_arrival_time_to_keep = packet_arrival_times_.lower_bound(
packet_arrival_times_.rbegin()->first - kMaxNumberOfPackets);
if (first_arrival_time_to_keep != packet_arrival_times_.begin()) {
packet_arrival_times_.erase(packet_arrival_times_.begin(),
first_arrival_time_to_keep);
if (send_periodic_feedback_) {
// |packet_arrival_times_| cannot be empty since we just added one element
// and the last element is not deleted.
RTC_DCHECK(!packet_arrival_times_.empty());
periodic_window_start_seq_ = packet_arrival_times_.begin()->first;
}
}
if (header.extension.feedback_request) {
// Send feedback packet immediately.
SendFeedbackOnRequest(seq, header.extension.feedback_request.value());
}
} }
bool RemoteEstimatorProxy::LatestEstimate(std::vector<unsigned int>* ssrcs, bool RemoteEstimatorProxy::LatestEstimate(std::vector<unsigned int>* ssrcs,
@ -117,59 +162,6 @@ void RemoteEstimatorProxy::SetSendPeriodicFeedback(
send_periodic_feedback_ = send_periodic_feedback; send_periodic_feedback_ = send_periodic_feedback;
} }
void RemoteEstimatorProxy::OnPacketArrival(
uint16_t sequence_number,
int64_t arrival_time,
absl::optional<FeedbackRequest> feedback_request) {
if (arrival_time < 0 || arrival_time > kMaxTimeMs) {
RTC_LOG(LS_WARNING) << "Arrival time out of bounds: " << arrival_time;
return;
}
int64_t seq = unwrapper_.Unwrap(sequence_number);
if (send_periodic_feedback_) {
if (periodic_window_start_seq_ &&
packet_arrival_times_.lower_bound(*periodic_window_start_seq_) ==
packet_arrival_times_.end()) {
// Start new feedback packet, cull old packets.
for (auto it = packet_arrival_times_.begin();
it != packet_arrival_times_.end() && it->first < seq &&
arrival_time - it->second >= send_config_.back_window->ms();) {
it = packet_arrival_times_.erase(it);
}
}
if (!periodic_window_start_seq_ || seq < *periodic_window_start_seq_) {
periodic_window_start_seq_ = seq;
}
}
// We are only interested in the first time a packet is received.
if (packet_arrival_times_.find(seq) != packet_arrival_times_.end())
return;
packet_arrival_times_[seq] = arrival_time;
// Limit the range of sequence numbers to send feedback for.
auto first_arrival_time_to_keep = packet_arrival_times_.lower_bound(
packet_arrival_times_.rbegin()->first - kMaxNumberOfPackets);
if (first_arrival_time_to_keep != packet_arrival_times_.begin()) {
packet_arrival_times_.erase(packet_arrival_times_.begin(),
first_arrival_time_to_keep);
if (send_periodic_feedback_) {
// |packet_arrival_times_| cannot be empty since we just added one element
// and the last element is not deleted.
RTC_DCHECK(!packet_arrival_times_.empty());
periodic_window_start_seq_ = packet_arrival_times_.begin()->first;
}
}
if (feedback_request) {
// Send feedback packet immediately.
SendFeedbackOnRequest(seq, *feedback_request);
}
}
void RemoteEstimatorProxy::SendPeriodicFeedbacks() { void RemoteEstimatorProxy::SendPeriodicFeedbacks() {
// |periodic_window_start_seq_| is the first sequence number to include in the // |periodic_window_start_seq_| is the first sequence number to include in the
// current feedback packet. Some older may still be in the map, in case a // current feedback packet. Some older may still be in the map, in case a

View file

@ -69,10 +69,7 @@ class RemoteEstimatorProxy : public RemoteBitrateEstimator {
}; };
static const int kMaxNumberOfPackets; static const int kMaxNumberOfPackets;
void OnPacketArrival(uint16_t sequence_number,
int64_t arrival_time,
absl::optional<FeedbackRequest> feedback_request)
RTC_EXCLUSIVE_LOCKS_REQUIRED(&lock_);
void SendPeriodicFeedbacks() RTC_EXCLUSIVE_LOCKS_REQUIRED(&lock_); void SendPeriodicFeedbacks() RTC_EXCLUSIVE_LOCKS_REQUIRED(&lock_);
void SendFeedbackOnRequest(int64_t sequence_number, void SendFeedbackOnRequest(int64_t sequence_number,
const FeedbackRequest& feedback_request) const FeedbackRequest& feedback_request)