1 /*
2  *  Copyright (c) 2017 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 #include "modules/audio_processing/aec3/block_processor_metrics.h"
12 
13 #include "modules/audio_processing/aec3/aec3_common.h"
14 #include "system_wrappers/include/metrics.h"
15 
16 namespace webrtc {
17 
18 namespace {
19 
20 enum class RenderUnderrunCategory {
21   kNone,
22   kFew,
23   kSeveral,
24   kMany,
25   kConstant,
26   kNumCategories
27 };
28 
29 enum class RenderOverrunCategory {
30   kNone,
31   kFew,
32   kSeveral,
33   kMany,
34   kConstant,
35   kNumCategories
36 };
37 
38 }  // namespace
39 
UpdateCapture(bool underrun)40 void BlockProcessorMetrics::UpdateCapture(bool underrun) {
41   ++capture_block_counter_;
42   if (underrun) {
43     ++render_buffer_underruns_;
44   }
45 
46   if (capture_block_counter_ == kMetricsReportingIntervalBlocks) {
47     metrics_reported_ = true;
48 
49     RenderUnderrunCategory underrun_category;
50     if (render_buffer_underruns_ == 0) {
51       underrun_category = RenderUnderrunCategory::kNone;
52     } else if (render_buffer_underruns_ > (capture_block_counter_ >> 1)) {
53       underrun_category = RenderUnderrunCategory::kConstant;
54     } else if (render_buffer_underruns_ > 100) {
55       underrun_category = RenderUnderrunCategory::kMany;
56     } else if (render_buffer_underruns_ > 10) {
57       underrun_category = RenderUnderrunCategory::kSeveral;
58     } else {
59       underrun_category = RenderUnderrunCategory::kFew;
60     }
61     RTC_HISTOGRAM_ENUMERATION(
62         "WebRTC.Audio.EchoCanceller.RenderUnderruns",
63         static_cast<int>(underrun_category),
64         static_cast<int>(RenderUnderrunCategory::kNumCategories));
65 
66     RenderOverrunCategory overrun_category;
67     if (render_buffer_overruns_ == 0) {
68       overrun_category = RenderOverrunCategory::kNone;
69     } else if (render_buffer_overruns_ > (buffer_render_calls_ >> 1)) {
70       overrun_category = RenderOverrunCategory::kConstant;
71     } else if (render_buffer_overruns_ > 100) {
72       overrun_category = RenderOverrunCategory::kMany;
73     } else if (render_buffer_overruns_ > 10) {
74       overrun_category = RenderOverrunCategory::kSeveral;
75     } else {
76       overrun_category = RenderOverrunCategory::kFew;
77     }
78     RTC_HISTOGRAM_ENUMERATION(
79         "WebRTC.Audio.EchoCanceller.RenderOverruns",
80         static_cast<int>(overrun_category),
81         static_cast<int>(RenderOverrunCategory::kNumCategories));
82 
83     ResetMetrics();
84     capture_block_counter_ = 0;
85   } else {
86     metrics_reported_ = false;
87   }
88 }
89 
UpdateRender(bool overrun)90 void BlockProcessorMetrics::UpdateRender(bool overrun) {
91   ++buffer_render_calls_;
92   if (overrun) {
93     ++render_buffer_overruns_;
94   }
95 }
96 
ResetMetrics()97 void BlockProcessorMetrics::ResetMetrics() {
98   render_buffer_underruns_ = 0;
99   render_buffer_overruns_ = 0;
100   buffer_render_calls_ = 0;
101 }
102 
103 }  // namespace webrtc
104