xref: /aosp_15_r20/external/webrtc/video/send_delay_stats.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef VIDEO_SEND_DELAY_STATS_H_
12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_SEND_DELAY_STATS_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include <map>
18*d9f75844SAndroid Build Coastguard Worker #include <memory>
19*d9f75844SAndroid Build Coastguard Worker #include <set>
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker #include "call/video_send_stream.h"
22*d9f75844SAndroid Build Coastguard Worker #include "modules/include/module_common_types_public.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
25*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
26*d9f75844SAndroid Build Coastguard Worker #include "video/stats_counter.h"
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker // Used to collect delay stats for video streams. The class gets callbacks
31*d9f75844SAndroid Build Coastguard Worker // from more than one threads and internally uses a mutex for data access
32*d9f75844SAndroid Build Coastguard Worker // synchronization.
33*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): OnSendPacket and OnSentPacket will eventually
34*d9f75844SAndroid Build Coastguard Worker // be called consistently on the same thread. Once we're there, we should be
35*d9f75844SAndroid Build Coastguard Worker // able to avoid locking (at least for the fast path).
36*d9f75844SAndroid Build Coastguard Worker class SendDelayStats : public SendPacketObserver {
37*d9f75844SAndroid Build Coastguard Worker  public:
38*d9f75844SAndroid Build Coastguard Worker   explicit SendDelayStats(Clock* clock);
39*d9f75844SAndroid Build Coastguard Worker   ~SendDelayStats() override;
40*d9f75844SAndroid Build Coastguard Worker 
41*d9f75844SAndroid Build Coastguard Worker   // Adds the configured ssrcs for the rtp streams.
42*d9f75844SAndroid Build Coastguard Worker   // Stats will be calculated for these streams.
43*d9f75844SAndroid Build Coastguard Worker   void AddSsrcs(const VideoSendStream::Config& config);
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   // Called when a packet is sent (leaving socket).
46*d9f75844SAndroid Build Coastguard Worker   bool OnSentPacket(int packet_id, int64_t time_ms);
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker  protected:
49*d9f75844SAndroid Build Coastguard Worker   // From SendPacketObserver.
50*d9f75844SAndroid Build Coastguard Worker   // Called when a packet is sent to the transport.
51*d9f75844SAndroid Build Coastguard Worker   void OnSendPacket(uint16_t packet_id,
52*d9f75844SAndroid Build Coastguard Worker                     int64_t capture_time_ms,
53*d9f75844SAndroid Build Coastguard Worker                     uint32_t ssrc) override;
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker  private:
56*d9f75844SAndroid Build Coastguard Worker   // Map holding sent packets (mapped by sequence number).
57*d9f75844SAndroid Build Coastguard Worker   struct SequenceNumberOlderThan {
operatorSequenceNumberOlderThan58*d9f75844SAndroid Build Coastguard Worker     bool operator()(uint16_t seq1, uint16_t seq2) const {
59*d9f75844SAndroid Build Coastguard Worker       return IsNewerSequenceNumber(seq2, seq1);
60*d9f75844SAndroid Build Coastguard Worker     }
61*d9f75844SAndroid Build Coastguard Worker   };
62*d9f75844SAndroid Build Coastguard Worker   struct Packet {
PacketPacket63*d9f75844SAndroid Build Coastguard Worker     Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms)
64*d9f75844SAndroid Build Coastguard Worker         : ssrc(ssrc),
65*d9f75844SAndroid Build Coastguard Worker           capture_time_ms(capture_time_ms),
66*d9f75844SAndroid Build Coastguard Worker           send_time_ms(send_time_ms) {}
67*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc;
68*d9f75844SAndroid Build Coastguard Worker     int64_t capture_time_ms;
69*d9f75844SAndroid Build Coastguard Worker     int64_t send_time_ms;
70*d9f75844SAndroid Build Coastguard Worker   };
71*d9f75844SAndroid Build Coastguard Worker   typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap;
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker   void UpdateHistograms();
74*d9f75844SAndroid Build Coastguard Worker   void RemoveOld(int64_t now, PacketMap* packets)
75*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
76*d9f75844SAndroid Build Coastguard Worker   AvgCounter* GetSendDelayCounter(uint32_t ssrc)
77*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   Clock* const clock_;
80*d9f75844SAndroid Build Coastguard Worker   Mutex mutex_;
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker   PacketMap packets_ RTC_GUARDED_BY(mutex_);
83*d9f75844SAndroid Build Coastguard Worker   size_t num_old_packets_ RTC_GUARDED_BY(mutex_);
84*d9f75844SAndroid Build Coastguard Worker   size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_);
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker   std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(mutex_);
87*d9f75844SAndroid Build Coastguard Worker 
88*d9f75844SAndroid Build Coastguard Worker   // Mapped by SSRC.
89*d9f75844SAndroid Build Coastguard Worker   std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_
90*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(mutex_);
91*d9f75844SAndroid Build Coastguard Worker };
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
94*d9f75844SAndroid Build Coastguard Worker #endif  // VIDEO_SEND_DELAY_STATS_H_
95