diff --git a/rtc_tools/rtc_event_log_to_text/converter.cc b/rtc_tools/rtc_event_log_to_text/converter.cc index e30676d551..6bd3458a6f 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 @@ bool Convert(std::string inputfile, 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 @@ bool Convert(std::string inputfile, 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 6b9449fbe5..a5b8b49302 100644 --- a/rtc_tools/rtc_event_log_visualizer/analyzer.cc +++ b/rtc_tools/rtc_event_log_visualizer/analyzer.cc @@ -205,7 +205,6 @@ absl::optional NetworkDelayDiff_CaptureTime( return delay_change; } - template TimeSeries CreateRtcpTypeTimeSeries(const std::vector& rtcp_list, AnalyzerConfig config, @@ -617,6 +616,30 @@ void EventLogAnalyzer::CreatePlayoutGraph(Plot* plot) { 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 1f31d8be1d..e58a4823f7 100644 --- a/rtc_tools/rtc_event_log_visualizer/analyzer.h +++ b/rtc_tools/rtc_event_log_visualizer/analyzer.h @@ -46,6 +46,8 @@ class EventLogAnalyzer { 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 9f0c632efc..4988808cab 100644 --- a/rtc_tools/rtc_event_log_visualizer/main.cc +++ b/rtc_tools/rtc_event_log_visualizer/main.cc @@ -322,6 +322,11 @@ int main(int argc, char* argv[]) { }); 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); });