Refactor VideoQualityMetricsReporter with no impact.

Change-Id: Iebba001953d66e48fc280a4e8e50cbe776c22855
Bug: b/398190061
No-Try: True
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/380401
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Jeremy Leconte <jleconte@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44079}
diff --git a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.cc b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.cc
index d429566..41b9356 100644
--- a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.cc
+++ b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.cc
@@ -10,8 +10,10 @@
 
 #include "test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h"
 
+#include <algorithm>
 #include <map>
 #include <string>
+#include <vector>
 
 #include "absl/strings/string_view.h"
 #include "api/numerics/samples_stats_counter.h"
@@ -55,7 +57,7 @@
     absl::string_view test_case_name,
     const TrackIdStreamInfoMap* /*reporter_helper*/) {
   test_case_name_ = std::string(test_case_name);
-  start_time_ = Now();
+  start_time_ = clock_->CurrentTime();
 }
 
 void VideoQualityMetricsReporter::OnStatsReports(
@@ -64,7 +66,8 @@
   RTC_CHECK(start_time_)
       << "Please invoke Start(...) method before calling OnStatsReports(...)";
 
-  auto transport_stats = report->GetStatsOfType<RTCTransportStats>();
+  std::vector<const RTCTransportStats*> transport_stats =
+      report->GetStatsOfType<RTCTransportStats>();
   if (transport_stats.size() == 0u ||
       !transport_stats[0]->selected_candidate_pair_id.has_value()) {
     return;
@@ -78,16 +81,14 @@
   const RTCIceCandidatePairStats ice_candidate_pair_stats =
       report->Get(selected_ice_id)->cast_to<const RTCIceCandidatePairStats>();
 
-  auto outbound_rtp_stats = report->GetStatsOfType<RTCOutboundRtpStreamStats>();
-  StatsSample sample;
-  for (auto& s : outbound_rtp_stats) {
+  StatsSample sample = {.timestamp = *start_time_};
+  for (const RTCOutboundRtpStreamStats* s :
+       report->GetStatsOfType<RTCOutboundRtpStreamStats>()) {
     if (!s->kind.has_value() || *s->kind != "video") {
       continue;
     }
     sample.scalability_modes.push_back(s->scalability_mode);
-    if (s->timestamp() > sample.sample_time) {
-      sample.sample_time = s->timestamp();
-    }
+    sample.timestamp = std::max(*sample.timestamp, s->timestamp());
     sample.retransmitted_bytes_sent +=
         DataSize::Bytes(s->retransmitted_bytes_sent.value_or(0ul));
     sample.bytes_sent += DataSize::Bytes(s->bytes_sent.value_or(0ul));
@@ -95,7 +96,7 @@
         DataSize::Bytes(s->header_bytes_sent.value_or(0ul));
   }
 
-  MutexLock lock(&video_bwe_stats_lock_);
+  MutexLock lock(&stats_lock_);
   VideoBweStats& video_bwe_stats = video_bwe_stats_[std::string(pc_label)];
   if (ice_candidate_pair_stats.available_outgoing_bitrate.has_value()) {
     video_bwe_stats.available_send_bandwidth.AddSample(
@@ -105,22 +106,20 @@
   }
 
   StatsSample prev_sample = last_stats_sample_[std::string(pc_label)];
-  if (prev_sample.scalability_modes != sample.scalability_modes) {
-    // Counters are reset when the scalability mode changes.
-    prev_sample.bytes_sent = DataSize::Zero();
-    prev_sample.header_bytes_sent = DataSize::Zero();
-    prev_sample.retransmitted_bytes_sent = DataSize::Zero();
-  }
-  if (prev_sample.sample_time.IsZero()) {
-    prev_sample.sample_time = start_time_.value();
-  }
   last_stats_sample_[std::string(pc_label)] = sample;
 
-  TimeDelta time_between_samples = sample.sample_time - prev_sample.sample_time;
+  TimeDelta time_between_samples =
+      *sample.timestamp - prev_sample.timestamp.value_or(*start_time_);
   if (time_between_samples.IsZero()) {
     return;
   }
 
+  if (prev_sample.scalability_modes != sample.scalability_modes) {
+    // Change in video config can trigger the counters to be reset.
+    prev_sample.bytes_sent = DataSize::Zero();
+    prev_sample.header_bytes_sent = DataSize::Zero();
+    prev_sample.retransmitted_bytes_sent = DataSize::Zero();
+  }
   DataRate retransmission_bitrate =
       (sample.retransmitted_bytes_sent - prev_sample.retransmitted_bytes_sent) /
       time_between_samples;
@@ -135,21 +134,16 @@
 }
 
 void VideoQualityMetricsReporter::StopAndReportResults() {
-  MutexLock video_bwemutex_(&video_bwe_stats_lock_);
+  MutexLock lock(&stats_lock_);
   for (const auto& item : video_bwe_stats_) {
     ReportVideoBweResults(item.first, item.second);
   }
 }
 
-std::string VideoQualityMetricsReporter::GetTestCaseName(
-    const std::string& peer_name) const {
-  return test_case_name_ + "/" + peer_name;
-}
-
 void VideoQualityMetricsReporter::ReportVideoBweResults(
     const std::string& peer_name,
     const VideoBweStats& video_bwe_stats) {
-  std::string test_case_name = GetTestCaseName(peer_name);
+  std::string test_case_name = test_case_name_ + "/" + peer_name;
   // TODO(bugs.webrtc.org/14757): Remove kExperimentalTestNameMetadataKey.
   std::map<std::string, std::string> metric_metadata{
       {MetricMetadataKey::kPeerMetadataKey, peer_name},
diff --git a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h
index b187b3b..18b0320 100644
--- a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h
+++ b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h
@@ -32,12 +32,6 @@
 namespace webrtc {
 namespace webrtc_pc_e2e {
 
-struct VideoBweStats {
-  SamplesStatsCounter available_send_bandwidth;
-  SamplesStatsCounter transmission_bitrate;
-  SamplesStatsCounter retransmission_bitrate;
-};
-
 class VideoQualityMetricsReporter
     : public PeerConnectionE2EQualityTestFixture::QualityMetricsReporter {
  public:
@@ -53,19 +47,21 @@
   void StopAndReportResults() override;
 
  private:
+  struct VideoBweStats {
+    SamplesStatsCounter available_send_bandwidth;
+    SamplesStatsCounter transmission_bitrate;
+    SamplesStatsCounter retransmission_bitrate;
+  };
   struct StatsSample {
     std::vector<std::optional<std::string>> scalability_modes;
+    std::optional<Timestamp> timestamp;
     DataSize bytes_sent = DataSize::Zero();
     DataSize header_bytes_sent = DataSize::Zero();
     DataSize retransmitted_bytes_sent = DataSize::Zero();
-
-    Timestamp sample_time = Timestamp::Zero();
   };
 
-  std::string GetTestCaseName(const std::string& peer_name) const;
   void ReportVideoBweResults(const std::string& peer_name,
                              const VideoBweStats& video_bwe_stats);
-  Timestamp Now() const { return clock_->CurrentTime(); }
 
   Clock* const clock_;
   test::MetricsLogger* const metrics_logger_;
@@ -73,13 +69,13 @@
   std::string test_case_name_;
   std::optional<Timestamp> start_time_;
 
-  Mutex video_bwe_stats_lock_;
+  Mutex stats_lock_;
   // Map between a peer connection label (provided by the framework) and
   // its video BWE stats.
   std::map<std::string, VideoBweStats> video_bwe_stats_
-      RTC_GUARDED_BY(video_bwe_stats_lock_);
+      RTC_GUARDED_BY(stats_lock_);
   std::map<std::string, StatsSample> last_stats_sample_
-      RTC_GUARDED_BY(video_bwe_stats_lock_);
+      RTC_GUARDED_BY(stats_lock_);
 };
 
 }  // namespace webrtc_pc_e2e