| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |     2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 
|     3  * |     3  * | 
|     4  *  Use of this source code is governed by a BSD-style license |     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 |     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 |     6  *  tree. An additional intellectual property rights grant can be found | 
|     7  *  in the file PATENTS.  All contributing project authors may |     7  *  in the file PATENTS.  All contributing project authors may | 
|     8  *  be found in the AUTHORS file in the root of the source tree. |     8  *  be found in the AUTHORS file in the root of the source tree. | 
|     9  */ |     9  */ | 
|    10  |    10  | 
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   565                                          Plot* plot) { |   565                                          Plot* plot) { | 
|   566   for (auto& kv : rtp_packets_) { |   566   for (auto& kv : rtp_packets_) { | 
|   567     StreamId stream_id = kv.first; |   567     StreamId stream_id = kv.first; | 
|   568     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   568     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   569     // Filter on direction and SSRC. |   569     // Filter on direction and SSRC. | 
|   570     if (stream_id.GetDirection() != desired_direction || |   570     if (stream_id.GetDirection() != desired_direction || | 
|   571         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |   571         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 
|   572       continue; |   572       continue; | 
|   573     } |   573     } | 
|   574  |   574  | 
|   575     TimeSeries time_series; |   575     TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH); | 
|   576     time_series.label = GetStreamName(stream_id); |  | 
|   577     time_series.style = BAR_GRAPH; |  | 
|   578     ProcessPoints<LoggedRtpPacket>( |   576     ProcessPoints<LoggedRtpPacket>( | 
|   579         [](const LoggedRtpPacket& packet) -> rtc::Optional<float> { |   577         [](const LoggedRtpPacket& packet) -> rtc::Optional<float> { | 
|   580           return rtc::Optional<float>(packet.total_length); |   578           return rtc::Optional<float>(packet.total_length); | 
|   581         }, |   579         }, | 
|   582         packet_stream, begin_time_, &time_series); |   580         packet_stream, begin_time_, &time_series); | 
|   583     plot->series_list_.push_back(std::move(time_series)); |   581     plot->series_list_.push_back(std::move(time_series)); | 
|   584   } |   582   } | 
|   585  |   583  | 
|   586   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   584   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   587   plot->SetSuggestedYAxis(0, 1, "Packet size (bytes)", kBottomMargin, |   585   plot->SetSuggestedYAxis(0, 1, "Packet size (bytes)", kBottomMargin, | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|   601     const std::string& label_prefix) { |   599     const std::string& label_prefix) { | 
|   602   for (auto& kv : packets) { |   600   for (auto& kv : packets) { | 
|   603     StreamId stream_id = kv.first; |   601     StreamId stream_id = kv.first; | 
|   604     const std::vector<T>& packet_stream = kv.second; |   602     const std::vector<T>& packet_stream = kv.second; | 
|   605     // Filter on direction and SSRC. |   603     // Filter on direction and SSRC. | 
|   606     if (stream_id.GetDirection() != desired_direction || |   604     if (stream_id.GetDirection() != desired_direction || | 
|   607         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |   605         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 
|   608       continue; |   606       continue; | 
|   609     } |   607     } | 
|   610  |   608  | 
|   611     TimeSeries time_series; |   609     std::string label = label_prefix + " " + GetStreamName(stream_id); | 
|   612     time_series.label = label_prefix + " " + GetStreamName(stream_id); |   610     TimeSeries time_series(label, LINE_STEP_GRAPH); | 
|   613     time_series.style = LINE_STEP_GRAPH; |  | 
|   614  |  | 
|   615     for (size_t i = 0; i < packet_stream.size(); i++) { |   611     for (size_t i = 0; i < packet_stream.size(); i++) { | 
|   616       float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) / |   612       float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) / | 
|   617                 1000000; |   613                 1000000; | 
|   618       time_series.points.emplace_back(x, i + 1); |   614       time_series.points.emplace_back(x, i + 1); | 
|   619     } |   615     } | 
|   620  |   616  | 
|   621     plot->series_list_.push_back(std::move(time_series)); |   617     plot->series_list_.push_back(std::move(time_series)); | 
|   622   } |   618   } | 
|   623 } |   619 } | 
|   624  |   620  | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   715 void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) { |   711 void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) { | 
|   716   for (auto& kv : rtp_packets_) { |   712   for (auto& kv : rtp_packets_) { | 
|   717     StreamId stream_id = kv.first; |   713     StreamId stream_id = kv.first; | 
|   718     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   714     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   719     // Filter on direction and SSRC. |   715     // Filter on direction and SSRC. | 
|   720     if (stream_id.GetDirection() != kIncomingPacket || |   716     if (stream_id.GetDirection() != kIncomingPacket || | 
|   721         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |   717         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 
|   722       continue; |   718       continue; | 
|   723     } |   719     } | 
|   724  |   720  | 
|   725     TimeSeries time_series; |   721     TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH); | 
|   726     time_series.label = GetStreamName(stream_id); |  | 
|   727     time_series.style = BAR_GRAPH; |  | 
|   728     ProcessPairs<LoggedRtpPacket, float>( |   722     ProcessPairs<LoggedRtpPacket, float>( | 
|   729         [](const LoggedRtpPacket& old_packet, |   723         [](const LoggedRtpPacket& old_packet, | 
|   730            const LoggedRtpPacket& new_packet) { |   724            const LoggedRtpPacket& new_packet) { | 
|   731           int64_t diff = |   725           int64_t diff = | 
|   732               WrappingDifference(new_packet.header.sequenceNumber, |   726               WrappingDifference(new_packet.header.sequenceNumber, | 
|   733                                  old_packet.header.sequenceNumber, 1ul << 16); |   727                                  old_packet.header.sequenceNumber, 1ul << 16); | 
|   734           return rtc::Optional<float>(diff); |   728           return rtc::Optional<float>(diff); | 
|   735         }, |   729         }, | 
|   736         packet_stream, begin_time_, &time_series); |   730         packet_stream, begin_time_, &time_series); | 
|   737     plot->series_list_.push_back(std::move(time_series)); |   731     plot->series_list_.push_back(std::move(time_series)); | 
|   738   } |   732   } | 
|   739  |   733  | 
|   740   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   734   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   741   plot->SetSuggestedYAxis(0, 1, "Difference since last packet", kBottomMargin, |   735   plot->SetSuggestedYAxis(0, 1, "Difference since last packet", kBottomMargin, | 
|   742                           kTopMargin); |   736                           kTopMargin); | 
|   743   plot->SetTitle("Sequence number"); |   737   plot->SetTitle("Sequence number"); | 
|   744 } |   738 } | 
|   745  |   739  | 
|   746 void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) { |   740 void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) { | 
|   747   for (auto& kv : rtp_packets_) { |   741   for (auto& kv : rtp_packets_) { | 
|   748     StreamId stream_id = kv.first; |   742     StreamId stream_id = kv.first; | 
|   749     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   743     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   750     // Filter on direction and SSRC. |   744     // Filter on direction and SSRC. | 
|   751     if (stream_id.GetDirection() != kIncomingPacket || |   745     if (stream_id.GetDirection() != kIncomingPacket || | 
|   752         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || |   746         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || | 
|   753         packet_stream.size() == 0) { |   747         packet_stream.size() == 0) { | 
|   754       continue; |   748       continue; | 
|   755     } |   749     } | 
|   756  |   750  | 
|   757     TimeSeries time_series; |   751     TimeSeries time_series(GetStreamName(stream_id), LINE_DOT_GRAPH); | 
|   758     time_series.label = GetStreamName(stream_id); |  | 
|   759     time_series.style = LINE_DOT_GRAPH; |  | 
|   760     const uint64_t kWindowUs = 1000000; |   752     const uint64_t kWindowUs = 1000000; | 
|   761     const uint64_t kStep = 1000000; |   753     const uint64_t kStep = 1000000; | 
|   762     SequenceNumberUnwrapper unwrapper_; |   754     SequenceNumberUnwrapper unwrapper_; | 
|   763     SequenceNumberUnwrapper prior_unwrapper_; |   755     SequenceNumberUnwrapper prior_unwrapper_; | 
|   764     size_t window_index_begin = 0; |   756     size_t window_index_begin = 0; | 
|   765     size_t window_index_end = 0; |   757     size_t window_index_end = 0; | 
|   766     int64_t highest_seq_number = |   758     int64_t highest_seq_number = | 
|   767         unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1; |   759         unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1; | 
|   768     int64_t highest_prior_seq_number = |   760     int64_t highest_prior_seq_number = | 
|   769         prior_unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1; |   761         prior_unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1; | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   807     StreamId stream_id = kv.first; |   799     StreamId stream_id = kv.first; | 
|   808     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   800     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   809     // Filter on direction and SSRC. |   801     // Filter on direction and SSRC. | 
|   810     if (stream_id.GetDirection() != kIncomingPacket || |   802     if (stream_id.GetDirection() != kIncomingPacket || | 
|   811         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || |   803         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || | 
|   812         IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || |   804         IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || | 
|   813         IsRtxSsrc(stream_id)) { |   805         IsRtxSsrc(stream_id)) { | 
|   814       continue; |   806       continue; | 
|   815     } |   807     } | 
|   816  |   808  | 
|   817     TimeSeries capture_time_data; |   809     TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time", | 
|   818     capture_time_data.label = GetStreamName(stream_id) + " capture-time"; |   810                                  BAR_GRAPH); | 
|   819     capture_time_data.style = BAR_GRAPH; |  | 
|   820     ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime, |   811     ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime, | 
|   821                                           packet_stream, begin_time_, |   812                                           packet_stream, begin_time_, | 
|   822                                           &capture_time_data); |   813                                           &capture_time_data); | 
|   823     plot->series_list_.push_back(std::move(capture_time_data)); |   814     plot->series_list_.push_back(std::move(capture_time_data)); | 
|   824  |   815  | 
|   825     TimeSeries send_time_data; |   816     TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time", | 
|   826     send_time_data.label = GetStreamName(stream_id) + " abs-send-time"; |   817                               BAR_GRAPH); | 
|   827     send_time_data.style = BAR_GRAPH; |  | 
|   828     ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime, |   818     ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime, | 
|   829                                           packet_stream, begin_time_, |   819                                           packet_stream, begin_time_, | 
|   830                                           &send_time_data); |   820                                           &send_time_data); | 
|   831     plot->series_list_.push_back(std::move(send_time_data)); |   821     plot->series_list_.push_back(std::move(send_time_data)); | 
|   832   } |   822   } | 
|   833  |   823  | 
|   834   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   824   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   835   plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, |   825   plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, | 
|   836                           kTopMargin); |   826                           kTopMargin); | 
|   837   plot->SetTitle("Network latency change between consecutive packets"); |   827   plot->SetTitle("Network latency change between consecutive packets"); | 
|   838 } |   828 } | 
|   839  |   829  | 
|   840 void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) { |   830 void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) { | 
|   841   for (auto& kv : rtp_packets_) { |   831   for (auto& kv : rtp_packets_) { | 
|   842     StreamId stream_id = kv.first; |   832     StreamId stream_id = kv.first; | 
|   843     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   833     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   844     // Filter on direction and SSRC. |   834     // Filter on direction and SSRC. | 
|   845     if (stream_id.GetDirection() != kIncomingPacket || |   835     if (stream_id.GetDirection() != kIncomingPacket || | 
|   846         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || |   836         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) || | 
|   847         IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || |   837         IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) || | 
|   848         IsRtxSsrc(stream_id)) { |   838         IsRtxSsrc(stream_id)) { | 
|   849       continue; |   839       continue; | 
|   850     } |   840     } | 
|   851  |   841  | 
|   852     TimeSeries capture_time_data; |   842     TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time", | 
|   853     capture_time_data.label = GetStreamName(stream_id) + " capture-time"; |   843                                  LINE_GRAPH); | 
|   854     capture_time_data.style = LINE_GRAPH; |  | 
|   855     AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime, |   844     AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime, | 
|   856                                              packet_stream, begin_time_, |   845                                              packet_stream, begin_time_, | 
|   857                                              &capture_time_data); |   846                                              &capture_time_data); | 
|   858     plot->series_list_.push_back(std::move(capture_time_data)); |   847     plot->series_list_.push_back(std::move(capture_time_data)); | 
|   859  |   848  | 
|   860     TimeSeries send_time_data; |   849     TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time", | 
|   861     send_time_data.label = GetStreamName(stream_id) + " abs-send-time"; |   850                               LINE_GRAPH); | 
|   862     send_time_data.style = LINE_GRAPH; |  | 
|   863     AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime, |   851     AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime, | 
|   864                                              packet_stream, begin_time_, |   852                                              packet_stream, begin_time_, | 
|   865                                              &send_time_data); |   853                                              &send_time_data); | 
|   866     plot->series_list_.push_back(std::move(send_time_data)); |   854     plot->series_list_.push_back(std::move(send_time_data)); | 
|   867   } |   855   } | 
|   868  |   856  | 
|   869   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   857   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   870   plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, |   858   plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin, | 
|   871                           kTopMargin); |   859                           kTopMargin); | 
|   872   plot->SetTitle("Accumulated network latency change"); |   860   plot->SetTitle("Accumulated network latency change"); | 
|   873 } |   861 } | 
|   874  |   862  | 
|   875 // Plot the fraction of packets lost (as perceived by the loss-based BWE). |   863 // Plot the fraction of packets lost (as perceived by the loss-based BWE). | 
|   876 void EventLogAnalyzer::CreateFractionLossGraph(Plot* plot) { |   864 void EventLogAnalyzer::CreateFractionLossGraph(Plot* plot) { | 
|   877   plot->series_list_.push_back(TimeSeries()); |   865   TimeSeries* time_series = | 
 |   866       plot->AddTimeSeries("Fraction lost", LINE_DOT_GRAPH); | 
|   878   for (auto& bwe_update : bwe_loss_updates_) { |   867   for (auto& bwe_update : bwe_loss_updates_) { | 
|   879     float x = static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000; |   868     float x = static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000; | 
|   880     float y = static_cast<float>(bwe_update.fraction_loss) / 255 * 100; |   869     float y = static_cast<float>(bwe_update.fraction_loss) / 255 * 100; | 
|   881     plot->series_list_.back().points.emplace_back(x, y); |   870     time_series->points.emplace_back(x, y); | 
|   882   } |   871   } | 
|   883   plot->series_list_.back().label = "Fraction lost"; |  | 
|   884   plot->series_list_.back().style = LINE_DOT_GRAPH; |  | 
|   885  |   872  | 
|   886   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   873   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   887   plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin, |   874   plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin, | 
|   888                           kTopMargin); |   875                           kTopMargin); | 
|   889   plot->SetTitle("Reported packet loss"); |   876   plot->SetTitle("Reported packet loss"); | 
|   890 } |   877 } | 
|   891  |   878  | 
|   892 // Plot the total bandwidth used by all RTP streams. |   879 // Plot the total bandwidth used by all RTP streams. | 
|   893 void EventLogAnalyzer::CreateTotalBitrateGraph( |   880 void EventLogAnalyzer::CreateTotalBitrateGraph( | 
|   894     PacketDirection desired_direction, |   881     PacketDirection desired_direction, | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|   914         packets.push_back(TimestampSize(timestamp, total_length)); |   901         packets.push_back(TimestampSize(timestamp, total_length)); | 
|   915       } |   902       } | 
|   916     } |   903     } | 
|   917   } |   904   } | 
|   918  |   905  | 
|   919   size_t window_index_begin = 0; |   906   size_t window_index_begin = 0; | 
|   920   size_t window_index_end = 0; |   907   size_t window_index_end = 0; | 
|   921   size_t bytes_in_window = 0; |   908   size_t bytes_in_window = 0; | 
|   922  |   909  | 
|   923   // Calculate a moving average of the bitrate and store in a TimeSeries. |   910   // Calculate a moving average of the bitrate and store in a TimeSeries. | 
|   924   plot->series_list_.push_back(TimeSeries()); |   911   TimeSeries* time_series = plot->AddTimeSeries("Bitrate", LINE_GRAPH); | 
|   925   for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) { |   912   for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) { | 
|   926     while (window_index_end < packets.size() && |   913     while (window_index_end < packets.size() && | 
|   927            packets[window_index_end].timestamp < time) { |   914            packets[window_index_end].timestamp < time) { | 
|   928       bytes_in_window += packets[window_index_end].size; |   915       bytes_in_window += packets[window_index_end].size; | 
|   929       ++window_index_end; |   916       ++window_index_end; | 
|   930     } |   917     } | 
|   931     while (window_index_begin < packets.size() && |   918     while (window_index_begin < packets.size() && | 
|   932            packets[window_index_begin].timestamp < time - window_duration_) { |   919            packets[window_index_begin].timestamp < time - window_duration_) { | 
|   933       RTC_DCHECK_LE(packets[window_index_begin].size, bytes_in_window); |   920       RTC_DCHECK_LE(packets[window_index_begin].size, bytes_in_window); | 
|   934       bytes_in_window -= packets[window_index_begin].size; |   921       bytes_in_window -= packets[window_index_begin].size; | 
|   935       ++window_index_begin; |   922       ++window_index_begin; | 
|   936     } |   923     } | 
|   937     float window_duration_in_seconds = |   924     float window_duration_in_seconds = | 
|   938         static_cast<float>(window_duration_) / 1000000; |   925         static_cast<float>(window_duration_) / 1000000; | 
|   939     float x = static_cast<float>(time - begin_time_) / 1000000; |   926     float x = static_cast<float>(time - begin_time_) / 1000000; | 
|   940     float y = bytes_in_window * 8 / window_duration_in_seconds / 1000; |   927     float y = bytes_in_window * 8 / window_duration_in_seconds / 1000; | 
|   941     plot->series_list_.back().points.push_back(TimeSeriesPoint(x, y)); |   928     time_series->points.emplace_back(x, y); | 
|   942   } |   929   } | 
|   943  |   930  | 
|   944   // Set labels. |  | 
|   945   if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { |  | 
|   946     plot->series_list_.back().label = "Incoming bitrate"; |  | 
|   947   } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) { |  | 
|   948     plot->series_list_.back().label = "Outgoing bitrate"; |  | 
|   949   } |  | 
|   950   plot->series_list_.back().style = LINE_GRAPH; |  | 
|   951  |  | 
|   952   // Overlay the send-side bandwidth estimate over the outgoing bitrate. |   931   // Overlay the send-side bandwidth estimate over the outgoing bitrate. | 
|   953   if (desired_direction == kOutgoingPacket) { |   932   if (desired_direction == kOutgoingPacket) { | 
|   954     plot->series_list_.push_back(TimeSeries()); |   933     TimeSeries* time_series = | 
 |   934         plot->AddTimeSeries("Loss-based estimate", LINE_STEP_GRAPH); | 
|   955     for (auto& bwe_update : bwe_loss_updates_) { |   935     for (auto& bwe_update : bwe_loss_updates_) { | 
|   956       float x = |   936       float x = | 
|   957           static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000; |   937           static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000; | 
|   958       float y = static_cast<float>(bwe_update.new_bitrate) / 1000; |   938       float y = static_cast<float>(bwe_update.new_bitrate) / 1000; | 
|   959       plot->series_list_.back().points.emplace_back(x, y); |   939       time_series->points.emplace_back(x, y); | 
|   960     } |   940     } | 
|   961     plot->series_list_.back().label = "Loss-based estimate"; |  | 
|   962     plot->series_list_.back().style = LINE_STEP_GRAPH; |  | 
|   963   } |   941   } | 
|   964   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   942   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|   965   plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); |   943   plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin); | 
|   966   if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { |   944   if (desired_direction == webrtc::PacketDirection::kIncomingPacket) { | 
|   967     plot->SetTitle("Incoming RTP bitrate"); |   945     plot->SetTitle("Incoming RTP bitrate"); | 
|   968   } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) { |   946   } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) { | 
|   969     plot->SetTitle("Outgoing RTP bitrate"); |   947     plot->SetTitle("Outgoing RTP bitrate"); | 
|   970   } |   948   } | 
|   971 } |   949 } | 
|   972  |   950  | 
|   973 // For each SSRC, plot the bandwidth used by that stream. |   951 // For each SSRC, plot the bandwidth used by that stream. | 
|   974 void EventLogAnalyzer::CreateStreamBitrateGraph( |   952 void EventLogAnalyzer::CreateStreamBitrateGraph( | 
|   975     PacketDirection desired_direction, |   953     PacketDirection desired_direction, | 
|   976     Plot* plot) { |   954     Plot* plot) { | 
|   977   for (auto& kv : rtp_packets_) { |   955   for (auto& kv : rtp_packets_) { | 
|   978     StreamId stream_id = kv.first; |   956     StreamId stream_id = kv.first; | 
|   979     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; |   957     const std::vector<LoggedRtpPacket>& packet_stream = kv.second; | 
|   980     // Filter on direction and SSRC. |   958     // Filter on direction and SSRC. | 
|   981     if (stream_id.GetDirection() != desired_direction || |   959     if (stream_id.GetDirection() != desired_direction || | 
|   982         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { |   960         !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) { | 
|   983       continue; |   961       continue; | 
|   984     } |   962     } | 
|   985  |   963  | 
|   986     TimeSeries time_series; |   964     TimeSeries time_series(GetStreamName(stream_id), LINE_GRAPH); | 
|   987     time_series.label = GetStreamName(stream_id); |  | 
|   988     time_series.style = LINE_GRAPH; |  | 
|   989     MovingAverage<LoggedRtpPacket, double>( |   965     MovingAverage<LoggedRtpPacket, double>( | 
|   990         [](const LoggedRtpPacket& packet) { |   966         [](const LoggedRtpPacket& packet) { | 
|   991           return rtc::Optional<double>(packet.total_length * 8.0 / 1000.0); |   967           return rtc::Optional<double>(packet.total_length * 8.0 / 1000.0); | 
|   992         }, |   968         }, | 
|   993         packet_stream, begin_time_, end_time_, window_duration_, step_, |   969         packet_stream, begin_time_, end_time_, window_duration_, step_, | 
|   994         &time_series); |   970         &time_series); | 
|   995     plot->series_list_.push_back(std::move(time_series)); |   971     plot->series_list_.push_back(std::move(time_series)); | 
|   996   } |   972   } | 
|   997  |   973  | 
|   998   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |   974   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  1026   SimulatedClock clock(0); |  1002   SimulatedClock clock(0); | 
|  1027   BitrateObserver observer; |  1003   BitrateObserver observer; | 
|  1028   RtcEventLogNullImpl null_event_log; |  1004   RtcEventLogNullImpl null_event_log; | 
|  1029   PacketRouter packet_router; |  1005   PacketRouter packet_router; | 
|  1030   CongestionController cc(&clock, &observer, &observer, &null_event_log, |  1006   CongestionController cc(&clock, &observer, &observer, &null_event_log, | 
|  1031                           &packet_router); |  1007                           &packet_router); | 
|  1032   // TODO(holmer): Log the call config and use that here instead. |  1008   // TODO(holmer): Log the call config and use that here instead. | 
|  1033   static const uint32_t kDefaultStartBitrateBps = 300000; |  1009   static const uint32_t kDefaultStartBitrateBps = 300000; | 
|  1034   cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1); |  1010   cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1); | 
|  1035  |  1011  | 
|  1036   TimeSeries time_series; |  1012   TimeSeries time_series("Delay-based estimate", LINE_DOT_GRAPH); | 
|  1037   time_series.label = "Delay-based estimate"; |  1013   TimeSeries acked_time_series("Acked bitrate", LINE_DOT_GRAPH); | 
|  1038   time_series.style = LINE_DOT_GRAPH; |  | 
|  1039   TimeSeries acked_time_series; |  | 
|  1040   acked_time_series.label = "Acked bitrate"; |  | 
|  1041   acked_time_series.style = LINE_DOT_GRAPH; |  | 
|  1042  |  1014  | 
|  1043   auto rtp_iterator = outgoing_rtp.begin(); |  1015   auto rtp_iterator = outgoing_rtp.begin(); | 
|  1044   auto rtcp_iterator = incoming_rtcp.begin(); |  1016   auto rtcp_iterator = incoming_rtcp.begin(); | 
|  1045  |  1017  | 
|  1046   auto NextRtpTime = [&]() { |  1018   auto NextRtpTime = [&]() { | 
|  1047     if (rtp_iterator != outgoing_rtp.end()) |  1019     if (rtp_iterator != outgoing_rtp.end()) | 
|  1048       return static_cast<int64_t>(rtp_iterator->first); |  1020       return static_cast<int64_t>(rtp_iterator->first); | 
|  1049     return std::numeric_limits<int64_t>::max(); |  1021     return std::numeric_limits<int64_t>::max(); | 
|  1050   }; |  1022   }; | 
|  1051  |  1023  | 
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1144     if (kv.first.GetDirection() == PacketDirection::kIncomingPacket) { |  1116     if (kv.first.GetDirection() == PacketDirection::kIncomingPacket) { | 
|  1145       for (const LoggedRtcpPacket& rtcp_packet : kv.second) |  1117       for (const LoggedRtcpPacket& rtcp_packet : kv.second) | 
|  1146         incoming_rtcp.insert( |  1118         incoming_rtcp.insert( | 
|  1147             std::make_pair(rtcp_packet.timestamp, &rtcp_packet)); |  1119             std::make_pair(rtcp_packet.timestamp, &rtcp_packet)); | 
|  1148     } |  1120     } | 
|  1149   } |  1121   } | 
|  1150  |  1122  | 
|  1151   SimulatedClock clock(0); |  1123   SimulatedClock clock(0); | 
|  1152   TransportFeedbackAdapter feedback_adapter(&clock); |  1124   TransportFeedbackAdapter feedback_adapter(&clock); | 
|  1153  |  1125  | 
|  1154   TimeSeries time_series; |  1126   TimeSeries time_series("Network Delay Change", LINE_DOT_GRAPH); | 
|  1155   time_series.label = "Network Delay Change"; |  | 
|  1156   time_series.style = LINE_DOT_GRAPH; |  | 
|  1157   int64_t estimated_base_delay_ms = std::numeric_limits<int64_t>::max(); |  1127   int64_t estimated_base_delay_ms = std::numeric_limits<int64_t>::max(); | 
|  1158  |  1128  | 
|  1159   auto rtp_iterator = outgoing_rtp.begin(); |  1129   auto rtp_iterator = outgoing_rtp.begin(); | 
|  1160   auto rtcp_iterator = incoming_rtcp.begin(); |  1130   auto rtcp_iterator = incoming_rtcp.begin(); | 
|  1161  |  1131  | 
|  1162   auto NextRtpTime = [&]() { |  1132   auto NextRtpTime = [&]() { | 
|  1163     if (rtp_iterator != outgoing_rtp.end()) |  1133     if (rtp_iterator != outgoing_rtp.end()) | 
|  1164       return static_cast<int64_t>(rtp_iterator->first); |  1134       return static_cast<int64_t>(rtp_iterator->first); | 
|  1165     return std::numeric_limits<int64_t>::max(); |  1135     return std::numeric_limits<int64_t>::max(); | 
|  1166   }; |  1136   }; | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1247   } |  1217   } | 
|  1248   return timestamps; |  1218   return timestamps; | 
|  1249 } |  1219 } | 
|  1250  |  1220  | 
|  1251 void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) { |  1221 void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) { | 
|  1252   for (const auto& kv : rtp_packets_) { |  1222   for (const auto& kv : rtp_packets_) { | 
|  1253     const std::vector<LoggedRtpPacket>& rtp_packets = kv.second; |  1223     const std::vector<LoggedRtpPacket>& rtp_packets = kv.second; | 
|  1254     StreamId stream_id = kv.first; |  1224     StreamId stream_id = kv.first; | 
|  1255  |  1225  | 
|  1256     { |  1226     { | 
|  1257       TimeSeries timestamp_data; |  1227       TimeSeries timestamp_data(GetStreamName(stream_id) + " capture-time", | 
|  1258       timestamp_data.label = GetStreamName(stream_id) + " capture-time"; |  1228                                 LINE_DOT_GRAPH); | 
|  1259       timestamp_data.style = LINE_DOT_GRAPH; |  | 
|  1260       for (LoggedRtpPacket packet : rtp_packets) { |  1229       for (LoggedRtpPacket packet : rtp_packets) { | 
|  1261         float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000; |  1230         float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000; | 
|  1262         float y = packet.header.timestamp; |  1231         float y = packet.header.timestamp; | 
|  1263         timestamp_data.points.emplace_back(x, y); |  1232         timestamp_data.points.emplace_back(x, y); | 
|  1264       } |  1233       } | 
|  1265       plot->series_list_.push_back(std::move(timestamp_data)); |  1234       plot->series_list_.push_back(std::move(timestamp_data)); | 
|  1266     } |  1235     } | 
|  1267  |  1236  | 
|  1268     { |  1237     { | 
|  1269       auto kv = rtcp_packets_.find(stream_id); |  1238       auto kv = rtcp_packets_.find(stream_id); | 
|  1270       if (kv != rtcp_packets_.end()) { |  1239       if (kv != rtcp_packets_.end()) { | 
|  1271         const auto& packets = kv->second; |  1240         const auto& packets = kv->second; | 
|  1272         TimeSeries timestamp_data; |  1241         TimeSeries timestamp_data( | 
|  1273         timestamp_data.label = GetStreamName(stream_id) + " rtcp capture-time"; |  1242             GetStreamName(stream_id) + " rtcp capture-time", LINE_DOT_GRAPH); | 
|  1274         timestamp_data.style = LINE_DOT_GRAPH; |  | 
|  1275         for (const LoggedRtcpPacket& rtcp : packets) { |  1243         for (const LoggedRtcpPacket& rtcp : packets) { | 
|  1276           if (rtcp.type != kRtcpSr) |  1244           if (rtcp.type != kRtcpSr) | 
|  1277             continue; |  1245             continue; | 
|  1278           rtcp::SenderReport* sr; |  1246           rtcp::SenderReport* sr; | 
|  1279           sr = static_cast<rtcp::SenderReport*>(rtcp.packet.get()); |  1247           sr = static_cast<rtcp::SenderReport*>(rtcp.packet.get()); | 
|  1280           float x = static_cast<float>(rtcp.timestamp - begin_time_) / 1000000; |  1248           float x = static_cast<float>(rtcp.timestamp - begin_time_) / 1000000; | 
|  1281           float y = sr->rtp_timestamp(); |  1249           float y = sr->rtp_timestamp(); | 
|  1282           timestamp_data.points.emplace_back(x, y); |  1250           timestamp_data.points.emplace_back(x, y); | 
|  1283         } |  1251         } | 
|  1284         plot->series_list_.push_back(std::move(timestamp_data)); |  1252         plot->series_list_.push_back(std::move(timestamp_data)); | 
|  1285       } |  1253       } | 
|  1286     } |  1254     } | 
|  1287   } |  1255   } | 
|  1288  |  1256  | 
|  1289   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1257   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1290   plot->SetSuggestedYAxis(0, 1, "Timestamp (90khz)", kBottomMargin, kTopMargin); |  1258   plot->SetSuggestedYAxis(0, 1, "Timestamp (90khz)", kBottomMargin, kTopMargin); | 
|  1291   plot->SetTitle("Timestamps"); |  1259   plot->SetTitle("Timestamps"); | 
|  1292 } |  1260 } | 
|  1293  |  1261  | 
|  1294 void EventLogAnalyzer::CreateAudioEncoderTargetBitrateGraph(Plot* plot) { |  1262 void EventLogAnalyzer::CreateAudioEncoderTargetBitrateGraph(Plot* plot) { | 
|  1295   plot->series_list_.push_back(TimeSeries()); |  1263   TimeSeries* time_series = | 
|  1296   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1264       plot->AddTimeSeries("Audio encoder target bitrate", LINE_DOT_GRAPH); | 
|  1297   plot->series_list_.back().label = "Audio encoder target bitrate"; |  | 
|  1298   ProcessPoints<AudioNetworkAdaptationEvent>( |  1265   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1299       [](const AudioNetworkAdaptationEvent& ana_event) -> rtc::Optional<float> { |  1266       [](const AudioNetworkAdaptationEvent& ana_event) -> rtc::Optional<float> { | 
|  1300         if (ana_event.config.bitrate_bps) |  1267         if (ana_event.config.bitrate_bps) | 
|  1301           return rtc::Optional<float>( |  1268           return rtc::Optional<float>( | 
|  1302               static_cast<float>(*ana_event.config.bitrate_bps)); |  1269               static_cast<float>(*ana_event.config.bitrate_bps)); | 
|  1303         return rtc::Optional<float>(); |  1270         return rtc::Optional<float>(); | 
|  1304       }, |  1271       }, | 
|  1305       audio_network_adaptation_events_, begin_time_, |  1272       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1306       &plot->series_list_.back()); |  | 
|  1307   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1273   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1308   plot->SetSuggestedYAxis(0, 1, "Bitrate (bps)", kBottomMargin, kTopMargin); |  1274   plot->SetSuggestedYAxis(0, 1, "Bitrate (bps)", kBottomMargin, kTopMargin); | 
|  1309   plot->SetTitle("Reported audio encoder target bitrate"); |  1275   plot->SetTitle("Reported audio encoder target bitrate"); | 
|  1310 } |  1276 } | 
|  1311  |  1277  | 
|  1312 void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) { |  1278 void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) { | 
|  1313   plot->series_list_.push_back(TimeSeries()); |  1279   TimeSeries* time_series = | 
|  1314   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1280       plot->AddTimeSeries("Audio encoder frame length", LINE_DOT_GRAPH); | 
|  1315   plot->series_list_.back().label = "Audio encoder frame length"; |  | 
|  1316   ProcessPoints<AudioNetworkAdaptationEvent>( |  1281   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1317       [](const AudioNetworkAdaptationEvent& ana_event) { |  1282       [](const AudioNetworkAdaptationEvent& ana_event) { | 
|  1318         if (ana_event.config.frame_length_ms) |  1283         if (ana_event.config.frame_length_ms) | 
|  1319           return rtc::Optional<float>( |  1284           return rtc::Optional<float>( | 
|  1320               static_cast<float>(*ana_event.config.frame_length_ms)); |  1285               static_cast<float>(*ana_event.config.frame_length_ms)); | 
|  1321         return rtc::Optional<float>(); |  1286         return rtc::Optional<float>(); | 
|  1322       }, |  1287       }, | 
|  1323       audio_network_adaptation_events_, begin_time_, |  1288       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1324       &plot->series_list_.back()); |  | 
|  1325   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1289   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1326   plot->SetSuggestedYAxis(0, 1, "Frame length (ms)", kBottomMargin, kTopMargin); |  1290   plot->SetSuggestedYAxis(0, 1, "Frame length (ms)", kBottomMargin, kTopMargin); | 
|  1327   plot->SetTitle("Reported audio encoder frame length"); |  1291   plot->SetTitle("Reported audio encoder frame length"); | 
|  1328 } |  1292 } | 
|  1329  |  1293  | 
|  1330 void EventLogAnalyzer::CreateAudioEncoderUplinkPacketLossFractionGraph( |  1294 void EventLogAnalyzer::CreateAudioEncoderUplinkPacketLossFractionGraph( | 
|  1331     Plot* plot) { |  1295     Plot* plot) { | 
|  1332   plot->series_list_.push_back(TimeSeries()); |  1296   TimeSeries* time_series = plot->AddTimeSeries( | 
|  1333   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1297       "Audio encoder uplink packet loss fraction", LINE_DOT_GRAPH); | 
|  1334   plot->series_list_.back().label = "Audio encoder uplink packet loss fraction"; |  | 
|  1335   ProcessPoints<AudioNetworkAdaptationEvent>( |  1298   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1336       [](const AudioNetworkAdaptationEvent& ana_event) { |  1299       [](const AudioNetworkAdaptationEvent& ana_event) { | 
|  1337         if (ana_event.config.uplink_packet_loss_fraction) |  1300         if (ana_event.config.uplink_packet_loss_fraction) | 
|  1338           return rtc::Optional<float>(static_cast<float>( |  1301           return rtc::Optional<float>(static_cast<float>( | 
|  1339               *ana_event.config.uplink_packet_loss_fraction)); |  1302               *ana_event.config.uplink_packet_loss_fraction)); | 
|  1340         return rtc::Optional<float>(); |  1303         return rtc::Optional<float>(); | 
|  1341       }, |  1304       }, | 
|  1342       audio_network_adaptation_events_, begin_time_, |  1305       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1343       &plot->series_list_.back()); |  | 
|  1344   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1306   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1345   plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin, |  1307   plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin, | 
|  1346                           kTopMargin); |  1308                           kTopMargin); | 
|  1347   plot->SetTitle("Reported audio encoder lost packets"); |  1309   plot->SetTitle("Reported audio encoder lost packets"); | 
|  1348 } |  1310 } | 
|  1349  |  1311  | 
|  1350 void EventLogAnalyzer::CreateAudioEncoderEnableFecGraph(Plot* plot) { |  1312 void EventLogAnalyzer::CreateAudioEncoderEnableFecGraph(Plot* plot) { | 
|  1351   plot->series_list_.push_back(TimeSeries()); |  1313   TimeSeries* time_series = | 
|  1352   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1314       plot->AddTimeSeries("Audio encoder FEC", LINE_DOT_GRAPH); | 
|  1353   plot->series_list_.back().label = "Audio encoder FEC"; |  | 
|  1354   ProcessPoints<AudioNetworkAdaptationEvent>( |  1315   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1355       [](const AudioNetworkAdaptationEvent& ana_event) { |  1316       [](const AudioNetworkAdaptationEvent& ana_event) { | 
|  1356         if (ana_event.config.enable_fec) |  1317         if (ana_event.config.enable_fec) | 
|  1357           return rtc::Optional<float>( |  1318           return rtc::Optional<float>( | 
|  1358               static_cast<float>(*ana_event.config.enable_fec)); |  1319               static_cast<float>(*ana_event.config.enable_fec)); | 
|  1359         return rtc::Optional<float>(); |  1320         return rtc::Optional<float>(); | 
|  1360       }, |  1321       }, | 
|  1361       audio_network_adaptation_events_, begin_time_, |  1322       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1362       &plot->series_list_.back()); |  | 
|  1363   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1323   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1364   plot->SetSuggestedYAxis(0, 1, "FEC (false/true)", kBottomMargin, kTopMargin); |  1324   plot->SetSuggestedYAxis(0, 1, "FEC (false/true)", kBottomMargin, kTopMargin); | 
|  1365   plot->SetTitle("Reported audio encoder FEC"); |  1325   plot->SetTitle("Reported audio encoder FEC"); | 
|  1366 } |  1326 } | 
|  1367  |  1327  | 
|  1368 void EventLogAnalyzer::CreateAudioEncoderEnableDtxGraph(Plot* plot) { |  1328 void EventLogAnalyzer::CreateAudioEncoderEnableDtxGraph(Plot* plot) { | 
|  1369   plot->series_list_.push_back(TimeSeries()); |  1329   TimeSeries* time_series = | 
|  1370   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1330       plot->AddTimeSeries("Audio encoder DTX", LINE_DOT_GRAPH); | 
|  1371   plot->series_list_.back().label = "Audio encoder DTX"; |  | 
|  1372   ProcessPoints<AudioNetworkAdaptationEvent>( |  1331   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1373       [](const AudioNetworkAdaptationEvent& ana_event) { |  1332       [](const AudioNetworkAdaptationEvent& ana_event) { | 
|  1374         if (ana_event.config.enable_dtx) |  1333         if (ana_event.config.enable_dtx) | 
|  1375           return rtc::Optional<float>( |  1334           return rtc::Optional<float>( | 
|  1376               static_cast<float>(*ana_event.config.enable_dtx)); |  1335               static_cast<float>(*ana_event.config.enable_dtx)); | 
|  1377         return rtc::Optional<float>(); |  1336         return rtc::Optional<float>(); | 
|  1378       }, |  1337       }, | 
|  1379       audio_network_adaptation_events_, begin_time_, |  1338       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1380       &plot->series_list_.back()); |  | 
|  1381   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1339   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1382   plot->SetSuggestedYAxis(0, 1, "DTX (false/true)", kBottomMargin, kTopMargin); |  1340   plot->SetSuggestedYAxis(0, 1, "DTX (false/true)", kBottomMargin, kTopMargin); | 
|  1383   plot->SetTitle("Reported audio encoder DTX"); |  1341   plot->SetTitle("Reported audio encoder DTX"); | 
|  1384 } |  1342 } | 
|  1385  |  1343  | 
|  1386 void EventLogAnalyzer::CreateAudioEncoderNumChannelsGraph(Plot* plot) { |  1344 void EventLogAnalyzer::CreateAudioEncoderNumChannelsGraph(Plot* plot) { | 
|  1387   plot->series_list_.push_back(TimeSeries()); |  1345   TimeSeries* time_series = | 
|  1388   plot->series_list_.back().style = LINE_DOT_GRAPH; |  1346       plot->AddTimeSeries("Audio encoder number of channels", LINE_DOT_GRAPH); | 
|  1389   plot->series_list_.back().label = "Audio encoder number of channels"; |  | 
|  1390   ProcessPoints<AudioNetworkAdaptationEvent>( |  1347   ProcessPoints<AudioNetworkAdaptationEvent>( | 
|  1391       [](const AudioNetworkAdaptationEvent& ana_event) { |  1348       [](const AudioNetworkAdaptationEvent& ana_event) { | 
|  1392         if (ana_event.config.num_channels) |  1349         if (ana_event.config.num_channels) | 
|  1393           return rtc::Optional<float>( |  1350           return rtc::Optional<float>( | 
|  1394               static_cast<float>(*ana_event.config.num_channels)); |  1351               static_cast<float>(*ana_event.config.num_channels)); | 
|  1395         return rtc::Optional<float>(); |  1352         return rtc::Optional<float>(); | 
|  1396       }, |  1353       }, | 
|  1397       audio_network_adaptation_events_, begin_time_, |  1354       audio_network_adaptation_events_, begin_time_, time_series); | 
|  1398       &plot->series_list_.back()); |  | 
|  1399   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); |  1355   plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin); | 
|  1400   plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))", |  1356   plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))", | 
|  1401                           kBottomMargin, kTopMargin); |  1357                           kBottomMargin, kTopMargin); | 
|  1402   plot->SetTitle("Reported audio encoder number of channels"); |  1358   plot->SetTitle("Reported audio encoder number of channels"); | 
|  1403 } |  1359 } | 
|  1404 }  // namespace plotting |  1360 }  // namespace plotting | 
|  1405 }  // namespace webrtc |  1361 }  // namespace webrtc | 
| OLD | NEW |