Chromium Code Reviews| Index: webrtc/modules/audio_processing/aec3/echo_canceller3.cc |
| diff --git a/webrtc/modules/audio_processing/aec3/echo_canceller3.cc b/webrtc/modules/audio_processing/aec3/echo_canceller3.cc |
| index ed12a4799535155b60e237a7082a0b4f184c2b03..d18292245e0f6ec47cdcb29fbbc861577c6a2ce9 100644 |
| --- a/webrtc/modules/audio_processing/aec3/echo_canceller3.cc |
| +++ b/webrtc/modules/audio_processing/aec3/echo_canceller3.cc |
| @@ -18,6 +18,8 @@ namespace webrtc { |
| namespace { |
| +enum class EchoCanceller3ApiCall { kCapture, kRender }; |
|
peah-webrtc
2017/03/30 05:36:56
Used to record the API call sequence.
|
| + |
| bool DetectSaturation(rtc::ArrayView<const float> y) { |
| for (auto y_k : y) { |
| if (y_k >= 32700.0f || y_k <= -32700.0f) { |
| @@ -85,7 +87,7 @@ void ProcessRemainingCaptureFrameContent( |
| output_framer->InsertBlock(*block); |
| } |
| -bool BufferRenderFrameContent( |
| +void BufferRenderFrameContent( |
| std::vector<std::vector<float>>* render_frame, |
| size_t sub_frame_index, |
| FrameBlocker* render_blocker, |
| @@ -94,27 +96,30 @@ bool BufferRenderFrameContent( |
| std::vector<rtc::ArrayView<float>>* sub_frame_view) { |
| FillSubFrameView(render_frame, sub_frame_index, sub_frame_view); |
| render_blocker->InsertSubFrameAndExtractBlock(*sub_frame_view, block); |
| - return block_processor->BufferRender(block); |
| + block_processor->BufferRender(block); |
| } |
| -bool BufferRemainingRenderFrameContent(FrameBlocker* render_blocker, |
| +void BufferRemainingRenderFrameContent(FrameBlocker* render_blocker, |
| BlockProcessor* block_processor, |
| std::vector<std::vector<float>>* block) { |
| if (!render_blocker->IsBlockAvailable()) { |
| - return true; |
| + return; |
| } |
| render_blocker->ExtractBlock(block); |
| - return block_processor->BufferRender(block); |
| + block_processor->BufferRender(block); |
| } |
| -void CopyLowestBandIntoFrame(AudioBuffer* buffer, |
| - size_t num_bands, |
| - size_t frame_length, |
| - std::vector<std::vector<float>>* frame) { |
| +void CopyBufferIntoFrame(AudioBuffer* buffer, |
| + size_t num_bands, |
| + size_t frame_length, |
| + std::vector<std::vector<float>>* frame) { |
| RTC_DCHECK_EQ(num_bands, frame->size()); |
| RTC_DCHECK_EQ(frame_length, (*frame)[0].size()); |
| - rtc::ArrayView<float> buffer_view(&buffer->channels_f()[0][0], frame_length); |
| - std::copy(buffer_view.begin(), buffer_view.end(), (*frame)[0].begin()); |
| + for (size_t k = 0; k < num_bands; ++k) { |
| + rtc::ArrayView<float> buffer_view(&buffer->split_bands_f(0)[k][0], |
| + frame_length); |
| + std::copy(buffer_view.begin(), buffer_view.end(), (*frame)[k].begin()); |
| + } |
| } |
| // [B,A] = butter(2,100/4000,'high') |
| @@ -129,8 +134,6 @@ const CascadedBiQuadFilter::BiQuadCoefficients |
| {-1.94448f, 0.94598f}}; |
| const int kNumberOfHighPassBiQuads_16kHz = 1; |
| -static constexpr size_t kRenderTransferQueueSize = 30; |
| - |
| } // namespace |
| class EchoCanceller3::RenderWriter { |
| @@ -143,7 +146,7 @@ class EchoCanceller3::RenderWriter { |
| int frame_length, |
| int num_bands); |
| ~RenderWriter(); |
| - bool Insert(AudioBuffer* render); |
| + void Insert(AudioBuffer* render); |
| private: |
| ApmDataDumper* data_dumper_; |
| @@ -178,21 +181,21 @@ EchoCanceller3::RenderWriter::RenderWriter( |
| EchoCanceller3::RenderWriter::~RenderWriter() = default; |
| -bool EchoCanceller3::RenderWriter::Insert(AudioBuffer* input) { |
| +void EchoCanceller3::RenderWriter::Insert(AudioBuffer* input) { |
| RTC_DCHECK_EQ(1, input->num_channels()); |
| RTC_DCHECK_EQ(frame_length_, input->num_frames_per_band()); |
| data_dumper_->DumpWav("aec3_render_input", frame_length_, |
| - &input->channels_f()[0][0], |
| + &input->split_bands_f(0)[0][0], |
| LowestBandRate(sample_rate_hz_), 1); |
| - CopyLowestBandIntoFrame(input, num_bands_, frame_length_, |
| - &render_queue_input_frame_); |
| + CopyBufferIntoFrame(input, num_bands_, frame_length_, |
| + &render_queue_input_frame_); |
| if (render_highpass_filter_) { |
| render_highpass_filter_->Process(render_queue_input_frame_[0]); |
| } |
| - return render_transfer_queue_->Insert(&render_queue_input_frame_); |
| + static_cast<void>(render_transfer_queue_->Insert(&render_queue_input_frame_)); |
|
peah-webrtc
2017/03/30 05:36:55
Ignore return value, as any overrun will be implic
|
| } |
| int EchoCanceller3::instance_count_ = 0; |
| @@ -251,9 +254,12 @@ EchoCanceller3::EchoCanceller3(int sample_rate_hz, |
| EchoCanceller3::~EchoCanceller3() = default; |
| -bool EchoCanceller3::AnalyzeRender(AudioBuffer* render) { |
| +void EchoCanceller3::AnalyzeRender(AudioBuffer* render) { |
| RTC_DCHECK_RUNS_SERIALIZED(&render_race_checker_); |
| RTC_DCHECK(render); |
| + data_dumper_->DumpRaw("aec3_call_order", |
| + static_cast<int>(EchoCanceller3ApiCall::kRender)); |
| + |
| return render_writer_->Insert(render); |
| } |
| @@ -280,6 +286,8 @@ void EchoCanceller3::ProcessCapture(AudioBuffer* capture, bool level_change) { |
| RTC_DCHECK_EQ(1u, capture->num_channels()); |
| RTC_DCHECK_EQ(num_bands_, capture->num_bands()); |
| RTC_DCHECK_EQ(frame_length_, capture->num_frames_per_band()); |
| + data_dumper_->DumpRaw("aec3_call_order", |
| + static_cast<int>(EchoCanceller3ApiCall::kCapture)); |
| rtc::ArrayView<float> capture_lower_band = |
| rtc::ArrayView<float>(&capture->split_bands_f(0)[0][0], frame_length_); |
| @@ -287,8 +295,7 @@ void EchoCanceller3::ProcessCapture(AudioBuffer* capture, bool level_change) { |
| data_dumper_->DumpWav("aec3_capture_input", capture_lower_band, |
| LowestBandRate(sample_rate_hz_), 1); |
| - const bool successful_buffering = EmptyRenderQueue(); |
| - RTC_DCHECK(successful_buffering); |
| + EmptyRenderQueue(); |
| if (capture_highpass_filter_) { |
| capture_highpass_filter_->Process(capture_lower_band); |
| @@ -327,35 +334,26 @@ bool EchoCanceller3::Validate( |
| return true; |
| } |
| -bool EchoCanceller3::EmptyRenderQueue() { |
| +void EchoCanceller3::EmptyRenderQueue() { |
| RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_); |
| - bool successful_buffering = true; |
| bool frame_to_buffer = |
| render_transfer_queue_.Remove(&render_queue_output_frame_); |
| while (frame_to_buffer) { |
| - successful_buffering = |
| - BufferRenderFrameContent(&render_queue_output_frame_, 0, |
| - &render_blocker_, block_processor_.get(), |
| - &block_, &sub_frame_view_) && |
| - successful_buffering; |
| + BufferRenderFrameContent(&render_queue_output_frame_, 0, &render_blocker_, |
| + block_processor_.get(), &block_, &sub_frame_view_); |
| if (sample_rate_hz_ != 8000) { |
| - successful_buffering = |
| - BufferRenderFrameContent(&render_queue_output_frame_, 1, |
| - &render_blocker_, block_processor_.get(), |
| - &block_, &sub_frame_view_) && |
| - successful_buffering; |
| + BufferRenderFrameContent(&render_queue_output_frame_, 1, &render_blocker_, |
| + block_processor_.get(), &block_, |
| + &sub_frame_view_); |
| } |
| - successful_buffering = |
| - BufferRemainingRenderFrameContent(&render_blocker_, |
| - block_processor_.get(), &block_) && |
| - successful_buffering; |
| + BufferRemainingRenderFrameContent(&render_blocker_, block_processor_.get(), |
| + &block_); |
| frame_to_buffer = |
| render_transfer_queue_.Remove(&render_queue_output_frame_); |
| } |
| - return successful_buffering; |
| } |
| } // namespace webrtc |