Chromium Code Reviews| 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 51bffb6563a2b503aa162ae6e4fd891201ff7d84..68ba1b0fa16badcd81a181e9ac7adf93519d359d 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
| @@ -49,7 +49,6 @@ namespace { |
| using rtcp::CommonHeader; |
| using rtcp::ReportBlock; |
| -using RTCPHelp::RTCPReportBlockInformation; |
| // The number of RTCP time intervals needed to trigger a timeout. |
| const int kRrTimeoutIntervals = 3; |
| @@ -88,6 +87,16 @@ struct RTCPReceiver::ReceiveInformation { |
| std::map<uint32_t, TimedTmmbrItem> tmmbr; |
| }; |
| +struct RTCPReceiver::ReportBlockInformation { |
|
philipel
2016/10/03 12:33:17
WDYT about |AggregatedRttInfo| instead of |ReportB
danilchap
2016/10/03 16:10:12
The structure still hold the ReportBlock itself.
(
|
| + RTCPReportBlock remote_receive_block; |
| + |
| + int64_t last_rtt_ms = 0; |
| + int64_t min_rtt_ms = 0; |
| + int64_t max_rtt_ms = 0; |
| + int64_t sum_rtt_ms = 0; |
| + size_t num_rtts = 0; |
| +}; |
| + |
| RTCPReceiver::RTCPReceiver( |
| Clock* clock, |
| bool receiver_only, |
| @@ -120,17 +129,7 @@ RTCPReceiver::RTCPReceiver( |
| memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); |
| } |
| -RTCPReceiver::~RTCPReceiver() { |
| - ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); |
| - for (; it != _receivedReportBlockMap.end(); ++it) { |
| - ReportBlockInfoMap* info_map = &(it->second); |
| - while (!info_map->empty()) { |
| - ReportBlockInfoMap::iterator it_info = info_map->begin(); |
| - delete it_info->second; |
| - info_map->erase(it_info); |
| - } |
| - } |
| -} |
| +RTCPReceiver::~RTCPReceiver() {} |
| bool RTCPReceiver::IncomingPacket(const uint8_t* packet, size_t packet_size) { |
| if (packet_size == 0) { |
| @@ -186,31 +185,38 @@ void RTCPReceiver::SetSsrcs(uint32_t main_ssrc, |
| } |
| } |
| -int32_t RTCPReceiver::RTT(uint32_t remoteSSRC, |
| - int64_t* RTT, |
| - int64_t* avgRTT, |
| - int64_t* minRTT, |
| - int64_t* maxRTT) const { |
| +int32_t RTCPReceiver::RTT(uint32_t remote_ssrc, |
| + int64_t* last_rtt_ms, |
| + int64_t* avg_rtt_ms, |
| + int64_t* min_rtt_ms, |
| + int64_t* max_rtt_ms) const { |
| rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
| - RTCPReportBlockInformation* reportBlock = |
| - GetReportBlockInformation(remoteSSRC, main_ssrc_); |
| + auto it = received_report_blocks_.find(main_ssrc_); |
| + if (it == received_report_blocks_.end()) |
| + return -1; |
| - if (reportBlock == NULL) { |
| + auto it_info = it->second.find(remote_ssrc); |
| + if (it_info == it->second.end()) |
| return -1; |
| - } |
| - if (RTT) { |
| - *RTT = reportBlock->RTT; |
| - } |
| - if (avgRTT) { |
| - *avgRTT = reportBlock->avgRTT; |
| - } |
| - if (minRTT) { |
| - *minRTT = reportBlock->minRTT; |
| - } |
| - if (maxRTT) { |
| - *maxRTT = reportBlock->maxRTT; |
| - } |
| + |
| + const ReportBlockInformation* report_block = &it_info->second; |
| + |
| + if (report_block->num_rtts == 0) |
| + return -1; |
| + |
| + if (last_rtt_ms) |
| + *last_rtt_ms = report_block->last_rtt_ms; |
| + |
| + if (avg_rtt_ms) |
| + *avg_rtt_ms = report_block->sum_rtt_ms / report_block->num_rtts; |
| + |
| + if (min_rtt_ms) |
| + *min_rtt_ms = report_block->min_rtt_ms; |
| + |
| + if (max_rtt_ms) |
| + *max_rtt_ms = report_block->max_rtt_ms; |
| + |
| return 0; |
| } |
| @@ -292,20 +298,14 @@ int32_t RTCPReceiver::SenderInfoReceived(RTCPSenderInfo* senderInfo) const { |
| return 0; |
| } |
| -// statistics |
| -// we can get multiple receive reports when we receive the report from a CE |
| +// We can get multiple receive reports when we receive the report from a CE. |
| int32_t RTCPReceiver::StatisticsReceived( |
| - std::vector<RTCPReportBlock>* receiveBlocks) const { |
| - assert(receiveBlocks); |
| + std::vector<RTCPReportBlock>* receive_blocks) const { |
| + RTC_DCHECK(receive_blocks); |
| rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
| - ReportBlockMap::const_iterator it = _receivedReportBlockMap.begin(); |
| - for (; it != _receivedReportBlockMap.end(); ++it) { |
| - const ReportBlockInfoMap* info_map = &(it->second); |
| - ReportBlockInfoMap::const_iterator it_info = info_map->begin(); |
| - for (; it_info != info_map->end(); ++it_info) { |
| - receiveBlocks->push_back(it_info->second->remoteReceiveBlock); |
| - } |
| - } |
| + for (const auto& reports_per_receiver : received_report_blocks_) |
| + for (const auto& report : reports_per_receiver.second) |
| + receive_blocks->push_back(report.second.remote_receive_block); |
| return 0; |
| } |
| @@ -481,51 +481,45 @@ void RTCPReceiver::HandleReceiverReport(const CommonHeader& rtcp_block, |
| void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, |
| PacketInformation* packet_information, |
| - uint32_t remoteSSRC) { |
| + uint32_t remote_ssrc) { |
| // This will be called once per report block in the RTCP packet. |
| // We filter out all report blocks that are not for us. |
| // Each packet has max 31 RR blocks. |
| // |
| // We can calc RTT if we send a send report and get a report block back. |
| - // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to |
| + // |report_block.source_ssrc()| is the SSRC identifier of the source to |
| // which the information in this reception report block pertains. |
| // Filter out all report blocks that are not for us. |
| if (registered_ssrcs_.count(report_block.source_ssrc()) == 0) |
| return; |
| - RTCPReportBlockInformation* reportBlock = |
| - CreateOrGetReportBlockInformation(remoteSSRC, report_block.source_ssrc()); |
| - if (reportBlock == NULL) { |
| - LOG(LS_WARNING) << "Failed to CreateReportBlockInformation(" << remoteSSRC |
| - << ")"; |
| - return; |
| - } |
| + ReportBlockInformation* report_block_info = |
| + &received_report_blocks_[report_block.source_ssrc()][remote_ssrc]; |
| _lastReceivedRrMs = _clock->TimeInMilliseconds(); |
| - reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC; |
| - reportBlock->remoteReceiveBlock.sourceSSRC = report_block.source_ssrc(); |
| - reportBlock->remoteReceiveBlock.fractionLost = report_block.fraction_lost(); |
| - reportBlock->remoteReceiveBlock.cumulativeLost = |
| + report_block_info->remote_receive_block.remoteSSRC = remote_ssrc; |
| + report_block_info->remote_receive_block.sourceSSRC = |
| + report_block.source_ssrc(); |
| + report_block_info->remote_receive_block.fractionLost = |
| + report_block.fraction_lost(); |
| + report_block_info->remote_receive_block.cumulativeLost = |
| report_block.cumulative_lost(); |
| if (report_block.extended_high_seq_num() > |
| - reportBlock->remoteReceiveBlock.extendedHighSeqNum) { |
| + report_block_info->remote_receive_block.extendedHighSeqNum) { |
| // We have successfully delivered new RTP packets to the remote side after |
| // the last RR was sent from the remote side. |
| _lastIncreasedSequenceNumberMs = _lastReceivedRrMs; |
| } |
| - reportBlock->remoteReceiveBlock.extendedHighSeqNum = |
| + report_block_info->remote_receive_block.extendedHighSeqNum = |
| report_block.extended_high_seq_num(); |
| - reportBlock->remoteReceiveBlock.jitter = report_block.jitter(); |
| - reportBlock->remoteReceiveBlock.delaySinceLastSR = |
| + report_block_info->remote_receive_block.jitter = report_block.jitter(); |
| + report_block_info->remote_receive_block.delaySinceLastSR = |
| report_block.delay_since_last_sr(); |
| - reportBlock->remoteReceiveBlock.lastSR = report_block.last_sr(); |
| + report_block_info->remote_receive_block.lastSR = report_block.last_sr(); |
| - if (report_block.jitter() > reportBlock->remoteMaxJitter) |
| - reportBlock->remoteMaxJitter = report_block.jitter(); |
| - |
| - int64_t rtt = 0; |
| + int64_t rtt_ms = 0; |
| uint32_t send_time = report_block.last_sr(); |
| // RFC3550, section 6.4.1, LSR field discription states: |
| // If no SR has been received yet, the field is set to zero. |
| @@ -539,66 +533,25 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, |
| // RTT in 1/(2^16) seconds. |
| uint32_t rtt_ntp = receive_time - delay - send_time; |
| // Convert to 1/1000 seconds (milliseconds). |
| - rtt = CompactNtpRttToMs(rtt_ntp); |
| - if (rtt > reportBlock->maxRTT) { |
| - // Store max RTT. |
| - reportBlock->maxRTT = rtt; |
| - } |
| - if (reportBlock->minRTT == 0) { |
| - // First RTT. |
| - reportBlock->minRTT = rtt; |
| - } else if (rtt < reportBlock->minRTT) { |
| - // Store min RTT. |
| - reportBlock->minRTT = rtt; |
| - } |
| - // Store last RTT. |
| - reportBlock->RTT = rtt; |
| - |
| - // store average RTT |
| - if (reportBlock->numAverageCalcs != 0) { |
| - float ac = static_cast<float>(reportBlock->numAverageCalcs); |
| - float newAverage = |
| - ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * rtt); |
| - reportBlock->avgRTT = static_cast<int64_t>(newAverage + 0.5f); |
| - } else { |
| - // First RTT. |
| - reportBlock->avgRTT = rtt; |
| - } |
| - reportBlock->numAverageCalcs++; |
| - } |
| + rtt_ms = CompactNtpRttToMs(rtt_ntp); |
| + if (rtt_ms > report_block_info->max_rtt_ms) |
| + report_block_info->max_rtt_ms = rtt_ms; |
| - TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", |
| - report_block.source_ssrc(), rtt); |
| - |
| - packet_information->rtt_ms = rtt; |
| - packet_information->report_blocks.push_back(reportBlock->remoteReceiveBlock); |
| -} |
| + if (report_block_info->num_rtts == 0 || |
| + rtt_ms < report_block_info->min_rtt_ms) |
| + report_block_info->min_rtt_ms = rtt_ms; |
| -RTCPReportBlockInformation* RTCPReceiver::CreateOrGetReportBlockInformation( |
| - uint32_t remote_ssrc, |
| - uint32_t source_ssrc) { |
| - RTCPReportBlockInformation* info = |
| - GetReportBlockInformation(remote_ssrc, source_ssrc); |
| - if (info == NULL) { |
| - info = new RTCPReportBlockInformation; |
| - _receivedReportBlockMap[source_ssrc][remote_ssrc] = info; |
| + report_block_info->last_rtt_ms = rtt_ms; |
| + report_block_info->sum_rtt_ms += rtt_ms; |
| + ++report_block_info->num_rtts; |
| } |
| - return info; |
| -} |
| -RTCPReportBlockInformation* RTCPReceiver::GetReportBlockInformation( |
| - uint32_t remote_ssrc, |
| - uint32_t source_ssrc) const { |
| - ReportBlockMap::const_iterator it = _receivedReportBlockMap.find(source_ssrc); |
| - if (it == _receivedReportBlockMap.end()) { |
| - return NULL; |
| - } |
| - const ReportBlockInfoMap* info_map = &(it->second); |
| - ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); |
| - if (it_info == info_map->end()) { |
| - return NULL; |
| - } |
| - return it_info->second; |
| + TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", |
| + report_block.source_ssrc(), rtt_ms); |
| + |
| + packet_information->rtt_ms = rtt_ms; |
| + packet_information->report_blocks.push_back( |
| + report_block_info->remote_receive_block); |
| } |
| void RTCPReceiver::CreateReceiveInformation(uint32_t remote_ssrc) { |
| @@ -737,15 +690,8 @@ void RTCPReceiver::HandleBYE(const CommonHeader& rtcp_block) { |
| } |
| // clear our lists |
| - ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); |
| - for (; it != _receivedReportBlockMap.end(); ++it) { |
| - ReportBlockInfoMap* info_map = &(it->second); |
| - ReportBlockInfoMap::iterator it_info = info_map->find(bye.sender_ssrc()); |
| - if (it_info != info_map->end()) { |
| - delete it_info->second; |
| - info_map->erase(it_info); |
| - } |
| - } |
| + for (auto& reports_per_receiver : received_report_blocks_) |
| + reports_per_receiver.second.erase(bye.sender_ssrc()); |
| // We can't delete it due to TMMBR. |
| ReceiveInformation* receive_info = GetReceiveInformation(bye.sender_ssrc()); |