[DVQA] Add capture_frame_rate metric as detailed stats

Bug: b/240540204
Change-Id: I3e4a8f903f5b01c31418cc3e29d4e663d62a86a3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/279640
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38427}
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 2cb4409..7e3806f 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
@@ -1050,6 +1050,12 @@
 
   if (options_.report_detailed_frame_stats) {
     metrics_logger_->LogSingleValueMetric(
+        "capture_frame_rate", test_case_name,
+        stats.capture_frame_rate.IsEmpty()
+            ? 0
+            : stats.capture_frame_rate.GetEventsPerSecond(),
+        Unit::kHertz, ImprovementDirection::kBiggerIsBetter, metric_metadata);
+    metrics_logger_->LogSingleValueMetric(
         "num_encoded_frames", test_case_name, frame_counters.encoded,
         Unit::kCount, ImprovementDirection::kBiggerIsBetter, metric_metadata);
     metrics_logger_->LogSingleValueMetric(
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_frames_comparator.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_frames_comparator.cc
index 739ab3d..3b7dc40 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_frames_comparator.cc
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_frames_comparator.cc
@@ -434,6 +434,7 @@
     stats->ssim.AddSample(
         StatsSample(ssim, frame_stats.received_time, metadata));
   }
+  stats->capture_frame_rate.AddEvent(frame_stats.captured_time);
 
   // Compute dropped phase for dropped frame
   if (comparison.type == FrameComparisonType::kDroppedFrame) {
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 e1458d4..6b97612 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
@@ -284,6 +284,11 @@
               .improvement_direction = ImprovementDirection::kNeitherIsBetter},
           MetricValidationInfo{
               .test_case = "test_case/alice_video",
+              .name = "capture_frame_rate",
+              .unit = Unit::kHertz,
+              .improvement_direction = ImprovementDirection::kBiggerIsBetter},
+          MetricValidationInfo{
+              .test_case = "test_case/alice_video",
               .name = "num_encoded_frames",
               .unit = Unit::kCount,
               .improvement_direction = ImprovementDirection::kBiggerIsBetter},
@@ -448,6 +453,11 @@
               .improvement_direction = ImprovementDirection::kNeitherIsBetter},
           MetricValidationInfo{
               .test_case = "test_case/alice_video_alice_bob",
+              .name = "capture_frame_rate",
+              .unit = Unit::kHertz,
+              .improvement_direction = ImprovementDirection::kBiggerIsBetter},
+          MetricValidationInfo{
+              .test_case = "test_case/alice_video_alice_bob",
               .name = "num_encoded_frames",
               .unit = Unit::kCount,
               .improvement_direction = ImprovementDirection::kBiggerIsBetter},
@@ -580,6 +590,11 @@
               .improvement_direction = ImprovementDirection::kNeitherIsBetter},
           MetricValidationInfo{
               .test_case = "test_case/alice_video_alice_charlie",
+              .name = "capture_frame_rate",
+              .unit = Unit::kHertz,
+              .improvement_direction = ImprovementDirection::kBiggerIsBetter},
+          MetricValidationInfo{
+              .test_case = "test_case/alice_video_alice_charlie",
               .name = "num_encoded_frames",
               .unit = Unit::kCount,
               .improvement_direction = ImprovementDirection::kBiggerIsBetter},
@@ -641,10 +656,10 @@
 
   std::vector<std::string> metrics =
       ToTestCases(metrics_logger.GetCollectedMetrics());
-  EXPECT_THAT(metrics, SizeIs(53));
-  EXPECT_THAT(metrics, Contains("test_case/alice_video_alice_bob").Times(26));
+  EXPECT_THAT(metrics, SizeIs(55));
+  EXPECT_THAT(metrics, Contains("test_case/alice_video_alice_bob").Times(27));
   EXPECT_THAT(metrics,
-              Contains("test_case/alice_video_alice_charlie").Times(26));
+              Contains("test_case/alice_video_alice_charlie").Times(27));
   EXPECT_THAT(metrics, Contains("test_case").Times(1));
 }
 
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_shared_objects.h b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_shared_objects.h
index a52914e..69fb1ce 100644
--- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_shared_objects.h
+++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_shared_objects.h
@@ -125,6 +125,7 @@
   SamplesStatsCounter total_delay_incl_transport_ms;
   // Time between frames out from renderer.
   SamplesStatsCounter time_between_rendered_frames_ms;
+  SamplesRateCounter capture_frame_rate;
   SamplesRateCounter encode_frame_rate;
   SamplesStatsCounter encode_time_ms;
   SamplesStatsCounter decode_time_ms;