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 <map> 15 #include <memory> 16 #include <set> 17 18 #include "common_types.h" // NOLINT(build/include) 19 #include "modules/include/module_common_types.h" 20 #include "rtc_base/criticalsection.h" 21 #include "rtc_base/thread_annotations.h" 22 #include "system_wrappers/include/clock.h" 23 #include "video/stats_counter.h" 24 #include "call/video_send_stream.h" 25 26 namespace webrtc { 27 28 class SendDelayStats : public SendPacketObserver { 29 public: 30 explicit SendDelayStats(Clock* clock); 31 virtual ~SendDelayStats(); 32 33 // Adds the configured ssrcs for the rtp streams. 34 // Stats will be calculated for these streams. 35 void AddSsrcs(const VideoSendStream::Config& config); 36 37 // Called when a packet is sent (leaving socket). 38 bool OnSentPacket(int packet_id, int64_t time_ms); 39 40 protected: 41 // From SendPacketObserver. 42 // Called when a packet is sent to the transport. 43 void OnSendPacket(uint16_t packet_id, 44 int64_t capture_time_ms, 45 uint32_t ssrc) override; 46 47 private: 48 // Map holding sent packets (mapped by sequence number). 49 struct SequenceNumberOlderThan { operatorSequenceNumberOlderThan50 bool operator()(uint16_t seq1, uint16_t seq2) const { 51 return IsNewerSequenceNumber(seq2, seq1); 52 } 53 }; 54 struct Packet { PacketPacket55 Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms) 56 : ssrc(ssrc), 57 capture_time_ms(capture_time_ms), 58 send_time_ms(send_time_ms) {} 59 uint32_t ssrc; 60 int64_t capture_time_ms; 61 int64_t send_time_ms; 62 }; 63 typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap; 64 65 void UpdateHistograms(); 66 void RemoveOld(int64_t now, PacketMap* packets) 67 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_); 68 AvgCounter* GetSendDelayCounter(uint32_t ssrc) 69 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_); 70 71 Clock* const clock_; 72 rtc::CriticalSection crit_; 73 74 PacketMap packets_ RTC_GUARDED_BY(crit_); 75 size_t num_old_packets_ RTC_GUARDED_BY(crit_); 76 size_t num_skipped_packets_ RTC_GUARDED_BY(crit_); 77 78 std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(crit_); 79 80 // Mapped by SSRC. 81 std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_ 82 RTC_GUARDED_BY(crit_); 83 }; 84 85 } // namespace webrtc 86 #endif // VIDEO_SEND_DELAY_STATS_H_ 87