blob: 6366e5d945a56e14dcd72b2e6ce83e9e8da74753 [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"
pbos@webrtc.org273a4142014-12-01 15:23:21 +000021#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
pbos@webrtc.org891d4832015-02-26 13:15:22 +000022#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
pbos@webrtc.org273a4142014-12-01 15:23:21 +000023#include "webrtc/system_wrappers/interface/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:
asaperssond89920b2015-07-22 06:52:00 -070090 struct SampleCounter {
91 SampleCounter() : sum(0), num_samples(0) {}
92 void Add(int sample);
93 int Avg(int min_required_samples) const;
94
95 private:
96 int sum;
97 int num_samples;
98 };
asaperssondec5ebf2015-10-05 02:36:17 -070099 struct BoolSampleCounter {
100 BoolSampleCounter() : sum(0), num_samples(0) {}
101 void Add(bool sample);
102 int Percent(int min_required_samples) const;
103 int Permille(int min_required_samples) const;
104
105 private:
106 int Fraction(int min_required_samples, float multiplier) const;
107 int sum;
108 int num_samples;
109 };
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000110 struct StatsUpdateTimes {
111 StatsUpdateTimes() : resolution_update_ms(0) {}
112 int64_t resolution_update_ms;
Peter Boström20f3f942015-05-15 11:33:39 +0200113 int64_t bitrate_update_ms;
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000114 };
115 void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_);
pbos@webrtc.org09c77b92015-02-25 10:42:16 +0000116 VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
117 EXCLUSIVE_LOCKS_REQUIRED(crit_);
Åsa Persson24b4eda2015-06-16 10:17:01 +0200118 void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000119
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000120 Clock* const clock_;
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000121 const VideoSendStream::Config config_;
Peter Boströmf2f82832015-05-01 13:00:41 +0200122 mutable rtc::CriticalSection crit_;
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000123 VideoSendStream::Stats stats_ GUARDED_BY(crit_);
perkj@webrtc.orgaf612d52015-03-18 09:51:05 +0000124 rtc::RateTracker input_frame_rate_tracker_ GUARDED_BY(crit_);
Tim Psiaki63046262015-09-14 10:38:08 -0700125 rtc::RateTracker sent_frame_rate_tracker_ GUARDED_BY(crit_);
Åsa Persson24b4eda2015-06-16 10:17:01 +0200126 uint32_t last_sent_frame_timestamp_ GUARDED_BY(crit_);
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000127 std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_);
asaperssond89920b2015-07-22 06:52:00 -0700128
129 int max_sent_width_per_timestamp_ GUARDED_BY(crit_);
130 int max_sent_height_per_timestamp_ GUARDED_BY(crit_);
131 SampleCounter input_width_counter_ GUARDED_BY(crit_);
132 SampleCounter input_height_counter_ GUARDED_BY(crit_);
133 SampleCounter sent_width_counter_ GUARDED_BY(crit_);
134 SampleCounter sent_height_counter_ GUARDED_BY(crit_);
asapersson6718e972015-07-24 00:20:58 -0700135 SampleCounter encode_time_counter_ GUARDED_BY(crit_);
asaperssondec5ebf2015-10-05 02:36:17 -0700136 BoolSampleCounter key_frame_counter_ GUARDED_BY(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34 +0000137};
138
139} // namespace webrtc
140#endif // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_