Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(286)

Side by Side Diff: webrtc/voice_engine/audio_level.cc

Issue 2984473002: Move total audio energy and duration tracking to AudioLevel and protect with existing critial secti… (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/voice_engine/audio_level.h ('k') | webrtc/voice_engine/channel.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 30 matching lines...) Expand all
41 } 41 }
42 42
43 void AudioLevel::Clear() { 43 void AudioLevel::Clear() {
44 rtc::CritScope cs(&crit_sect_); 44 rtc::CritScope cs(&crit_sect_);
45 abs_max_ = 0; 45 abs_max_ = 0;
46 count_ = 0; 46 count_ = 0;
47 current_level_ = 0; 47 current_level_ = 0;
48 current_level_full_range_ = 0; 48 current_level_full_range_ = 0;
49 } 49 }
50 50
51 void AudioLevel::ComputeLevel(const AudioFrame& audioFrame) { 51 double AudioLevel::TotalEnergy() const {
52 rtc::CritScope cs(&crit_sect_);
53 return total_energy_;
54 }
55
56 double AudioLevel::TotalDuration() const {
57 rtc::CritScope cs(&crit_sect_);
58 return total_duration_;
59 }
60
61 void AudioLevel::ComputeLevel(const AudioFrame& audioFrame, double duration) {
52 // Check speech level (works for 2 channels as well) 62 // Check speech level (works for 2 channels as well)
53 int16_t abs_value = audioFrame.muted() ? 0 : 63 int16_t abs_value = audioFrame.muted() ? 0 :
54 WebRtcSpl_MaxAbsValueW16( 64 WebRtcSpl_MaxAbsValueW16(
55 audioFrame.data(), 65 audioFrame.data(),
56 audioFrame.samples_per_channel_ * audioFrame.num_channels_); 66 audioFrame.samples_per_channel_ * audioFrame.num_channels_);
57 67
58 // Protect member access using a lock since this method is called on a 68 // Protect member access using a lock since this method is called on a
59 // dedicated audio thread in the RecordedDataIsAvailable() callback. 69 // dedicated audio thread in the RecordedDataIsAvailable() callback.
60 rtc::CritScope cs(&crit_sect_); 70 rtc::CritScope cs(&crit_sect_);
61 71
(...skipping 14 matching lines...) Expand all
76 // Make it less likely that the bar stays at position 0. I.e. only if it's 86 // Make it less likely that the bar stays at position 0. I.e. only if it's
77 // in the range 0-250 (instead of 0-1000) 87 // in the range 0-250 (instead of 0-1000)
78 if ((position == 0) && (abs_max_ > 250)) { 88 if ((position == 0) && (abs_max_ > 250)) {
79 position = 1; 89 position = 1;
80 } 90 }
81 current_level_ = kPermutation[position]; 91 current_level_ = kPermutation[position];
82 92
83 // Decay the absolute maximum (divide by 4) 93 // Decay the absolute maximum (divide by 4)
84 abs_max_ >>= 2; 94 abs_max_ >>= 2;
85 } 95 }
96
97 // See the description for "totalAudioEnergy" in the WebRTC stats spec
98 // (https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudi oenergy)
99 // for an explanation of these formulas. In short, we need a value that can
100 // be used to compute RMS audio levels over different time intervals, by
101 // taking the difference between the results from two getStats calls. To do
102 // this, the value needs to be of units "squared sample value * time".
103 double additional_energy =
104 static_cast<double>(current_level_full_range_) / INT16_MAX;
105 additional_energy *= additional_energy;
106 total_energy_ += additional_energy * duration;
107 total_duration_ += duration;
86 } 108 }
87 109
88 } // namespace voe 110 } // namespace voe
89 } // namespace webrtc 111 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/voice_engine/audio_level.h ('k') | webrtc/voice_engine/channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698