xref: /aosp_15_r20/external/webrtc/video/send_delay_stats.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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 // Used to collect delay stats for video streams. The class gets callbacks
31 // from more than one threads and internally uses a mutex for data access
32 // synchronization.
33 // TODO(bugs.webrtc.org/11993): OnSendPacket and OnSentPacket will eventually
34 // be called consistently on the same thread. Once we're there, we should be
35 // able to avoid locking (at least for the fast path).
36 class SendDelayStats : public SendPacketObserver {
37  public:
38   explicit SendDelayStats(Clock* clock);
39   ~SendDelayStats() override;
40 
41   // Adds the configured ssrcs for the rtp streams.
42   // Stats will be calculated for these streams.
43   void AddSsrcs(const VideoSendStream::Config& config);
44 
45   // Called when a packet is sent (leaving socket).
46   bool OnSentPacket(int packet_id, int64_t time_ms);
47 
48  protected:
49   // From SendPacketObserver.
50   // Called when a packet is sent to the transport.
51   void OnSendPacket(uint16_t packet_id,
52                     int64_t capture_time_ms,
53                     uint32_t ssrc) override;
54 
55  private:
56   // Map holding sent packets (mapped by sequence number).
57   struct SequenceNumberOlderThan {
operatorSequenceNumberOlderThan58     bool operator()(uint16_t seq1, uint16_t seq2) const {
59       return IsNewerSequenceNumber(seq2, seq1);
60     }
61   };
62   struct Packet {
PacketPacket63     Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms)
64         : ssrc(ssrc),
65           capture_time_ms(capture_time_ms),
66           send_time_ms(send_time_ms) {}
67     uint32_t ssrc;
68     int64_t capture_time_ms;
69     int64_t send_time_ms;
70   };
71   typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap;
72 
73   void UpdateHistograms();
74   void RemoveOld(int64_t now, PacketMap* packets)
75       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
76   AvgCounter* GetSendDelayCounter(uint32_t ssrc)
77       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
78 
79   Clock* const clock_;
80   Mutex mutex_;
81 
82   PacketMap packets_ RTC_GUARDED_BY(mutex_);
83   size_t num_old_packets_ RTC_GUARDED_BY(mutex_);
84   size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_);
85 
86   std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(mutex_);
87 
88   // Mapped by SSRC.
89   std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_
90       RTC_GUARDED_BY(mutex_);
91 };
92 
93 }  // namespace webrtc
94 #endif  // VIDEO_SEND_DELAY_STATS_H_
95