From 6afa92ab2054cf4fd9b42d15073b742d1a315c24 Mon Sep 17 00:00:00 2001 From: Lionel Koenig Date: Mon, 16 Jan 2023 11:23:36 +0100 Subject: [PATCH] Tooling to process RtcEventNetEqSetMinimumDelay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Commit-Queue: Lionel Koenig Reviewed-by: Lionel Koenig Reviewed-by: Per Kjellander Cr-Commit-Position: refs/heads/main@{#39112} --- rtc_tools/rtc_event_log_to_text/converter.cc | 14 +++++++++++ .../rtc_event_log_visualizer/analyzer.cc | 25 ++++++++++++++++++- rtc_tools/rtc_event_log_visualizer/analyzer.h | 2 ++ rtc_tools/rtc_event_log_visualizer/main.cc | 5 ++++ 4 files changed, 45 insertions(+), 1 deletion(-) 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); });