diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/libwebrtc/rtc_tools/rtc_event_log_visualizer/plot_base.h | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_tools/rtc_event_log_visualizer/plot_base.h b/third_party/libwebrtc/rtc_tools/rtc_event_log_visualizer/plot_base.h new file mode 100644 index 0000000000..dbc9535fc1 --- /dev/null +++ b/third_party/libwebrtc/rtc_tools/rtc_event_log_visualizer/plot_base.h @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_PLOT_BASE_H_ +#define RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_PLOT_BASE_H_ + +#include <memory> +#include <string> +#include <utility> +#include <vector> + +#include "absl/base/attributes.h" +#include "absl/types/optional.h" +#include "rtc_base/ignore_wundef.h" + +RTC_PUSH_IGNORING_WUNDEF() +#include "rtc_tools/rtc_event_log_visualizer/proto/chart.pb.h" +RTC_POP_IGNORING_WUNDEF() + +namespace webrtc { + +enum class LineStyle { + kNone, // No line connecting the points. Used to create scatter plots. + kLine, // Straight line between consecutive points. + kStep, // Horizontal line until the next value. Used for state changes. + kBar // Vertical bars from the x-axis to the point. +}; + +enum class PointStyle { + kNone, // Don't draw the points. + kHighlight // Draw circles or dots to highlight the points. +}; + +struct TimeSeriesPoint { + TimeSeriesPoint(float x, float y) : x(x), y(y) {} + float x; + float y; +}; + +struct TimeSeries { + TimeSeries() = default; // TODO(terelius): Remove the default constructor. + TimeSeries(const char* label, + LineStyle line_style, + PointStyle point_style = PointStyle::kNone) + : label(label), line_style(line_style), point_style(point_style) {} + TimeSeries(const std::string& label, + LineStyle line_style, + PointStyle point_style = PointStyle::kNone) + : label(label), line_style(line_style), point_style(point_style) {} + TimeSeries(TimeSeries&& other) + : label(std::move(other.label)), + line_style(other.line_style), + point_style(other.point_style), + points(std::move(other.points)) {} + TimeSeries& operator=(TimeSeries&& other) { + label = std::move(other.label); + line_style = other.line_style; + point_style = other.point_style; + points = std::move(other.points); + return *this; + } + + std::string label; + LineStyle line_style = LineStyle::kLine; + PointStyle point_style = PointStyle::kNone; + std::vector<TimeSeriesPoint> points; +}; + +struct Interval { + Interval() = default; + Interval(double begin, double end) : begin(begin), end(end) {} + + double begin; + double end; +}; + +struct IntervalSeries { + enum Orientation { kHorizontal, kVertical }; + + IntervalSeries() = default; + IntervalSeries(const std::string& label, + const std::string& color, + IntervalSeries::Orientation orientation) + : label(label), color(color), orientation(orientation) {} + + std::string label; + std::string color; + Orientation orientation; + std::vector<Interval> intervals; +}; + +// A container that represents a general graph, with axes, title and one or +// more data series. A subclass should define the output format by overriding +// the Draw() method. +class Plot { + public: + virtual ~Plot() {} + + ABSL_DEPRECATED("Use PrintPythonCode() or ExportProtobuf() instead.") + virtual void Draw() {} + + // Sets the lower x-axis limit to min_value (if left_margin == 0). + // Sets the upper x-axis limit to max_value (if right_margin == 0). + // The margins are measured as fractions of the interval + // (max_value - min_value) and are added to either side of the plot. + void SetXAxis(float min_value, + float max_value, + std::string label, + float left_margin = 0, + float right_margin = 0); + + // Sets the lower and upper x-axis limits based on min_value and max_value, + // but modified such that all points in the data series can be represented + // on the x-axis. The margins are measured as fractions of the range of + // x-values and are added to either side of the plot. + void SetSuggestedXAxis(float min_value, + float max_value, + std::string label, + float left_margin = 0, + float right_margin = 0); + + // Sets the lower y-axis limit to min_value (if bottom_margin == 0). + // Sets the upper y-axis limit to max_value (if top_margin == 0). + // The margins are measured as fractions of the interval + // (max_value - min_value) and are added to either side of the plot. + void SetYAxis(float min_value, + float max_value, + std::string label, + float bottom_margin = 0, + float top_margin = 0); + + // Sets the lower and upper y-axis limits based on min_value and max_value, + // but modified such that all points in the data series can be represented + // on the y-axis. The margins are measured as fractions of the range of + // y-values and are added to either side of the plot. + void SetSuggestedYAxis(float min_value, + float max_value, + std::string label, + float bottom_margin = 0, + float top_margin = 0); + + void SetYAxisTickLabels( + const std::vector<std::pair<float, std::string>>& labels); + + // Sets the title of the plot. + void SetTitle(const std::string& title); + + // Sets an unique ID for the plot. The ID is similar to the title except that + // the title might change in future releases whereas the ID should be stable + // over time. + void SetId(const std::string& id); + + // Add a new TimeSeries to the plot. + void AppendTimeSeries(TimeSeries&& time_series); + + // Add a new IntervalSeries to the plot. + void AppendIntervalSeries(IntervalSeries&& interval_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); + + // Replaces PythonPlot::Draw() + void PrintPythonCode() const; + + // Replaces ProtobufPlot::Draw() + void ExportProtobuf(webrtc::analytics::Chart* chart) const; + + protected: + float xaxis_min_; + float xaxis_max_; + std::string xaxis_label_; + float yaxis_min_; + float yaxis_max_; + std::string yaxis_label_; + std::vector<std::pair<float, std::string>> yaxis_tick_labels_; + std::string title_; + std::string id_; + std::vector<TimeSeries> series_list_; + std::vector<IntervalSeries> interval_list_; +}; + +class PlotCollection { + public: + virtual ~PlotCollection() {} + + ABSL_DEPRECATED("Use PrintPythonCode() or ExportProtobuf() instead.") + virtual void Draw() {} + + virtual Plot* AppendNewPlot(); + + void SetCallTimeToUtcOffsetMs(int64_t calltime_to_utc_ms) { + calltime_to_utc_ms_ = calltime_to_utc_ms; + } + + // Replaces PythonPlotCollection::Draw() + void PrintPythonCode(bool shared_xaxis) const; + + // Replaces ProtobufPlotCollections::Draw() + void ExportProtobuf(webrtc::analytics::ChartCollection* collection) const; + + protected: + std::vector<std::unique_ptr<Plot>> plots_; + absl::optional<int64_t> calltime_to_utc_ms_; +}; + +} // namespace webrtc + +#endif // RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_PLOT_BASE_H_ |