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

Unified Diff: webrtc/modules/audio_processing/echo_cancellation_impl.cc

Issue 2427553003: Moved the AEC render sample queue into the audio processing module (Closed)
Patch Set: Rebase Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_processing/echo_cancellation_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_processing/echo_cancellation_impl.cc
diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl.cc b/webrtc/modules/audio_processing/echo_cancellation_impl.cc
index 18c815dc00dfca8330fec3f62f46f5ce133dd4f2..e06b2faa84df7e46035294bbe84174c9472eb083 100644
--- a/webrtc/modules/audio_processing/echo_cancellation_impl.cc
+++ b/webrtc/modules/audio_processing/echo_cancellation_impl.cc
@@ -49,12 +49,6 @@ AudioProcessing::Error MapError(int err) {
}
}
-// Maximum length that a frame of samples can have.
-static const size_t kMaxAllowedValuesOfSamplesPerFrame = 160;
-// Maximum number of frames to buffer in the render queue.
-// TODO(peah): Decrease this once we properly handle hugely unbalanced
-// reverse and forward call numbers.
-static const size_t kMaxNumFramesToBuffer = 100;
} // namespace
struct EchoCancellationImpl::StreamProperties {
@@ -113,93 +107,37 @@ EchoCancellationImpl::EchoCancellationImpl(rtc::CriticalSection* crit_render,
delay_logging_enabled_(false),
extended_filter_enabled_(false),
delay_agnostic_enabled_(false),
- aec3_enabled_(false),
- render_queue_element_max_size_(0) {
+ aec3_enabled_(false) {
RTC_DCHECK(crit_render);
RTC_DCHECK(crit_capture);
}
-EchoCancellationImpl::~EchoCancellationImpl() {}
+EchoCancellationImpl::~EchoCancellationImpl() = default;
-int EchoCancellationImpl::ProcessRenderAudio(const AudioBuffer* audio) {
- rtc::CritScope cs_render(crit_render_);
+void EchoCancellationImpl::ProcessRenderAudio(
+ rtc::ArrayView<const float> packed_render_audio) {
+ rtc::CritScope cs_capture(crit_capture_);
if (!enabled_) {
- return AudioProcessing::kNoError;
+ return;
}
RTC_DCHECK(stream_properties_);
- RTC_DCHECK_GE(160u, audio->num_frames_per_band());
- RTC_DCHECK_EQ(audio->num_channels(),
- stream_properties_->num_reverse_channels);
- RTC_DCHECK_GE(cancellers_.size(), stream_properties_->num_output_channels *
- audio->num_channels());
-
- int err = AudioProcessing::kNoError;
-
- // The ordering convention must be followed to pass to the correct AEC.
size_t handle_index = 0;
- render_queue_buffer_.clear();
+ size_t buffer_index = 0;
+ const size_t num_frames_per_band =
+ packed_render_audio.size() / (stream_properties_->num_output_channels *
+ stream_properties_->num_reverse_channels);
for (size_t i = 0; i < stream_properties_->num_output_channels; i++) {
- for (size_t j = 0; j < audio->num_channels(); j++) {
- // Retrieve any error code produced by the buffering of the farend
- // signal.
- err = WebRtcAec_GetBufferFarendError(
- cancellers_[handle_index++]->state(),
- audio->split_bands_const_f(j)[kBand0To8kHz],
- audio->num_frames_per_band());
-
- if (err != AudioProcessing::kNoError) {
- return MapError(err); // TODO(ajm): warning possible?
- }
+ for (size_t j = 0; j < stream_properties_->num_reverse_channels; j++) {
+ WebRtcAec_BufferFarend(cancellers_[handle_index++]->state(),
+ &packed_render_audio[buffer_index],
+ num_frames_per_band);
- // Buffer the samples in the render queue.
- render_queue_buffer_.insert(render_queue_buffer_.end(),
- audio->split_bands_const_f(j)[kBand0To8kHz],
- (audio->split_bands_const_f(j)[kBand0To8kHz] +
- audio->num_frames_per_band()));
+ buffer_index += num_frames_per_band;
}
}
-
- // Insert the samples into the queue.
- if (!render_signal_queue_->Insert(&render_queue_buffer_)) {
- // The data queue is full and needs to be emptied.
- ReadQueuedRenderData();
-
- // Retry the insert (should always work).
- bool result = render_signal_queue_->Insert(&render_queue_buffer_);
- RTC_DCHECK(result);
- }
-
- return AudioProcessing::kNoError;
}
-// Read chunks of data that were received and queued on the render side from
-// a queue. All the data chunks are buffered into the farend signal of the AEC.
-void EchoCancellationImpl::ReadQueuedRenderData() {
- rtc::CritScope cs_capture(crit_capture_);
- if (!enabled_) {
- return;
- }
-
- RTC_DCHECK(stream_properties_);
- while (render_signal_queue_->Remove(&capture_queue_buffer_)) {
- size_t handle_index = 0;
- size_t buffer_index = 0;
- const size_t num_frames_per_band =
- capture_queue_buffer_.size() /
- (stream_properties_->num_output_channels *
- stream_properties_->num_reverse_channels);
- for (size_t i = 0; i < stream_properties_->num_output_channels; i++) {
- for (size_t j = 0; j < stream_properties_->num_reverse_channels; j++) {
- WebRtcAec_BufferFarend(cancellers_[handle_index++]->state(),
- &capture_queue_buffer_[buffer_index],
- num_frames_per_band);
-
- buffer_index += num_frames_per_band;
- }
- }
- }
-}
int EchoCancellationImpl::ProcessCaptureAudio(AudioBuffer* audio,
int stream_delay_ms) {
@@ -480,9 +418,12 @@ void EchoCancellationImpl::Initialize(int sample_rate_hz,
return;
}
- if (NumCancellersRequired() > cancellers_.size()) {
+ const size_t num_cancellers_required =
+ NumCancellersRequired(stream_properties_->num_output_channels,
+ stream_properties_->num_reverse_channels);
+ if (num_cancellers_required > cancellers_.size()) {
const size_t cancellers_old_size = cancellers_.size();
- cancellers_.resize(NumCancellersRequired());
+ cancellers_.resize(num_cancellers_required);
for (size_t i = cancellers_old_size; i < cancellers_.size(); ++i) {
cancellers_[i].reset(new Canceller());
@@ -494,8 +435,6 @@ void EchoCancellationImpl::Initialize(int sample_rate_hz,
}
Configure();
-
- AllocateRenderQueue();
}
int EchoCancellationImpl::GetSystemDelayInSamples() const {
@@ -506,30 +445,24 @@ int EchoCancellationImpl::GetSystemDelayInSamples() const {
WebRtcAec_aec_core(cancellers_[0]->state()));
}
-void EchoCancellationImpl::AllocateRenderQueue() {
- const size_t new_render_queue_element_max_size = std::max<size_t>(
- static_cast<size_t>(1),
- kMaxAllowedValuesOfSamplesPerFrame * NumCancellersRequired());
-
- rtc::CritScope cs_render(crit_render_);
- rtc::CritScope cs_capture(crit_capture_);
-
- // Reallocate the queue if the queue item size is too small to fit the
- // data to put in the queue.
- if (render_queue_element_max_size_ < new_render_queue_element_max_size) {
- render_queue_element_max_size_ = new_render_queue_element_max_size;
-
- std::vector<float> template_queue_element(render_queue_element_max_size_);
-
- render_signal_queue_.reset(
- new SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>(
- kMaxNumFramesToBuffer, template_queue_element,
- RenderQueueItemVerifier<float>(render_queue_element_max_size_)));
+void EchoCancellationImpl::PackRenderAudioBuffer(
+ const AudioBuffer* audio,
+ size_t num_output_channels,
+ size_t num_channels,
+ std::vector<float>* packed_buffer) {
+ RTC_DCHECK_GE(160u, audio->num_frames_per_band());
+ RTC_DCHECK_EQ(num_channels, audio->num_channels());
- render_queue_buffer_.resize(render_queue_element_max_size_);
- capture_queue_buffer_.resize(render_queue_element_max_size_);
- } else {
- render_signal_queue_->Clear();
+ packed_buffer->clear();
+ // The ordering convention must be followed to pass the correct data.
+ for (size_t i = 0; i < num_output_channels; i++) {
+ for (size_t j = 0; j < audio->num_channels(); j++) {
+ // Buffer the samples in the render queue.
+ packed_buffer->insert(packed_buffer->end(),
+ audio->split_bands_const_f(j)[kBand0To8kHz],
+ (audio->split_bands_const_f(j)[kBand0To8kHz] +
+ audio->num_frames_per_band()));
+ }
}
}
@@ -573,10 +506,10 @@ int EchoCancellationImpl::Configure() {
return error;
}
-size_t EchoCancellationImpl::NumCancellersRequired() const {
- RTC_DCHECK(stream_properties_);
- return stream_properties_->num_output_channels *
- stream_properties_->num_reverse_channels;
+size_t EchoCancellationImpl::NumCancellersRequired(
+ size_t num_output_channels,
+ size_t num_reverse_channels) {
+ return num_output_channels * num_reverse_channels;
}
} // namespace webrtc
« no previous file with comments | « webrtc/modules/audio_processing/echo_cancellation_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698