1 /*
2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef VIDEO_SEND_DELAY_STATS_H_
12 #define VIDEO_SEND_DELAY_STATS_H_
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 #include <map>
18 #include <memory>
19 #include <set>
20 
21 #include "call/video_send_stream.h"
22 #include "modules/include/module_common_types_public.h"
23 #include "rtc_base/synchronization/mutex.h"
24 #include "rtc_base/thread_annotations.h"
25 #include "system_wrappers/include/clock.h"
26 #include "video/stats_counter.h"
27 
28 namespace webrtc {
29 
30 class SendDelayStats : public SendPacketObserver {
31  public:
32   explicit SendDelayStats(Clock* clock);
33   ~SendDelayStats() override;
34 
35   // Adds the configured ssrcs for the rtp streams.
36   // Stats will be calculated for these streams.
37   void AddSsrcs(const VideoSendStream::Config& config);
38 
39   // Called when a packet is sent (leaving socket).
40   bool OnSentPacket(int packet_id, int64_t time_ms);
41 
42  protected:
43   // From SendPacketObserver.
44   // Called when a packet is sent to the transport.
45   void OnSendPacket(uint16_t packet_id,
46                     int64_t capture_time_ms,
47                     uint32_t ssrc) override;
48 
49  private:
50   // Map holding sent packets (mapped by sequence number).
51   struct SequenceNumberOlderThan {
operatorSequenceNumberOlderThan52     bool operator()(uint16_t seq1, uint16_t seq2) const {
53       return IsNewerSequenceNumber(seq2, seq1);
54     }
55   };
56   struct Packet {
PacketPacket57     Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms)
58         : ssrc(ssrc),
59           capture_time_ms(capture_time_ms),
60           send_time_ms(send_time_ms) {}
61     uint32_t ssrc;
62     int64_t capture_time_ms;
63     int64_t send_time_ms;
64   };
65   typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap;
66 
67   void UpdateHistograms();
68   void RemoveOld(int64_t now, PacketMap* packets)
69       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
70   AvgCounter* GetSendDelayCounter(uint32_t ssrc)
71       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
72 
73   Clock* const clock_;
74   Mutex mutex_;
75 
76   PacketMap packets_ RTC_GUARDED_BY(mutex_);
77   size_t num_old_packets_ RTC_GUARDED_BY(mutex_);
78   size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_);
79 
80   std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(mutex_);
81 
82   // Mapped by SSRC.
83   std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_
84       RTC_GUARDED_BY(mutex_);
85 };
86 
87 }  // namespace webrtc
88 #endif  // VIDEO_SEND_DELAY_STATS_H_
89