Output plots for new DTLS events.

Bug: webrtc:10101
Change-Id: Ida8084549bc386b91fec468026c3f4a261a4ef50
Reviewed-on: https://webrtc-review.googlesource.com/c/113462
Commit-Queue: Zach Stein <zstein@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25941}
diff --git a/rtc_tools/event_log_visualizer/analyzer.cc b/rtc_tools/event_log_visualizer/analyzer.cc
index 567276c..89f2391 100644
--- a/rtc_tools/event_log_visualizer/analyzer.cc
+++ b/rtc_tools/event_log_visualizer/analyzer.cc
@@ -1979,6 +1979,37 @@
   plot->SetTitle("[IceEventLog] ICE connectivity checks");
 }
 
+void EventLogAnalyzer::CreateDtlsTransportStateGraph(Plot* plot) {
+  TimeSeries states("DTLS Transport State", LineStyle::kNone,
+                    PointStyle::kHighlight);
+  for (const auto& event : parsed_log_.dtls_transport_states()) {
+    float x = ToCallTimeSec(event.log_time_us());
+    float y = static_cast<float>(event.dtls_transport_state);
+    states.points.emplace_back(x, y);
+  }
+  plot->AppendTimeSeries(std::move(states));
+  plot->SetXAxis(ToCallTimeSec(begin_time_), call_duration_s_, "Time (s)",
+                 kLeftMargin, kRightMargin);
+  plot->SetSuggestedYAxis(0, static_cast<float>(DtlsTransportState::kNumValues),
+                          "Numeric Transport State", kBottomMargin, kTopMargin);
+  plot->SetTitle("DTLS Transport State");
+}
+
+void EventLogAnalyzer::CreateDtlsWritableStateGraph(Plot* plot) {
+  TimeSeries writable("DTLS Writable", LineStyle::kNone,
+                      PointStyle::kHighlight);
+  for (const auto& event : parsed_log_.dtls_writable_states()) {
+    float x = ToCallTimeSec(event.log_time_us());
+    float y = static_cast<float>(event.writable);
+    writable.points.emplace_back(x, y);
+  }
+  plot->AppendTimeSeries(std::move(writable));
+  plot->SetXAxis(ToCallTimeSec(begin_time_), call_duration_s_, "Time (s)",
+                 kLeftMargin, kRightMargin);
+  plot->SetSuggestedYAxis(0, 1, "Writable", kBottomMargin, kTopMargin);
+  plot->SetTitle("DTLS Writable State");
+}
+
 void EventLogAnalyzer::PrintNotifications(FILE* file) {
   fprintf(file, "========== TRIAGE NOTIFICATIONS ==========\n");
   for (const auto& alert : incoming_rtp_recv_time_gaps_) {
diff --git a/rtc_tools/event_log_visualizer/analyzer.h b/rtc_tools/event_log_visualizer/analyzer.h
index c6606c2..35a44b9 100644
--- a/rtc_tools/event_log_visualizer/analyzer.h
+++ b/rtc_tools/event_log_visualizer/analyzer.h
@@ -99,6 +99,9 @@
   void CreateIceCandidatePairConfigGraph(Plot* plot);
   void CreateIceConnectivityCheckGraph(Plot* plot);
 
+  void CreateDtlsTransportStateGraph(Plot* plot);
+  void CreateDtlsWritableStateGraph(Plot* plot);
+
   void CreateTriageNotifications();
   void PrintNotifications(FILE* file);
 
diff --git a/rtc_tools/event_log_visualizer/main.cc b/rtc_tools/event_log_visualizer/main.cc
index e3f4d50..4808f9d 100644
--- a/rtc_tools/event_log_visualizer/main.cc
+++ b/rtc_tools/event_log_visualizer/main.cc
@@ -151,6 +151,12 @@
 WEBRTC_DEFINE_bool(plot_ice_connectivity_check,
                    false,
                    "Plot the ICE candidate pair connectivity checks.");
+WEBRTC_DEFINE_bool(plot_dtls_transport_state,
+                   false,
+                   "Plot DTLS transport state changes.");
+WEBRTC_DEFINE_bool(plot_dtls_writable_state,
+                   false,
+                   "Plot DTLS writable state changes.");
 
 WEBRTC_DEFINE_string(
     force_fieldtrials,
@@ -469,6 +475,13 @@
     analyzer.CreateIceConnectivityCheckGraph(collection->AppendNewPlot());
   }
 
+  if (FLAG_plot_dtls_transport_state) {
+    analyzer.CreateDtlsTransportStateGraph(collection->AppendNewPlot());
+  }
+  if (FLAG_plot_dtls_writable_state) {
+    analyzer.CreateDtlsWritableStateGraph(collection->AppendNewPlot());
+  }
+
   collection->Draw();
 
   if (FLAG_print_triage_alerts) {