1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef VIDEO_SEND_DELAY_STATS_H_ 12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_SEND_DELAY_STATS_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include <map> 18*d9f75844SAndroid Build Coastguard Worker #include <memory> 19*d9f75844SAndroid Build Coastguard Worker #include <set> 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker #include "call/video_send_stream.h" 22*d9f75844SAndroid Build Coastguard Worker #include "modules/include/module_common_types_public.h" 23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h" 24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h" 25*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h" 26*d9f75844SAndroid Build Coastguard Worker #include "video/stats_counter.h" 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 29*d9f75844SAndroid Build Coastguard Worker 30*d9f75844SAndroid Build Coastguard Worker // Used to collect delay stats for video streams. The class gets callbacks 31*d9f75844SAndroid Build Coastguard Worker // from more than one threads and internally uses a mutex for data access 32*d9f75844SAndroid Build Coastguard Worker // synchronization. 33*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): OnSendPacket and OnSentPacket will eventually 34*d9f75844SAndroid Build Coastguard Worker // be called consistently on the same thread. Once we're there, we should be 35*d9f75844SAndroid Build Coastguard Worker // able to avoid locking (at least for the fast path). 36*d9f75844SAndroid Build Coastguard Worker class SendDelayStats : public SendPacketObserver { 37*d9f75844SAndroid Build Coastguard Worker public: 38*d9f75844SAndroid Build Coastguard Worker explicit SendDelayStats(Clock* clock); 39*d9f75844SAndroid Build Coastguard Worker ~SendDelayStats() override; 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker // Adds the configured ssrcs for the rtp streams. 42*d9f75844SAndroid Build Coastguard Worker // Stats will be calculated for these streams. 43*d9f75844SAndroid Build Coastguard Worker void AddSsrcs(const VideoSendStream::Config& config); 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker // Called when a packet is sent (leaving socket). 46*d9f75844SAndroid Build Coastguard Worker bool OnSentPacket(int packet_id, int64_t time_ms); 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker protected: 49*d9f75844SAndroid Build Coastguard Worker // From SendPacketObserver. 50*d9f75844SAndroid Build Coastguard Worker // Called when a packet is sent to the transport. 51*d9f75844SAndroid Build Coastguard Worker void OnSendPacket(uint16_t packet_id, 52*d9f75844SAndroid Build Coastguard Worker int64_t capture_time_ms, 53*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc) override; 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker private: 56*d9f75844SAndroid Build Coastguard Worker // Map holding sent packets (mapped by sequence number). 57*d9f75844SAndroid Build Coastguard Worker struct SequenceNumberOlderThan { operatorSequenceNumberOlderThan58*d9f75844SAndroid Build Coastguard Worker bool operator()(uint16_t seq1, uint16_t seq2) const { 59*d9f75844SAndroid Build Coastguard Worker return IsNewerSequenceNumber(seq2, seq1); 60*d9f75844SAndroid Build Coastguard Worker } 61*d9f75844SAndroid Build Coastguard Worker }; 62*d9f75844SAndroid Build Coastguard Worker struct Packet { PacketPacket63*d9f75844SAndroid Build Coastguard Worker Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms) 64*d9f75844SAndroid Build Coastguard Worker : ssrc(ssrc), 65*d9f75844SAndroid Build Coastguard Worker capture_time_ms(capture_time_ms), 66*d9f75844SAndroid Build Coastguard Worker send_time_ms(send_time_ms) {} 67*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc; 68*d9f75844SAndroid Build Coastguard Worker int64_t capture_time_ms; 69*d9f75844SAndroid Build Coastguard Worker int64_t send_time_ms; 70*d9f75844SAndroid Build Coastguard Worker }; 71*d9f75844SAndroid Build Coastguard Worker typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap; 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker void UpdateHistograms(); 74*d9f75844SAndroid Build Coastguard Worker void RemoveOld(int64_t now, PacketMap* packets) 75*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 76*d9f75844SAndroid Build Coastguard Worker AvgCounter* GetSendDelayCounter(uint32_t ssrc) 77*d9f75844SAndroid Build Coastguard Worker RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_); 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 80*d9f75844SAndroid Build Coastguard Worker Mutex mutex_; 81*d9f75844SAndroid Build Coastguard Worker 82*d9f75844SAndroid Build Coastguard Worker PacketMap packets_ RTC_GUARDED_BY(mutex_); 83*d9f75844SAndroid Build Coastguard Worker size_t num_old_packets_ RTC_GUARDED_BY(mutex_); 84*d9f75844SAndroid Build Coastguard Worker size_t num_skipped_packets_ RTC_GUARDED_BY(mutex_); 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(mutex_); 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker // Mapped by SSRC. 89*d9f75844SAndroid Build Coastguard Worker std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_ 90*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(mutex_); 91*d9f75844SAndroid Build Coastguard Worker }; 92*d9f75844SAndroid Build Coastguard Worker 93*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 94*d9f75844SAndroid Build Coastguard Worker #endif // VIDEO_SEND_DELAY_STATS_H_ 95