| Index: webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| index 51c4aa86944dedbd24e526227a6e0e7430296b3d..59049be01f1b3c2de4473fa073742a0876940142 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc
|
| @@ -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 {
|
|
|