1 /*
2  *  Copyright (c) 2020 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 #ifndef RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_ALERTS_H_
12 #define RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_ALERTS_H_
13 
14 #include <stdio.h>
15 
16 #include <map>
17 #include <string>
18 #include <utility>
19 
20 #include "absl/strings/string_view.h"
21 #include "logging/rtc_event_log/rtc_event_log_parser.h"
22 #include "rtc_base/constructor_magic.h"
23 #include "rtc_tools/rtc_event_log_visualizer/analyzer_common.h"
24 
25 namespace webrtc {
26 
27 enum class TriageAlertType {
28   kUnknown = 0,
29   kIncomingRtpGap,
30   kOutgoingRtpGap,
31   kIncomingRtcpGap,
32   kOutgoingRtcpGap,
33   kIncomingSeqNumJump,
34   kOutgoingSeqNumJump,
35   kIncomingCaptureTimeJump,
36   kOutgoingCaptureTimeJump,
37   kOutgoingHighLoss,
38   kLast,
39 };
40 
41 struct TriageAlert {
42   TriageAlertType type = TriageAlertType::kUnknown;
43   int count = 0;
44   float first_occurrence = -1;
45   std::string explanation;
46 };
47 
48 class TriageHelper {
49  public:
TriageHelper(const AnalyzerConfig & config)50   explicit TriageHelper(const AnalyzerConfig& config) : config_(config) {}
51 
52   void AnalyzeLog(const ParsedRtcEventLog& parsed_log);
53 
54   void AnalyzeStreamGaps(const ParsedRtcEventLog& parsed_log,
55                          PacketDirection direction);
56   void AnalyzeTransmissionGaps(const ParsedRtcEventLog& parsed_log,
57                                PacketDirection direction);
58   void Print(FILE* file);
59 
60  private:
61   AnalyzerConfig config_;
62   std::map<TriageAlertType, TriageAlert> triage_alerts_;
63 
Alert(TriageAlertType type,float time_seconds,absl::string_view explanation)64   void Alert(TriageAlertType type,
65              float time_seconds,
66              absl::string_view explanation) {
67     std::map<TriageAlertType, TriageAlert>::iterator it =
68         triage_alerts_.find(type);
69 
70     if (it == triage_alerts_.end()) {
71       TriageAlert alert;
72       alert.type = type;
73       alert.first_occurrence = time_seconds;
74       alert.count = 1;
75       alert.explanation = std::string(explanation);
76       triage_alerts_.insert(std::make_pair(type, alert));
77     } else {
78       it->second.count += 1;
79     }
80   }
81   RTC_DISALLOW_COPY_AND_ASSIGN(TriageHelper);
82 };
83 
84 }  // namespace webrtc
85 
86 #endif  // RTC_TOOLS_RTC_EVENT_LOG_VISUALIZER_ALERTS_H_
87