/* * 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 "api/units/timestamp.h" #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: explicit SendDelayStats(Clock* clock); ~SendDelayStats(); // 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, Timestamp time); // Called when a packet is sent to the transport. void OnSendPacket(uint16_t packet_id, Timestamp capture_time, uint32_t ssrc); 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 { AvgCounter* send_delay; Timestamp capture_time; Timestamp send_time; }; void UpdateHistograms(); void RemoveOld(Timestamp now) RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); Clock* const clock_; Mutex mutex_; std::map packets_ RTC_GUARDED_BY(mutex_); size_t num_old_packets_ RTC_GUARDED_BY(mutex_); size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_); // Mapped by SSRC. std::map send_delay_counters_ RTC_GUARDED_BY(mutex_); }; } // namespace webrtc #endif // VIDEO_SEND_DELAY_STATS_H_