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