OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <iostream> | |
12 | |
13 #include "gflags/gflags.h" | |
14 #include "webrtc/call/rtc_event_log_parser.h" | |
15 #include "webrtc/tools/event_log_visualizer/analyzer.h" | |
16 #include "webrtc/tools/event_log_visualizer/plot_base.h" | |
17 #include "webrtc/tools/event_log_visualizer/plot_python.h" | |
18 | |
19 DEFINE_bool(incoming, true, "Plot statistics for incoming packets."); | |
20 DEFINE_bool(outgoing, true, "Plot statistics for outgoing packets."); | |
21 DEFINE_bool(plot_all, true, "Plot all different data types."); | |
22 DEFINE_bool(plot_packets, | |
23 false, | |
24 "Plot bar graph showing the size of each packet."); | |
25 DEFINE_bool(plot_audio_playout, | |
26 false, | |
27 "Plot bar graph showing the time between each audio playout."); | |
28 DEFINE_bool( | |
29 plot_sequence_number, | |
30 false, | |
31 "Plot the difference in sequence number between consecutive packets."); | |
32 DEFINE_bool( | |
33 plot_delay_change, | |
34 false, | |
35 "Plot the difference in 1-way path delay between consecutive packets."); | |
36 DEFINE_bool(plot_accumulated_delay_change, | |
37 false, | |
38 "Plot the accumulated 1-way path delay change, or the path delay " | |
39 "change compared to the first packet."); | |
40 DEFINE_bool(plot_total_bitrate, | |
41 false, | |
42 "Plot the total bitrate used by all streams."); | |
43 DEFINE_bool(plot_stream_bitrate, | |
44 false, | |
45 "Plot the bitrate used by each stream."); | |
46 DEFINE_bool(plot_bwe, | |
47 false, | |
48 "Run the bandwidth estimator with the logged rtp and rtcp and plot " | |
49 "the output."); | |
50 DEFINE_bool(plot_network_delay_feedback, | |
51 false, | |
52 "Compute network delay based on sent packets and the received " | |
53 "transport feedback."); | |
54 DEFINE_bool(plot_fraction_loss, | |
55 false, | |
56 "Plot packet loss in percent for outgoing packets (as perceived by " | |
57 "the send-side bandwidth estimator)."); | |
58 | |
59 int main(int argc, char* argv[]) { | |
60 std::string program_name = argv[0]; | |
61 std::string usage = | |
62 "A tool for visualizing WebRTC event logs.\n" | |
63 "Example usage:\n" + | |
64 program_name + " <logfile> | python\n" + "Run " + program_name + | |
65 " --help for a list of command line options\n"; | |
66 google::SetUsageMessage(usage); | |
67 google::ParseCommandLineFlags(&argc, &argv, true); | |
68 | |
69 if (argc != 2) { | |
70 // Print usage information. | |
71 std::cout << google::ProgramUsage(); | |
72 return 0; | |
73 } | |
74 | |
75 std::string filename = argv[1]; | |
76 | |
77 webrtc::ParsedRtcEventLog parsed_log; | |
78 | |
79 if (!parsed_log.ParseFile(filename)) { | |
80 std::cerr << "Could not parse the entire log file." << std::endl; | |
81 std::cerr << "Proceeding to analyze the first " | |
82 << parsed_log.GetNumberOfEvents() << " events in the file." | |
83 << std::endl; | |
84 } | |
85 | |
86 webrtc::plotting::EventLogAnalyzer analyzer(parsed_log); | |
87 std::unique_ptr<webrtc::plotting::PlotCollection> collection( | |
88 new webrtc::plotting::PythonPlotCollection()); | |
89 | |
90 if (FLAGS_plot_all || FLAGS_plot_packets) { | |
91 if (FLAGS_incoming) { | |
92 analyzer.CreatePacketGraph(webrtc::PacketDirection::kIncomingPacket, | |
93 collection->AppendNewPlot()); | |
94 } | |
95 if (FLAGS_outgoing) { | |
96 analyzer.CreatePacketGraph(webrtc::PacketDirection::kOutgoingPacket, | |
97 collection->AppendNewPlot()); | |
98 } | |
99 } | |
100 | |
101 if (FLAGS_plot_all || FLAGS_plot_audio_playout) { | |
102 analyzer.CreatePlayoutGraph(collection->AppendNewPlot()); | |
103 } | |
104 | |
105 if (FLAGS_plot_all || FLAGS_plot_sequence_number) { | |
106 if (FLAGS_incoming) { | |
107 analyzer.CreateSequenceNumberGraph(collection->AppendNewPlot()); | |
108 } | |
109 } | |
110 | |
111 if (FLAGS_plot_all || FLAGS_plot_delay_change) { | |
112 if (FLAGS_incoming) { | |
113 analyzer.CreateDelayChangeGraph(collection->AppendNewPlot()); | |
114 } | |
115 } | |
116 | |
117 if (FLAGS_plot_all || FLAGS_plot_accumulated_delay_change) { | |
118 if (FLAGS_incoming) { | |
119 analyzer.CreateAccumulatedDelayChangeGraph(collection->AppendNewPlot()); | |
120 } | |
121 } | |
122 | |
123 if (FLAGS_plot_all || FLAGS_plot_fraction_loss) { | |
124 analyzer.CreateFractionLossGraph(collection->AppendNewPlot()); | |
125 } | |
126 | |
127 if (FLAGS_plot_all || FLAGS_plot_total_bitrate) { | |
128 if (FLAGS_incoming) { | |
129 analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kIncomingPacket, | |
130 collection->AppendNewPlot()); | |
131 } | |
132 if (FLAGS_outgoing) { | |
133 analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kOutgoingPacket, | |
134 collection->AppendNewPlot()); | |
135 } | |
136 } | |
137 | |
138 if (FLAGS_plot_all || FLAGS_plot_stream_bitrate) { | |
139 if (FLAGS_incoming) { | |
140 analyzer.CreateStreamBitrateGraph( | |
141 webrtc::PacketDirection::kIncomingPacket, | |
142 collection->AppendNewPlot()); | |
143 } | |
144 if (FLAGS_outgoing) { | |
145 analyzer.CreateStreamBitrateGraph( | |
146 webrtc::PacketDirection::kOutgoingPacket, | |
147 collection->AppendNewPlot()); | |
148 } | |
149 } | |
150 | |
151 if (FLAGS_plot_all || FLAGS_plot_bwe) { | |
152 analyzer.CreateBweGraph(collection->AppendNewPlot()); | |
153 } | |
154 | |
155 if (FLAGS_plot_all || FLAGS_plot_network_delay_feedback) { | |
156 analyzer.CreateNetworkDelayFeebackGraph(collection->AppendNewPlot()); | |
157 } | |
158 | |
159 collection->Draw(); | |
160 | |
161 return 0; | |
162 } | |
OLD | NEW |