• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2019 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 #ifndef LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
11 #define LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
12 
13 #include <iterator>
14 #include <limits>
15 #include <map>
16 #include <set>
17 #include <sstream>  // no-presubmit-check TODO(webrtc:8982)
18 #include <string>
19 #include <utility>  // pair
20 #include <vector>
21 
22 #include "api/rtc_event_log/rtc_event_log.h"
23 #include "call/video_receive_stream.h"
24 #include "call/video_send_stream.h"
25 #include "logging/rtc_event_log/logged_events.h"
26 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
27 #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
28 #include "rtc_base/ignore_wundef.h"
29 
30 // Files generated at build-time by the protobuf compiler.
31 RTC_PUSH_IGNORING_WUNDEF()
32 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
33 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
34 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log2.pb.h"
35 #else
36 #include "logging/rtc_event_log/rtc_event_log.pb.h"
37 #include "logging/rtc_event_log/rtc_event_log2.pb.h"
38 #endif
RTC_POP_IGNORING_WUNDEF()39 RTC_POP_IGNORING_WUNDEF()
40 
41 namespace webrtc {
42 
43 enum PacketDirection { kIncomingPacket = 0, kOutgoingPacket };
44 
45 template <typename T>
46 class PacketView;
47 
48 template <typename T>
49 class PacketIterator {
50   friend class PacketView<T>;
51 
52  public:
53   // Standard iterator traits.
54   using difference_type = std::ptrdiff_t;
55   using value_type = T;
56   using pointer = T*;
57   using reference = T&;
58   using iterator_category = std::bidirectional_iterator_tag;
59 
60   // The default-contructed iterator is meaningless, but is required by the
61   // ForwardIterator concept.
62   PacketIterator() : ptr_(nullptr), element_size_(0) {}
63   PacketIterator(const PacketIterator& other)
64       : ptr_(other.ptr_), element_size_(other.element_size_) {}
65   PacketIterator(const PacketIterator&& other)
66       : ptr_(other.ptr_), element_size_(other.element_size_) {}
67   ~PacketIterator() = default;
68 
69   PacketIterator& operator=(const PacketIterator& other) {
70     ptr_ = other.ptr_;
71     element_size_ = other.element_size_;
72     return *this;
73   }
74   PacketIterator& operator=(const PacketIterator&& other) {
75     ptr_ = other.ptr_;
76     element_size_ = other.element_size_;
77     return *this;
78   }
79 
80   bool operator==(const PacketIterator<T>& other) const {
81     RTC_DCHECK_EQ(element_size_, other.element_size_);
82     return ptr_ == other.ptr_;
83   }
84   bool operator!=(const PacketIterator<T>& other) const {
85     RTC_DCHECK_EQ(element_size_, other.element_size_);
86     return ptr_ != other.ptr_;
87   }
88 
89   PacketIterator& operator++() {
90     ptr_ += element_size_;
91     return *this;
92   }
93   PacketIterator& operator--() {
94     ptr_ -= element_size_;
95     return *this;
96   }
97   PacketIterator operator++(int) {
98     PacketIterator iter_copy(ptr_, element_size_);
99     ptr_ += element_size_;
100     return iter_copy;
101   }
102   PacketIterator operator--(int) {
103     PacketIterator iter_copy(ptr_, element_size_);
104     ptr_ -= element_size_;
105     return iter_copy;
106   }
107 
108   T& operator*() { return *reinterpret_cast<T*>(ptr_); }
109   const T& operator*() const { return *reinterpret_cast<const T*>(ptr_); }
110 
111   T* operator->() { return reinterpret_cast<T*>(ptr_); }
112   const T* operator->() const { return reinterpret_cast<const T*>(ptr_); }
113 
114  private:
115   PacketIterator(typename std::conditional<std::is_const<T>::value,
116                                            const void*,
117                                            void*>::type p,
118                  size_t s)
119       : ptr_(reinterpret_cast<decltype(ptr_)>(p)), element_size_(s) {}
120 
121   typename std::conditional<std::is_const<T>::value, const char*, char*>::type
122       ptr_;
123   size_t element_size_;
124 };
125 
126 // Suppose that we have a struct S where we are only interested in a specific
127 // member M. Given an array of S, PacketView can be used to treat the array
128 // as an array of M, without exposing the type S to surrounding code and without
129 // accessing the member through a virtual function. In this case, we want to
130 // have a common view for incoming and outgoing RtpPackets, hence the PacketView
131 // name.
132 // Note that constructing a PacketView bypasses the typesystem, so the caller
133 // has to take extra care when constructing these objects. The implementation
134 // also requires that the containing struct is standard-layout (e.g. POD).
135 //
136 // Usage example:
137 // struct A {...};
138 // struct B { A a; ...};
139 // struct C { A a; ...};
140 // size_t len = 10;
141 // B* array1 = new B[len];
142 // C* array2 = new C[len];
143 //
144 // PacketView<A> view1 = PacketView<A>::Create<B>(array1, len, offsetof(B, a));
145 // PacketView<A> view2 = PacketView<A>::Create<C>(array2, len, offsetof(C, a));
146 //
147 // The following code works with either view1 or view2.
148 // void f(PacketView<A> view)
149 // for (A& a : view) {
150 //   DoSomething(a);
151 // }
152 template <typename T>
153 class PacketView {
154  public:
155   template <typename U>
156   static PacketView Create(U* ptr, size_t num_elements, size_t offset) {
157     static_assert(std::is_standard_layout<U>::value,
158                   "PacketView can only be created for standard layout types.");
159     static_assert(std::is_standard_layout<T>::value,
160                   "PacketView can only be created for standard layout types.");
161     return PacketView(ptr, num_elements, offset, sizeof(U));
162   }
163 
164   using value_type = T;
165   using reference = value_type&;
166   using const_reference = const value_type&;
167 
168   using iterator = PacketIterator<T>;
169   using const_iterator = PacketIterator<const T>;
170   using reverse_iterator = std::reverse_iterator<iterator>;
171   using const_reverse_iterator = std::reverse_iterator<const_iterator>;
172 
173   iterator begin() { return iterator(data_, element_size_); }
174   iterator end() {
175     auto end_ptr = data_ + num_elements_ * element_size_;
176     return iterator(end_ptr, element_size_);
177   }
178 
179   const_iterator begin() const { return const_iterator(data_, element_size_); }
180   const_iterator end() const {
181     auto end_ptr = data_ + num_elements_ * element_size_;
182     return const_iterator(end_ptr, element_size_);
183   }
184 
185   reverse_iterator rbegin() { return reverse_iterator(end()); }
186   reverse_iterator rend() { return reverse_iterator(begin()); }
187 
188   const_reverse_iterator rbegin() const {
189     return const_reverse_iterator(end());
190   }
191   const_reverse_iterator rend() const {
192     return const_reverse_iterator(begin());
193   }
194 
195   size_t size() const { return num_elements_; }
196 
197   bool empty() const { return num_elements_ == 0; }
198 
199   T& operator[](size_t i) {
200     auto elem_ptr = data_ + i * element_size_;
201     return *reinterpret_cast<T*>(elem_ptr);
202   }
203 
204   const T& operator[](size_t i) const {
205     auto elem_ptr = data_ + i * element_size_;
206     return *reinterpret_cast<const T*>(elem_ptr);
207   }
208 
209  private:
210   PacketView(typename std::conditional<std::is_const<T>::value,
211                                        const void*,
212                                        void*>::type data,
213              size_t num_elements,
214              size_t offset,
215              size_t element_size)
216       : data_(reinterpret_cast<decltype(data_)>(data) + offset),
217         num_elements_(num_elements),
218         element_size_(element_size) {}
219 
220   typename std::conditional<std::is_const<T>::value, const char*, char*>::type
221       data_;
222   size_t num_elements_;
223   size_t element_size_;
224 };
225 
226 // Conversion functions for version 2 of the wire format.
227 BandwidthUsage GetRuntimeDetectorState(
228     rtclog2::DelayBasedBweUpdates::DetectorState detector_state);
229 
230 ProbeFailureReason GetRuntimeProbeFailureReason(
231     rtclog2::BweProbeResultFailure::FailureReason failure);
232 
233 DtlsTransportState GetRuntimeDtlsTransportState(
234     rtclog2::DtlsTransportStateEvent::DtlsTransportState state);
235 
236 IceCandidatePairConfigType GetRuntimeIceCandidatePairConfigType(
237     rtclog2::IceCandidatePairConfig::IceCandidatePairConfigType type);
238 
239 IceCandidateType GetRuntimeIceCandidateType(
240     rtclog2::IceCandidatePairConfig::IceCandidateType type);
241 
242 IceCandidatePairProtocol GetRuntimeIceCandidatePairProtocol(
243     rtclog2::IceCandidatePairConfig::Protocol protocol);
244 
245 IceCandidatePairAddressFamily GetRuntimeIceCandidatePairAddressFamily(
246     rtclog2::IceCandidatePairConfig::AddressFamily address_family);
247 
248 IceCandidateNetworkType GetRuntimeIceCandidateNetworkType(
249     rtclog2::IceCandidatePairConfig::NetworkType network_type);
250 
251 IceCandidatePairEventType GetRuntimeIceCandidatePairEventType(
252     rtclog2::IceCandidatePairEvent::IceCandidatePairEventType type);
253 
254 std::vector<RtpExtension> GetRuntimeRtpHeaderExtensionConfig(
255     const rtclog2::RtpHeaderExtensionConfig& proto_header_extensions);
256 // End of conversion functions.
257 
258 class ParsedRtcEventLog {
259  public:
260   enum class MediaType { ANY, AUDIO, VIDEO, DATA };
261   enum class UnconfiguredHeaderExtensions {
262     kDontParse,
263     kAttemptWebrtcDefaultConfig
264   };
265   class ParseStatus {
266    public:
267     static ParseStatus Success() { return ParseStatus(); }
268     static ParseStatus Error(std::string error, std::string file, int line) {
269       return ParseStatus(error, file, line);
270     }
271 
272     bool ok() const { return error_.empty() && file_.empty() && line_ == 0; }
273     std::string message() const {
274       return error_ + " failed at " + file_ + " line " + std::to_string(line_);
275     }
276 
277     RTC_DEPRECATED operator bool() const { return ok(); }
278 
279    private:
280     ParseStatus() : error_(), file_(), line_(0) {}
281     ParseStatus(std::string error, std::string file, int line)
282         : error_(error), file_(file), line_(line) {}
283     std::string error_;
284     std::string file_;
285     int line_;
286   };
287 
288   template <typename T>
289   class ParseStatusOr {
290    public:
291     ParseStatusOr(const ParseStatus& error)  // NOLINT
292         : status_(error), value_() {}
293     ParseStatusOr(const T& value)  // NOLINT
294         : status_(ParseStatus::Success()), value_(value) {}
295     bool ok() const { return status_.ok(); }
296     const T& value() const& {
297       RTC_DCHECK(status_.ok());
298       return value_;
299     }
300     std::string message() const { return status_.message(); }
301     const ParseStatus& status() const { return status_; }
302 
303    private:
304     ParseStatus status_;
305     T value_;
306   };
307 
308   struct LoggedRtpStreamIncoming {
309     LoggedRtpStreamIncoming();
310     LoggedRtpStreamIncoming(const LoggedRtpStreamIncoming&);
311     ~LoggedRtpStreamIncoming();
312     uint32_t ssrc;
313     std::vector<LoggedRtpPacketIncoming> incoming_packets;
314   };
315 
316   struct LoggedRtpStreamOutgoing {
317     LoggedRtpStreamOutgoing();
318     LoggedRtpStreamOutgoing(const LoggedRtpStreamOutgoing&);
319     ~LoggedRtpStreamOutgoing();
320     uint32_t ssrc;
321     std::vector<LoggedRtpPacketOutgoing> outgoing_packets;
322   };
323 
324   struct LoggedRtpStreamView {
325     LoggedRtpStreamView(uint32_t ssrc,
326                         const LoggedRtpPacketIncoming* ptr,
327                         size_t num_elements);
328     LoggedRtpStreamView(uint32_t ssrc,
329                         const LoggedRtpPacketOutgoing* ptr,
330                         size_t num_elements);
331     LoggedRtpStreamView(const LoggedRtpStreamView&);
332     uint32_t ssrc;
333     PacketView<const LoggedRtpPacket> packet_view;
334   };
335 
336   class LogSegment {
337    public:
338     LogSegment(int64_t start_time_us, int64_t stop_time_us)
339         : start_time_us_(start_time_us), stop_time_us_(stop_time_us) {}
340     int64_t start_time_ms() const { return start_time_us_ / 1000; }
341     int64_t start_time_us() const { return start_time_us_; }
342     int64_t stop_time_ms() const { return stop_time_us_ / 1000; }
343     int64_t stop_time_us() const { return stop_time_us_; }
344 
345    private:
346     int64_t start_time_us_;
347     int64_t stop_time_us_;
348   };
349 
350   static webrtc::RtpHeaderExtensionMap GetDefaultHeaderExtensionMap();
351 
352   explicit ParsedRtcEventLog(
353       UnconfiguredHeaderExtensions parse_unconfigured_header_extensions =
354           UnconfiguredHeaderExtensions::kDontParse,
355       bool allow_incomplete_log = false);
356 
357   ~ParsedRtcEventLog();
358 
359   // Clears previously parsed events and resets the ParsedRtcEventLogNew to an
360   // empty state.
361   void Clear();
362 
363   // Reads an RtcEventLog file and returns success if parsing was successful.
364   ParseStatus ParseFile(const std::string& file_name);
365 
366   // Reads an RtcEventLog from a string and returns success if successful.
367   ParseStatus ParseString(const std::string& s);
368 
369   // Reads an RtcEventLog from an istream and returns success if successful.
370   ParseStatus ParseStream(
371       std::istream& stream);  // no-presubmit-check TODO(webrtc:8982)
372 
373   MediaType GetMediaType(uint32_t ssrc, PacketDirection direction) const;
374 
375   // Configured SSRCs.
376   const std::set<uint32_t>& incoming_rtx_ssrcs() const {
377     return incoming_rtx_ssrcs_;
378   }
379 
380   const std::set<uint32_t>& incoming_video_ssrcs() const {
381     return incoming_video_ssrcs_;
382   }
383 
384   const std::set<uint32_t>& incoming_audio_ssrcs() const {
385     return incoming_audio_ssrcs_;
386   }
387 
388   const std::set<uint32_t>& outgoing_rtx_ssrcs() const {
389     return outgoing_rtx_ssrcs_;
390   }
391 
392   const std::set<uint32_t>& outgoing_video_ssrcs() const {
393     return outgoing_video_ssrcs_;
394   }
395 
396   const std::set<uint32_t>& outgoing_audio_ssrcs() const {
397     return outgoing_audio_ssrcs_;
398   }
399 
400   // Stream configurations.
401   const std::vector<LoggedAudioRecvConfig>& audio_recv_configs() const {
402     return audio_recv_configs_;
403   }
404 
405   const std::vector<LoggedAudioSendConfig>& audio_send_configs() const {
406     return audio_send_configs_;
407   }
408 
409   const std::vector<LoggedVideoRecvConfig>& video_recv_configs() const {
410     return video_recv_configs_;
411   }
412 
413   const std::vector<LoggedVideoSendConfig>& video_send_configs() const {
414     return video_send_configs_;
415   }
416 
417   // Beginning and end of log segments.
418   const std::vector<LoggedStartEvent>& start_log_events() const {
419     return start_log_events_;
420   }
421 
422   const std::vector<LoggedStopEvent>& stop_log_events() const {
423     return stop_log_events_;
424   }
425 
426   const std::vector<LoggedAlrStateEvent>& alr_state_events() const {
427     return alr_state_events_;
428   }
429 
430   // Audio
431   const std::map<uint32_t, std::vector<LoggedAudioPlayoutEvent>>&
432   audio_playout_events() const {
433     return audio_playout_events_;
434   }
435 
436   const std::vector<LoggedAudioNetworkAdaptationEvent>&
437   audio_network_adaptation_events() const {
438     return audio_network_adaptation_events_;
439   }
440 
441   // Bandwidth estimation
442   const std::vector<LoggedBweProbeClusterCreatedEvent>&
443   bwe_probe_cluster_created_events() const {
444     return bwe_probe_cluster_created_events_;
445   }
446 
447   const std::vector<LoggedBweProbeFailureEvent>& bwe_probe_failure_events()
448       const {
449     return bwe_probe_failure_events_;
450   }
451 
452   const std::vector<LoggedBweProbeSuccessEvent>& bwe_probe_success_events()
453       const {
454     return bwe_probe_success_events_;
455   }
456 
457   const std::vector<LoggedBweDelayBasedUpdate>& bwe_delay_updates() const {
458     return bwe_delay_updates_;
459   }
460 
461   const std::vector<LoggedBweLossBasedUpdate>& bwe_loss_updates() const {
462     return bwe_loss_updates_;
463   }
464 
465   // DTLS
466   const std::vector<LoggedDtlsTransportState>& dtls_transport_states() const {
467     return dtls_transport_states_;
468   }
469 
470   const std::vector<LoggedDtlsWritableState>& dtls_writable_states() const {
471     return dtls_writable_states_;
472   }
473 
474   // ICE events
475   const std::vector<LoggedIceCandidatePairConfig>& ice_candidate_pair_configs()
476       const {
477     return ice_candidate_pair_configs_;
478   }
479 
480   const std::vector<LoggedIceCandidatePairEvent>& ice_candidate_pair_events()
481       const {
482     return ice_candidate_pair_events_;
483   }
484 
485   const std::vector<LoggedRouteChangeEvent>& route_change_events() const {
486     return route_change_events_;
487   }
488 
489   const std::vector<LoggedRemoteEstimateEvent>& remote_estimate_events() const {
490     return remote_estimate_events_;
491   }
492 
493   // RTP
494   const std::vector<LoggedRtpStreamIncoming>& incoming_rtp_packets_by_ssrc()
495       const {
496     return incoming_rtp_packets_by_ssrc_;
497   }
498 
499   const std::vector<LoggedRtpStreamOutgoing>& outgoing_rtp_packets_by_ssrc()
500       const {
501     return outgoing_rtp_packets_by_ssrc_;
502   }
503 
504   const std::vector<LoggedRtpStreamView>& rtp_packets_by_ssrc(
505       PacketDirection direction) const {
506     if (direction == kIncomingPacket)
507       return incoming_rtp_packet_views_by_ssrc_;
508     else
509       return outgoing_rtp_packet_views_by_ssrc_;
510   }
511 
512   // RTCP
513   const std::vector<LoggedRtcpPacketIncoming>& incoming_rtcp_packets() const {
514     return incoming_rtcp_packets_;
515   }
516 
517   const std::vector<LoggedRtcpPacketOutgoing>& outgoing_rtcp_packets() const {
518     return outgoing_rtcp_packets_;
519   }
520 
521   const std::vector<LoggedRtcpPacketReceiverReport>& receiver_reports(
522       PacketDirection direction) const {
523     if (direction == kIncomingPacket) {
524       return incoming_rr_;
525     } else {
526       return outgoing_rr_;
527     }
528   }
529 
530   const std::vector<LoggedRtcpPacketSenderReport>& sender_reports(
531       PacketDirection direction) const {
532     if (direction == kIncomingPacket) {
533       return incoming_sr_;
534     } else {
535       return outgoing_sr_;
536     }
537   }
538 
539   const std::vector<LoggedRtcpPacketExtendedReports>& extended_reports(
540       PacketDirection direction) const {
541     if (direction == kIncomingPacket) {
542       return incoming_xr_;
543     } else {
544       return outgoing_xr_;
545     }
546   }
547 
548   const std::vector<LoggedRtcpPacketNack>& nacks(
549       PacketDirection direction) const {
550     if (direction == kIncomingPacket) {
551       return incoming_nack_;
552     } else {
553       return outgoing_nack_;
554     }
555   }
556 
557   const std::vector<LoggedRtcpPacketRemb>& rembs(
558       PacketDirection direction) const {
559     if (direction == kIncomingPacket) {
560       return incoming_remb_;
561     } else {
562       return outgoing_remb_;
563     }
564   }
565 
566   const std::vector<LoggedRtcpPacketFir>& firs(
567       PacketDirection direction) const {
568     if (direction == kIncomingPacket) {
569       return incoming_fir_;
570     } else {
571       return outgoing_fir_;
572     }
573   }
574 
575   const std::vector<LoggedRtcpPacketPli>& plis(
576       PacketDirection direction) const {
577     if (direction == kIncomingPacket) {
578       return incoming_pli_;
579     } else {
580       return outgoing_pli_;
581     }
582   }
583 
584   const std::vector<LoggedRtcpPacketTransportFeedback>& transport_feedbacks(
585       PacketDirection direction) const {
586     if (direction == kIncomingPacket) {
587       return incoming_transport_feedback_;
588     } else {
589       return outgoing_transport_feedback_;
590     }
591   }
592 
593   const std::vector<LoggedRtcpPacketLossNotification>& loss_notifications(
594       PacketDirection direction) {
595     if (direction == kIncomingPacket) {
596       return incoming_loss_notification_;
597     } else {
598       return outgoing_loss_notification_;
599     }
600   }
601 
602   const std::vector<LoggedGenericPacketReceived>& generic_packets_received()
603       const {
604     return generic_packets_received_;
605   }
606   const std::vector<LoggedGenericPacketSent>& generic_packets_sent() const {
607     return generic_packets_sent_;
608   }
609 
610   const std::vector<LoggedGenericAckReceived>& generic_acks_received() const {
611     return generic_acks_received_;
612   }
613 
614   int64_t first_timestamp() const { return first_timestamp_; }
615   int64_t last_timestamp() const { return last_timestamp_; }
616 
617   const LogSegment& first_log_segment() const { return first_log_segment_; }
618 
619   std::vector<LoggedPacketInfo> GetPacketInfos(PacketDirection direction) const;
620   std::vector<LoggedPacketInfo> GetIncomingPacketInfos() const {
621     return GetPacketInfos(kIncomingPacket);
622   }
623   std::vector<LoggedPacketInfo> GetOutgoingPacketInfos() const {
624     return GetPacketInfos(kOutgoingPacket);
625   }
626   std::vector<LoggedIceCandidatePairConfig> GetIceCandidates() const;
627   std::vector<LoggedIceEvent> GetIceEvents() const;
628 
629   std::vector<InferredRouteChangeEvent> GetRouteChanges() const;
630 
631  private:
632   ABSL_MUST_USE_RESULT ParseStatus ParseStreamInternal(
633       std::istream& stream);  // no-presubmit-check TODO(webrtc:8982)
634 
635   ABSL_MUST_USE_RESULT ParseStatus
636   StoreParsedLegacyEvent(const rtclog::Event& event);
637 
638   template <typename T>
639   void StoreFirstAndLastTimestamp(const std::vector<T>& v);
640 
641   // Reads the header, direction, header length and packet length from the RTP
642   // event at |index|, and stores the values in the corresponding output
643   // parameters. Each output parameter can be set to nullptr if that value
644   // isn't needed.
645   // NB: The header must have space for at least IP_PACKET_SIZE bytes.
646   ParseStatus GetRtpHeader(const rtclog::Event& event,
647                            PacketDirection* incoming,
648                            uint8_t* header,
649                            size_t* header_length,
650                            size_t* total_length,
651                            int* probe_cluster_id) const;
652 
653   // Returns: a pointer to a header extensions map acquired from parsing
654   // corresponding Audio/Video Sender/Receiver config events.
655   // Warning: if the same SSRC is reused by both video and audio streams during
656   // call, extensions maps may be incorrect (the last one would be returned).
657   const RtpHeaderExtensionMap* GetRtpHeaderExtensionMap(
658       PacketDirection direction,
659       uint32_t ssrc);
660 
661   // Reads packet, direction and packet length from the RTCP event at |index|,
662   // and stores the values in the corresponding output parameters.
663   // Each output parameter can be set to nullptr if that value isn't needed.
664   // NB: The packet must have space for at least IP_PACKET_SIZE bytes.
665   ParseStatus GetRtcpPacket(const rtclog::Event& event,
666                             PacketDirection* incoming,
667                             uint8_t* packet,
668                             size_t* length) const;
669 
670   ParseStatusOr<rtclog::StreamConfig> GetVideoReceiveConfig(
671       const rtclog::Event& event) const;
672   ParseStatusOr<rtclog::StreamConfig> GetVideoSendConfig(
673       const rtclog::Event& event) const;
674   ParseStatusOr<rtclog::StreamConfig> GetAudioReceiveConfig(
675       const rtclog::Event& event) const;
676   ParseStatusOr<rtclog::StreamConfig> GetAudioSendConfig(
677       const rtclog::Event& event) const;
678 
679   ParsedRtcEventLog::ParseStatusOr<LoggedAudioPlayoutEvent> GetAudioPlayout(
680       const rtclog::Event& event) const;
681 
682   ParsedRtcEventLog::ParseStatusOr<LoggedBweLossBasedUpdate>
683   GetLossBasedBweUpdate(const rtclog::Event& event) const;
684 
685   ParsedRtcEventLog::ParseStatusOr<LoggedBweDelayBasedUpdate>
686   GetDelayBasedBweUpdate(const rtclog::Event& event) const;
687 
688   ParsedRtcEventLog::ParseStatusOr<LoggedAudioNetworkAdaptationEvent>
689   GetAudioNetworkAdaptation(const rtclog::Event& event) const;
690 
691   ParsedRtcEventLog::ParseStatusOr<LoggedBweProbeClusterCreatedEvent>
692   GetBweProbeClusterCreated(const rtclog::Event& event) const;
693 
694   ParsedRtcEventLog::ParseStatusOr<LoggedBweProbeFailureEvent>
695   GetBweProbeFailure(const rtclog::Event& event) const;
696 
697   ParsedRtcEventLog::ParseStatusOr<LoggedBweProbeSuccessEvent>
698   GetBweProbeSuccess(const rtclog::Event& event) const;
699 
700   ParsedRtcEventLog::ParseStatusOr<LoggedAlrStateEvent> GetAlrState(
701       const rtclog::Event& event) const;
702 
703   ParsedRtcEventLog::ParseStatusOr<LoggedIceCandidatePairConfig>
704   GetIceCandidatePairConfig(const rtclog::Event& event) const;
705 
706   ParsedRtcEventLog::ParseStatusOr<LoggedIceCandidatePairEvent>
707   GetIceCandidatePairEvent(const rtclog::Event& event) const;
708 
709   // Parsing functions for new format.
710   ParseStatus StoreAlrStateEvent(const rtclog2::AlrState& proto);
711   ParseStatus StoreAudioNetworkAdaptationEvent(
712       const rtclog2::AudioNetworkAdaptations& proto);
713   ParseStatus StoreAudioPlayoutEvent(const rtclog2::AudioPlayoutEvents& proto);
714   ParseStatus StoreAudioRecvConfig(const rtclog2::AudioRecvStreamConfig& proto);
715   ParseStatus StoreAudioSendConfig(const rtclog2::AudioSendStreamConfig& proto);
716   ParseStatus StoreBweDelayBasedUpdate(
717       const rtclog2::DelayBasedBweUpdates& proto);
718   ParseStatus StoreBweLossBasedUpdate(
719       const rtclog2::LossBasedBweUpdates& proto);
720   ParseStatus StoreBweProbeClusterCreated(
721       const rtclog2::BweProbeCluster& proto);
722   ParseStatus StoreBweProbeFailureEvent(
723       const rtclog2::BweProbeResultFailure& proto);
724   ParseStatus StoreBweProbeSuccessEvent(
725       const rtclog2::BweProbeResultSuccess& proto);
726   ParseStatus StoreDtlsTransportState(
727       const rtclog2::DtlsTransportStateEvent& proto);
728   ParseStatus StoreDtlsWritableState(const rtclog2::DtlsWritableState& proto);
729   ParseStatus StoreGenericAckReceivedEvent(
730       const rtclog2::GenericAckReceived& proto);
731   ParseStatus StoreGenericPacketReceivedEvent(
732       const rtclog2::GenericPacketReceived& proto);
733   ParseStatus StoreGenericPacketSentEvent(
734       const rtclog2::GenericPacketSent& proto);
735   ParseStatus StoreIceCandidateEvent(
736       const rtclog2::IceCandidatePairEvent& proto);
737   ParseStatus StoreIceCandidatePairConfig(
738       const rtclog2::IceCandidatePairConfig& proto);
739   ParseStatus StoreIncomingRtcpPackets(
740       const rtclog2::IncomingRtcpPackets& proto);
741   ParseStatus StoreIncomingRtpPackets(const rtclog2::IncomingRtpPackets& proto);
742   ParseStatus StoreOutgoingRtcpPackets(
743       const rtclog2::OutgoingRtcpPackets& proto);
744   ParseStatus StoreOutgoingRtpPackets(const rtclog2::OutgoingRtpPackets& proto);
745   ParseStatus StoreParsedNewFormatEvent(const rtclog2::EventStream& event);
746   ParseStatus StoreRouteChangeEvent(const rtclog2::RouteChange& proto);
747   ParseStatus StoreRemoteEstimateEvent(const rtclog2::RemoteEstimates& proto);
748   ParseStatus StoreStartEvent(const rtclog2::BeginLogEvent& proto);
749   ParseStatus StoreStopEvent(const rtclog2::EndLogEvent& proto);
750   ParseStatus StoreVideoRecvConfig(const rtclog2::VideoRecvStreamConfig& proto);
751   ParseStatus StoreVideoSendConfig(const rtclog2::VideoSendStreamConfig& proto);
752   // End of new parsing functions.
753 
754   struct Stream {
755     Stream(uint32_t ssrc,
756            MediaType media_type,
757            PacketDirection direction,
758            webrtc::RtpHeaderExtensionMap map)
759         : ssrc(ssrc),
760           media_type(media_type),
761           direction(direction),
762           rtp_extensions_map(map) {}
763     uint32_t ssrc;
764     MediaType media_type;
765     PacketDirection direction;
766     webrtc::RtpHeaderExtensionMap rtp_extensions_map;
767   };
768 
769   const UnconfiguredHeaderExtensions parse_unconfigured_header_extensions_;
770   const bool allow_incomplete_logs_;
771 
772   // Make a default extension map for streams without configuration information.
773   // TODO(ivoc): Once configuration of audio streams is stored in the event log,
774   //             this can be removed. Tracking bug: webrtc:6399
775   RtpHeaderExtensionMap default_extension_map_;
776 
777   // Tracks what each stream is configured for. Note that a single SSRC can be
778   // in several sets. For example, the SSRC used for sending video over RTX
779   // will appear in both video_ssrcs_ and rtx_ssrcs_. In the unlikely case that
780   // an SSRC is reconfigured to a different media type mid-call, it will also
781   // appear in multiple sets.
782   std::set<uint32_t> incoming_rtx_ssrcs_;
783   std::set<uint32_t> incoming_video_ssrcs_;
784   std::set<uint32_t> incoming_audio_ssrcs_;
785   std::set<uint32_t> outgoing_rtx_ssrcs_;
786   std::set<uint32_t> outgoing_video_ssrcs_;
787   std::set<uint32_t> outgoing_audio_ssrcs_;
788 
789   // Maps an SSRC to the parsed  RTP headers in that stream. Header extensions
790   // are parsed if the stream has been configured. This is only used for
791   // grouping the events by SSRC during parsing; the events are moved to
792   // incoming_rtp_packets_by_ssrc_ once the parsing is done.
793   std::map<uint32_t, std::vector<LoggedRtpPacketIncoming>>
794       incoming_rtp_packets_map_;
795   std::map<uint32_t, std::vector<LoggedRtpPacketOutgoing>>
796       outgoing_rtp_packets_map_;
797 
798   // RTP headers.
799   std::vector<LoggedRtpStreamIncoming> incoming_rtp_packets_by_ssrc_;
800   std::vector<LoggedRtpStreamOutgoing> outgoing_rtp_packets_by_ssrc_;
801   std::vector<LoggedRtpStreamView> incoming_rtp_packet_views_by_ssrc_;
802   std::vector<LoggedRtpStreamView> outgoing_rtp_packet_views_by_ssrc_;
803 
804   // Raw RTCP packets.
805   std::vector<LoggedRtcpPacketIncoming> incoming_rtcp_packets_;
806   std::vector<LoggedRtcpPacketOutgoing> outgoing_rtcp_packets_;
807 
808   // Parsed RTCP messages. Currently not separated based on SSRC.
809   std::vector<LoggedRtcpPacketReceiverReport> incoming_rr_;
810   std::vector<LoggedRtcpPacketReceiverReport> outgoing_rr_;
811   std::vector<LoggedRtcpPacketSenderReport> incoming_sr_;
812   std::vector<LoggedRtcpPacketSenderReport> outgoing_sr_;
813   std::vector<LoggedRtcpPacketExtendedReports> incoming_xr_;
814   std::vector<LoggedRtcpPacketExtendedReports> outgoing_xr_;
815   std::vector<LoggedRtcpPacketNack> incoming_nack_;
816   std::vector<LoggedRtcpPacketNack> outgoing_nack_;
817   std::vector<LoggedRtcpPacketRemb> incoming_remb_;
818   std::vector<LoggedRtcpPacketRemb> outgoing_remb_;
819   std::vector<LoggedRtcpPacketFir> incoming_fir_;
820   std::vector<LoggedRtcpPacketFir> outgoing_fir_;
821   std::vector<LoggedRtcpPacketPli> incoming_pli_;
822   std::vector<LoggedRtcpPacketPli> outgoing_pli_;
823   std::vector<LoggedRtcpPacketTransportFeedback> incoming_transport_feedback_;
824   std::vector<LoggedRtcpPacketTransportFeedback> outgoing_transport_feedback_;
825   std::vector<LoggedRtcpPacketLossNotification> incoming_loss_notification_;
826   std::vector<LoggedRtcpPacketLossNotification> outgoing_loss_notification_;
827 
828   std::vector<LoggedStartEvent> start_log_events_;
829   std::vector<LoggedStopEvent> stop_log_events_;
830 
831   std::vector<LoggedAlrStateEvent> alr_state_events_;
832 
833   std::map<uint32_t, std::vector<LoggedAudioPlayoutEvent>>
834       audio_playout_events_;
835 
836   std::vector<LoggedAudioNetworkAdaptationEvent>
837       audio_network_adaptation_events_;
838 
839   std::vector<LoggedBweProbeClusterCreatedEvent>
840       bwe_probe_cluster_created_events_;
841 
842   std::vector<LoggedBweProbeFailureEvent> bwe_probe_failure_events_;
843   std::vector<LoggedBweProbeSuccessEvent> bwe_probe_success_events_;
844 
845   std::vector<LoggedBweDelayBasedUpdate> bwe_delay_updates_;
846   std::vector<LoggedBweLossBasedUpdate> bwe_loss_updates_;
847 
848   std::vector<LoggedDtlsTransportState> dtls_transport_states_;
849   std::vector<LoggedDtlsWritableState> dtls_writable_states_;
850 
851   std::vector<LoggedIceCandidatePairConfig> ice_candidate_pair_configs_;
852   std::vector<LoggedIceCandidatePairEvent> ice_candidate_pair_events_;
853 
854   std::vector<LoggedAudioRecvConfig> audio_recv_configs_;
855   std::vector<LoggedAudioSendConfig> audio_send_configs_;
856   std::vector<LoggedVideoRecvConfig> video_recv_configs_;
857   std::vector<LoggedVideoSendConfig> video_send_configs_;
858 
859   std::vector<LoggedGenericPacketReceived> generic_packets_received_;
860   std::vector<LoggedGenericPacketSent> generic_packets_sent_;
861   std::vector<LoggedGenericAckReceived> generic_acks_received_;
862 
863   std::vector<LoggedRouteChangeEvent> route_change_events_;
864   std::vector<LoggedRemoteEstimateEvent> remote_estimate_events_;
865 
866   uint8_t last_incoming_rtcp_packet_[IP_PACKET_SIZE];
867   uint8_t last_incoming_rtcp_packet_length_;
868 
869   int64_t first_timestamp_;
870   int64_t last_timestamp_;
871 
872   LogSegment first_log_segment_ =
873       LogSegment(0, std::numeric_limits<int64_t>::max());
874 
875   // The extension maps are mutable to allow us to insert the default
876   // configuration when parsing an RTP header for an unconfigured stream.
877   // TODO(terelius): This is only used for the legacy format. Remove once we've
878   // fully transitioned to the new format.
879   mutable std::map<uint32_t, webrtc::RtpHeaderExtensionMap>
880       incoming_rtp_extensions_maps_;
881   mutable std::map<uint32_t, webrtc::RtpHeaderExtensionMap>
882       outgoing_rtp_extensions_maps_;
883 };
884 
885 struct MatchedSendArrivalTimes {
886   static constexpr int64_t kNotReceived = -1;
887 
888   MatchedSendArrivalTimes(int64_t fb, int64_t tx, int64_t rx, int64_t ps)
889       : feedback_arrival_time_ms(fb),
890         send_time_ms(tx),
891         arrival_time_ms(rx),
892         payload_size(ps) {}
893 
894   int64_t feedback_arrival_time_ms;
895   int64_t send_time_ms;
896   int64_t arrival_time_ms;  // kNotReceived for lost packets.
897   int64_t payload_size;
898 };
899 const std::vector<MatchedSendArrivalTimes> GetNetworkTrace(
900     const ParsedRtcEventLog& parsed_log);
901 
902 }  // namespace webrtc
903 
904 #endif  // LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
905