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

Side by Side Diff: content/renderer/media/media_stream_audio_processor.cc

Issue 1528473003: Feed the WebRTC APM with empty far-end frames for the number of frames skipped by OS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/media_stream_audio_processor.h" 5 #include "content/renderer/media/media_stream_audio_processor.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/metrics/field_trial.h" 8 #include "base/metrics/field_trial.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 StopEchoCancellationDump(audio_processing_.get()); 425 StopEchoCancellationDump(audio_processing_.get());
426 } 426 }
427 427
428 void MediaStreamAudioProcessor::OnIpcClosing() { 428 void MediaStreamAudioProcessor::OnIpcClosing() {
429 DCHECK(main_thread_checker_.CalledOnValidThread()); 429 DCHECK(main_thread_checker_.CalledOnValidThread());
430 aec_dump_message_filter_ = NULL; 430 aec_dump_message_filter_ = NULL;
431 } 431 }
432 432
433 void MediaStreamAudioProcessor::OnPlayoutData(media::AudioBus* audio_bus, 433 void MediaStreamAudioProcessor::OnPlayoutData(media::AudioBus* audio_bus,
434 int sample_rate, 434 int sample_rate,
435 int audio_delay_milliseconds) { 435 int audio_delay_milliseconds,
436 uint32_t skipped_frames) {
436 DCHECK(render_thread_checker_.CalledOnValidThread()); 437 DCHECK(render_thread_checker_.CalledOnValidThread());
437 DCHECK(audio_processing_->echo_control_mobile()->is_enabled() ^ 438 DCHECK(audio_processing_->echo_control_mobile()->is_enabled() ^
438 audio_processing_->echo_cancellation()->is_enabled()); 439 audio_processing_->echo_cancellation()->is_enabled());
439 440
440 TRACE_EVENT0("audio", "MediaStreamAudioProcessor::OnPlayoutData"); 441 TRACE_EVENT0("audio", "MediaStreamAudioProcessor::OnPlayoutData");
441 DCHECK_LT(audio_delay_milliseconds, 442 DCHECK_LT(audio_delay_milliseconds,
442 std::numeric_limits<base::subtle::Atomic32>::max()); 443 std::numeric_limits<base::subtle::Atomic32>::max());
443 base::subtle::Release_Store(&render_delay_ms_, audio_delay_milliseconds); 444 base::subtle::Release_Store(&render_delay_ms_, audio_delay_milliseconds);
444 445
445 InitializeRenderFifoIfNeeded(sample_rate, audio_bus->channels(), 446 InitializeRenderFifoIfNeeded(sample_rate, audio_bus->channels(),
446 audio_bus->frames()); 447 audio_bus->frames());
447 448
448 render_fifo_->Push( 449 render_fifo_->Push(
449 *audio_bus, base::TimeDelta::FromMilliseconds(audio_delay_milliseconds)); 450 *audio_bus, base::TimeDelta::FromMilliseconds(audio_delay_milliseconds));
451
452 // Feed the APM with empty frames corresponding to |skipped_frames|.
453 if (skipped_frames > 0) {
454 MediaStreamAudioBus empty_bus(audio_bus->channels(), skipped_frames);
peah 2015/12/16 10:26:57 Does this call also set all samples in the empty_b
Henrik Grunell 2015/12/18 10:17:33 I doesn't. Fixed.
455 audio_processing_->AnalyzeReverseStream(
456 empty_bus.channel_ptrs(),
457 empty_bus.bus()->frames(),
peah 2015/12/16 10:26:57 Is there any restriction on the values of skipped_
Henrik Grunell 2015/12/18 10:17:33 No, it can be any value. OK, I added storing the n
peah 2015/12/18 13:34:12 What does this mean? Does it mean that typically a
458 sample_rate,
459 ChannelsToLayout(empty_bus.bus()->channels()));
460 }
461
462 // Pull data from the fifo and feed the APM.
450 MediaStreamAudioBus* analysis_bus; 463 MediaStreamAudioBus* analysis_bus;
451 base::TimeDelta audio_delay; 464 base::TimeDelta audio_delay;
452 while (render_fifo_->Consume(&analysis_bus, &audio_delay)) { 465 while (render_fifo_->Consume(&analysis_bus, &audio_delay)) {
453 // TODO(ajm): Should AnalyzeReverseStream() account for the |audio_delay|? 466 // TODO(ajm): Should AnalyzeReverseStream() account for the |audio_delay|?
454 audio_processing_->AnalyzeReverseStream( 467 audio_processing_->AnalyzeReverseStream(
455 analysis_bus->channel_ptrs(), 468 analysis_bus->channel_ptrs(),
456 analysis_bus->bus()->frames(), 469 analysis_bus->bus()->frames(),
457 sample_rate, 470 sample_rate,
458 ChannelsToLayout(audio_bus->channels())); 471 ChannelsToLayout(analysis_bus->bus()->channels()));
459 } 472 }
460 } 473 }
461 474
462 void MediaStreamAudioProcessor::OnPlayoutDataSourceChanged() { 475 void MediaStreamAudioProcessor::OnPlayoutDataSourceChanged() {
463 DCHECK(main_thread_checker_.CalledOnValidThread()); 476 DCHECK(main_thread_checker_.CalledOnValidThread());
464 // There is no need to hold a lock here since the caller guarantees that 477 // There is no need to hold a lock here since the caller guarantees that
465 // there is no more OnPlayoutData() callback on the render thread. 478 // there is no more OnPlayoutData() callback on the render thread.
466 render_thread_checker_.DetachFromThread(); 479 render_thread_checker_.DetachFromThread();
467 render_fifo_.reset(); 480 render_fifo_.reset();
468 } 481 }
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 if (echo_information_) { 757 if (echo_information_) {
745 echo_information_.get()->UpdateAecDelayStats(ap->echo_cancellation()); 758 echo_information_.get()->UpdateAecDelayStats(ap->echo_cancellation());
746 } 759 }
747 760
748 // Return 0 if the volume hasn't been changed, and otherwise the new volume. 761 // Return 0 if the volume hasn't been changed, and otherwise the new volume.
749 return (agc->stream_analog_level() == volume) ? 762 return (agc->stream_analog_level() == volume) ?
750 0 : agc->stream_analog_level(); 763 0 : agc->stream_analog_level();
751 } 764 }
752 765
753 } // namespace content 766 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_audio_processor.h ('k') | content/renderer/media/media_stream_audio_processor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698