block_processor_metrics.cc (3002B)
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 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 90 void BlockProcessorMetrics::UpdateRender(bool overrun) { 91 ++buffer_render_calls_; 92 if (overrun) { 93 ++render_buffer_overruns_; 94 } 95 } 96 97 void BlockProcessorMetrics::ResetMetrics() { 98 render_buffer_underruns_ = 0; 99 render_buffer_overruns_ = 0; 100 buffer_render_calls_ = 0; 101 } 102 103 } // namespace webrtc