Fix perf issue when timinig out receiver infos in RTCP.

BUG=b/33270241

Review-Url: https://codereview.webrtc.org/2664163002
Cr-Commit-Position: refs/heads/master@{#16414}
This commit is contained in:
stefan 2017-02-02 03:57:02 -08:00 committed by Commit bot
parent cc99bc25d8
commit b33eed2e42
3 changed files with 20 additions and 21 deletions

View File

@ -145,11 +145,7 @@ bool RTCPReceiver::IncomingPacket(const uint8_t* packet, size_t packet_size) {
int64_t RTCPReceiver::LastReceivedReceiverReport() const {
rtc::CritScope lock(&rtcp_receiver_lock_);
int64_t last_received_rr = -1;
for (const auto& kv : received_infos_)
if (kv.second.last_time_received_ms > last_received_rr)
last_received_rr = kv.second.last_time_received_ms;
return last_received_rr;
return last_received_rr_ms_;
}
void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) {
@ -445,6 +441,8 @@ void RTCPReceiver::HandleReceiverReport(const CommonHeader& rtcp_block,
return;
}
last_received_rr_ms_ = clock_->TimeInMilliseconds();
const uint32_t remote_ssrc = receiver_report.sender_ssrc();
packet_information->remote_ssrc = remote_ssrc;
@ -478,8 +476,6 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block,
ReportBlockWithRtt* report_block_info =
&received_report_blocks_[report_block.source_ssrc()][remote_ssrc];
last_received_rr_ms_ = clock_->TimeInMilliseconds();
report_block_info->report_block.remoteSSRC = remote_ssrc;
report_block_info->report_block.sourceSSRC = report_block.source_ssrc();
report_block_info->report_block.fractionLost = report_block.fraction_lost();
@ -489,7 +485,7 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block,
report_block_info->report_block.extendedHighSeqNum) {
// We have successfully delivered new RTP packets to the remote side after
// the last RR was sent from the remote side.
last_increased_sequence_number_ms_ = last_received_rr_ms_;
last_increased_sequence_number_ms_ = clock_->TimeInMilliseconds();
}
report_block_info->report_block.extendedHighSeqNum =
report_block.extended_high_seq_num();
@ -579,22 +575,30 @@ bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) {
bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() {
rtc::CritScope lock(&rtcp_receiver_lock_);
bool update_bounding_set = false;
int64_t now_ms = clock_->TimeInMilliseconds();
// Use audio define since we don't know what interval the remote peer use.
int64_t timeouted_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
int64_t timeout_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
if (oldest_received_info_ms_ >= timeout_ms)
return false;
bool update_bounding_set = false;
oldest_received_info_ms_ = -1;
for (auto receive_info_it = received_infos_.begin();
receive_info_it != received_infos_.end();) {
ReceiveInformation* receive_info = &receive_info_it->second;
if (receive_info->last_time_received_ms > 0) {
if (receive_info->last_time_received_ms < timeouted_ms) {
if (receive_info->last_time_received_ms < timeout_ms) {
// No rtcp packet for the last 5 regular intervals, reset limitations.
receive_info->tmmbr.clear();
// Prevent that we call this over and over again.
receive_info->last_time_received_ms = 0;
// Send new TMMBN to all channels using the default codec.
update_bounding_set = true;
} else if (oldest_received_info_ms_ == -1 ||
receive_info->last_time_received_ms <
oldest_received_info_ms_) {
oldest_received_info_ms_ = receive_info->last_time_received_ms;
}
++receive_info_it;
} else if (receive_info->ready_for_delete) {
@ -1070,11 +1074,11 @@ std::vector<rtcp::TmmbItem> RTCPReceiver::TmmbrReceived() {
int64_t now_ms = clock_->TimeInMilliseconds();
// Use audio define since we don't know what interval the remote peer use.
int64_t timeouted_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
int64_t timeout_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
for (auto& kv : received_infos_) {
for (auto it = kv.second.tmmbr.begin(); it != kv.second.tmmbr.end();) {
if (it->second.last_updated_ms < timeouted_ms) {
if (it->second.last_updated_ms < timeout_ms) {
// Erase timeout entries.
it = kv.second.tmmbr.erase(it);
} else {

View File

@ -244,11 +244,12 @@ class RTCPReceiver {
// Received report blocks.
ReportBlockMap received_report_blocks_ GUARDED_BY(rtcp_receiver_lock_);
ReceivedInfoMap received_infos_ GUARDED_BY(rtcp_receiver_lock_);
int64_t oldest_received_info_ms_ GUARDED_BY(rtcp_receiver_lock_);
std::map<uint32_t, std::string> received_cnames_
GUARDED_BY(rtcp_receiver_lock_);
// The last time we received an RTCP RR.
int64_t last_received_rr_ms_;
int64_t last_received_rr_ms_ GUARDED_BY(rtcp_receiver_lock_);
// The time we last received an RTCP RR telling we have successfully
// delivered RTP packet to the remote side.

View File

@ -211,7 +211,7 @@ void ModuleRtpRtcpImpl::Process() {
if (rtcp_sender_.TimeToSendRTCPReport())
rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
if (UpdateRTCPReceiveInformationTimers()) {
if (TMMBR() && rtcp_receiver_.UpdateRTCPReceiveInformationTimers()) {
// A receiver has timed out.
rtcp_receiver_.UpdateTmmbr();
}
@ -867,12 +867,6 @@ bool ModuleRtpRtcpImpl::LastReceivedNTP(
return true;
}
bool ModuleRtpRtcpImpl::UpdateRTCPReceiveInformationTimers() {
// If this returns true this channel has timed out.
// Periodically check if this is true and if so call UpdateTMMBR.
return rtcp_receiver_.UpdateRTCPReceiveInformationTimers();
}
// Called from RTCPsender.
std::vector<rtcp::TmmbItem> ModuleRtpRtcpImpl::BoundingSet(bool* tmmbr_owner) {
return rtcp_receiver_.BoundingSet(tmmbr_owner);