Fix frame counters for peers added in the middle of the call

Bug: b/196035476
Change-Id: Ie49ab247a2ff8bda680e4586f7316af8eaa8fe56
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/228429
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34724}
This commit is contained in:
Artem Titov
2021-08-11 12:48:39 +02:00
committed by WebRTC LUCI CQ
parent 6e2458d888
commit 897bf9bff1
2 changed files with 27 additions and 13 deletions

View File

@ -510,20 +510,34 @@ void DefaultVideoQualityAnalyzer::RegisterParticipantInCall(
MutexLock lock1(&lock_);
MutexLock lock2(&comparison_lock_);
RTC_CHECK(!peers_->HasName(peer_name));
peers_->AddIfAbsent(peer_name);
size_t new_peer_index = peers_->AddIfAbsent(peer_name);
// Ensure stats for receiving (for frames from other peers to this one)
// streams exists. Since in flight frames will be sent to the new peer
// as well. Sending stats (from this peer to others) will be added by
// DefaultVideoQualityAnalyzer::OnFrameCaptured.
for (auto& key_val : stream_to_sender_) {
InternalStatsKey key(key_val.first, key_val.second,
peers_->index(peer_name));
const int64_t frames_count = captured_frames_in_flight_.size();
size_t stream_index = key_val.first;
size_t sender_peer_index = key_val.second;
InternalStatsKey key(stream_index, sender_peer_index, new_peer_index);
// To initiate `FrameCounters` for the stream we should pick frame
// counters with the same stream index and the same sender's peer index
// and any receiver's peer index and copy from its sender side
// counters.
FrameCounters counters;
counters.captured = frames_count;
counters.pre_encoded = frames_count;
counters.encoded = frames_count;
for (size_t i = 0; i < peers_->size(); ++i) {
InternalStatsKey prototype_key(stream_index, sender_peer_index, i);
auto it = stream_frame_counters_.find(prototype_key);
if (it != stream_frame_counters_.end()) {
counters.captured = it->second.captured;
counters.pre_encoded = it->second.pre_encoded;
counters.encoded = it->second.encoded;
break;
}
}
// It may happen if we had only one peer before this method was invoked,
// then `counters` will be empty. In such case empty `counters` are ok.
stream_frame_counters_.insert({key, std::move(counters)});
stream_stats_.insert({key, StreamStats()});

View File

@ -883,9 +883,9 @@ TEST(DefaultVideoQualityAnalyzerTest, RuntimeParticipantsAdding) {
{
FrameCounters stream_conters =
analyzer.GetPerStreamCounters().at(kAliceCharlieStats);
EXPECT_EQ(stream_conters.captured, kTwoThirdFrames);
EXPECT_EQ(stream_conters.pre_encoded, kTwoThirdFrames);
EXPECT_EQ(stream_conters.encoded, kTwoThirdFrames);
EXPECT_EQ(stream_conters.captured, kFramesCount);
EXPECT_EQ(stream_conters.pre_encoded, kFramesCount);
EXPECT_EQ(stream_conters.encoded, kFramesCount);
EXPECT_EQ(stream_conters.received, kTwoThirdFrames);
EXPECT_EQ(stream_conters.decoded, kTwoThirdFrames);
EXPECT_EQ(stream_conters.rendered, kTwoThirdFrames);
@ -893,9 +893,9 @@ TEST(DefaultVideoQualityAnalyzerTest, RuntimeParticipantsAdding) {
{
FrameCounters stream_conters =
analyzer.GetPerStreamCounters().at(kAliceKatieStats);
EXPECT_EQ(stream_conters.captured, kTwoThirdFrames);
EXPECT_EQ(stream_conters.pre_encoded, kTwoThirdFrames);
EXPECT_EQ(stream_conters.encoded, kTwoThirdFrames);
EXPECT_EQ(stream_conters.captured, kFramesCount);
EXPECT_EQ(stream_conters.pre_encoded, kFramesCount);
EXPECT_EQ(stream_conters.encoded, kFramesCount);
EXPECT_EQ(stream_conters.received, kOneThirdFrames);
EXPECT_EQ(stream_conters.decoded, kOneThirdFrames);
EXPECT_EQ(stream_conters.rendered, kOneThirdFrames);