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

Side by Side Diff: webrtc/modules/audio_processing/audio_processing_impl.cc

Issue 2110593003: Pull out the PostFilter to its own NonlinearBeamformer API (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebasing Created 4 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
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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 std::unique_ptr<VoiceDetectionImpl> voice_detection; 121 std::unique_ptr<VoiceDetectionImpl> voice_detection;
122 std::unique_ptr<GainControlForExperimentalAgc> 122 std::unique_ptr<GainControlForExperimentalAgc>
123 gain_control_for_experimental_agc; 123 gain_control_for_experimental_agc;
124 124
125 // Accessed internally from both render and capture. 125 // Accessed internally from both render and capture.
126 std::unique_ptr<TransientSuppressor> transient_suppressor; 126 std::unique_ptr<TransientSuppressor> transient_suppressor;
127 std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer; 127 std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer;
128 }; 128 };
129 129
130 struct AudioProcessingImpl::ApmPrivateSubmodules { 130 struct AudioProcessingImpl::ApmPrivateSubmodules {
131 explicit ApmPrivateSubmodules(Beamformer<float>* beamformer) 131 explicit ApmPrivateSubmodules(NonlinearBeamformer* beamformer)
132 : beamformer(beamformer) {} 132 : beamformer(beamformer) {}
133 // Accessed internally from capture or during initialization 133 // Accessed internally from capture or during initialization
134 std::unique_ptr<Beamformer<float>> beamformer; 134 std::unique_ptr<NonlinearBeamformer> beamformer;
135 std::unique_ptr<AgcManagerDirect> agc_manager; 135 std::unique_ptr<AgcManagerDirect> agc_manager;
136 std::unique_ptr<LevelController> level_controller; 136 std::unique_ptr<LevelController> level_controller;
137 }; 137 };
138 138
139 AudioProcessing* AudioProcessing::Create() { 139 AudioProcessing* AudioProcessing::Create() {
140 Config config; 140 Config config;
141 return Create(config, nullptr); 141 return Create(config, nullptr);
142 } 142 }
143 143
144 AudioProcessing* AudioProcessing::Create(const Config& config) { 144 AudioProcessing* AudioProcessing::Create(const Config& config) {
145 return Create(config, nullptr); 145 return Create(config, nullptr);
146 } 146 }
147 147
148 AudioProcessing* AudioProcessing::Create(const Config& config, 148 AudioProcessing* AudioProcessing::Create(const Config& config,
149 Beamformer<float>* beamformer) { 149 NonlinearBeamformer* beamformer) {
150 AudioProcessingImpl* apm = new AudioProcessingImpl(config, beamformer); 150 AudioProcessingImpl* apm = new AudioProcessingImpl(config, beamformer);
151 if (apm->Initialize() != kNoError) { 151 if (apm->Initialize() != kNoError) {
152 delete apm; 152 delete apm;
153 apm = nullptr; 153 apm = nullptr;
154 } 154 }
155 155
156 return apm; 156 return apm;
157 } 157 }
158 158
159 AudioProcessingImpl::AudioProcessingImpl(const Config& config) 159 AudioProcessingImpl::AudioProcessingImpl(const Config& config)
160 : AudioProcessingImpl(config, nullptr) {} 160 : AudioProcessingImpl(config, nullptr) {}
161 161
162 AudioProcessingImpl::AudioProcessingImpl(const Config& config, 162 AudioProcessingImpl::AudioProcessingImpl(const Config& config,
163 Beamformer<float>* beamformer) 163 NonlinearBeamformer* beamformer)
164 : public_submodules_(new ApmPublicSubmodules()), 164 : public_submodules_(new ApmPublicSubmodules()),
165 private_submodules_(new ApmPrivateSubmodules(beamformer)), 165 private_submodules_(new ApmPrivateSubmodules(beamformer)),
166 constants_(config.Get<ExperimentalAgc>().startup_min_volume, 166 constants_(config.Get<ExperimentalAgc>().startup_min_volume,
167 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) 167 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
168 false), 168 false),
169 #else 169 #else
170 config.Get<ExperimentalAgc>().enabled), 170 config.Get<ExperimentalAgc>().enabled),
171 #endif 171 #endif
172 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) 172 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
173 capture_(false, 173 capture_(false,
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 private_submodules_->agc_manager->AnalyzePreProcess( 692 private_submodules_->agc_manager->AnalyzePreProcess(
693 ca->channels()[0], ca->num_channels(), 693 ca->channels()[0], ca->num_channels(),
694 capture_nonlocked_.fwd_proc_format.num_frames()); 694 capture_nonlocked_.fwd_proc_format.num_frames());
695 } 695 }
696 696
697 if (fwd_analysis_needed()) { 697 if (fwd_analysis_needed()) {
698 ca->SplitIntoFrequencyBands(); 698 ca->SplitIntoFrequencyBands();
699 } 699 }
700 700
701 if (capture_nonlocked_.beamformer_enabled) { 701 if (capture_nonlocked_.beamformer_enabled) {
702 private_submodules_->beamformer->ProcessChunk(*ca->split_data_f(), 702 private_submodules_->beamformer->AnalyzeChunk(*ca->split_data_f());
703 ca->split_data_f()); 703 // Discards all channels by the leftmost one.
704 ca->set_num_channels(1); 704 ca->set_num_channels(1);
705 } 705 }
706 706
707 public_submodules_->high_pass_filter->ProcessCaptureAudio(ca); 707 public_submodules_->high_pass_filter->ProcessCaptureAudio(ca);
708 RETURN_ON_ERR(public_submodules_->gain_control->AnalyzeCaptureAudio(ca)); 708 RETURN_ON_ERR(public_submodules_->gain_control->AnalyzeCaptureAudio(ca));
709 public_submodules_->noise_suppression->AnalyzeCaptureAudio(ca); 709 public_submodules_->noise_suppression->AnalyzeCaptureAudio(ca);
710 710
711 // Ensure that the stream delay was set before the call to the 711 // Ensure that the stream delay was set before the call to the
712 // AEC ProcessCaptureAudio function. 712 // AEC ProcessCaptureAudio function.
713 if (public_submodules_->echo_cancellation->is_enabled() && 713 if (public_submodules_->echo_cancellation->is_enabled() &&
(...skipping 25 matching lines...) Expand all
739 // Ensure that the stream delay was set before the call to the 739 // Ensure that the stream delay was set before the call to the
740 // AECM ProcessCaptureAudio function. 740 // AECM ProcessCaptureAudio function.
741 if (public_submodules_->echo_control_mobile->is_enabled() && 741 if (public_submodules_->echo_control_mobile->is_enabled() &&
742 !was_stream_delay_set()) { 742 !was_stream_delay_set()) {
743 return AudioProcessing::kStreamParameterNotSetError; 743 return AudioProcessing::kStreamParameterNotSetError;
744 } 744 }
745 745
746 RETURN_ON_ERR(public_submodules_->echo_control_mobile->ProcessCaptureAudio( 746 RETURN_ON_ERR(public_submodules_->echo_control_mobile->ProcessCaptureAudio(
747 ca, stream_delay_ms())); 747 ca, stream_delay_ms()));
748 748
749 if (capture_nonlocked_.beamformer_enabled) {
750 private_submodules_->beamformer->PostFilter(ca->split_data_f());
751 }
752
749 public_submodules_->voice_detection->ProcessCaptureAudio(ca); 753 public_submodules_->voice_detection->ProcessCaptureAudio(ca);
750 754
751 if (constants_.use_experimental_agc && 755 if (constants_.use_experimental_agc &&
752 public_submodules_->gain_control->is_enabled() && 756 public_submodules_->gain_control->is_enabled() &&
753 (!capture_nonlocked_.beamformer_enabled || 757 (!capture_nonlocked_.beamformer_enabled ||
754 private_submodules_->beamformer->is_target_present())) { 758 private_submodules_->beamformer->is_target_present())) {
755 private_submodules_->agc_manager->Process( 759 private_submodules_->agc_manager->Process(
756 ca->split_bands_const(0)[kBand0To8kHz], ca->num_frames_per_band(), 760 ca->split_bands_const(0)[kBand0To8kHz], ca->num_frames_per_band(),
757 capture_nonlocked_.split_rate); 761 capture_nonlocked_.split_rate);
758 } 762 }
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 capture_nonlocked_.fwd_proc_format.sample_rate_hz(), 1220 capture_nonlocked_.fwd_proc_format.sample_rate_hz(),
1217 capture_nonlocked_.split_rate, 1221 capture_nonlocked_.split_rate,
1218 num_proc_channels()); 1222 num_proc_channels());
1219 } 1223 }
1220 } 1224 }
1221 1225
1222 void AudioProcessingImpl::InitializeBeamformer() { 1226 void AudioProcessingImpl::InitializeBeamformer() {
1223 if (capture_nonlocked_.beamformer_enabled) { 1227 if (capture_nonlocked_.beamformer_enabled) {
1224 if (!private_submodules_->beamformer) { 1228 if (!private_submodules_->beamformer) {
1225 private_submodules_->beamformer.reset(new NonlinearBeamformer( 1229 private_submodules_->beamformer.reset(new NonlinearBeamformer(
1226 capture_.array_geometry, capture_.target_direction)); 1230 capture_.array_geometry, 1u, capture_.target_direction));
1227 } 1231 }
1228 private_submodules_->beamformer->Initialize(kChunkSizeMs, 1232 private_submodules_->beamformer->Initialize(kChunkSizeMs,
1229 capture_nonlocked_.split_rate); 1233 capture_nonlocked_.split_rate);
1230 } 1234 }
1231 } 1235 }
1232 1236
1233 void AudioProcessingImpl::InitializeIntelligibility() { 1237 void AudioProcessingImpl::InitializeIntelligibility() {
1234 if (capture_nonlocked_.intelligibility_enabled) { 1238 if (capture_nonlocked_.intelligibility_enabled) {
1235 public_submodules_->intelligibility_enhancer.reset( 1239 public_submodules_->intelligibility_enhancer.reset(
1236 new IntelligibilityEnhancer(capture_nonlocked_.split_rate, 1240 new IntelligibilityEnhancer(capture_nonlocked_.split_rate,
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1486 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config); 1490 debug_dump_.capture.event_msg->mutable_config()->CopyFrom(config);
1487 1491
1488 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(), 1492 RETURN_ON_ERR(WriteMessageToDebugFile(debug_dump_.debug_file.get(),
1489 &debug_dump_.num_bytes_left_for_log_, 1493 &debug_dump_.num_bytes_left_for_log_,
1490 &crit_debug_, &debug_dump_.capture)); 1494 &crit_debug_, &debug_dump_.capture));
1491 return kNoError; 1495 return kNoError;
1492 } 1496 }
1493 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP 1497 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP
1494 1498
1495 } // namespace webrtc 1499 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/audio_processing_impl.h ('k') | webrtc/modules/audio_processing/audio_processing_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698