Add dur_ms to jank and frame_timeline metrics

Bug: 261731427
Change-Id: I9bf518e49b8c5da9954c8ab6ffb4b8279d73c9f7
diff --git a/protos/perfetto/metrics/android/android_frame_timeline_metric.proto b/protos/perfetto/metrics/android/android_frame_timeline_metric.proto
index d6be2ec..d0f4d50 100644
--- a/protos/perfetto/metrics/android/android_frame_timeline_metric.proto
+++ b/protos/perfetto/metrics/android/android_frame_timeline_metric.proto
@@ -35,6 +35,10 @@
     optional int64 frame_dur_p90 = 11;
     optional int64 frame_dur_p95 = 12;
     optional int64 frame_dur_p99 = 13;
+    optional double frame_dur_ms_p50 = 14;
+    optional double frame_dur_ms_p90 = 15;
+    optional double frame_dur_ms_p95 = 16;
+    optional double frame_dur_ms_p99 = 17;
 
     reserved 1, 2;
   }
diff --git a/protos/perfetto/metrics/android/jank_cuj_metric.proto b/protos/perfetto/metrics/android/jank_cuj_metric.proto
index a2bb50d..10bb9a7 100644
--- a/protos/perfetto/metrics/android/jank_cuj_metric.proto
+++ b/protos/perfetto/metrics/android/jank_cuj_metric.proto
@@ -78,7 +78,7 @@
     optional bool sf_missed = 6;
   }
 
-  // Next id: 12
+  // Next id: 16
   message Metrics {
     // Overall number of frames within the CUJ.
     optional int64 total_frames = 1;
@@ -96,28 +96,43 @@
     // Not available in timeline_metrics and trace_metrics.
     optional int64 missed_frames_max_successive = 5;
 
-    // Max frame duration.
-    // Not available in counter_metrics.
+    // Max frame duration in nanoseconds.
     optional int64 frame_dur_max = 6;
 
-    // Average frame duration.
+    // Average frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_avg = 7;
 
-    // Median frame duration.
+    // Median frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p50 = 8;
 
-    // P90 frame duration.
+    // P90 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p90 = 9;
 
-    // P95 frame duration.
+    // P95 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p95 = 10;
 
-    // P99 frame duration.
+    // P99 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p99 = 11;
+
+    // Median frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p50 = 12;
+
+    // P90 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p90 = 13;
+
+    // P95 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p95 = 14;
+
+    // P99 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p99 = 15;
   }
 }
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 1bb29ac..4db6c88 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -64,6 +64,10 @@
     optional int64 frame_dur_p90 = 11;
     optional int64 frame_dur_p95 = 12;
     optional int64 frame_dur_p99 = 13;
+    optional double frame_dur_ms_p50 = 14;
+    optional double frame_dur_ms_p90 = 15;
+    optional double frame_dur_ms_p95 = 16;
+    optional double frame_dur_ms_p99 = 17;
 
     reserved 1, 2;
   }
@@ -785,7 +789,7 @@
     optional bool sf_missed = 6;
   }
 
-  // Next id: 12
+  // Next id: 16
   message Metrics {
     // Overall number of frames within the CUJ.
     optional int64 total_frames = 1;
@@ -803,29 +807,44 @@
     // Not available in timeline_metrics and trace_metrics.
     optional int64 missed_frames_max_successive = 5;
 
-    // Max frame duration.
-    // Not available in counter_metrics.
+    // Max frame duration in nanoseconds.
     optional int64 frame_dur_max = 6;
 
-    // Average frame duration.
+    // Average frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_avg = 7;
 
-    // Median frame duration.
+    // Median frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p50 = 8;
 
-    // P90 frame duration.
+    // P90 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p90 = 9;
 
-    // P95 frame duration.
+    // P95 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p95 = 10;
 
-    // P99 frame duration.
+    // P99 frame duration in nanoseconds.
     // Not available in counter_metrics.
     optional int64 frame_dur_p99 = 11;
+
+    // Median frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p50 = 12;
+
+    // P90 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p90 = 13;
+
+    // P95 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p95 = 14;
+
+    // P99 frame duration in milliseconds.
+    // Not available in counter_metrics.
+    optional double frame_dur_ms_p99 = 15;
   }
 }
 
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index bafcbbc..bf8b56e 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/src/trace_processor/metrics/sql/android/android_frame_timeline_metric.sql b/src/trace_processor/metrics/sql/android/android_frame_timeline_metric.sql
index bbccaa8..44a55a2 100644
--- a/src/trace_processor/metrics/sql/android/android_frame_timeline_metric.sql
+++ b/src/trace_processor/metrics/sql/android/android_frame_timeline_metric.sql
@@ -35,6 +35,10 @@
   CAST(PERCENTILE(dur, 90) AS INTEGER) AS frame_dur_p90,
   CAST(PERCENTILE(dur, 95) AS INTEGER) AS frame_dur_p95,
   CAST(PERCENTILE(dur, 99) AS INTEGER) AS frame_dur_p99,
+  PERCENTILE(dur / 1e6, 50) AS frame_dur_ms_p50,
+  PERCENTILE(dur / 1e6, 90) AS frame_dur_ms_p90,
+  PERCENTILE(dur / 1e6, 95) AS frame_dur_ms_p95,
+  PERCENTILE(dur / 1e6, 99) AS frame_dur_ms_p99,
   CAST(AVG(dur) AS INTEGER) AS frame_dur_avg,
   MAX(dur) AS frame_dur_max
 FROM actual_frame_timeline_slice
diff --git a/src/trace_processor/metrics/sql/android/android_jank_cuj.sql b/src/trace_processor/metrics/sql/android/android_jank_cuj.sql
index caaac19..eec6435 100644
--- a/src/trace_processor/metrics/sql/android/android_jank_cuj.sql
+++ b/src/trace_processor/metrics/sql/android/android_jank_cuj.sql
@@ -115,7 +115,11 @@
               'frame_dur_p50', CAST(PERCENTILE(f.dur, 50) AS INTEGER),
               'frame_dur_p90', CAST(PERCENTILE(f.dur, 90) AS INTEGER),
               'frame_dur_p95', CAST(PERCENTILE(f.dur, 95) AS INTEGER),
-              'frame_dur_p99', CAST(PERCENTILE(f.dur, 99) AS INTEGER))
+              'frame_dur_p99', CAST(PERCENTILE(f.dur, 99) AS INTEGER),
+              'frame_dur_ms_p50', PERCENTILE(f.dur / 1e6, 50),
+              'frame_dur_ms_p90', PERCENTILE(f.dur / 1e6, 90),
+              'frame_dur_ms_p95', PERCENTILE(f.dur / 1e6, 95),
+              'frame_dur_ms_p99', PERCENTILE(f.dur / 1e6, 99))
             FROM android_jank_cuj_frame f
             WHERE f.cuj_id = cuj.cuj_id),
           'timeline_metrics', (
@@ -129,7 +133,11 @@
               'frame_dur_p50', CAST(PERCENTILE(f.dur, 50) AS INTEGER),
               'frame_dur_p90', CAST(PERCENTILE(f.dur, 90) AS INTEGER),
               'frame_dur_p95', CAST(PERCENTILE(f.dur, 95) AS INTEGER),
-              'frame_dur_p99', CAST(PERCENTILE(f.dur, 99) AS INTEGER))
+              'frame_dur_p99', CAST(PERCENTILE(f.dur, 99) AS INTEGER),
+              'frame_dur_ms_p50', PERCENTILE(f.dur / 1e6, 50),
+              'frame_dur_ms_p90', PERCENTILE(f.dur / 1e6, 90),
+              'frame_dur_ms_p95', PERCENTILE(f.dur / 1e6, 95),
+              'frame_dur_ms_p99', PERCENTILE(f.dur / 1e6, 99))
             FROM android_jank_cuj_frame_timeline f
             WHERE f.cuj_id = cuj.cuj_id),
           'frame', (
diff --git a/test/trace_processor/diff_tests/graphics/android_jank_cuj.out b/test/trace_processor/diff_tests/graphics/android_jank_cuj.out
index 063e02a..bdb6392 100644
--- a/test/trace_processor/diff_tests/graphics/android_jank_cuj.out
+++ b/test/trace_processor/diff_tests/graphics/android_jank_cuj.out
@@ -138,6 +138,10 @@
       frame_dur_p90: 34000000
       frame_dur_p95: 37000000
       frame_dur_p99: 39400000
+      frame_dur_ms_p50: 24.0
+      frame_dur_ms_p90: 34.0
+      frame_dur_ms_p95: 37.0
+      frame_dur_ms_p99: 39.400000000000006
     }
     trace_metrics {
       total_frames: 6
@@ -150,6 +154,10 @@
       frame_dur_p90: 34000000
       frame_dur_p95: 37000000
       frame_dur_p99: 39400000
+      frame_dur_ms_p50: 24.0
+      frame_dur_ms_p90: 34.0
+      frame_dur_ms_p95: 37.0
+      frame_dur_ms_p99: 39.400000000000006
     }
   }
   cuj {
@@ -354,6 +362,10 @@
       frame_dur_p90: 58900000
       frame_dur_p95: 61000000
       frame_dur_p99: 61000000
+      frame_dur_ms_p50: 22.5
+      frame_dur_ms_p90: 58.900000000000006
+      frame_dur_ms_p95: 61.0
+      frame_dur_ms_p99: 61.0
     }
     trace_metrics {
       total_frames: 12
@@ -366,6 +378,10 @@
       frame_dur_p90: 60500000
       frame_dur_p95: 61000000
       frame_dur_p99: 61000000
+      frame_dur_ms_p50: 25.3
+      frame_dur_ms_p90: 60.5
+      frame_dur_ms_p95: 61.0
+      frame_dur_ms_p99: 61.0
     }
   }
 }