blob: fa76a1e39c71ccf6a3864be3c8616b81d6915441 [file] [log] [blame]
asapersson35151f32016-05-03 06:44:011/*
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
Mirko Bonadei92ea95e2017-09-15 04:47:3111#ifndef VIDEO_SEND_DELAY_STATS_H_
12#define VIDEO_SEND_DELAY_STATS_H_
asapersson35151f32016-05-03 06:44:0113
Yves Gerey3e707812018-11-28 15:47:4914#include <stddef.h>
15#include <stdint.h>
Jonas Olssona4d87372019-07-05 17:08:3316
asapersson35151f32016-05-03 06:44:0117#include <map>
18#include <memory>
19#include <set>
20
Yves Gerey665174f2018-06-19 13:03:0521#include "call/video_send_stream.h"
Yves Gerey3e707812018-11-28 15:47:4922#include "modules/include/module_common_types_public.h"
Markus Handella3765182020-07-08 11:13:3223#include "rtc_base/synchronization/mutex.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "rtc_base/thread_annotations.h"
25#include "system_wrappers/include/clock.h"
26#include "video/stats_counter.h"
asapersson35151f32016-05-03 06:44:0127
28namespace webrtc {
29
Tomas Gunnarssoneb9c3f22021-04-19 10:53:0930// 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).
asapersson35151f32016-05-03 06:44:0136class SendDelayStats : public SendPacketObserver {
37 public:
38 explicit SendDelayStats(Clock* clock);
Stefan Holmerdbdb3a02018-07-17 14:03:4639 ~SendDelayStats() override;
asapersson35151f32016-05-03 06:44:0140
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 {
58 bool operator()(uint16_t seq1, uint16_t seq2) const {
59 return IsNewerSequenceNumber(seq2, seq1);
60 }
61 };
62 struct Packet {
63 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
asapersson35151f32016-05-03 06:44:0173 void UpdateHistograms();
74 void RemoveOld(int64_t now, PacketMap* packets)
Markus Handella3765182020-07-08 11:13:3275 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
asapersson40f54002016-06-09 07:09:2276 AvgCounter* GetSendDelayCounter(uint32_t ssrc)
Markus Handella3765182020-07-08 11:13:3277 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
asapersson35151f32016-05-03 06:44:0178
79 Clock* const clock_;
Markus Handella3765182020-07-08 11:13:3280 Mutex mutex_;
asapersson35151f32016-05-03 06:44:0181
Markus Handella3765182020-07-08 11:13:3282 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_);
asapersson35151f32016-05-03 06:44:0185
Markus Handella3765182020-07-08 11:13:3286 std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(mutex_);
asapersson40f54002016-06-09 07:09:2287
88 // Mapped by SSRC.
89 std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_
Markus Handella3765182020-07-08 11:13:3290 RTC_GUARDED_BY(mutex_);
asapersson35151f32016-05-03 06:44:0191};
92
93} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 04:47:3194#endif // VIDEO_SEND_DELAY_STATS_H_