blob: 1bd79d8e4a0f81006061f7abf8b82e25e8765194 [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
Mirko Bonadei92ea95e2017-09-15 04:47:3111#ifndef VIDEO_SEND_STATISTICS_PROXY_H_
12#define VIDEO_SEND_STATISTICS_PROXY_H_
sprang@webrtc.orgccd42842014-01-07 09:54:3413
Evan Shrubsolecc62b162019-09-09 09:26:4514#include <array>
mflodmand1590b22015-12-09 15:07:5915#include <map>
kwiberg27f982b2016-03-01 19:52:3316#include <memory>
sprang@webrtc.orgccd42842014-01-07 09:54:3417#include <string>
Pera48ddb72016-09-29 09:48:5018#include <vector>
sprang@webrtc.orgccd42842014-01-07 09:54:3419
Evan Shrubsolecc62b162019-09-09 09:26:4520#include "api/video/video_codec_constants.h"
Niels Möller213618e2018-07-24 07:29:5821#include "api/video/video_stream_encoder_observer.h"
Evan Shrubsolecc62b162019-09-09 09:26:4522#include "api/video_codecs/video_encoder_config.h"
Yves Gerey665174f2018-06-19 13:03:0523#include "call/video_send_stream.h"
Danil Chapovalov7c067772019-10-07 10:56:2424#include "modules/include/module_common_types_public.h"
Henrik Boström87e3f9d2019-05-27 08:44:2425#include "modules/rtp_rtcp/include/report_block_data.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3126#include "modules/video_coding/include/video_codec_interface.h"
27#include "modules/video_coding/include/video_coding_defines.h"
Steve Anton10542f22019-01-11 17:11:0028#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3129#include "rtc_base/numerics/exp_filter.h"
Steve Anton10542f22019-01-11 17:11:0030#include "rtc_base/rate_tracker.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3131#include "rtc_base/thread_annotations.h"
32#include "system_wrappers/include/clock.h"
Henrik Boströmce33b6a2019-05-28 15:42:3833#include "video/quality_limitation_reason_tracker.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3134#include "video/report_block_stats.h"
35#include "video/stats_counter.h"
sprang@webrtc.orgccd42842014-01-07 09:54:3436
37namespace webrtc {
38
Niels Möller213618e2018-07-24 07:29:5839class SendStatisticsProxy : public VideoStreamEncoderObserver,
pbos@webrtc.org3e6e2712015-02-26 12:19:3140 public RtcpStatisticsCallback,
Henrik Boström87e3f9d2019-05-27 08:44:2441 public ReportBlockDataObserver,
pbos@webrtc.org1d0fa5d2015-02-19 12:47:0042 public RtcpPacketTypeCounterObserver,
sprang@webrtc.orgccd42842014-01-07 09:54:3443 public StreamDataCountersCallback,
44 public BitrateStatisticsObserver,
45 public FrameCountObserver,
stefan@webrtc.org168f23f2014-07-11 13:44:0246 public SendSideDelayObserver {
sprang@webrtc.orgccd42842014-01-07 09:54:3447 public:
pbos@webrtc.org273a4142014-12-01 15:23:2148 static const int kStatsTimeoutMs;
perkj803d97f2016-11-01 18:45:4649 // Number of required samples to be collected before a metric is added
50 // to a rtc histogram.
51 static const int kMinRequiredMetricsSamples = 200;
pbos@webrtc.org273a4142014-12-01 15:23:2152
sprangb4a1ae52015-12-03 16:10:0853 SendStatisticsProxy(Clock* clock,
54 const VideoSendStream::Config& config,
55 VideoEncoderConfig::ContentType content_type);
Stefan Holmerdbdb3a02018-07-17 14:03:4656 ~SendStatisticsProxy() override;
sprang@webrtc.orgccd42842014-01-07 09:54:3457
sprangc5d62e22017-04-03 06:53:0458 virtual VideoSendStream::Stats GetStats();
pbos@webrtc.org273a4142014-12-01 15:23:2159
Stefan Holmerdbdb3a02018-07-17 14:03:4660 void OnSendEncodedImage(const EncodedImage& encoded_image,
Niels Möller213618e2018-07-24 07:29:5861 const CodecSpecificInfo* codec_info) override;
Erik Språnge2fd86a72018-10-24 09:32:3962
63 void OnEncoderImplementationChanged(
64 const std::string& implementation_name) override;
65
perkj@webrtc.orgaf612d52015-03-18 09:51:0566 // Used to update incoming frame rate.
Niels Möller213618e2018-07-24 07:29:5867 void OnIncomingFrame(int width, int height) override;
sprang@webrtc.orgccd42842014-01-07 09:54:3468
Ilya Nikolaevskiyd79314f2017-10-23 08:45:3769 // Dropped frame stats.
Niels Möller213618e2018-07-24 07:29:5870 void OnFrameDropped(DropReason) override;
Ilya Nikolaevskiyd79314f2017-10-23 08:45:3771
asapersson09f05612017-05-16 06:40:1872 // Adaptation stats.
Evan Shrubsoledff79252020-04-16 09:34:3273 void OnAdaptationChanged(
74 AdaptationReason reason,
75 const VideoAdaptationCounters& cpu_counters,
76 const VideoAdaptationCounters& quality_counters) override;
77 void ClearAdaptationStats() override;
78 void UpdateAdaptationSettings(AdaptationSettings cpu_settings,
79 AdaptationSettings quality_settings) override;
perkj803d97f2016-11-01 18:45:4680
Evan Shrubsolecc62b162019-09-09 09:26:4581 void OnBitrateAllocationUpdated(
82 const VideoCodec& codec,
83 const VideoBitrateAllocation& allocation) override;
84
Ilya Nikolaevskiyeac08bf2020-03-10 09:50:2685 void OnEncoderInternalScalerUpdate(bool is_scaled) override;
86
Niels Möller213618e2018-07-24 07:29:5887 void OnMinPixelLimitReached() override;
88 void OnInitialQualityResolutionAdaptDown() override;
89
90 void OnSuspendChange(bool is_suspended) override;
Peter Boström20f3f942015-05-15 09:33:3991 void OnInactiveSsrc(uint32_t ssrc);
92
sprangb4a1ae52015-12-03 16:10:0893 // Used to indicate change in content type, which may require a change in
Niels Möller97e04882018-05-25 07:43:2694 // how stats are collected.
Pera48ddb72016-09-29 09:48:5095 void OnEncoderReconfigured(const VideoEncoderConfig& encoder_config,
Niels Möller213618e2018-07-24 07:29:5896 const std::vector<VideoStream>& streams) override;
sprangb4a1ae52015-12-03 16:10:0897
perkjf5b2e512016-07-05 15:34:0498 // Used to update the encoder target rate.
99 void OnSetEncoderTargetRate(uint32_t bitrate_bps);
Peter Boströme4499152016-02-05 10:13:28100
101 // Implements CpuOveruseMetricsObserver.
102 void OnEncodedFrameTimeMeasured(int encode_time_ms,
Niels Möller213618e2018-07-24 07:29:58103 int encode_usage_percent) override;
Peter Boströme4499152016-02-05 10:13:28104
Niels Möller213618e2018-07-24 07:29:58105 int GetInputFrameRate() const override;
Per69b332d2016-06-02 13:45:42106 int GetSendFrameRate() const;
107
sprang@webrtc.orgccd42842014-01-07 09:54:34108 protected:
109 // From RtcpStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35110 void StatisticsUpdated(const RtcpStatistics& statistics,
111 uint32_t ssrc) override;
Henrik Boström87e3f9d2019-05-27 08:44:24112 // From ReportBlockDataObserver.
113 void OnReportBlockDataUpdated(ReportBlockData report_block_data) override;
asaperssond89920b2015-07-22 13:52:00114 // From RtcpPacketTypeCounterObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35115 void RtcpPacketTypesCounterUpdated(
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00116 uint32_t ssrc,
kjellander@webrtc.org14665ff2015-03-04 12:58:35117 const RtcpPacketTypeCounter& packet_counter) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34118 // From StreamDataCountersCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35119 void DataCountersUpdated(const StreamDataCounters& counters,
120 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34121
122 // From BitrateStatisticsObserver.
sprangcd349d92016-07-13 16:11:28123 void Notify(uint32_t total_bitrate_bps,
124 uint32_t retransmit_bitrate_bps,
kjellander@webrtc.org14665ff2015-03-04 12:58:35125 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34126
127 // From FrameCountObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35128 void FrameCountUpdated(const FrameCounts& frame_counts,
129 uint32_t ssrc) override;
sprang@webrtc.orgccd42842014-01-07 09:54:34130
kjellander@webrtc.org14665ff2015-03-04 12:58:35131 void SendSideDelayUpdated(int avg_delay_ms,
132 int max_delay_ms,
Henrik Boström9fe18342019-05-16 16:38:20133 uint64_t total_delay_ms,
kjellander@webrtc.org14665ff2015-03-04 12:58:35134 uint32_t ssrc) override;
stefan@webrtc.org168f23f2014-07-11 13:44:02135
sprang@webrtc.orgccd42842014-01-07 09:54:34136 private:
asaperssonda535c42015-10-20 06:32:41137 class SampleCounter {
138 public:
asaperssond89920b2015-07-22 13:52:00139 SampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-20 06:32:41140 ~SampleCounter() {}
asaperssond89920b2015-07-22 13:52:00141 void Add(int sample);
asapersson66d4b372016-12-19 14:50:53142 int Avg(int64_t min_required_samples) const;
asaperssond89920b2015-07-22 13:52:00143
144 private:
asapersson66d4b372016-12-19 14:50:53145 int64_t sum;
146 int64_t num_samples;
asaperssond89920b2015-07-22 13:52:00147 };
asaperssonda535c42015-10-20 06:32:41148 class BoolSampleCounter {
149 public:
asaperssondec5ebf2015-10-05 09:36:17150 BoolSampleCounter() : sum(0), num_samples(0) {}
asaperssonda535c42015-10-20 06:32:41151 ~BoolSampleCounter() {}
asaperssondec5ebf2015-10-05 09:36:17152 void Add(bool sample);
asapersson66d4b372016-12-19 14:50:53153 void Add(bool sample, int64_t count);
154 int Percent(int64_t min_required_samples) const;
155 int Permille(int64_t min_required_samples) const;
asaperssondec5ebf2015-10-05 09:36:17156
157 private:
asapersson66d4b372016-12-19 14:50:53158 int Fraction(int64_t min_required_samples, float multiplier) const;
159 int64_t sum;
160 int64_t num_samples;
asaperssondec5ebf2015-10-05 09:36:17161 };
pbos@webrtc.org273a4142014-12-01 15:23:21162 struct StatsUpdateTimes {
sprangb4a1ae52015-12-03 16:10:08163 StatsUpdateTimes() : resolution_update_ms(0), bitrate_update_ms(0) {}
pbos@webrtc.org273a4142014-12-01 15:23:21164 int64_t resolution_update_ms;
Peter Boström20f3f942015-05-15 09:33:39165 int64_t bitrate_update_ms;
pbos@webrtc.org273a4142014-12-01 15:23:21166 };
asapersson66d4b372016-12-19 14:50:53167 struct TargetRateUpdates {
168 TargetRateUpdates()
169 : pause_resume_events(0), last_paused_or_resumed(false), last_ms(-1) {}
170 int pause_resume_events;
171 bool last_paused_or_resumed;
172 int64_t last_ms;
173 };
asapersson8d75ac72017-09-15 13:41:15174 struct FallbackEncoderInfo {
Mirko Bonadei8fdcac32018-08-28 14:30:18175 FallbackEncoderInfo();
asapersson8d75ac72017-09-15 13:41:15176 bool is_possible = true;
177 bool is_active = false;
178 int on_off_events = 0;
179 int64_t elapsed_ms = 0;
Danil Chapovalovb9b146c2018-06-15 10:28:07180 absl::optional<int64_t> last_update_ms;
asapersson8d75ac72017-09-15 13:41:15181 const int max_frame_diff_ms = 2000;
182 };
Åsa Perssonc3ed6302017-11-16 13:04:52183 struct FallbackEncoderInfoDisabled {
184 bool is_possible = true;
185 bool min_pixel_limit_reached = false;
186 };
asapersson6eca98b2017-04-05 06:40:50187 struct StatsTimer {
188 void Start(int64_t now_ms);
189 void Stop(int64_t now_ms);
190 void Restart(int64_t now_ms);
191 int64_t start_ms = -1;
192 int64_t total_ms = 0;
193 };
asapersson118ef002016-03-31 07:00:19194 struct QpCounters {
asapersson6eca98b2017-04-05 06:40:50195 SampleCounter vp8; // QP range: 0-127.
196 SampleCounter vp9; // QP range: 0-255.
197 SampleCounter h264; // QP range: 0-51.
asapersson118ef002016-03-31 07:00:19198 };
Åsa Persson875841d2018-01-08 07:49:53199 struct AdaptChanges {
200 int down = 0;
201 int up = 0;
202 };
Åsa Persson0122e842017-10-16 10:19:23203
204 // Map holding encoded frames (mapped by timestamp).
205 // If simulcast layers are encoded on different threads, there is no guarantee
206 // that one frame of all layers are encoded before the next start.
207 struct TimestampOlderThan {
208 bool operator()(uint32_t ts1, uint32_t ts2) const {
209 return IsNewerTimestamp(ts2, ts1);
210 }
211 };
212 struct Frame {
Niels Möllerd3b8c632018-08-27 13:33:42213 Frame(int64_t send_ms, uint32_t width, uint32_t height, int simulcast_idx)
Åsa Perssonaa329e72017-12-15 14:54:44214 : send_ms(send_ms),
215 max_width(width),
216 max_height(height),
217 max_simulcast_idx(simulcast_idx) {}
Åsa Persson0122e842017-10-16 10:19:23218 const int64_t
219 send_ms; // Time when first frame with this timestamp is sent.
220 uint32_t max_width; // Max width with this timestamp.
221 uint32_t max_height; // Max height with this timestamp.
Niels Möllerd3b8c632018-08-27 13:33:42222 int max_simulcast_idx; // Max simulcast index with this timestamp.
Åsa Persson0122e842017-10-16 10:19:23223 };
224 typedef std::map<uint32_t, Frame, TimestampOlderThan> EncodedFrameMap;
225
danilchapa37de392017-09-09 11:17:22226 void PurgeOldStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
pbos@webrtc.org09c77b92015-02-25 10:42:16227 VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
danilchapa37de392017-09-09 11:17:22228 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34229
Evan Shrubsoledff79252020-04-16 09:34:32230 struct MaskedAdaptationCounts {
231 absl::optional<int> resolution_adaptations = absl::nullopt;
232 absl::optional<int> num_framerate_reductions = absl::nullopt;
233 };
234
235 struct Adaptations {
236 public:
237 MaskedAdaptationCounts MaskedCpuCounts() const;
238 MaskedAdaptationCounts MaskedQualityCounts() const;
239
240 void set_cpu_counts(const VideoAdaptationCounters& cpu_counts);
241 void set_quality_counts(const VideoAdaptationCounters& quality_counts);
242
243 void UpdateMaskingSettings(AdaptationSettings cpu_settings,
244 AdaptationSettings quality_settings);
245
246 private:
247 VideoAdaptationCounters cpu_counts_;
248 AdaptationSettings cpu_settings_;
249 VideoAdaptationCounters quality_counts_;
250 AdaptationSettings quality_settings_;
251
252 MaskedAdaptationCounts Mask(const VideoAdaptationCounters& counters,
253 const AdaptationSettings& settings) const;
254 };
255
256 void SetAdaptTimer(const MaskedAdaptationCounts& counts, StatsTimer* timer)
Niels Möller213618e2018-07-24 07:29:58257 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
Ilya Nikolaevskiy5963c7c2019-10-09 16:06:58258 void UpdateAdaptationStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
Åsa Persson875841d2018-01-08 07:49:53259 void TryUpdateInitialQualityResolutionAdaptUp(
Evan Shrubsoledff79252020-04-16 09:34:32260 absl::optional<int> old_quality_downscales,
261 absl::optional<int> updated_quality_downscales)
Åsa Persson875841d2018-01-08 07:49:53262 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
asapersson09f05612017-05-16 06:40:18263
Åsa Persson45bbc8a2017-11-13 09:16:47264 void UpdateEncoderFallbackStats(const CodecSpecificInfo* codec_info,
Niels Möllerd3b8c632018-08-27 13:33:42265 int pixels,
266 int simulcast_index)
asapersson8d75ac72017-09-15 13:41:15267 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
Åsa Perssonc3ed6302017-11-16 13:04:52268 void UpdateFallbackDisabledStats(const CodecSpecificInfo* codec_info,
Niels Möllerd3b8c632018-08-27 13:33:42269 int pixels,
270 int simulcast_index)
Åsa Perssonc3ed6302017-11-16 13:04:52271 RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
asapersson8d75ac72017-09-15 13:41:15272
pbos@webrtc.org273a4142014-12-01 15:23:21273 Clock* const clock_;
perkj26091b12016-09-01 08:17:40274 const std::string payload_name_;
Stefan Holmerdbdb3a02018-07-17 14:03:46275 const RtpConfig rtp_config_;
Danil Chapovalovb9b146c2018-06-15 10:28:07276 const absl::optional<int> fallback_max_pixels_;
277 const absl::optional<int> fallback_max_pixels_disabled_;
pbos5ad935c2016-01-25 11:52:44278 rtc::CriticalSection crit_;
danilchapa37de392017-09-09 11:17:22279 VideoEncoderConfig::ContentType content_type_ RTC_GUARDED_BY(crit_);
asapersson4374a092016-07-27 07:39:09280 const int64_t start_ms_;
danilchapa37de392017-09-09 11:17:22281 VideoSendStream::Stats stats_ RTC_GUARDED_BY(crit_);
danilchapa37de392017-09-09 11:17:22282 std::map<uint32_t, StatsUpdateTimes> update_times_ RTC_GUARDED_BY(crit_);
283 rtc::ExpFilter encode_time_ RTC_GUARDED_BY(crit_);
Henrik Boströmce33b6a2019-05-28 15:42:38284 QualityLimitationReasonTracker quality_limitation_reason_tracker_
285 RTC_GUARDED_BY(crit_);
Åsa Persson0122e842017-10-16 10:19:23286 rtc::RateTracker media_byte_rate_tracker_ RTC_GUARDED_BY(crit_);
287 rtc::RateTracker encoded_frame_rate_tracker_ RTC_GUARDED_BY(crit_);
asaperssond89920b2015-07-22 13:52:00288
Danil Chapovalovb9b146c2018-06-15 10:28:07289 absl::optional<int64_t> last_outlier_timestamp_ RTC_GUARDED_BY(crit_);
Ilya Nikolaevskiy70473fc2018-02-28 15:35:03290
Evan Shrubsolecc62b162019-09-09 09:26:45291 int last_num_spatial_layers_ RTC_GUARDED_BY(crit_);
292 int last_num_simulcast_streams_ RTC_GUARDED_BY(crit_);
293 std::array<bool, kMaxSpatialLayers> last_spatial_layer_use_
294 RTC_GUARDED_BY(crit_);
Ilya Nikolaevskiy5963c7c2019-10-09 16:06:58295 // Indicates if the latest bitrate allocation had layers disabled by low
296 // available bandwidth.
297 bool bw_limited_layers_ RTC_GUARDED_BY(crit_);
Ilya Nikolaevskiyeac08bf2020-03-10 09:50:26298 // Indicastes if the encoder internally downscales input image.
299 bool internal_encoder_scaler_ RTC_GUARDED_BY(crit_);
Evan Shrubsoledff79252020-04-16 09:34:32300 Adaptations adaptations_ RTC_GUARDED_BY(crit_);
Evan Shrubsolecc62b162019-09-09 09:26:45301
Erik Språnge2fd86a72018-10-24 09:32:39302 struct EncoderChangeEvent {
303 std::string previous_encoder_implementation;
304 std::string new_encoder_implementation;
305 };
306 // Stores the last change in encoder implementation in an optional, so that
307 // the event can be consumed.
308 absl::optional<EncoderChangeEvent> encoder_changed_;
309
sprangb4a1ae52015-12-03 16:10:08310 // Contains stats used for UMA histograms. These stats will be reset if
311 // content type changes between real-time video and screenshare, since these
312 // will be reported separately.
313 struct UmaSamplesContainer {
sprang07fb9be2016-02-24 15:55:00314 UmaSamplesContainer(const char* prefix,
315 const VideoSendStream::Stats& start_stats,
316 Clock* clock);
sprangb4a1ae52015-12-03 16:10:08317 ~UmaSamplesContainer();
318
Stefan Holmerdbdb3a02018-07-17 14:03:46319 void UpdateHistograms(const RtpConfig& rtp_config,
sprang07fb9be2016-02-24 15:55:00320 const VideoSendStream::Stats& current_stats);
sprangb4a1ae52015-12-03 16:10:08321
asapersson93e1e232017-02-06 13:18:35322 void InitializeBitrateCounters(const VideoSendStream::Stats& stats);
323
Åsa Perssonaa329e72017-12-15 14:54:44324 bool InsertEncodedFrame(const EncodedImage& encoded_frame,
Ilya Nikolaevskiy840394c2019-11-26 16:20:50325 int simulcast_idx);
326 void RemoveOld(int64_t now_ms);
Åsa Persson0122e842017-10-16 10:19:23327
sprangb4a1ae52015-12-03 16:10:08328 const std::string uma_prefix_;
sprang07fb9be2016-02-24 15:55:00329 Clock* const clock_;
sprangb4a1ae52015-12-03 16:10:08330 SampleCounter input_width_counter_;
331 SampleCounter input_height_counter_;
332 SampleCounter sent_width_counter_;
333 SampleCounter sent_height_counter_;
334 SampleCounter encode_time_counter_;
335 BoolSampleCounter key_frame_counter_;
336 BoolSampleCounter quality_limited_frame_counter_;
337 SampleCounter quality_downscales_counter_;
perkj803d97f2016-11-01 18:45:46338 BoolSampleCounter cpu_limited_frame_counter_;
sprangb4a1ae52015-12-03 16:10:08339 BoolSampleCounter bw_limited_frame_counter_;
340 SampleCounter bw_resolutions_disabled_counter_;
341 SampleCounter delay_counter_;
342 SampleCounter max_delay_counter_;
343 rtc::RateTracker input_frame_rate_tracker_;
asapersson320e45a2016-11-29 09:40:35344 RateCounter input_fps_counter_;
345 RateCounter sent_fps_counter_;
asapersson93e1e232017-02-06 13:18:35346 RateAccCounter total_byte_counter_;
347 RateAccCounter media_byte_counter_;
348 RateAccCounter rtx_byte_counter_;
349 RateAccCounter padding_byte_counter_;
350 RateAccCounter retransmit_byte_counter_;
351 RateAccCounter fec_byte_counter_;
sprange2d83d62016-02-19 17:03:26352 int64_t first_rtcp_stats_time_ms_;
Erik Språng22c2b482016-03-01 08:40:42353 int64_t first_rtp_stats_time_ms_;
asapersson09f05612017-05-16 06:40:18354 StatsTimer cpu_adapt_timer_;
355 StatsTimer quality_adapt_timer_;
asapersson66d4b372016-12-19 14:50:53356 BoolSampleCounter paused_time_counter_;
357 TargetRateUpdates target_rate_updates_;
asapersson8d75ac72017-09-15 13:41:15358 BoolSampleCounter fallback_active_counter_;
359 FallbackEncoderInfo fallback_info_;
Åsa Perssonc3ed6302017-11-16 13:04:52360 FallbackEncoderInfoDisabled fallback_info_disabled_;
sprange2d83d62016-02-19 17:03:26361 ReportBlockStats report_block_stats_;
sprang07fb9be2016-02-24 15:55:00362 const VideoSendStream::Stats start_stats_;
Åsa Perssonaa329e72017-12-15 14:54:44363 size_t num_streams_; // Number of configured streams to encoder.
364 size_t num_pixels_highest_stream_;
Åsa Persson0122e842017-10-16 10:19:23365 EncodedFrameMap encoded_frames_;
Åsa Persson875841d2018-01-08 07:49:53366 AdaptChanges initial_quality_changes_;
sprangc5d62e22017-04-03 06:53:04367
asapersson118ef002016-03-31 07:00:19368 std::map<int, QpCounters>
369 qp_counters_; // QP counters mapped by spatial idx.
sprangb4a1ae52015-12-03 16:10:08370 };
371
danilchapa37de392017-09-09 11:17:22372 std::unique_ptr<UmaSamplesContainer> uma_container_ RTC_GUARDED_BY(crit_);
sprang@webrtc.orgccd42842014-01-07 09:54:34373};
374
375} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 04:47:31376#endif // VIDEO_SEND_STATISTICS_PROXY_H_