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}
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
index 9f285b5..ad8ba1f 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
@@ -510,20 +510,34 @@
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()});
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
index 46c8c34..d336cd7 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
@@ -883,9 +883,9 @@
{
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 @@
{
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);