From 2c8e8a306a5c2db8566763d0d898cbd08d05f6cb Mon Sep 17 00:00:00 2001 From: terelius Date: Fri, 2 Jun 2017 01:29:48 -0700 Subject: [PATCH] Overlay REMB in total bitrate graphs in visualization tool. This doesn't affect the production code. BUG=webrtc:7726 Review-Url: https://codereview.webrtc.org/2912813002 Cr-Commit-Position: refs/heads/master@{#18400} --- webrtc/tools/event_log_visualizer/analyzer.cc | 45 +++++++++++++++++-- .../tools/event_log_visualizer/plot_base.cc | 6 +++ webrtc/tools/event_log_visualizer/plot_base.h | 4 ++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc index f068759ec2..b5b05dd218 100644 --- a/webrtc/tools/event_log_visualizer/analyzer.cc +++ b/webrtc/tools/event_log_visualizer/analyzer.cc @@ -19,6 +19,7 @@ #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" +#include "webrtc/base/ptr_util.h" #include "webrtc/base/rate_statistics.h" #include "webrtc/call/audio_receive_stream.h" #include "webrtc/call/audio_send_stream.h" @@ -30,6 +31,7 @@ #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" @@ -420,7 +422,7 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) if (header.type() == rtcp::TransportFeedback::kPacketType && header.fmt() == rtcp::TransportFeedback::kFeedbackMessageType) { std::unique_ptr rtcp_packet( - new rtcp::TransportFeedback()); + rtc::MakeUnique()); if (rtcp_packet->Parse(header)) { uint32_t ssrc = rtcp_packet->sender_ssrc(); StreamId stream(ssrc, direction); @@ -430,7 +432,7 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) } } else if (header.type() == rtcp::SenderReport::kPacketType) { std::unique_ptr rtcp_packet( - new rtcp::SenderReport()); + rtc::MakeUnique()); if (rtcp_packet->Parse(header)) { uint32_t ssrc = rtcp_packet->sender_ssrc(); StreamId stream(ssrc, direction); @@ -440,7 +442,7 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) } } else if (header.type() == rtcp::ReceiverReport::kPacketType) { std::unique_ptr rtcp_packet( - new rtcp::ReceiverReport()); + rtc::MakeUnique()); if (rtcp_packet->Parse(header)) { uint32_t ssrc = rtcp_packet->sender_ssrc(); StreamId stream(ssrc, direction); @@ -448,6 +450,17 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) rtcp_packets_[stream].push_back( LoggedRtcpPacket(timestamp, kRtcpRr, std::move(rtcp_packet))); } + } else if (header.type() == rtcp::Remb::kPacketType && + header.fmt() == rtcp::Remb::kFeedbackMessageType) { + std::unique_ptr rtcp_packet( + rtc::MakeUnique()); + if (rtcp_packet->Parse(header)) { + uint32_t ssrc = rtcp_packet->sender_ssrc(); + StreamId stream(ssrc, direction); + uint64_t timestamp = parsed_log_.GetTimestamp(i); + rtcp_packets_[stream].push_back(LoggedRtcpPacket( + timestamp, kRtcpRemb, std::move(rtcp_packet))); + } } } break; @@ -975,6 +988,32 @@ void EventLogAnalyzer::CreateTotalBitrateGraph( plot->AppendTimeSeries(std::move(result_series)); } + // Overlay the incoming REMB over the outgoing bitrate + // and outgoing REMB over incoming bitrate. + PacketDirection remb_direction = + desired_direction == kOutgoingPacket ? kIncomingPacket : kOutgoingPacket; + TimeSeries remb_series("Remb", LINE_STEP_GRAPH); + std::multimap remb_packets; + for (const auto& kv : rtcp_packets_) { + if (kv.first.GetDirection() == remb_direction) { + for (const LoggedRtcpPacket& rtcp_packet : kv.second) { + if (rtcp_packet.type == kRtcpRemb) { + remb_packets.insert( + std::make_pair(rtcp_packet.timestamp, &rtcp_packet)); + } + } + } + } + + for (const auto& kv : remb_packets) { + const LoggedRtcpPacket* const rtcp = kv.second; + const rtcp::Remb* const remb = static_cast(rtcp->packet.get()); + float x = static_cast(rtcp->timestamp - begin_time_) / 1000000; + float y = static_cast(remb->bitrate_bps()) / 1000; + remb_series.points.emplace_back(x, y); + } + plot->AppendTimeSeriesIfNotEmpty(std::move(remb_series)); + plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { diff --git a/webrtc/tools/event_log_visualizer/plot_base.cc b/webrtc/tools/event_log_visualizer/plot_base.cc index 057a3108a4..63fb09272e 100644 --- a/webrtc/tools/event_log_visualizer/plot_base.cc +++ b/webrtc/tools/event_log_visualizer/plot_base.cc @@ -75,5 +75,11 @@ void Plot::AppendTimeSeries(TimeSeries&& time_series) { series_list_.emplace_back(std::move(time_series)); } +void Plot::AppendTimeSeriesIfNotEmpty(TimeSeries&& time_series) { + if (time_series.points.size() > 0) { + series_list_.emplace_back(std::move(time_series)); + } +} + } // namespace plotting } // namespace webrtc diff --git a/webrtc/tools/event_log_visualizer/plot_base.h b/webrtc/tools/event_log_visualizer/plot_base.h index afa20beaf8..0abd6befec 100644 --- a/webrtc/tools/event_log_visualizer/plot_base.h +++ b/webrtc/tools/event_log_visualizer/plot_base.h @@ -109,6 +109,10 @@ class Plot { // Add a new TimeSeries to the plot. void AppendTimeSeries(TimeSeries&& time_series); + // Add a new TimeSeries to the plot if the series contains contains data. + // Otherwise, the call has no effect and the timeseries is destroyed. + void AppendTimeSeriesIfNotEmpty(TimeSeries&& time_series); + protected: float xaxis_min_; float xaxis_max_;