blob: 7cbb21ce6d03efbbedde2e93465459673edd1e79 [file] [log] [blame]
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +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_ENGINE_OVERUSE_FRAME_DETECTOR_H_
12#define WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_
13
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000014#include "webrtc/modules/interface/module.h"
15#include "webrtc/system_wrappers/interface/constructor_magic.h"
16#include "webrtc/system_wrappers/interface/scoped_ptr.h"
17
18namespace webrtc {
19
20class Clock;
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000021class CpuOveruseObserver;
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000022class CriticalSectionWrapper;
23class VCMExpFilter;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000024
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000025// Limits on standard deviation for under/overuse.
26#ifdef WEBRTC_LINUX
27const float kOveruseStdDevMs = 15.0f;
28const float kNormalUseStdDevMs = 7.0f;
29#elif WEBRTC_MAC
30const float kOveruseStdDevMs = 22.0f;
31const float kNormalUseStdDevMs = 12.0f;
32#else
33const float kOveruseStdDevMs = 17.0f;
34const float kNormalUseStdDevMs = 10.0f;
35#endif
36
37// TODO(pbos): Move this somewhere appropriate.
pbos@webrtc.orga9575702013-08-30 17:16:32 +000038class Statistics {
39 public:
40 Statistics();
41
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000042 void AddSample(float sample_ms);
pbos@webrtc.orga9575702013-08-30 17:16:32 +000043 void Reset();
44
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000045 float Mean() const;
46 float StdDev() const;
47 uint64_t Count() const;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000048
49 private:
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000050 float InitialMean() const;
51 float InitialVariance() const;
52
53 float sum_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000054 uint64_t count_;
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000055 scoped_ptr<VCMExpFilter> filtered_samples_;
56 scoped_ptr<VCMExpFilter> filtered_variance_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000057};
58
59// Use to detect system overuse based on jitter in incoming frames.
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000060class OveruseFrameDetector : public Module {
61 public:
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000062 explicit OveruseFrameDetector(Clock* clock,
63 float normaluse_stddev_ms,
64 float overuse_stddev_ms);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000065 ~OveruseFrameDetector();
66
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +000067 // Registers an observer receiving overuse and underuse callbacks. Set
68 // 'observer' to NULL to disable callbacks.
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000069 void SetObserver(CpuOveruseObserver* observer);
70
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +000071 // Called for each captured frame.
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000072 void FrameCaptured(int width, int height);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000073
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000074 // Called when the processing of a captured frame is started.
75 void FrameProcessingStarted();
76
77 // Called for each encoded frame.
asapersson@webrtc.orgc7ff8f92013-11-26 11:12:33 +000078 void FrameEncoded(int encode_time_ms);
79
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000080 // Accessors.
81 // The last estimated jitter based on the incoming captured frames.
asapersson@webrtc.orgc7ff8f92013-11-26 11:12:33 +000082 int last_capture_jitter_ms() const;
83
84 // Running average of reported encode time (FrameEncoded()).
85 // Only used for stats.
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000086 int AvgEncodeTimeMs() const;
87
88 // The average encode time divided by the average time difference between
89 // incoming captured frames.
90 // This variable is currently only used for statistics.
91 int EncodeUsagePercent() const;
92
93 // The current time delay between an incoming captured frame (FrameCaptured())
94 // until the frame is being processed (FrameProcessingStarted()).
95 // (Note: if a new frame is received before an old frame has been processed,
96 // the old frame is skipped).
97 // The delay is returned as the delay in ms per second.
98 // This variable is currently only used for statistics.
99 int AvgCaptureQueueDelayMsPerS() const;
100 int CaptureQueueDelayMsPerS() const;
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000101
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000102 // Implements Module.
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000103 virtual int32_t TimeUntilNextProcess() OVERRIDE;
104 virtual int32_t Process() OVERRIDE;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000105
106 private:
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000107 class EncodeTimeAvg;
108 class EncodeUsage;
109 class CaptureQueueDelay;
110
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000111 bool IsOverusing();
112 bool IsUnderusing(int64_t time_now);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000113
114 // Protecting all members.
115 scoped_ptr<CriticalSectionWrapper> crit_;
116
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +0000117 // Limits on standard deviation for under/overuse.
118 const float normaluse_stddev_ms_;
119 const float overuse_stddev_ms_;
120
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000121 // Observer getting overuse reports.
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +0000122 CpuOveruseObserver* observer_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000123
124 Clock* clock_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000125 int64_t next_process_time_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000126
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000127 Statistics capture_deltas_;
128 int64_t last_capture_time_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000129
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000130 int64_t last_overuse_time_;
131 int checks_above_threshold_;
132
133 int64_t last_rampup_time_;
134 bool in_quick_rampup_;
135 int current_rampup_delay_ms_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000136
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +0000137 // Number of pixels of last captured frame.
138 int num_pixels_;
139
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000140 int last_capture_jitter_ms_;
141
142 int64_t last_encode_sample_ms_;
143 scoped_ptr<EncodeTimeAvg> encode_time_;
144 scoped_ptr<EncodeUsage> encode_usage_;
145
146 scoped_ptr<CaptureQueueDelay> capture_queue_delay_;
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000147
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000148 DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
149};
150
151} // namespace webrtc
152
153#endif // WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_