blob: 7209094fe68a70342de60992ea2acc6e4528ef47 [file] [log] [blame]
sprang@webrtc.orgccd42842014-01-07 09:54:34 +00001/*
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
14#include <string>
15
Peter Boströmf2f82832015-05-01 13:00:41 +020016#include "webrtc/base/criticalsection.h"
perkj@webrtc.orgaf612d52015-03-18 09:51:05 +000017#include "webrtc/base/ratetracker.h"
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000018#include "webrtc/base/scoped_ptr.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000019#include "webrtc/base/thread_annotations.h"
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000020#include "webrtc/common_types.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010021#include "webrtc/modules/video_coding/include/video_codec_interface.h"
22#include "webrtc/modules/video_coding/include/video_coding_defines.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010023#include "webrtc/system_wrappers/include/clock.h"
Peter Boström300eeb62015-05-12 16:51:11 +020024#include "webrtc/video_engine/overuse_frame_detector.h"
25#include "webrtc/video_engine/vie_encoder.h"
pbos@webrtc.org273a4142014-12-01 15:23:21 +000026#include "webrtc/video_send_stream.h"
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000027
28namespace webrtc {
29
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +000030class SendStatisticsProxy : public CpuOveruseMetricsObserver,
31 public RtcpStatisticsCallback,
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +000032 public RtcpPacketTypeCounterObserver,
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000033 public StreamDataCountersCallback,
34 public BitrateStatisticsObserver,
35 public FrameCountObserver,
pbos@webrtc.org891d4832015-02-26 13:15:22 +000036 public VideoEncoderRateObserver,
stefan@webrtc.org168f23f2014-07-11 13:44:02 +000037 public SendSideDelayObserver {
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000038 public:
pbos@webrtc.org273a4142014-12-01 15:23:21 +000039 static const int kStatsTimeoutMs;
40
41 SendStatisticsProxy(Clock* clock, const VideoSendStream::Config& config);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000042 virtual ~SendStatisticsProxy();
43
pbos@webrtc.org273a4142014-12-01 15:23:21 +000044 VideoSendStream::Stats GetStats();
45
46 virtual void OnSendEncodedImage(const EncodedImage& encoded_image,
47 const RTPVideoHeader* rtp_video_header);
perkj@webrtc.orgaf612d52015-03-18 09:51:05 +000048 // Used to update incoming frame rate.
asaperssond89920b2015-07-22 06:52:00 -070049 void OnIncomingFrame(int width, int height);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000050
asapersson6718e972015-07-24 00:20:58 -070051 // Used to update encode time of frames.
52 void OnEncodedFrame(int encode_time_ms);
53
pbos@webrtc.org891d4832015-02-26 13:15:22 +000054 // From VideoEncoderRateObserver.
55 void OnSetRates(uint32_t bitrate_bps, int framerate) override;
56
Peter Boström7083e112015-09-22 16:28:51 +020057 void OnOutgoingRate(uint32_t framerate, uint32_t bitrate);
58 void OnSuspendChange(bool is_suspended);
Peter Boström20f3f942015-05-15 11:33:39 +020059 void OnInactiveSsrc(uint32_t ssrc);
60
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000061 protected:
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +000062 // From CpuOveruseMetricsObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000063 void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000064 // From RtcpStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000065 void StatisticsUpdated(const RtcpStatistics& statistics,
66 uint32_t ssrc) override;
67 void CNameChanged(const char* cname, uint32_t ssrc) override;
asaperssond89920b2015-07-22 06:52:00 -070068 // From RtcpPacketTypeCounterObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000069 void RtcpPacketTypesCounterUpdated(
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +000070 uint32_t ssrc,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000071 const RtcpPacketTypeCounter& packet_counter) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000072 // From StreamDataCountersCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000073 void DataCountersUpdated(const StreamDataCounters& counters,
74 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000075
76 // From BitrateStatisticsObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000077 void Notify(const BitrateStatistics& total_stats,
78 const BitrateStatistics& retransmit_stats,
79 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000080
81 // From FrameCountObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000082 void FrameCountUpdated(const FrameCounts& frame_counts,
83 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000084
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000085 void SendSideDelayUpdated(int avg_delay_ms,
86 int max_delay_ms,
87 uint32_t ssrc) override;
stefan@webrtc.org168f23f2014-07-11 13:44:02 +000088
sprang@webrtc.orgccd42842014-01-07 09:54:34 +000089 private:
asaperssonda535c42015-10-19 23:32:41 -070090 class SampleCounter {
91 public:
asaperssond89920b2015-07-22 06:52:00 -070092 SampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-19 23:32:41 -070093 ~SampleCounter() {}
asaperssond89920b2015-07-22 06:52:00 -070094 void Add(int sample);
95 int Avg(int min_required_samples) const;
96
97 private:
98 int sum;
99 int num_samples;
100 };
asaperssonda535c42015-10-19 23:32:41 -0700101 class BoolSampleCounter {
102 public:
asaperssondec5ebf2015-10-05 02:36:17 -0700103 BoolSampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-19 23:32:41 -0700104 ~BoolSampleCounter() {}
asaperssondec5ebf2015-10-05 02:36:17 -0700105 void Add(bool sample);
106 int Percent(int min_required_samples) const;
107 int Permille(int min_required_samples) const;
108
109 private:
110 int Fraction(int min_required_samples, float multiplier) const;
111 int sum;
112 int num_samples;
113 };
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000114 struct StatsUpdateTimes {
115 StatsUpdateTimes() : resolution_update_ms(0) {}
116 int64_t resolution_update_ms;
Peter Boström20f3f942015-05-15 11:33:39 +0200117 int64_t bitrate_update_ms;
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000118 };
119 void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_);
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000120 VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
121 EXCLUSIVE_LOCKS_REQUIRED(crit_);
Åsa Persson24b4eda2015-06-16 10:17:01 +0200122 void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000123
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000124 Clock* const clock_;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000125 const VideoSendStream::Config config_;
Peter Boströmf2f82832015-05-01 13:00:41 +0200126 mutable rtc::CriticalSection crit_;
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000127 VideoSendStream::Stats stats_ GUARDED_BY(crit_);
perkj@webrtc.orgaf612d52015-03-18 09:51:05 +0000128 rtc::RateTracker input_frame_rate_tracker_ GUARDED_BY(crit_);
Tim Psiaki63046262015-09-14 10:38:08 -0700129 rtc::RateTracker sent_frame_rate_tracker_ GUARDED_BY(crit_);
Åsa Persson24b4eda2015-06-16 10:17:01 +0200130 uint32_t last_sent_frame_timestamp_ GUARDED_BY(crit_);
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000131 std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_);
asaperssond89920b2015-07-22 06:52:00 -0700132
133 int max_sent_width_per_timestamp_ GUARDED_BY(crit_);
134 int max_sent_height_per_timestamp_ GUARDED_BY(crit_);
135 SampleCounter input_width_counter_ GUARDED_BY(crit_);
136 SampleCounter input_height_counter_ GUARDED_BY(crit_);
137 SampleCounter sent_width_counter_ GUARDED_BY(crit_);
138 SampleCounter sent_height_counter_ GUARDED_BY(crit_);
asapersson6718e972015-07-24 00:20:58 -0700139 SampleCounter encode_time_counter_ GUARDED_BY(crit_);
asaperssondec5ebf2015-10-05 02:36:17 -0700140 BoolSampleCounter key_frame_counter_ GUARDED_BY(crit_);
asapersson4306fc72015-10-19 00:35:21 -0700141 BoolSampleCounter quality_limited_frame_counter_ GUARDED_BY(crit_);
142 SampleCounter quality_downscales_counter_ GUARDED_BY(crit_);
asaperssonda535c42015-10-19 23:32:41 -0700143 BoolSampleCounter bw_limited_frame_counter_ GUARDED_BY(crit_);
144 SampleCounter bw_resolutions_disabled_counter_ GUARDED_BY(crit_);
asaperssonf040b232015-11-04 00:59:03 -0800145 SampleCounter delay_counter_ GUARDED_BY(crit_);
146 SampleCounter max_delay_counter_ GUARDED_BY(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000147};
148
149} // namespace webrtc
150#endif // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_