| Index: webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| index 2c340127de5c9e205015f457ae6755faadb78a19..90eb5b3f12e35d49574962f3812fff771570d958 100644
 | 
| --- a/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| +++ b/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| @@ -30,6 +30,8 @@
 | 
|  #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
 | 
|  #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/sender_report.h"
 | 
|  #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
 | 
|  #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
 | 
|  #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 | 
| @@ -385,7 +387,7 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log)
 | 
|  
 | 
|          // Currently feedback is logged twice, both for audio and video.
 | 
|          // Only act on one of them.
 | 
| -        if (media_type == MediaType::VIDEO) {
 | 
| +        if (media_type == MediaType::AUDIO || media_type == MediaType::ANY) {
 | 
|            rtcp::CommonHeader header;
 | 
|            const uint8_t* packet_end = packet + total_length;
 | 
|            for (const uint8_t* block = packet; block < packet_end;
 | 
| @@ -402,6 +404,26 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log)
 | 
|                  rtcp_packets_[stream].push_back(LoggedRtcpPacket(
 | 
|                      timestamp, kRtcpTransportFeedback, std::move(rtcp_packet)));
 | 
|                }
 | 
| +            } else if (header.type() == rtcp::SenderReport::kPacketType) {
 | 
| +              std::unique_ptr<rtcp::SenderReport> rtcp_packet(
 | 
| +                  new rtcp::SenderReport());
 | 
| +              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, kRtcpSr, std::move(rtcp_packet)));
 | 
| +              }
 | 
| +            } else if (header.type() == rtcp::ReceiverReport::kPacketType) {
 | 
| +              std::unique_ptr<rtcp::ReceiverReport> rtcp_packet(
 | 
| +                  new rtcp::ReceiverReport());
 | 
| +              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, kRtcpRr, std::move(rtcp_packet)));
 | 
| +              }
 | 
|              }
 | 
|            }
 | 
|          }
 | 
| @@ -1209,5 +1231,48 @@ std::vector<std::pair<int64_t, int64_t>> EventLogAnalyzer::GetFrameTimestamps()
 | 
|    }
 | 
|    return timestamps;
 | 
|  }
 | 
| +
 | 
| +void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) {
 | 
| +  for (const auto& kv : rtp_packets_) {
 | 
| +    const std::vector<LoggedRtpPacket>& rtp_packets = kv.second;
 | 
| +    StreamId stream_id = kv.first;
 | 
| +
 | 
| +    {
 | 
| +      TimeSeries timestamp_data;
 | 
| +      timestamp_data.label = GetStreamName(stream_id) + " capture-time";
 | 
| +      timestamp_data.style = LINE_DOT_GRAPH;
 | 
| +      for (LoggedRtpPacket packet : rtp_packets) {
 | 
| +        float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000;
 | 
| +        float y = packet.header.timestamp;
 | 
| +        timestamp_data.points.emplace_back(x, y);
 | 
| +      }
 | 
| +      plot->series_list_.push_back(std::move(timestamp_data));
 | 
| +    }
 | 
| +
 | 
| +    {
 | 
| +      auto kv = rtcp_packets_.find(stream_id);
 | 
| +      if (kv != rtcp_packets_.end()) {
 | 
| +        const auto& packets = kv->second;
 | 
| +        TimeSeries timestamp_data;
 | 
| +        timestamp_data.label = GetStreamName(stream_id) + " rtcp capture-time";
 | 
| +        timestamp_data.style = LINE_DOT_GRAPH;
 | 
| +        for (const LoggedRtcpPacket& rtcp : packets) {
 | 
| +          if (rtcp.type != kRtcpSr)
 | 
| +            continue;
 | 
| +          rtcp::SenderReport* sr;
 | 
| +          sr = static_cast<rtcp::SenderReport*>(rtcp.packet.get());
 | 
| +          float x = static_cast<float>(rtcp.timestamp - begin_time_) / 1000000;
 | 
| +          float y = sr->rtp_timestamp();
 | 
| +          timestamp_data.points.emplace_back(x, y);
 | 
| +        }
 | 
| +        plot->series_list_.push_back(std::move(timestamp_data));
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
| +  plot->SetSuggestedYAxis(0, 1, "Timestamp (90khz)", kBottomMargin, kTopMargin);
 | 
| +  plot->SetTitle("Timestamps");
 | 
| +}
 | 
|  }  // namespace plotting
 | 
|  }  // namespace webrtc
 | 
| 
 |