blob: e9e89f64f53f860cc3b07b309ce4da2ffa527311 [file] [log] [blame]
sprang@webrtc.orgccd42842014-01-07 09:54:341/*
2 * Copyright (c) 2013 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 WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
12#define WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
13
mflodmand1590b22015-12-09 15:07:5914#include <map>
sprang@webrtc.orgccd42842014-01-07 09:54:3415#include <string>
16
Peter Boströmf2f82832015-05-01 11:00:4117#include "webrtc/base/criticalsection.h"
asapersson1aa420b2015-12-07 11:12:2218#include "webrtc/base/exp_filter.h"
perkj@webrtc.orgaf612d52015-03-18 09:51:0519#include "webrtc/base/ratetracker.h"
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:5520#include "webrtc/base/scoped_ptr.h"
pbos@webrtc.org38344ed2014-09-24 06:05:0021#include "webrtc/base/thread_annotations.h"
sprang@webrtc.orgccd42842014-01-07 09:54:3422#include "webrtc/common_types.h"
Henrik Kjellander2557b862015-11-18 21:00:2123#include "webrtc/modules/video_coding/include/video_codec_interface.h"
24#include "webrtc/modules/video_coding/include/video_coding_defines.h"
Henrik Kjellander98f53512015-10-28 17:17:4025#include "webrtc/system_wrappers/include/clock.h"
Peter Boström7623ce42015-12-09 11:13:3026#include "webrtc/video/overuse_frame_detector.h"
27#include "webrtc/video/vie_encoder.h"
pbos@webrtc.org273a4142014-12-01 15:23:2128#include "webrtc/video_send_stream.h"
sprang@webrtc.orgccd42842014-01-07 09:54:3429
30namespace webrtc {
31
pbos@webrtc.org3e6e2712015-02-26 12:19:3132class SendStatisticsProxy : public CpuOveruseMetricsObserver,
33 public RtcpStatisticsCallback,
pbos@webrtc.org1d0fa5d2015-02-19 12:47:0034 public RtcpPacketTypeCounterObserver,
sprang@webrtc.orgccd42842014-01-07 09:54:3435 public StreamDataCountersCallback,
36 public BitrateStatisticsObserver,
37 public FrameCountObserver,
pbos@webrtc.org891d4832015-02-26 13:15:2238 public VideoEncoderRateObserver,
stefan@webrtc.org168f23f2014-07-11 13:44:0239 public SendSideDelayObserver {
sprang@webrtc.orgccd42842014-01-07 09:54:3440 public:
pbos@webrtc.org273a4142014-12-01 15:23:2141 static const int kStatsTimeoutMs;
42
sprangb4a1ae52015-12-03 16:10:0843 SendStatisticsProxy(Clock* clock,
44 const VideoSendStream::Config& config,
45 VideoEncoderConfig::ContentType content_type);
sprang@webrtc.orgccd42842014-01-07 09:54:3446 virtual ~SendStatisticsProxy();
47
pbos@webrtc.org273a4142014-12-01 15:23:2148 VideoSendStream::Stats GetStats();
49
50 virtual void OnSendEncodedImage(const EncodedImage& encoded_image,
51 const RTPVideoHeader* rtp_video_header);
perkj@webrtc.orgaf612d52015-03-18 09:51:0552 // Used to update incoming frame rate.
asaperssond89920b2015-07-22 13:52:0053 void OnIncomingFrame(int width, int height);
sprang@webrtc.orgccd42842014-01-07 09:54:3454
asapersson6718e972015-07-24 07:20:5855 // Used to update encode time of frames.
56 void OnEncodedFrame(int encode_time_ms);
57
pbos@webrtc.org891d4832015-02-26 13:15:2258 // From VideoEncoderRateObserver.
59 void OnSetRates(uint32_t bitrate_bps, int framerate) override;
60
Peter Boström7083e112015-09-22 14:28:5161 void OnOutgoingRate(uint32_t framerate, uint32_t bitrate);
62 void OnSuspendChange(bool is_suspended);
Peter Boström20f3f942015-05-15 09:33:3963 void OnInactiveSsrc(uint32_t ssrc);
64
sprangb4a1ae52015-12-03 16:10:0865 // Used to indicate change in content type, which may require a change in
66 // how stats are collected.
67 void SetContentType(VideoEncoderConfig::ContentType content_type);
68
sprang@webrtc.orgccd42842014-01-07 09:54:3469 protected:
pbos@webrtc.org3e6e2712015-02-26 12:19:3170 // From CpuOveruseMetricsObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:3571 void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3472 // From RtcpStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:3573 void StatisticsUpdated(const RtcpStatistics& statistics,
74 uint32_t ssrc) override;
75 void CNameChanged(const char* cname, uint32_t ssrc) override;
asaperssond89920b2015-07-22 13:52:0076 // From RtcpPacketTypeCounterObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:3577 void RtcpPacketTypesCounterUpdated(
pbos@webrtc.org1d0fa5d2015-02-19 12:47:0078 uint32_t ssrc,
kjellander@webrtc.org14665ff2015-03-04 12:58:3579 const RtcpPacketTypeCounter& packet_counter) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3480 // From StreamDataCountersCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:3581 void DataCountersUpdated(const StreamDataCounters& counters,
82 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3483
84 // From BitrateStatisticsObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:3585 void Notify(const BitrateStatistics& total_stats,
86 const BitrateStatistics& retransmit_stats,
87 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3488
89 // From FrameCountObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:3590 void FrameCountUpdated(const FrameCounts& frame_counts,
91 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3492
kjellander@webrtc.org14665ff2015-03-04 12:58:3593 void SendSideDelayUpdated(int avg_delay_ms,
94 int max_delay_ms,
95 uint32_t ssrc) override;
stefan@webrtc.org168f23f2014-07-11 13:44:0296
sprang@webrtc.orgccd42842014-01-07 09:54:3497 private:
asaperssonda535c42015-10-20 06:32:4198 class SampleCounter {
99 public:
asaperssond89920b2015-07-22 13:52:00100 SampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-20 06:32:41101 ~SampleCounter() {}
asaperssond89920b2015-07-22 13:52:00102 void Add(int sample);
103 int Avg(int min_required_samples) const;
104
105 private:
106 int sum;
107 int num_samples;
108 };
asaperssonda535c42015-10-20 06:32:41109 class BoolSampleCounter {
110 public:
asaperssondec5ebf2015-10-05 09:36:17111 BoolSampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-20 06:32:41112 ~BoolSampleCounter() {}
asaperssondec5ebf2015-10-05 09:36:17113 void Add(bool sample);
114 int Percent(int min_required_samples) const;
115 int Permille(int min_required_samples) const;
116
117 private:
118 int Fraction(int min_required_samples, float multiplier) const;
119 int sum;
120 int num_samples;
121 };
pbos@webrtc.org273a4142014-12-01 15:23:21122 struct StatsUpdateTimes {
sprangb4a1ae52015-12-03 16:10:08123 StatsUpdateTimes() : resolution_update_ms(0), bitrate_update_ms(0) {}
pbos@webrtc.org273a4142014-12-01 15:23:21124 int64_t resolution_update_ms;
Peter Boström20f3f942015-05-15 09:33:39125 int64_t bitrate_update_ms;
pbos@webrtc.org273a4142014-12-01 15:23:21126 };
127 void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_);
pbos@webrtc.org09c77b92015-02-25 10:42:16128 VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
129 EXCLUSIVE_LOCKS_REQUIRED(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34130
pbos@webrtc.org273a4142014-12-01 15:23:21131 Clock* const clock_;
sprang@webrtc.orgccd42842014-01-07 09:54:34132 const VideoSendStream::Config config_;
Peter Boströmf2f82832015-05-01 11:00:41133 mutable rtc::CriticalSection crit_;
sprangb4a1ae52015-12-03 16:10:08134 VideoEncoderConfig::ContentType content_type_ GUARDED_BY(crit_);
pbos@webrtc.orgde1429e2014-04-28 13:00:21135 VideoSendStream::Stats stats_ GUARDED_BY(crit_);
Åsa Persson24b4eda2015-06-16 08:17:01136 uint32_t last_sent_frame_timestamp_ GUARDED_BY(crit_);
pbos@webrtc.org273a4142014-12-01 15:23:21137 std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_);
asapersson1aa420b2015-12-07 11:12:22138 rtc::ExpFilter encode_time_ GUARDED_BY(crit_);
asaperssond89920b2015-07-22 13:52:00139
sprangb4a1ae52015-12-03 16:10:08140 // Contains stats used for UMA histograms. These stats will be reset if
141 // content type changes between real-time video and screenshare, since these
142 // will be reported separately.
143 struct UmaSamplesContainer {
144 explicit UmaSamplesContainer(const char* prefix);
145 ~UmaSamplesContainer();
146
147 void UpdateHistograms();
148
149 const std::string uma_prefix_;
150 int max_sent_width_per_timestamp_;
151 int max_sent_height_per_timestamp_;
152 SampleCounter input_width_counter_;
153 SampleCounter input_height_counter_;
154 SampleCounter sent_width_counter_;
155 SampleCounter sent_height_counter_;
156 SampleCounter encode_time_counter_;
157 BoolSampleCounter key_frame_counter_;
158 BoolSampleCounter quality_limited_frame_counter_;
159 SampleCounter quality_downscales_counter_;
160 BoolSampleCounter bw_limited_frame_counter_;
161 SampleCounter bw_resolutions_disabled_counter_;
162 SampleCounter delay_counter_;
163 SampleCounter max_delay_counter_;
164 rtc::RateTracker input_frame_rate_tracker_;
165 rtc::RateTracker sent_frame_rate_tracker_;
166 };
167
168 rtc::scoped_ptr<UmaSamplesContainer> uma_container_ GUARDED_BY(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34169};
170
171} // namespace webrtc
172#endif // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_