Visualize events related to probing in the total bitrate graph.
BUG=webrtc:6984
R=terelius@webrtc.org
Review-Url: https://codereview.webrtc.org/2782553005 .
Cr-Commit-Position: refs/heads/master@{#17449}
diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc
index a806b3d..815308d 100644
--- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc
+++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc
@@ -534,4 +534,58 @@
rtc::Optional<float>(ana_event.uplink_packet_loss_fraction());
}
+ParsedRtcEventLog::BweProbeClusterCreatedEvent
+ParsedRtcEventLog::GetBweProbeClusterCreated(size_t index) const {
+ RTC_CHECK_LT(index, GetNumberOfEvents());
+ const rtclog::Event& event = events_[index];
+ RTC_CHECK(event.has_type());
+ RTC_CHECK_EQ(event.type(), rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT);
+ RTC_CHECK(event.has_probe_cluster());
+ const rtclog::BweProbeCluster& pcc_event = event.probe_cluster();
+ BweProbeClusterCreatedEvent res;
+ res.timestamp = GetTimestamp(index);
+ RTC_CHECK(pcc_event.has_id());
+ res.id = pcc_event.id();
+ RTC_CHECK(pcc_event.has_bitrate_bps());
+ res.bitrate_bps = pcc_event.bitrate_bps();
+ RTC_CHECK(pcc_event.has_min_packets());
+ res.min_packets = pcc_event.min_packets();
+ RTC_CHECK(pcc_event.has_min_bytes());
+ res.min_bytes = pcc_event.min_bytes();
+ return res;
+}
+
+ParsedRtcEventLog::BweProbeResultEvent ParsedRtcEventLog::GetBweProbeResult(
+ size_t index) const {
+ RTC_CHECK_LT(index, GetNumberOfEvents());
+ const rtclog::Event& event = events_[index];
+ RTC_CHECK(event.has_type());
+ RTC_CHECK_EQ(event.type(), rtclog::Event::BWE_PROBE_RESULT_EVENT);
+ RTC_CHECK(event.has_probe_result());
+ const rtclog::BweProbeResult& pr_event = event.probe_result();
+ BweProbeResultEvent res;
+ res.timestamp = GetTimestamp(index);
+ RTC_CHECK(pr_event.has_id());
+ res.id = pr_event.id();
+
+ RTC_CHECK(pr_event.has_result());
+ if (pr_event.result() == rtclog::BweProbeResult::SUCCESS) {
+ RTC_CHECK(pr_event.has_bitrate_bps());
+ res.bitrate_bps = rtc::Optional<uint64_t>(pr_event.bitrate_bps());
+ } else if (pr_event.result() ==
+ rtclog::BweProbeResult::INVALID_SEND_RECEIVE_INTERVAL) {
+ res.failure_reason =
+ rtc::Optional<ProbeFailureReason>(kInvalidSendReceiveInterval);
+ } else if (pr_event.result() ==
+ rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO) {
+ res.failure_reason =
+ rtc::Optional<ProbeFailureReason>(kInvalidSendReceiveRatio);
+ } else if (pr_event.result() == rtclog::BweProbeResult::TIMEOUT) {
+ res.failure_reason = rtc::Optional<ProbeFailureReason>(kTimeout);
+ } else {
+ RTC_NOTREACHED();
+ }
+
+ return res;
+}
} // namespace webrtc
diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
index 1460a4c..bb3c406 100644
--- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
+++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h
@@ -35,6 +35,21 @@
friend class RtcEventLogTestHelper;
public:
+ struct BweProbeClusterCreatedEvent {
+ uint64_t timestamp;
+ uint32_t id;
+ uint64_t bitrate_bps;
+ uint32_t min_packets;
+ uint32_t min_bytes;
+ };
+
+ struct BweProbeResultEvent {
+ uint64_t timestamp;
+ uint32_t id;
+ rtc::Optional<uint64_t> bitrate_bps;
+ rtc::Optional<ProbeFailureReason> failure_reason;
+ };
+
enum EventType {
UNKNOWN_EVENT = 0,
LOG_START = 1,
@@ -142,6 +157,11 @@
size_t index,
AudioNetworkAdaptor::EncoderRuntimeConfig* config) const;
+ ParsedRtcEventLog::BweProbeClusterCreatedEvent GetBweProbeClusterCreated(
+ size_t index) const;
+
+ ParsedRtcEventLog::BweProbeResultEvent GetBweProbeResult(size_t index) const;
+
private:
std::vector<rtclog::Event> events_;
};
diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
index c986ff7..ba95c25 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.cc
+++ b/webrtc/tools/event_log_visualizer/analyzer.cc
@@ -477,9 +477,12 @@
break;
}
case ParsedRtcEventLog::BWE_PROBE_CLUSTER_CREATED_EVENT: {
+ bwe_probe_cluster_created_events_.push_back(
+ parsed_log_.GetBweProbeClusterCreated(i));
break;
}
case ParsedRtcEventLog::BWE_PROBE_RESULT_EVENT: {
+ bwe_probe_result_events_.push_back(parsed_log_.GetBweProbeResult(i));
break;
}
case ParsedRtcEventLog::UNKNOWN_EVENT: {
@@ -938,7 +941,26 @@
float y = static_cast<float>(bwe_update.new_bitrate) / 1000;
time_series->points.emplace_back(x, y);
}
+
+ TimeSeries* created_series =
+ plot->AddTimeSeries("Probe cluster created.", DOT_GRAPH);
+ for (auto& cluster : bwe_probe_cluster_created_events_) {
+ float x = static_cast<float>(cluster.timestamp - begin_time_) / 1000000;
+ float y = static_cast<float>(cluster.bitrate_bps) / 1000;
+ created_series->points.emplace_back(x, y);
+ }
+
+ TimeSeries* result_series =
+ plot->AddTimeSeries("Probing results.", DOT_GRAPH);
+ for (auto& result : bwe_probe_result_events_) {
+ if (result.bitrate_bps) {
+ float x = static_cast<float>(result.timestamp - begin_time_) / 1000000;
+ float y = static_cast<float>(*result.bitrate_bps) / 1000;
+ result_series->points.emplace_back(x, y);
+ }
+ }
}
+
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/analyzer.h b/webrtc/tools/event_log_visualizer/analyzer.h
index 9773f2f..1acf756 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.h
+++ b/webrtc/tools/event_log_visualizer/analyzer.h
@@ -167,6 +167,11 @@
std::vector<AudioNetworkAdaptationEvent> audio_network_adaptation_events_;
+ std::vector<ParsedRtcEventLog::BweProbeClusterCreatedEvent>
+ bwe_probe_cluster_created_events_;
+
+ std::vector<ParsedRtcEventLog::BweProbeResultEvent> bwe_probe_result_events_;
+
// Window and step size used for calculating moving averages, e.g. bitrate.
// The generated data points will be |step_| microseconds apart.
// Only events occuring at most |window_duration_| microseconds before the
diff --git a/webrtc/tools/event_log_visualizer/chart.proto b/webrtc/tools/event_log_visualizer/chart.proto
index e005391..41e3ebd 100644
--- a/webrtc/tools/event_log_visualizer/chart.proto
+++ b/webrtc/tools/event_log_visualizer/chart.proto
@@ -10,6 +10,7 @@
LINE_CHART = 1;
BAR_CHART = 2;
LINE_STEP_CHART = 3;
+ SCATTER_CHART = 4;
}
}
diff --git a/webrtc/tools/event_log_visualizer/plot_base.h b/webrtc/tools/event_log_visualizer/plot_base.h
index 0c0ebc0..b2ab299 100644
--- a/webrtc/tools/event_log_visualizer/plot_base.h
+++ b/webrtc/tools/event_log_visualizer/plot_base.h
@@ -18,7 +18,13 @@
namespace webrtc {
namespace plotting {
-enum PlotStyle { LINE_GRAPH, LINE_DOT_GRAPH, BAR_GRAPH, LINE_STEP_GRAPH };
+enum PlotStyle {
+ LINE_GRAPH,
+ LINE_DOT_GRAPH,
+ BAR_GRAPH,
+ LINE_STEP_GRAPH,
+ DOT_GRAPH
+};
struct TimeSeriesPoint {
TimeSeriesPoint(float x, float y) : x(x), y(y) {}
diff --git a/webrtc/tools/event_log_visualizer/plot_protobuf.cc b/webrtc/tools/event_log_visualizer/plot_protobuf.cc
index 6e45585..d5e9192 100644
--- a/webrtc/tools/event_log_visualizer/plot_protobuf.cc
+++ b/webrtc/tools/event_log_visualizer/plot_protobuf.cc
@@ -40,6 +40,9 @@
data_set->set_highlight_points(true);
} else if (series_list_[i].style == LINE_STEP_GRAPH) {
data_set->set_style(webrtc::analytics::ChartStyle::LINE_STEP_CHART);
+ } else if (series_list_[i].style == DOT_GRAPH) {
+ data_set->set_style(webrtc::analytics::ChartStyle::SCATTER_CHART);
+ data_set->set_highlight_points(true);
} else {
data_set->set_style(webrtc::analytics::ChartStyle::UNDEFINED);
}
diff --git a/webrtc/tools/event_log_visualizer/plot_python.cc b/webrtc/tools/event_log_visualizer/plot_python.cc
index c91efe3..863c05f 100644
--- a/webrtc/tools/event_log_visualizer/plot_python.cc
+++ b/webrtc/tools/event_log_visualizer/plot_python.cc
@@ -75,6 +75,11 @@
"plt.plot(x%zu[1:], y%zu[:-1], color=rgb_colors[%zu], "
"label=\'%s\')\n",
i, i, i, series_list_[i].label.c_str());
+ } else if (series_list_[i].style == DOT_GRAPH) {
+ printf(
+ "plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\', "
+ "marker='.', ls=' ')\n",
+ i, i, i, series_list_[i].label.c_str());
} else {
printf("raise Exception(\"Unknown graph type\")\n");
}