diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc index 9e8117f9ce..c86e667185 100644 --- a/call/rtp_transport_controller_send.cc +++ b/call/rtp_transport_controller_send.cc @@ -670,15 +670,18 @@ void RtpTransportControllerSend::OnReceivedRtcpReceiverReportBlocks( // Compute the packet loss from all report blocks. for (const RTCPReportBlock& report_block : report_blocks) { - auto it = last_report_blocks_.find(report_block.source_ssrc); - if (it != last_report_blocks_.end()) { - auto number_of_packets = report_block.extended_highest_sequence_number - - it->second.extended_highest_sequence_number; - total_packets_delta += number_of_packets; - auto lost_delta = report_block.packets_lost - it->second.packets_lost; - total_packets_lost_delta += lost_delta; + auto [it, inserted] = + last_report_blocks_.try_emplace(report_block.source_ssrc); + LossReport& last_loss_report = it->second; + if (!inserted) { + total_packets_delta += report_block.extended_highest_sequence_number - + last_loss_report.extended_highest_sequence_number; + total_packets_lost_delta += + report_block.packets_lost - last_loss_report.cumulative_lost; } - last_report_blocks_[report_block.source_ssrc] = report_block; + last_loss_report.extended_highest_sequence_number = + report_block.extended_highest_sequence_number; + last_loss_report.cumulative_lost = report_block.packets_lost; } // Can only compute delta if there has been previous blocks to compare to. If // not, total_packets_delta will be unchanged and there's nothing more to do. diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h index b5134a523e..4d6f6e68a9 100644 --- a/call/rtp_transport_controller_send.h +++ b/call/rtp_transport_controller_send.h @@ -179,7 +179,11 @@ class RtpTransportControllerSend final TimeDelta process_interval_ RTC_GUARDED_BY(sequence_checker_); - std::map last_report_blocks_ + struct LossReport { + uint32_t extended_highest_sequence_number = 0; + int cumulative_lost = 0; + }; + std::map last_report_blocks_ RTC_GUARDED_BY(sequence_checker_); Timestamp last_report_block_time_ RTC_GUARDED_BY(sequence_checker_);