Support more ssrcs in ReceiveStatistics than retrieved per RtcpReportBlocks call

Bug: webrtc:8239
Change-Id: Ie2d630e98384e640e0e7dcbfbb1f69453d873044
Reviewed-on: https://webrtc-review.googlesource.com/39784
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21635}
This commit is contained in:
Danil Chapovalov
2018-01-16 11:07:18 +01:00
committed by Commit Bot
parent 98d4036f5a
commit d1996b76d5
3 changed files with 82 additions and 20 deletions

View File

@ -359,6 +359,7 @@ ReceiveStatistics* ReceiveStatistics::Create(Clock* clock) {
ReceiveStatisticsImpl::ReceiveStatisticsImpl(Clock* clock)
: clock_(clock),
last_returned_ssrc_(0),
rtcp_stats_callback_(NULL),
rtp_stats_callback_(NULL) {}
@ -467,29 +468,35 @@ std::vector<rtcp::ReportBlock> ReceiveStatisticsImpl::RtcpReportBlocks(
}
std::vector<rtcp::ReportBlock> result;
result.reserve(std::min(max_blocks, statisticians.size()));
for (auto& statistician : statisticians) {
// TODO(danilchap): Select statistician subset across multiple calls using
// round-robin, as described in rfc3550 section 6.4 when single
// rtcp_module/receive_statistics will be used for more rtp streams.
if (result.size() == max_blocks)
break;
auto add_report_block = [&result](uint32_t media_ssrc,
StreamStatisticianImpl* statistician) {
// Do we have receive statistics to send?
RtcpStatistics stats;
if (!statistician.second->GetActiveStatisticsAndReset(&stats))
continue;
if (!statistician->GetActiveStatisticsAndReset(&stats))
return;
result.emplace_back();
rtcp::ReportBlock& block = result.back();
block.SetMediaSsrc(statistician.first);
block.SetMediaSsrc(media_ssrc);
block.SetFractionLost(stats.fraction_lost);
if (!block.SetCumulativeLost(stats.packets_lost)) {
RTC_LOG(LS_WARNING) << "Cumulative lost is oversized.";
result.pop_back();
continue;
return;
}
block.SetExtHighestSeqNum(stats.extended_highest_sequence_number);
block.SetJitter(stats.jitter);
}
};
const auto start_it = statisticians.upper_bound(last_returned_ssrc_);
for (auto it = start_it;
result.size() < max_blocks && it != statisticians.end(); ++it)
add_report_block(it->first, it->second);
for (auto it = statisticians.begin();
result.size() < max_blocks && it != start_it; ++it)
add_report_block(it->first, it->second);
if (!result.empty())
last_returned_ssrc_ = result.back().source_ssrc();
return result;
}