Tooling to process RtcEventNetEqSetMinimumDelay

This introduce some tooling to display and plot the NetEq SetMinimum
delay event.

Bug: webrtc:14763
Change-Id: I69b73a51322734ec62e9b99abcdd0ac4e735879f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/287860
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Lionel Koenig <lionelk@webrtc.org>
Reviewed-by: Lionel Koenig <lionelk@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39112}
diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer.cc b/rtc_tools/rtc_event_log_visualizer/analyzer.cc
index 6b9449f..a5b8b49 100644
--- a/rtc_tools/rtc_event_log_visualizer/analyzer.cc
+++ b/rtc_tools/rtc_event_log_visualizer/analyzer.cc
@@ -205,7 +205,6 @@
   return delay_change;
 }
 
-
 template <typename T>
 TimeSeries CreateRtcpTypeTimeSeries(const std::vector<T>& rtcp_list,
                                     AnalyzerConfig config,
@@ -617,6 +616,30 @@
   plot->SetTitle("Audio playout");
 }
 
+void EventLogAnalyzer::CreateNetEqSetMinimumDelay(Plot* plot) {
+  for (const auto& playout_stream :
+       parsed_log_.neteq_set_minimum_delay_events()) {
+    uint32_t ssrc = playout_stream.first;
+    if (!MatchingSsrc(ssrc, desired_ssrc_))
+      continue;
+
+    TimeSeries time_series(SsrcToString(ssrc), LineStyle::kStep,
+                           PointStyle::kHighlight);
+    for (const auto& event : playout_stream.second) {
+      float x = config_.GetCallTimeSec(event.log_time());
+      float y = event.minimum_delay_ms;
+      time_series.points.push_back(TimeSeriesPoint(x, y));
+    }
+    plot->AppendTimeSeries(std::move(time_series));
+  }
+
+  plot->SetXAxis(config_.CallBeginTimeSec(), config_.CallEndTimeSec(),
+                 "Time (s)", kLeftMargin, kRightMargin);
+  plot->SetSuggestedYAxis(0, 1000, "Minimum Delay (ms)", kBottomMargin,
+                          kTopMargin);
+  plot->SetTitle("Set Minimum Delay");
+}
+
 // For audio SSRCs, plot the audio level.
 void EventLogAnalyzer::CreateAudioLevelGraph(PacketDirection direction,
                                              Plot* plot) {
diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer.h b/rtc_tools/rtc_event_log_visualizer/analyzer.h
index 1f31d8b..e58a482 100644
--- a/rtc_tools/rtc_event_log_visualizer/analyzer.h
+++ b/rtc_tools/rtc_event_log_visualizer/analyzer.h
@@ -46,6 +46,8 @@
 
   void CreatePlayoutGraph(Plot* plot);
 
+  void CreateNetEqSetMinimumDelay(Plot* plot);
+
   void CreateAudioLevelGraph(PacketDirection direction, Plot* plot);
 
   void CreateSequenceNumberGraph(Plot* plot);
diff --git a/rtc_tools/rtc_event_log_visualizer/main.cc b/rtc_tools/rtc_event_log_visualizer/main.cc
index 9f0c632..4988808 100644
--- a/rtc_tools/rtc_event_log_visualizer/main.cc
+++ b/rtc_tools/rtc_event_log_visualizer/main.cc
@@ -322,6 +322,11 @@
   });
   plots.RegisterPlot("audio_playout",
                      [&](Plot* plot) { analyzer.CreatePlayoutGraph(plot); });
+
+  plots.RegisterPlot("neteq_set_minimum_delay", [&](Plot* plot) {
+    analyzer.CreateNetEqSetMinimumDelay(plot);
+  });
+
   plots.RegisterPlot("incoming_audio_level", [&](Plot* plot) {
     analyzer.CreateAudioLevelGraph(webrtc::kIncomingPacket, plot);
   });