1f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org/*
2f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *
4f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  Use of this source code is governed by a BSD-style license
5f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org */
10f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
11f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_
12f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#define WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_
13f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
14774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h"
15f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "webrtc/modules/interface/module.h"
16f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
179da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org#include "webrtc/video_engine/include/vie_base.h"
18f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
19f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgnamespace webrtc {
20f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
21f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgclass Clock;
22bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass CpuOveruseObserver;
23ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.orgclass CriticalSectionWrapper;
24ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.orgclass VCMExpFilter;
25ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org
26ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org// TODO(pbos): Move this somewhere appropriate.
27ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.orgclass Statistics {
28ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org public:
29ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  Statistics();
30ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
31ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  void AddSample(float sample_ms);
32ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  void Reset();
339da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  void SetOptions(const CpuOveruseOptions& options);
34ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
35ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  float Mean() const;
36ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  float StdDev() const;
37ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  uint64_t Count() const;
38ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
39ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org private:
40ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  float InitialMean() const;
41ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  float InitialVariance() const;
42ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org
43ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  float sum_;
44ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  uint64_t count_;
459da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  CpuOveruseOptions options_;
46ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  scoped_ptr<VCMExpFilter> filtered_samples_;
47ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  scoped_ptr<VCMExpFilter> filtered_variance_;
48ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org};
49ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
50ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org// Use to detect system overuse based on jitter in incoming frames.
51f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgclass OveruseFrameDetector : public Module {
52f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org public:
539da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  explicit OveruseFrameDetector(Clock* clock);
54f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  ~OveruseFrameDetector();
55f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
56cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org  // Registers an observer receiving overuse and underuse callbacks. Set
57cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org  // 'observer' to NULL to disable callbacks.
58bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  void SetObserver(CpuOveruseObserver* observer);
59bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org
609da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  // Sets options for overuse detection.
619da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  void SetOptions(const CpuOveruseOptions& options);
629da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org
63cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org  // Called for each captured frame.
64ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  void FrameCaptured(int width, int height);
65f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
66f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  // Called when the processing of a captured frame is started.
67f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  void FrameProcessingStarted();
68f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org
69f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  // Called for each encoded frame.
70dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.org  void FrameEncoded(int encode_time_ms);
71dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.org
72f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  // Accessors.
734e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org
744e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  // Returns CpuOveruseMetrics where
754e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  // capture_jitter_ms: The estimated jitter based on incoming captured frames.
764e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  // avg_encode_time_ms: Running average of reported encode time
774e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                     (FrameEncoded()). Only used for stats.
784e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  // encode_usage_percent: The average encode time divided by the average time
794e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                       difference between incoming captured frames.
804e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  // capture_queue_delay_ms_per_s: The current time delay between an incoming
814e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               captured frame (FrameCaptured()) until the
824e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               frame is being processed
834e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               (FrameProcessingStarted()). (Note: if a new
844e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               frame is received before an old frame has
854e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               been processed, the old frame is skipped).
864e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               The delay is expressed in ms delay per sec.
874e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  //                               Only used for stats.
884e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  void GetCpuOveruseMetrics(CpuOveruseMetrics* metrics) const;
894e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org
90f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  int CaptureQueueDelayMsPerS() const;
914747585bba09508c7475bf1e5f70a0b981175d9fasapersson@webrtc.org
92f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  // Implements Module.
93ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  virtual int32_t TimeUntilNextProcess() OVERRIDE;
94ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  virtual int32_t Process() OVERRIDE;
95f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
96f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org private:
97f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  class EncodeTimeAvg;
989cd828145084df3ca05280ca93d283ee32b625e9asapersson@webrtc.org  class EncodeTimeRsd;
99f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  class EncodeUsage;
100f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  class CaptureQueueDelay;
101f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org
102cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org  bool IsOverusing();
103cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org  bool IsUnderusing(int64_t time_now);
104f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
1059da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  bool FrameTimeoutDetected(int64_t now) const;
1069da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  bool FrameSizeChanged(int num_pixels) const;
1079da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org
1089da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  void ResetAll(int num_pixels);
109995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org
110f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  // Protecting all members.
111f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  scoped_ptr<CriticalSectionWrapper> crit_;
112f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
113f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  // Observer getting overuse reports.
114bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  CpuOveruseObserver* observer_;
115f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
1169da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  CpuOveruseOptions options_;
1179da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org
118f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  Clock* clock_;
119ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int64_t next_process_time_;
120995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org  int64_t num_process_times_;
121ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
122ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  Statistics capture_deltas_;
123ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int64_t last_capture_time_;
124ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
125ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int64_t last_overuse_time_;
126ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int checks_above_threshold_;
127eddcc6311725092499404db49f40eda82b552483asapersson@webrtc.org  int num_overuse_detections_;
128ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org
129ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int64_t last_rampup_time_;
130ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  bool in_quick_rampup_;
131ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org  int current_rampup_delay_ms_;
132f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
133ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  // Number of pixels of last captured frame.
134ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org  int num_pixels_;
135ae14504dd56981e01bad96c86cca729ec31e6596asapersson@webrtc.org
136f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  int64_t last_encode_sample_ms_;
137f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  scoped_ptr<EncodeTimeAvg> encode_time_;
1389cd828145084df3ca05280ca93d283ee32b625e9asapersson@webrtc.org  scoped_ptr<EncodeTimeRsd> encode_rsd_;
139f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  scoped_ptr<EncodeUsage> encode_usage_;
140f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org
141f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org  scoped_ptr<CaptureQueueDelay> capture_queue_delay_;
1424747585bba09508c7475bf1e5f70a0b981175d9fasapersson@webrtc.org
143f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org  DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
144f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org};
145f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
146f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org}  // namespace webrtc
147f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org
148f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_
149