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

Side by Side Diff: webrtc/media/engine/webrtcvoiceengine.cc

Issue 2961723004: Allow an external audio processing module to be used in WebRTC (Closed)
Patch Set: Moved creation of APMs from CreateVoiceEngines 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2004 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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 options.audio_network_adaptor_config) { 156 options.audio_network_adaptor_config) {
157 // Turn on audio network adaptor only when |options_.audio_network_adaptor| 157 // Turn on audio network adaptor only when |options_.audio_network_adaptor|
158 // equals true and |options_.audio_network_adaptor_config| has a value. 158 // equals true and |options_.audio_network_adaptor_config| has a value.
159 return options.audio_network_adaptor_config; 159 return options.audio_network_adaptor_config;
160 } 160 }
161 return rtc::Optional<std::string>(); 161 return rtc::Optional<std::string>();
162 } 162 }
163 163
164 webrtc::AudioState::Config MakeAudioStateConfig( 164 webrtc::AudioState::Config MakeAudioStateConfig(
165 VoEWrapper* voe_wrapper, 165 VoEWrapper* voe_wrapper,
166 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) { 166 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
167 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) {
167 webrtc::AudioState::Config config; 168 webrtc::AudioState::Config config;
168 config.voice_engine = voe_wrapper->engine(); 169 config.voice_engine = voe_wrapper->engine();
169 if (audio_mixer) { 170 if (audio_mixer) {
170 config.audio_mixer = audio_mixer; 171 config.audio_mixer = audio_mixer;
171 } else { 172 } else {
172 config.audio_mixer = webrtc::AudioMixerImpl::Create(); 173 config.audio_mixer = webrtc::AudioMixerImpl::Create();
173 } 174 }
175 config.audio_processing = audio_processing;
174 return config; 176 return config;
175 } 177 }
176 178
177 // |max_send_bitrate_bps| is the bitrate from "b=" in SDP. 179 // |max_send_bitrate_bps| is the bitrate from "b=" in SDP.
178 // |rtp_max_bitrate_bps| is the bitrate from RtpSender::SetParameters. 180 // |rtp_max_bitrate_bps| is the bitrate from RtpSender::SetParameters.
179 rtc::Optional<int> ComputeSendBitrate(int max_send_bitrate_bps, 181 rtc::Optional<int> ComputeSendBitrate(int max_send_bitrate_bps,
180 rtc::Optional<int> rtp_max_bitrate_bps, 182 rtc::Optional<int> rtp_max_bitrate_bps,
181 const webrtc::AudioCodecSpec& spec) { 183 const webrtc::AudioCodecSpec& spec) {
182 // If application-configured bitrate is set, take minimum of that and SDP 184 // If application-configured bitrate is set, take minimum of that and SDP
183 // bitrate. 185 // bitrate.
(...skipping 23 matching lines...) Expand all
207 return rtc::Optional<int>(std::min(bps, spec.info.max_bitrate_bps)); 209 return rtc::Optional<int>(std::min(bps, spec.info.max_bitrate_bps));
208 } 210 }
209 } 211 }
210 212
211 } // namespace 213 } // namespace
212 214
213 WebRtcVoiceEngine::WebRtcVoiceEngine( 215 WebRtcVoiceEngine::WebRtcVoiceEngine(
214 webrtc::AudioDeviceModule* adm, 216 webrtc::AudioDeviceModule* adm,
215 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory, 217 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
216 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, 218 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
217 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer) 219 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
220 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing)
218 : WebRtcVoiceEngine(adm, 221 : WebRtcVoiceEngine(adm,
219 encoder_factory, 222 encoder_factory,
220 decoder_factory, 223 decoder_factory,
221 audio_mixer, 224 audio_mixer,
225 audio_processing,
222 nullptr) {} 226 nullptr) {}
223 227
224 WebRtcVoiceEngine::WebRtcVoiceEngine( 228 WebRtcVoiceEngine::WebRtcVoiceEngine(
225 webrtc::AudioDeviceModule* adm, 229 webrtc::AudioDeviceModule* adm,
226 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory, 230 const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
227 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, 231 const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
228 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer, 232 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
233 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing,
229 VoEWrapper* voe_wrapper) 234 VoEWrapper* voe_wrapper)
230 : adm_(adm), 235 : adm_(adm),
231 encoder_factory_(encoder_factory), 236 encoder_factory_(encoder_factory),
232 decoder_factory_(decoder_factory), 237 decoder_factory_(decoder_factory),
233 audio_mixer_(audio_mixer), 238 audio_mixer_(audio_mixer),
239 apm_(audio_processing),
234 voe_wrapper_(voe_wrapper) { 240 voe_wrapper_(voe_wrapper) {
235 // This may be called from any thread, so detach thread checkers. 241 // This may be called from any thread, so detach thread checkers.
236 worker_thread_checker_.DetachFromThread(); 242 worker_thread_checker_.DetachFromThread();
237 signal_thread_checker_.DetachFromThread(); 243 signal_thread_checker_.DetachFromThread();
238 LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; 244 LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine";
239 RTC_DCHECK(decoder_factory); 245 RTC_DCHECK(decoder_factory);
240 RTC_DCHECK(encoder_factory); 246 RTC_DCHECK(encoder_factory);
247 RTC_DCHECK(audio_processing);
241 // The rest of our initialization will happen in Init. 248 // The rest of our initialization will happen in Init.
242 } 249 }
243 250
244 WebRtcVoiceEngine::~WebRtcVoiceEngine() { 251 WebRtcVoiceEngine::~WebRtcVoiceEngine() {
245 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 252 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
246 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; 253 LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine";
247 if (initialized_) { 254 if (initialized_) {
248 StopAecDump(); 255 StopAecDump();
249 voe_wrapper_->base()->Terminate(); 256 voe_wrapper_->base()->Terminate();
250 webrtc::Trace::SetTraceCallback(nullptr); 257 webrtc::Trace::SetTraceCallback(nullptr);
(...skipping 26 matching lines...) Expand all
277 for (const AudioCodec& codec : recv_codecs_) { 284 for (const AudioCodec& codec : recv_codecs_) {
278 LOG(LS_INFO) << ToString(codec); 285 LOG(LS_INFO) << ToString(codec);
279 } 286 }
280 287
281 channel_config_.enable_voice_pacing = true; 288 channel_config_.enable_voice_pacing = true;
282 289
283 // Temporarily turn logging level up for the Init() call. 290 // Temporarily turn logging level up for the Init() call.
284 webrtc::Trace::SetTraceCallback(this); 291 webrtc::Trace::SetTraceCallback(this);
285 webrtc::Trace::set_level_filter(kElevatedTraceFilter); 292 webrtc::Trace::set_level_filter(kElevatedTraceFilter);
286 LOG(LS_INFO) << webrtc::VoiceEngine::GetVersionString(); 293 LOG(LS_INFO) << webrtc::VoiceEngine::GetVersionString();
287 RTC_CHECK_EQ(0, voe_wrapper_->base()->Init(adm_.get(), nullptr, 294 RTC_CHECK_EQ(0,
288 decoder_factory_)); 295 voe_wrapper_->base()->Init(adm_.get(), apm(), decoder_factory_));
289 webrtc::Trace::set_level_filter(kDefaultTraceFilter); 296 webrtc::Trace::set_level_filter(kDefaultTraceFilter);
290 297
291 // No ADM supplied? Get the default one from VoE. 298 // No ADM supplied? Get the default one from VoE.
292 if (!adm_) { 299 if (!adm_) {
293 adm_ = voe_wrapper_->base()->audio_device_module(); 300 adm_ = voe_wrapper_->base()->audio_device_module();
294 } 301 }
295 RTC_DCHECK(adm_); 302 RTC_DCHECK(adm_);
296 303
297 apm_ = voe_wrapper_->base()->audio_processing();
298 RTC_DCHECK(apm_);
299
300 transmit_mixer_ = voe_wrapper_->base()->transmit_mixer(); 304 transmit_mixer_ = voe_wrapper_->base()->transmit_mixer();
301 RTC_DCHECK(transmit_mixer_); 305 RTC_DCHECK(transmit_mixer_);
302 306
303 // Save the default AGC configuration settings. This must happen before 307 // Save the default AGC configuration settings. This must happen before
304 // calling ApplyOptions or the default will be overwritten. 308 // calling ApplyOptions or the default will be overwritten.
305 default_agc_config_ = webrtc::apm_helpers::GetAgcConfig(apm_); 309 default_agc_config_ = webrtc::apm_helpers::GetAgcConfig(apm());
306 310
307 // Set default engine options. 311 // Set default engine options.
308 { 312 {
309 AudioOptions options; 313 AudioOptions options;
310 options.echo_cancellation = rtc::Optional<bool>(true); 314 options.echo_cancellation = rtc::Optional<bool>(true);
311 options.auto_gain_control = rtc::Optional<bool>(true); 315 options.auto_gain_control = rtc::Optional<bool>(true);
312 options.noise_suppression = rtc::Optional<bool>(true); 316 options.noise_suppression = rtc::Optional<bool>(true);
313 options.highpass_filter = rtc::Optional<bool>(true); 317 options.highpass_filter = rtc::Optional<bool>(true);
314 options.stereo_swapping = rtc::Optional<bool>(false); 318 options.stereo_swapping = rtc::Optional<bool>(false);
315 options.audio_jitter_buffer_max_packets = rtc::Optional<int>(50); 319 options.audio_jitter_buffer_max_packets = rtc::Optional<int>(50);
(...skipping 13 matching lines...) Expand all
329 333
330 // Set default audio devices. 334 // Set default audio devices.
331 #if !defined(WEBRTC_IOS) 335 #if !defined(WEBRTC_IOS)
332 webrtc::adm_helpers::SetRecordingDevice(adm_); 336 webrtc::adm_helpers::SetRecordingDevice(adm_);
333 apm()->Initialize(); 337 apm()->Initialize();
334 webrtc::adm_helpers::SetPlayoutDevice(adm_); 338 webrtc::adm_helpers::SetPlayoutDevice(adm_);
335 #endif // !WEBRTC_IOS 339 #endif // !WEBRTC_IOS
336 340
337 // May be null for VoE injected for testing. 341 // May be null for VoE injected for testing.
338 if (voe()->engine()) { 342 if (voe()->engine()) {
339 audio_state_ = 343 audio_state_ = webrtc::AudioState::Create(
340 webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer_)); 344 MakeAudioStateConfig(voe(), audio_mixer_, apm_));
341 } 345 }
342 346
343 initialized_ = true; 347 initialized_ = true;
344 } 348 }
345 349
346 rtc::scoped_refptr<webrtc::AudioState> 350 rtc::scoped_refptr<webrtc::AudioState>
347 WebRtcVoiceEngine::GetAudioState() const { 351 WebRtcVoiceEngine::GetAudioState() const {
348 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 352 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
349 return audio_state_; 353 return audio_state_;
350 } 354 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 default_agc_config_.limiterEnable = 504 default_agc_config_.limiterEnable =
501 options.tx_agc_limiter.value_or(default_agc_config_.limiterEnable); 505 options.tx_agc_limiter.value_or(default_agc_config_.limiterEnable);
502 506
503 webrtc::AgcConfig config = default_agc_config_; 507 webrtc::AgcConfig config = default_agc_config_;
504 if (options.adjust_agc_delta) { 508 if (options.adjust_agc_delta) {
505 config.targetLeveldBOv -= *options.adjust_agc_delta; 509 config.targetLeveldBOv -= *options.adjust_agc_delta;
506 LOG(LS_INFO) << "Adjusting AGC level from default -" 510 LOG(LS_INFO) << "Adjusting AGC level from default -"
507 << default_agc_config_.targetLeveldBOv << "dB to -" 511 << default_agc_config_.targetLeveldBOv << "dB to -"
508 << config.targetLeveldBOv << "dB"; 512 << config.targetLeveldBOv << "dB";
509 } 513 }
510 webrtc::apm_helpers::SetAgcConfig(apm_, config); 514 webrtc::apm_helpers::SetAgcConfig(apm(), config);
511 } 515 }
512 516
513 if (options.intelligibility_enhancer) { 517 if (options.intelligibility_enhancer) {
514 intelligibility_enhancer_ = options.intelligibility_enhancer; 518 intelligibility_enhancer_ = options.intelligibility_enhancer;
515 } 519 }
516 if (intelligibility_enhancer_ && *intelligibility_enhancer_) { 520 if (intelligibility_enhancer_ && *intelligibility_enhancer_) {
517 LOG(LS_INFO) << "Enabling NS when Intelligibility Enhancer is active."; 521 LOG(LS_INFO) << "Enabling NS when Intelligibility Enhancer is active.";
518 options.noise_suppression = intelligibility_enhancer_; 522 options.noise_suppression = intelligibility_enhancer_;
519 } 523 }
520 524
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 } 747 }
744 748
745 webrtc::AudioDeviceModule* WebRtcVoiceEngine::adm() { 749 webrtc::AudioDeviceModule* WebRtcVoiceEngine::adm() {
746 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 750 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
747 RTC_DCHECK(adm_); 751 RTC_DCHECK(adm_);
748 return adm_; 752 return adm_;
749 } 753 }
750 754
751 webrtc::AudioProcessing* WebRtcVoiceEngine::apm() { 755 webrtc::AudioProcessing* WebRtcVoiceEngine::apm() {
752 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 756 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
753 RTC_DCHECK(apm_); 757 return apm_.get();
754 return apm_;
755 } 758 }
756 759
757 webrtc::voe::TransmitMixer* WebRtcVoiceEngine::transmit_mixer() { 760 webrtc::voe::TransmitMixer* WebRtcVoiceEngine::transmit_mixer() {
758 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 761 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
759 RTC_DCHECK(transmit_mixer_); 762 RTC_DCHECK(transmit_mixer_);
760 return transmit_mixer_; 763 return transmit_mixer_;
761 } 764 }
762 765
763 AudioCodecs WebRtcVoiceEngine::CollectCodecs( 766 AudioCodecs WebRtcVoiceEngine::CollectCodecs(
764 const std::vector<webrtc::AudioCodecSpec>& specs) const { 767 const std::vector<webrtc::AudioCodecSpec>& specs) const {
(...skipping 1600 matching lines...) Expand 10 before | Expand all | Expand 10 after
2365 ssrc); 2368 ssrc);
2366 if (it != unsignaled_recv_ssrcs_.end()) { 2369 if (it != unsignaled_recv_ssrcs_.end()) {
2367 unsignaled_recv_ssrcs_.erase(it); 2370 unsignaled_recv_ssrcs_.erase(it);
2368 return true; 2371 return true;
2369 } 2372 }
2370 return false; 2373 return false;
2371 } 2374 }
2372 } // namespace cricket 2375 } // namespace cricket
2373 2376
2374 #endif // HAVE_WEBRTC_VOICE 2377 #endif // HAVE_WEBRTC_VOICE
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.h ('k') | webrtc/media/engine/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698