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