/* * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef VIDEO_SEND_DELAY_STATS_H_ #define VIDEO_SEND_DELAY_STATS_H_ #include #include #include #include #include #include "call/video_send_stream.h" #include "modules/include/module_common_types_public.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" #include "system_wrappers/include/clock.h" #include "video/stats_counter.h" namespace webrtc { // Used to collect delay stats for video streams. The class gets callbacks // from more than one threads and internally uses a mutex for data access // synchronization. // TODO(bugs.webrtc.org/11993): OnSendPacket and OnSentPacket will eventually // be called consistently on the same thread. Once we're there, we should be // able to avoid locking (at least for the fast path). class SendDelayStats : public SendPacketObserver { public: explicit SendDelayStats(Clock* clock); ~SendDelayStats() override; // Adds the configured ssrcs for the rtp streams. // Stats will be calculated for these streams. void AddSsrcs(const VideoSendStream::Config& config); // Called when a packet is sent (leaving socket). bool OnSentPacket(int packet_id, int64_t time_ms); protected: // From SendPacketObserver. // Called when a packet is sent to the transport. void OnSendPacket(uint16_t packet_id, int64_t capture_time_ms, uint32_t ssrc) override; private: // Map holding sent packets (mapped by sequence number). struct SequenceNumberOlderThan { bool operator()(uint16_t seq1, uint16_t seq2) const { return IsNewerSequenceNumber(seq2, seq1); } }; struct Packet { Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms) : ssrc(ssrc), capture_time_ms(capture_time_ms), send_time_ms(send_time_ms) {} uint32_t ssrc; int64_t capture_time_ms; int64_t send_time_ms; }; typedef std::map PacketMap; void UpdateHistograms(); void RemoveOld(int64_t now, PacketMap* packets) RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); AvgCounter* GetSendDelayCounter(uint32_t ssrc) RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); Clock* const clock_; Mutex mutex_; PacketMap packets_ RTC_GUARDED_BY(mutex_); size_t num_old_packets_ RTC_GUARDED_BY(mutex_); size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_); std::set ssrcs_ RTC_GUARDED_BY(mutex_); // Mapped by SSRC. std::map> send_delay_counters_ RTC_GUARDED_BY(mutex_); }; } // namespace webrtc #endif // VIDEO_SEND_DELAY_STATS_H_