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_to_text/converter.cc b/rtc_tools/rtc_event_log_to_text/converter.cc
index e30676d..6bd3458 100644
--- a/rtc_tools/rtc_event_log_to_text/converter.cc
+++ b/rtc_tools/rtc_event_log_to_text/converter.cc
@@ -33,6 +33,7 @@
 #include "logging/rtc_event_log/events/rtc_event_generic_packet_sent.h"
 #include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h"
 #include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h"
+#include "logging/rtc_event_log/events/rtc_event_neteq_set_minimum_delay.h"
 #include "logging/rtc_event_log/events/rtc_event_probe_cluster_created.h"
 #include "logging/rtc_event_log/events/rtc_event_probe_result_failure.h"
 #include "logging/rtc_event_log/events/rtc_event_probe_result_success.h"
@@ -125,6 +126,14 @@
             event.ssrc);
   };
 
+  auto neteq_set_minimum_delay_handler =
+      [&](const LoggedNetEqSetMinimumDelayEvent& event) {
+        fprintf(output,
+                "NETEQ_SET_MINIMUM_DELAY %" PRId64
+                " remote_ssrc=%u minimum_delay=%d\n",
+                event.log_time_ms(), event.remote_ssrc, event.minimum_delay_ms);
+      };
+
   auto audio_network_adaptation_handler =
       [&](const LoggedAudioNetworkAdaptationEvent& event) {
         fprintf(output, "AUDIO_NETWORK_ADAPTATION %" PRId64,
@@ -449,6 +458,11 @@
   for (const auto& kv : parsed_log.audio_playout_events()) {
     processor.AddEvents(kv.second, audio_playout_handler);
   }
+
+  for (const auto& kv : parsed_log.neteq_set_minimum_delay_events()) {
+    processor.AddEvents(kv.second, neteq_set_minimum_delay_handler);
+  }
+
   processor.AddEvents(parsed_log.audio_network_adaptation_events(),
                       audio_network_adaptation_handler);
 
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);
   });