PCLF: Ignore discarded frames in the DefaultVideoQualityAnalyzer

Bug: webrtc:14453, webrtc:11607
Change-Id: Iad0da2d85d9db74026205591e8b2ced399988998
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276420
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38204}
diff --git a/api/test/video_quality_analyzer_interface.h b/api/test/video_quality_analyzer_interface.h
index 65cc812..dc58b04 100644
--- a/api/test/video_quality_analyzer_interface.h
+++ b/api/test/video_quality_analyzer_interface.h
@@ -101,7 +101,8 @@
   virtual void OnFrameEncoded(absl::string_view peer_name,
                               uint16_t frame_id,
                               const EncodedImage& encoded_image,
-                              const EncoderStats& stats) {}
+                              const EncoderStats& stats,
+                              bool discarded) {}
   // Will be called for each frame dropped by encoder.
   // `peer_name` is name of the peer on which side frame drop was detected.
   virtual void OnFrameDropped(absl::string_view peer_name,
diff --git a/pc/test/svc_e2e_tests.cc b/pc/test/svc_e2e_tests.cc
index de0e050..615e3c3 100644
--- a/pc/test/svc_e2e_tests.cc
+++ b/pc/test/svc_e2e_tests.cc
@@ -196,12 +196,13 @@
   void OnFrameEncoded(absl::string_view peer_name,
                       uint16_t frame_id,
                       const EncodedImage& encoded_image,
-                      const EncoderStats& stats) override {
+                      const EncoderStats& stats,
+                      bool discarded) override {
     absl::optional<int> spatial_id = encoded_image.SpatialIndex();
     absl::optional<int> temporal_id = encoded_image.TemporalIndex();
     encoder_layers_seen_[spatial_id.value_or(0)][temporal_id.value_or(0)]++;
-    DefaultVideoQualityAnalyzer::OnFrameEncoded(peer_name, frame_id,
-                                                encoded_image, stats);
+    DefaultVideoQualityAnalyzer::OnFrameEncoded(
+        peer_name, frame_id, encoded_image, stats, discarded);
   }
 
   void OnFramePreDecode(absl::string_view peer_name,
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 123071b..08a6fca 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
@@ -295,7 +295,10 @@
     absl::string_view peer_name,
     uint16_t frame_id,
     const webrtc::EncodedImage& encoded_image,
-    const EncoderStats& stats) {
+    const EncoderStats& stats,
+    bool discarded) {
+  if (discarded)
+    return;
   MutexLock lock(&mutex_);
   RTC_CHECK_EQ(state_, State::kActive)
       << "DefaultVideoQualityAnalyzer has to be started before use";
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h
index 2b16eca..5501fb5 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h
@@ -62,7 +62,8 @@
   void OnFrameEncoded(absl::string_view peer_name,
                       uint16_t frame_id,
                       const EncodedImage& encoded_image,
-                      const EncoderStats& stats) override;
+                      const EncoderStats& stats,
+                      bool discarded) override;
   void OnFrameDropped(absl::string_view peer_name,
                       EncodedImageCallback::DropReason reason) override;
   void OnFramePreDecode(absl::string_view peer_name,
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc
index 6929145..e1458d4 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc
@@ -101,7 +101,8 @@
     frame.set_id(frame_id);
     analyzer.OnFramePreEncode(sender, frame);
     analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
     for (absl::string_view receiver : receivers) {
       VideoFrame received_frame = DeepCopy(frame);
       analyzer.OnFramePreDecode(receiver, received_frame.id(),
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 7a276b0..adda17c 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
@@ -126,7 +126,8 @@
     frame.set_id(frame_id);
     analyzer.OnFramePreEncode(sender, frame);
     analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
     for (absl::string_view receiver : receivers) {
       VideoFrame received_frame = DeepCopy(frame);
       analyzer.OnFramePreDecode(receiver, received_frame.id(),
@@ -165,7 +166,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   for (const uint16_t& frame_id : frames_order) {
@@ -218,7 +220,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Receive all frames.
@@ -246,7 +249,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Receive all frames.
@@ -299,7 +303,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   for (size_t i = kMaxFramesInFlightPerStream; i < frames_order.size(); ++i) {
@@ -350,7 +355,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   for (size_t i = 1; i < frames_order.size(); i += 2) {
@@ -405,7 +411,7 @@
   analyzer.OnFramePreEncode(kSenderPeerName, captured_frame);
   analyzer.OnFrameEncoded(kSenderPeerName, captured_frame.id(),
                           FakeEncode(captured_frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   VideoFrame received_frame = DeepCopy(captured_frame);
   analyzer.OnFramePreDecode(kReceiverPeerName, received_frame.id(),
@@ -465,7 +471,8 @@
     analyzer.OnFramePreEncode(kAlice, frame);
     SleepMs(20);
     analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   SleepMs(50);
@@ -592,7 +599,7 @@
   analyzer.OnFramePreEncode(kAlice, captured_frame);
   analyzer.OnFrameEncoded(kAlice, captured_frame.id(),
                           FakeEncode(captured_frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   VideoFrame received_frame = DeepCopy(captured_frame);
   analyzer.OnFramePreDecode(kBob, received_frame.id(),
@@ -653,7 +660,8 @@
         analyzer.OnFrameCaptured(kSenderPeerName, kStreamLabel, frame));
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
 
     VideoFrame received_frame = DeepCopy(frame);
     analyzer.OnFramePreDecode(kReceiverPeerName, received_frame.id(),
@@ -713,7 +721,8 @@
         analyzer.OnFrameCaptured(kSenderPeerName, kStreamLabel, frame));
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
 
     VideoFrame received_frame = frame;
     // Shift frame by a few pixels.
@@ -776,7 +785,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Windows CPU clock has low accuracy. We need to fake some additional load to
@@ -841,7 +851,8 @@
     captured_frames.insert({frame.id(), frame});
     analyzer.OnFramePreEncode(kAlice, frame);
     analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Bob receives one third of the sent frames.
@@ -984,7 +995,7 @@
   analyzer.OnFramePreEncode(kAlice, frame);
   // Encode 1st simulcast layer
   analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   // Receive by Bob
   VideoFrame received_frame = DeepCopy(frame);
@@ -1003,7 +1014,7 @@
 
   // Encode 2nd simulcast layer
   analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   // Give analyzer some time to process frames on async thread. The computations
   // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it
@@ -1047,7 +1058,8 @@
     frames.push_back(frame);
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Receive by 2nd peer.
@@ -1143,7 +1155,8 @@
     frames.push_back(frame);
     analyzer.OnFramePreEncode(kSenderPeerName, frame);
     analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
 
   // Receive by sender
@@ -1241,7 +1254,7 @@
       analyzer.OnFramePreEncode(kSenderPeerName, frame);
       encoder_stats.encoder_name = codec_names[i];
       analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame),
-                              encoder_stats);
+                              encoder_stats, false);
       frames.push_back(std::move(frame));
     }
   }
@@ -1322,9 +1335,9 @@
     analyzer.OnFramePreEncode(kSenderPeerName, frames[i]);
   }
   for (int i = 0; i < 4; ++i) {
-    analyzer.OnFrameEncoded(kSenderPeerName, frames[i].id(),
-                            FakeEncode(frames[i]),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+    analyzer.OnFrameEncoded(
+        kSenderPeerName, frames[i].id(), FakeEncode(frames[i]),
+        VideoQualityAnalyzerInterface::EncoderStats(), false);
   }
 
   // Receiver side actions
@@ -1415,9 +1428,9 @@
     analyzer.OnFramePreEncode(kSenderPeerName, frames[i]);
   }
   for (int i = 0; i < 4; ++i) {
-    analyzer.OnFrameEncoded(kSenderPeerName, frames[i].id(),
-                            FakeEncode(frames[i]),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+    analyzer.OnFrameEncoded(
+        kSenderPeerName, frames[i].id(), FakeEncode(frames[i]),
+        VideoQualityAnalyzerInterface::EncoderStats(), false);
   }
 
   // Receiver side actions
@@ -1517,7 +1530,8 @@
     frames.push_back(frame);
     analyzer.OnFramePreEncode(sender, frame);
     analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame),
-                            VideoQualityAnalyzerInterface::EncoderStats());
+                            VideoQualityAnalyzerInterface::EncoderStats(),
+                            false);
   }
   // We don't need to receive frames for stats to be gathered correctly.
 
@@ -1547,7 +1561,7 @@
   frame.set_id(frame_id);
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   analyzer.UnregisterParticipantInCall("alice");
 
@@ -1591,7 +1605,7 @@
   frame.set_id(frame_id);
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   analyzer.UnregisterParticipantInCall("alice");
 
@@ -1635,7 +1649,7 @@
   frame.set_id(frame_id);
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   analyzer.UnregisterParticipantInCall("bob");
 
@@ -1679,7 +1693,7 @@
   frame.set_id(frame_id);
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   analyzer.OnFramePreDecode("bob", frame.id(), FakeEncode(frame));
   analyzer.OnFrameDecoded("bob", DeepCopy(frame),
@@ -1777,7 +1791,7 @@
   analyzer.UnregisterParticipantInCall("bob");
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   // Give analyzer some time to process frames on async thread. The computations
   // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it
@@ -1820,7 +1834,7 @@
   analyzer.OnFramePreEncode("alice", frame);
   analyzer.UnregisterParticipantInCall("bob");
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   // Give analyzer some time to process frames on async thread. The computations
   // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it
@@ -1864,11 +1878,11 @@
   analyzer.OnFramePreEncode("alice", frame);
   // 1st simulcast layer encoded
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
   analyzer.UnregisterParticipantInCall("bob");
   // 2nd simulcast layer encoded
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   // Give analyzer some time to process frames on async thread. The computations
   // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it
@@ -2030,7 +2044,7 @@
   analyzer.OnFramePreEncode("alice", frame);
   SleepMs(10);
   analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame),
-                          VideoQualityAnalyzerInterface::EncoderStats());
+                          VideoQualityAnalyzerInterface::EncoderStats(), false);
 
   analyzer.UnregisterParticipantInCall("bob");
 
diff --git a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc
index 9f25ca6..f7d4550 100644
--- a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc
+++ b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc
@@ -58,7 +58,8 @@
     absl::string_view peer_name,
     uint16_t frame_id,
     const webrtc::EncodedImage& encoded_image,
-    const EncoderStats& stats) {
+    const EncoderStats& stats,
+    bool discarded) {
   MutexLock lock(&lock_);
   ++frames_encoded_;
 }
diff --git a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h
index 99a10c6..b12c11b 100644
--- a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h
+++ b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h
@@ -44,7 +44,8 @@
   void OnFrameEncoded(absl::string_view peer_name,
                       uint16_t frame_id,
                       const EncodedImage& encoded_image,
-                      const EncoderStats& stats) override;
+                      const EncoderStats& stats,
+                      bool discarded) override;
   void OnFrameDropped(absl::string_view peer_name,
                       EncodedImageCallback::DropReason reason) override;
   void OnFramePreDecode(absl::string_view peer_name,
diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc
index e774872..98c12f6 100644
--- a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc
+++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc
@@ -290,7 +290,8 @@
   VideoQualityAnalyzerInterface::EncoderStats stats;
   stats.encoder_name = codec_name;
   stats.target_encode_bitrate = target_encode_bitrate;
-  analyzer_->OnFrameEncoded(peer_name_, frame_id, encoded_image, stats);
+  analyzer_->OnFrameEncoded(peer_name_, frame_id, encoded_image, stats,
+                            discard);
 
   // Image data injector injects frame id and discard flag into provided
   // EncodedImage and returns the image with a) modified original buffer (in