send_statistics_proxy.h revision 6304626268238a074051910d201e9a77aae677e0
1ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org/* 2ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * 4ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * Use of this source code is governed by a BSD-style license 5ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * that can be found in the LICENSE file in the root of the source 6ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * tree. An additional intellectual property rights grant can be found 7ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * in the file PATENTS. All contributing project authors may 8ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org */ 10ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 11ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#ifndef WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_ 12ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#define WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_ 13ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 14ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include <string> 15ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 16f2f828374c3ee1e1834c72bb27eaae88ef67bb40Peter Boström#include "webrtc/base/criticalsection.h" 17af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org#include "webrtc/base/ratetracker.h" 1800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h" 1938344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h" 20ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/common_types.h" 21273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" 22891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h" 23273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 24300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_engine/overuse_frame_detector.h" 25300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_engine/vie_encoder.h" 26ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/video_send_stream.h" 27ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 28ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.orgnamespace webrtc { 29ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 303e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.orgclass SendStatisticsProxy : public CpuOveruseMetricsObserver, 313e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org public RtcpStatisticsCallback, 321d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org public RtcpPacketTypeCounterObserver, 33ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public StreamDataCountersCallback, 34ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public BitrateStatisticsObserver, 35ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public FrameCountObserver, 36ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public ViEEncoderObserver, 37891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org public VideoEncoderRateObserver, 38168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org public SendSideDelayObserver { 39ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public: 40273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org static const int kStatsTimeoutMs; 41273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org 42273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org SendStatisticsProxy(Clock* clock, const VideoSendStream::Config& config); 43ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org virtual ~SendStatisticsProxy(); 44ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 45273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org VideoSendStream::Stats GetStats(); 46273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org 47273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org virtual void OnSendEncodedImage(const EncodedImage& encoded_image, 48273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org const RTPVideoHeader* rtp_video_header); 49af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org // Used to update incoming frame rate. 50d89920b74a173b7bf80c6760908a382c095a66ccasapersson void OnIncomingFrame(int width, int height); 51ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 526718e97e730dfeb0c4290128b5682e123dd75866asapersson // Used to update encode time of frames. 536718e97e730dfeb0c4290128b5682e123dd75866asapersson void OnEncodedFrame(int encode_time_ms); 546718e97e730dfeb0c4290128b5682e123dd75866asapersson 55891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org // From VideoEncoderRateObserver. 56891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org void OnSetRates(uint32_t bitrate_bps, int framerate) override; 57891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org 5820f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström void OnInactiveSsrc(uint32_t ssrc); 5920f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström 60ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org protected: 613e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org // From CpuOveruseMetricsObserver. 6214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override; 63ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org // From RtcpStatisticsCallback. 6414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void StatisticsUpdated(const RtcpStatistics& statistics, 6514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org uint32_t ssrc) override; 6614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void CNameChanged(const char* cname, uint32_t ssrc) override; 67d89920b74a173b7bf80c6760908a382c095a66ccasapersson // From RtcpPacketTypeCounterObserver. 6814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void RtcpPacketTypesCounterUpdated( 691d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org uint32_t ssrc, 7014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org const RtcpPacketTypeCounter& packet_counter) override; 71ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org // From StreamDataCountersCallback. 7214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void DataCountersUpdated(const StreamDataCounters& counters, 7314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org uint32_t ssrc) override; 74ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 75ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org // From BitrateStatisticsObserver. 7614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void Notify(const BitrateStatistics& total_stats, 7714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org const BitrateStatistics& retransmit_stats, 7814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org uint32_t ssrc) override; 79ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 80ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org // From FrameCountObserver. 8114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void FrameCountUpdated(const FrameCounts& frame_counts, 8214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org uint32_t ssrc) override; 83ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 84ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org // From ViEEncoderObserver. 8514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void OutgoingRate(const int video_channel, 8614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org const unsigned int framerate, 8714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org const unsigned int bitrate) override; 88ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 8914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void SuspendChange(int video_channel, bool is_suspended) override; 90ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 9114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void SendSideDelayUpdated(int avg_delay_ms, 9214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org int max_delay_ms, 9314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org uint32_t ssrc) override; 94168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org 95ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org private: 96d89920b74a173b7bf80c6760908a382c095a66ccasapersson struct SampleCounter { 97d89920b74a173b7bf80c6760908a382c095a66ccasapersson SampleCounter() : sum(0), num_samples(0) {} 98d89920b74a173b7bf80c6760908a382c095a66ccasapersson void Add(int sample); 99d89920b74a173b7bf80c6760908a382c095a66ccasapersson int Avg(int min_required_samples) const; 100d89920b74a173b7bf80c6760908a382c095a66ccasapersson 101d89920b74a173b7bf80c6760908a382c095a66ccasapersson private: 102d89920b74a173b7bf80c6760908a382c095a66ccasapersson int sum; 103d89920b74a173b7bf80c6760908a382c095a66ccasapersson int num_samples; 104d89920b74a173b7bf80c6760908a382c095a66ccasapersson }; 105273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org struct StatsUpdateTimes { 106273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org StatsUpdateTimes() : resolution_update_ms(0) {} 107273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org int64_t resolution_update_ms; 10820f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström int64_t bitrate_update_ms; 109273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org }; 110273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_); 11109c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc) 11209c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org EXCLUSIVE_LOCKS_REQUIRED(crit_); 11324b4eda6f4fdfd33d2c3e82df1390bad55953f5dÅsa Persson void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_); 114ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 115273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org Clock* const clock_; 116ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org const VideoSendStream::Config config_; 117f2f828374c3ee1e1834c72bb27eaae88ef67bb40Peter Boström mutable rtc::CriticalSection crit_; 118de1429e9ad9a3a207ca191e1d748aa7271066860pbos@webrtc.org VideoSendStream::Stats stats_ GUARDED_BY(crit_); 119af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org rtc::RateTracker input_frame_rate_tracker_ GUARDED_BY(crit_); 1206304626268238a074051910d201e9a77aae677e0Tim Psiaki rtc::RateTracker sent_frame_rate_tracker_ GUARDED_BY(crit_); 12124b4eda6f4fdfd33d2c3e82df1390bad55953f5dÅsa Persson uint32_t last_sent_frame_timestamp_ GUARDED_BY(crit_); 122273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_); 123d89920b74a173b7bf80c6760908a382c095a66ccasapersson 124d89920b74a173b7bf80c6760908a382c095a66ccasapersson int max_sent_width_per_timestamp_ GUARDED_BY(crit_); 125d89920b74a173b7bf80c6760908a382c095a66ccasapersson int max_sent_height_per_timestamp_ GUARDED_BY(crit_); 126d89920b74a173b7bf80c6760908a382c095a66ccasapersson SampleCounter input_width_counter_ GUARDED_BY(crit_); 127d89920b74a173b7bf80c6760908a382c095a66ccasapersson SampleCounter input_height_counter_ GUARDED_BY(crit_); 128d89920b74a173b7bf80c6760908a382c095a66ccasapersson SampleCounter sent_width_counter_ GUARDED_BY(crit_); 129d89920b74a173b7bf80c6760908a382c095a66ccasapersson SampleCounter sent_height_counter_ GUARDED_BY(crit_); 1306718e97e730dfeb0c4290128b5682e123dd75866asapersson SampleCounter encode_time_counter_ GUARDED_BY(crit_); 131ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org}; 132ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org 133ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org} // namespace webrtc 134ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#endif // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_ 135