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);