OLD | NEW |
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 |
11 #include "webrtc/modules/audio_coding/neteq/expand.h" | 11 #include "webrtc/modules/audio_coding/neteq/expand.h" |
12 | 12 |
13 #include <assert.h> | 13 #include <assert.h> |
14 #include <string.h> // memset | 14 #include <string.h> // memset |
15 | 15 |
16 #include <algorithm> // min, max | 16 #include <algorithm> // min, max |
17 #include <limits> // numeric_limits<T> | 17 #include <limits> // numeric_limits<T> |
18 | 18 |
| 19 #include "webrtc/base/safe_conversions.h" |
19 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" | 20 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" |
20 #include "webrtc/modules/audio_coding/neteq/background_noise.h" | 21 #include "webrtc/modules/audio_coding/neteq/background_noise.h" |
21 #include "webrtc/modules/audio_coding/neteq/dsp_helper.h" | 22 #include "webrtc/modules/audio_coding/neteq/dsp_helper.h" |
22 #include "webrtc/modules/audio_coding/neteq/random_vector.h" | 23 #include "webrtc/modules/audio_coding/neteq/random_vector.h" |
| 24 #include "webrtc/modules/audio_coding/neteq/statistics_calculator.h" |
23 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h" | 25 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h" |
24 | 26 |
25 namespace webrtc { | 27 namespace webrtc { |
26 | 28 |
27 Expand::Expand(BackgroundNoise* background_noise, | 29 Expand::Expand(BackgroundNoise* background_noise, |
28 SyncBuffer* sync_buffer, | 30 SyncBuffer* sync_buffer, |
29 RandomVector* random_vector, | 31 RandomVector* random_vector, |
| 32 StatisticsCalculator* statistics, |
30 int fs, | 33 int fs, |
31 size_t num_channels) | 34 size_t num_channels) |
32 : random_vector_(random_vector), | 35 : random_vector_(random_vector), |
33 sync_buffer_(sync_buffer), | 36 sync_buffer_(sync_buffer), |
34 first_expand_(true), | 37 first_expand_(true), |
35 fs_hz_(fs), | 38 fs_hz_(fs), |
36 num_channels_(num_channels), | 39 num_channels_(num_channels), |
37 consecutive_expands_(0), | 40 consecutive_expands_(0), |
38 background_noise_(background_noise), | 41 background_noise_(background_noise), |
| 42 statistics_(statistics), |
39 overlap_length_(5 * fs / 8000), | 43 overlap_length_(5 * fs / 8000), |
40 lag_index_direction_(0), | 44 lag_index_direction_(0), |
41 current_lag_index_(0), | 45 current_lag_index_(0), |
42 stop_muting_(false), | 46 stop_muting_(false), |
| 47 expand_duration_samples_(0), |
43 channel_parameters_(new ChannelParameters[num_channels_]) { | 48 channel_parameters_(new ChannelParameters[num_channels_]) { |
44 assert(fs == 8000 || fs == 16000 || fs == 32000 || fs == 48000); | 49 assert(fs == 8000 || fs == 16000 || fs == 32000 || fs == 48000); |
45 assert(fs <= kMaxSampleRate); // Should not be possible. | 50 assert(fs <= kMaxSampleRate); // Should not be possible. |
46 assert(num_channels_ > 0); | 51 assert(num_channels_ > 0); |
47 memset(expand_lags_, 0, sizeof(expand_lags_)); | 52 memset(expand_lags_, 0, sizeof(expand_lags_)); |
48 Reset(); | 53 Reset(); |
49 } | 54 } |
50 | 55 |
51 Expand::~Expand() = default; | 56 Expand::~Expand() = default; |
52 | 57 |
(...skipping 18 matching lines...) Expand all Loading... |
71 int16_t unvoiced_array_memory[kNoiseLpcOrder + kMaxSampleRate / 8000 * 125]; | 76 int16_t unvoiced_array_memory[kNoiseLpcOrder + kMaxSampleRate / 8000 * 125]; |
72 int16_t* unvoiced_vector = unvoiced_array_memory + kUnvoicedLpcOrder; | 77 int16_t* unvoiced_vector = unvoiced_array_memory + kUnvoicedLpcOrder; |
73 int16_t* noise_vector = unvoiced_array_memory + kNoiseLpcOrder; | 78 int16_t* noise_vector = unvoiced_array_memory + kNoiseLpcOrder; |
74 | 79 |
75 int fs_mult = fs_hz_ / 8000; | 80 int fs_mult = fs_hz_ / 8000; |
76 | 81 |
77 if (first_expand_) { | 82 if (first_expand_) { |
78 // Perform initial setup if this is the first expansion since last reset. | 83 // Perform initial setup if this is the first expansion since last reset. |
79 AnalyzeSignal(random_vector); | 84 AnalyzeSignal(random_vector); |
80 first_expand_ = false; | 85 first_expand_ = false; |
| 86 expand_duration_samples_ = 0; |
81 } else { | 87 } else { |
82 // This is not the first expansion, parameters are already estimated. | 88 // This is not the first expansion, parameters are already estimated. |
83 // Extract a noise segment. | 89 // Extract a noise segment. |
84 int16_t rand_length = max_lag_; | 90 int16_t rand_length = max_lag_; |
85 // This only applies to SWB where length could be larger than 256. | 91 // This only applies to SWB where length could be larger than 256. |
86 assert(rand_length <= kMaxSampleRate / 8000 * 120 + 30); | 92 assert(rand_length <= kMaxSampleRate / 8000 * 120 + 30); |
87 GenerateRandomVector(2, rand_length, random_vector); | 93 GenerateRandomVector(2, rand_length, random_vector); |
88 } | 94 } |
89 | 95 |
90 | 96 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 } else { | 297 } else { |
292 assert(output->Size() == current_lag); | 298 assert(output->Size() == current_lag); |
293 } | 299 } |
294 memcpy(&(*output)[channel_ix][0], temp_data, | 300 memcpy(&(*output)[channel_ix][0], temp_data, |
295 sizeof(temp_data[0]) * current_lag); | 301 sizeof(temp_data[0]) * current_lag); |
296 } | 302 } |
297 | 303 |
298 // Increase call number and cap it. | 304 // Increase call number and cap it. |
299 consecutive_expands_ = consecutive_expands_ >= kMaxConsecutiveExpands ? | 305 consecutive_expands_ = consecutive_expands_ >= kMaxConsecutiveExpands ? |
300 kMaxConsecutiveExpands : consecutive_expands_ + 1; | 306 kMaxConsecutiveExpands : consecutive_expands_ + 1; |
| 307 expand_duration_samples_ += output->Size(); |
| 308 // Clamp the duration counter at 2 seconds. |
| 309 expand_duration_samples_ = |
| 310 std::min(expand_duration_samples_, rtc::checked_cast<size_t>(fs_hz_ * 2)); |
301 return 0; | 311 return 0; |
302 } | 312 } |
303 | 313 |
304 void Expand::SetParametersForNormalAfterExpand() { | 314 void Expand::SetParametersForNormalAfterExpand() { |
305 current_lag_index_ = 0; | 315 current_lag_index_ = 0; |
306 lag_index_direction_ = 0; | 316 lag_index_direction_ = 0; |
307 stop_muting_ = true; // Do not mute signal any more. | 317 stop_muting_ = true; // Do not mute signal any more. |
| 318 statistics_->LogDelayedPacketOutageEvent( |
| 319 rtc::checked_cast<int>(expand_duration_samples_) / (fs_hz_ / 1000)); |
308 } | 320 } |
309 | 321 |
310 void Expand::SetParametersForMergeAfterExpand() { | 322 void Expand::SetParametersForMergeAfterExpand() { |
311 current_lag_index_ = -1; /* out of the 3 possible ones */ | 323 current_lag_index_ = -1; /* out of the 3 possible ones */ |
312 lag_index_direction_ = 1; /* make sure we get the "optimal" lag */ | 324 lag_index_direction_ = 1; /* make sure we get the "optimal" lag */ |
313 stop_muting_ = true; | 325 stop_muting_ = true; |
314 } | 326 } |
315 | 327 |
316 size_t Expand::overlap_length() const { | 328 size_t Expand::overlap_length() const { |
317 return overlap_length_; | 329 return overlap_length_; |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 lag_index_direction_ = 1; | 838 lag_index_direction_ = 1; |
827 } | 839 } |
828 if (current_lag_index_ >= kNumLags - 1) { | 840 if (current_lag_index_ >= kNumLags - 1) { |
829 lag_index_direction_ = -1; | 841 lag_index_direction_ = -1; |
830 } | 842 } |
831 } | 843 } |
832 | 844 |
833 Expand* ExpandFactory::Create(BackgroundNoise* background_noise, | 845 Expand* ExpandFactory::Create(BackgroundNoise* background_noise, |
834 SyncBuffer* sync_buffer, | 846 SyncBuffer* sync_buffer, |
835 RandomVector* random_vector, | 847 RandomVector* random_vector, |
| 848 StatisticsCalculator* statistics, |
836 int fs, | 849 int fs, |
837 size_t num_channels) const { | 850 size_t num_channels) const { |
838 return new Expand(background_noise, sync_buffer, random_vector, fs, | 851 return new Expand(background_noise, sync_buffer, random_vector, statistics, |
839 num_channels); | 852 fs, num_channels); |
840 } | 853 } |
841 | 854 |
842 // TODO(turajs): This can be moved to BackgroundNoise class. | 855 // TODO(turajs): This can be moved to BackgroundNoise class. |
843 void Expand::GenerateBackgroundNoise(int16_t* random_vector, | 856 void Expand::GenerateBackgroundNoise(int16_t* random_vector, |
844 size_t channel, | 857 size_t channel, |
845 int mute_slope, | 858 int mute_slope, |
846 bool too_many_expands, | 859 bool too_many_expands, |
847 size_t num_noise_samples, | 860 size_t num_noise_samples, |
848 int16_t* buffer) { | 861 int16_t* buffer) { |
849 static const int kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder; | 862 static const int kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
938 const size_t kMaxRandSamples = RandomVector::kRandomTableSize; | 951 const size_t kMaxRandSamples = RandomVector::kRandomTableSize; |
939 while (samples_generated < length) { | 952 while (samples_generated < length) { |
940 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples); | 953 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples); |
941 random_vector_->IncreaseSeedIncrement(seed_increment); | 954 random_vector_->IncreaseSeedIncrement(seed_increment); |
942 random_vector_->Generate(rand_length, &random_vector[samples_generated]); | 955 random_vector_->Generate(rand_length, &random_vector[samples_generated]); |
943 samples_generated += rand_length; | 956 samples_generated += rand_length; |
944 } | 957 } |
945 } | 958 } |
946 | 959 |
947 } // namespace webrtc | 960 } // namespace webrtc |
OLD | NEW |