blob: f90a4f82503d54d96d2f8c5e612e39ff3029fd24 [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
henrike@webrtc.org88fbb2d2014-05-21 21:18:46 +000014#include "webrtc/base/constructormagic.h"
minyue@webrtc.org74aaf292014-07-16 21:28:26 +000015#include "webrtc/base/exp_filter.h"
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000016#include "webrtc/modules/interface/module.h"
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000017#include "webrtc/system_wrappers/interface/scoped_ptr.h"
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000018#include "webrtc/video_engine/include/vie_base.h"
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000019
20namespace webrtc {
21
22class Clock;
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000023class CpuOveruseObserver;
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000024class CriticalSectionWrapper;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000025
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000026// TODO(pbos): Move this somewhere appropriate.
pbos@webrtc.orga9575702013-08-30 17:16:32 +000027class Statistics {
28 public:
29 Statistics();
30
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000031 void AddSample(float sample_ms);
pbos@webrtc.orga9575702013-08-30 17:16:32 +000032 void Reset();
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000033 void SetOptions(const CpuOveruseOptions& options);
pbos@webrtc.orga9575702013-08-30 17:16:32 +000034
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000035 float Mean() const;
36 float StdDev() const;
37 uint64_t Count() const;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000038
39 private:
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +000040 float InitialMean() const;
41 float InitialVariance() const;
42
43 float sum_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000044 uint64_t count_;
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000045 CpuOveruseOptions options_;
minyue@webrtc.org74aaf292014-07-16 21:28:26 +000046 scoped_ptr<rtc::ExpFilter> filtered_samples_;
47 scoped_ptr<rtc::ExpFilter> filtered_variance_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +000048};
49
50// Use to detect system overuse based on jitter in incoming frames.
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000051class OveruseFrameDetector : public Module {
52 public:
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000053 explicit OveruseFrameDetector(Clock* clock);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000054 ~OveruseFrameDetector();
55
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +000056 // Registers an observer receiving overuse and underuse callbacks. Set
57 // 'observer' to NULL to disable callbacks.
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000058 void SetObserver(CpuOveruseObserver* observer);
59
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000060 // Sets options for overuse detection.
61 void SetOptions(const CpuOveruseOptions& options);
62
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +000063 // Called for each captured frame.
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000064 void FrameCaptured(int width, int height, int64_t capture_time_ms);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000065
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000066 // Called when the processing of a captured frame is started.
67 void FrameProcessingStarted();
68
69 // Called for each encoded frame.
asapersson@webrtc.orgc7ff8f92013-11-26 11:12:33 +000070 void FrameEncoded(int encode_time_ms);
71
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000072 // Called for each sent frame.
73 void FrameSent(int64_t capture_time_ms);
74
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000075 // Accessors.
asapersson@webrtc.orgc7ff8f92013-11-26 11:12:33 +000076
asapersson@webrtc.orgab6bf4f2014-05-27 07:43:15 +000077 // Returns CpuOveruseMetrics where
78 // capture_jitter_ms: The estimated jitter based on incoming captured frames.
79 // avg_encode_time_ms: Running average of reported encode time
80 // (FrameEncoded()). Only used for stats.
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000081 // TODO(asapersson): Rename metric.
82 // encode_usage_percent: The average processing time of a frame on the
83 // send-side divided by the average time difference
84 // between incoming captured frames.
asapersson@webrtc.orgab6bf4f2014-05-27 07:43:15 +000085 // capture_queue_delay_ms_per_s: The current time delay between an incoming
86 // captured frame (FrameCaptured()) until the
87 // frame is being processed
88 // (FrameProcessingStarted()). (Note: if a new
89 // frame is received before an old frame has
90 // been processed, the old frame is skipped).
91 // The delay is expressed in ms delay per sec.
92 // Only used for stats.
93 void GetCpuOveruseMetrics(CpuOveruseMetrics* metrics) const;
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000094
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000095 // Only public for testing.
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +000096 int CaptureQueueDelayMsPerS() const;
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000097 int LastProcessingTimeMs() const;
98 int FramesInQueue() const;
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +000099
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000100 // Implements Module.
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000101 virtual int32_t TimeUntilNextProcess() OVERRIDE;
102 virtual int32_t Process() OVERRIDE;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000103
104 private:
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000105 class EncodeTimeAvg;
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000106 class SendProcessingUsage;
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000107 class CaptureQueueDelay;
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000108 class FrameQueue;
109
110 void AddProcessingTime(int elapsed_ms);
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000111
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000112 bool IsOverusing();
113 bool IsUnderusing(int64_t time_now);
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000114
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000115 bool FrameTimeoutDetected(int64_t now) const;
116 bool FrameSizeChanged(int num_pixels) const;
117
118 void ResetAll(int num_pixels);
asapersson@webrtc.orgb60346e2014-02-17 19:02:15 +0000119
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000120 // Protecting all members.
121 scoped_ptr<CriticalSectionWrapper> crit_;
122
123 // Observer getting overuse reports.
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +0000124 CpuOveruseObserver* observer_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000125
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000126 CpuOveruseOptions options_;
127
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000128 Clock* clock_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000129 int64_t next_process_time_;
asapersson@webrtc.orgb60346e2014-02-17 19:02:15 +0000130 int64_t num_process_times_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000131
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000132 Statistics capture_deltas_;
133 int64_t last_capture_time_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000134
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000135 int64_t last_overuse_time_;
136 int checks_above_threshold_;
asapersson@webrtc.orgd9803072014-06-16 14:27:19 +0000137 int num_overuse_detections_;
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000138
139 int64_t last_rampup_time_;
140 bool in_quick_rampup_;
141 int current_rampup_delay_ms_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000142
asapersson@webrtc.orge2af6222013-09-23 20:05:39 +0000143 // Number of pixels of last captured frame.
144 int num_pixels_;
145
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000146 int64_t last_encode_sample_ms_;
147 scoped_ptr<EncodeTimeAvg> encode_time_;
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000148 scoped_ptr<SendProcessingUsage> usage_;
149 scoped_ptr<FrameQueue> frame_queue_;
150 int64_t last_sample_time_ms_;
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000151
152 scoped_ptr<CaptureQueueDelay> capture_queue_delay_;
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000153
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000154 DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
155};
156
157} // namespace webrtc
158
159#endif // WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_