[AudioProcessingImpl] Don't use AudioFrameView with aec dump In AudioProcessingImpl we receive externally provided channel data that may not be byte aligned (e.g AudioBus in chromium is aligned on a 16 byte boundary). Bug: chromium:409777951 Change-Id: I7ad9afda6f4bbfa67cfaf2ea89a40bebf4624e8b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/392322 Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org> Reviewed-by: Per Ã…hgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/main@{#44717}
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index b42ded6..d36c3c4 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn
@@ -91,6 +91,7 @@ deps = [ ":audio_frame_view", + "../../api/audio:audio_frame_api", "../../api/audio:audio_processing", "//third_party/abseil-cpp/absl/base:core_headers", ] @@ -156,6 +157,7 @@ "../../api:field_trials_view", "../../api:function_view", "../../api:make_ref_counted", + "../../api:scoped_refptr", "../../api/audio:aec3_config", "../../api/audio:audio_frame_api", "../../api/audio:audio_processing", @@ -189,6 +191,7 @@ "agc", "agc:gain_control_interface", "agc:legacy_agc", + "agc2:input_volume_controller", "agc2:input_volume_stats_reporter", "capture_levels_adjuster", "ns",
diff --git a/modules/audio_processing/aec_dump/BUILD.gn b/modules/audio_processing/aec_dump/BUILD.gn index 5fb2942..b747aaa 100644 --- a/modules/audio_processing/aec_dump/BUILD.gn +++ b/modules/audio_processing/aec_dump/BUILD.gn
@@ -34,6 +34,9 @@ "..:aec_dump_interface", "..:audioproc_test_utils", "../", + "../../../api/audio:audio_frame_api", + "../../../api/audio:audio_processing", + "../../../modules/audio_processing:audio_frame_view", "../../../test:test_support", ] } @@ -47,9 +50,12 @@ ":mock_aec_dump", "..:audioproc_test_utils", "../", + "../../../api:scoped_refptr", "../../../api/audio:audio_processing", "../../../api/audio:builtin_audio_processing_builder", "../../../api/environment:environment_factory", + "../../../rtc_base:checks", + "../../../test:test_support", "//testing/gtest", ] } @@ -68,7 +74,9 @@ ":aec_dump", "..:aec_dump_interface", "../../../api/audio:audio_frame_api", + "../../../api/audio:audio_processing", "../../../api/task_queue", + "../../../modules/audio_processing:audio_frame_view", "../../../rtc_base:checks", "../../../rtc_base:logging", "../../../rtc_base:macromagic",
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.cc b/modules/audio_processing/aec_dump/aec_dump_impl.cc index 31826ff..92f3bd3 100644 --- a/modules/audio_processing/aec_dump/aec_dump_impl.cc +++ b/modules/audio_processing/aec_dump/aec_dump_impl.cc
@@ -10,15 +10,26 @@ #include "modules/audio_processing/aec_dump/aec_dump_impl.h" +#include <cstddef> +#include <cstdint> +#include <cstdio> #include <memory> +#include <string> #include <utility> #include "absl/base/nullability.h" #include "absl/strings/string_view.h" +#include "api/audio/audio_processing.h" +#include "api/audio/audio_view.h" #include "api/task_queue/task_queue_base.h" #include "modules/audio_processing/aec_dump/aec_dump_factory.h" +#include "modules/audio_processing/debug.pb.h" +#include "modules/audio_processing/include/aec_dump.h" +#include "modules/audio_processing/include/audio_frame_view.h" #include "rtc_base/checks.h" #include "rtc_base/event.h" +#include "rtc_base/race_checker.h" +#include "rtc_base/system/file_wrapper.h" namespace webrtc { @@ -105,11 +116,19 @@ capture_stream_info_.AddInput(src); } +void AecDumpImpl::AddCaptureStreamInput(MonoView<const float> channel) { + capture_stream_info_.AddInputChannel(channel); +} + void AecDumpImpl::AddCaptureStreamOutput( const AudioFrameView<const float>& src) { capture_stream_info_.AddOutput(src); } +void AecDumpImpl::AddCaptureStreamOutput(MonoView<const float> channel) { + capture_stream_info_.AddOutputChannel(channel); +} + void AecDumpImpl::AddCaptureStreamInput(const int16_t* const data, int num_channels, int samples_per_channel) { @@ -157,6 +176,22 @@ PostWriteToFileTask(std::move(event)); } +void AecDumpImpl::WriteRenderStreamMessage(const float* const* data, + int num_channels, + int samples_per_channel) { + auto event = std::make_unique<audioproc::Event>(); + event->set_type(audioproc::Event::REVERSE_STREAM); + + audioproc::ReverseStream* msg = event->mutable_reverse_stream(); + + for (int i = 0; i < num_channels; ++i) { + MonoView<const float> channel_view(data[i], samples_per_channel); + msg->add_channel(channel_view.begin(), sizeof(float) * channel_view.size()); + } + + PostWriteToFileTask(std::move(event)); +} + void AecDumpImpl::WriteConfig(const InternalAPMConfig& config) { RTC_DCHECK_RUNS_SERIALIZED(&race_checker_); auto event = std::make_unique<audioproc::Event>();
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.h b/modules/audio_processing/aec_dump/aec_dump_impl.h index 7638758..aa25eae 100644 --- a/modules/audio_processing/aec_dump/aec_dump_impl.h +++ b/modules/audio_processing/aec_dump/aec_dump_impl.h
@@ -11,16 +11,18 @@ #ifndef MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_IMPL_H_ #define MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_IMPL_H_ +#include <cstdint> #include <memory> -#include <string> -#include <vector> +#include "absl/base/nullability.h" +#include "api/audio/audio_processing.h" +#include "api/audio/audio_view.h" #include "api/task_queue/task_queue_base.h" #include "modules/audio_processing/aec_dump/capture_stream_info.h" #include "modules/audio_processing/include/aec_dump.h" +#include "modules/audio_processing/include/audio_frame_view.h" #include "rtc_base/race_checker.h" #include "rtc_base/system/file_wrapper.h" -#include "rtc_base/thread_annotations.h" // Files generated at build-time by the protobuf compiler. #ifdef WEBRTC_ANDROID_PLATFORM_BUILD @@ -47,7 +49,9 @@ void WriteInitMessage(const ProcessingConfig& api_format, int64_t time_now_ms) override; void AddCaptureStreamInput(const AudioFrameView<const float>& src) override; + void AddCaptureStreamInput(MonoView<const float> channel) override; void AddCaptureStreamOutput(const AudioFrameView<const float>& src) override; + void AddCaptureStreamOutput(MonoView<const float> channel) override; void AddCaptureStreamInput(const int16_t* const data, int num_channels, int samples_per_channel) override; @@ -62,6 +66,9 @@ int samples_per_channel) override; void WriteRenderStreamMessage( const AudioFrameView<const float>& src) override; + void WriteRenderStreamMessage(const float* const* data, + int num_channels, + int samples_per_channel) override; void WriteConfig(const InternalAPMConfig& config) override;
diff --git a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc b/modules/audio_processing/aec_dump/aec_dump_integration_test.cc index 5c23c96..7701877 100644 --- a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc +++ b/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
@@ -9,18 +9,23 @@ */ #include <array> +#include <cstdint> #include <memory> #include <utility> #include "api/audio/audio_processing.h" #include "api/audio/builtin_audio_processing_builder.h" #include "api/environment/environment_factory.h" +#include "api/scoped_refptr.h" #include "modules/audio_processing/aec_dump/mock_aec_dump.h" -#include "modules/audio_processing/audio_processing_impl.h" +#include "rtc_base/checks.h" +#include "test/gmock.h" +#include "test/gtest.h" using ::testing::_; using ::testing::AtLeast; using ::testing::Exactly; +using ::testing::Matcher; using ::testing::StrictMock; namespace { @@ -59,7 +64,8 @@ frame.fill(0.f); webrtc::StreamConfig stream_config(kNumSampleRateHz, kNumChannels); - EXPECT_CALL(*mock_aec_dump.get(), WriteRenderStreamMessage(_, _, _)) + EXPECT_CALL(*mock_aec_dump.get(), + WriteRenderStreamMessage(Matcher<const int16_t*>(_), _, _)) .Times(Exactly(1)); apm->AttachAecDump(std::move(mock_aec_dump));
diff --git a/modules/audio_processing/aec_dump/capture_stream_info.cc b/modules/audio_processing/aec_dump/capture_stream_info.cc index 7d82a39..9933866 100644 --- a/modules/audio_processing/aec_dump/capture_stream_info.cc +++ b/modules/audio_processing/aec_dump/capture_stream_info.cc
@@ -10,28 +10,37 @@ #include "modules/audio_processing/aec_dump/capture_stream_info.h" +#include <cstddef> +#include <cstdint> + +#include "api/audio/audio_view.h" +#include "modules/audio_processing/include/aec_dump.h" +#include "modules/audio_processing/include/audio_frame_view.h" + namespace webrtc { void CaptureStreamInfo::AddInput(const AudioFrameView<const float>& src) { - auto* stream = event_->mutable_stream(); - for (int i = 0; i < src.num_channels(); ++i) { - const auto& channel_view = src.channel(i); - stream->add_input_channel(channel_view.begin(), - sizeof(float) * channel_view.size()); + AddInputChannel(src.channel(i)); } } -void CaptureStreamInfo::AddOutput(const AudioFrameView<const float>& src) { +void CaptureStreamInfo::AddInputChannel(MonoView<const float> channel) { auto* stream = event_->mutable_stream(); + stream->add_input_channel(channel.begin(), sizeof(float) * channel.size()); +} +void CaptureStreamInfo::AddOutput(const AudioFrameView<const float>& src) { for (int i = 0; i < src.num_channels(); ++i) { - const auto& channel_view = src.channel(i); - stream->add_output_channel(channel_view.begin(), - sizeof(float) * channel_view.size()); + AddOutputChannel(src.channel(i)); } } +void CaptureStreamInfo::AddOutputChannel(MonoView<const float> channel) { + auto* stream = event_->mutable_stream(); + stream->add_output_channel(channel.begin(), sizeof(float) * channel.size()); +} + void CaptureStreamInfo::AddInput(const int16_t* const data, int num_channels, int samples_per_channel) {
diff --git a/modules/audio_processing/aec_dump/capture_stream_info.h b/modules/audio_processing/aec_dump/capture_stream_info.h index 572990c..bbbbb22 100644 --- a/modules/audio_processing/aec_dump/capture_stream_info.h +++ b/modules/audio_processing/aec_dump/capture_stream_info.h
@@ -11,10 +11,13 @@ #ifndef MODULES_AUDIO_PROCESSING_AEC_DUMP_CAPTURE_STREAM_INFO_H_ #define MODULES_AUDIO_PROCESSING_AEC_DUMP_CAPTURE_STREAM_INFO_H_ +#include <cstdint> #include <memory> #include <utility> +#include "api/audio/audio_view.h" #include "modules/audio_processing/include/aec_dump.h" +#include "modules/audio_processing/include/audio_frame_view.h" // Files generated at build-time by the protobuf compiler. #ifdef WEBRTC_ANDROID_PLATFORM_BUILD @@ -33,7 +36,9 @@ ~CaptureStreamInfo() = default; void AddInput(const AudioFrameView<const float>& src); + void AddInputChannel(MonoView<const float> channel); void AddOutput(const AudioFrameView<const float>& src); + void AddOutputChannel(MonoView<const float> channel); void AddInput(const int16_t* const data, int num_channels,
diff --git a/modules/audio_processing/aec_dump/mock_aec_dump.h b/modules/audio_processing/aec_dump/mock_aec_dump.h index b396739..c192d46 100644 --- a/modules/audio_processing/aec_dump/mock_aec_dump.h +++ b/modules/audio_processing/aec_dump/mock_aec_dump.h
@@ -11,9 +11,12 @@ #ifndef MODULES_AUDIO_PROCESSING_AEC_DUMP_MOCK_AEC_DUMP_H_ #define MODULES_AUDIO_PROCESSING_AEC_DUMP_MOCK_AEC_DUMP_H_ -#include <memory> +#include <cstdint> +#include "api/audio/audio_processing.h" +#include "api/audio/audio_view.h" #include "modules/audio_processing/include/aec_dump.h" +#include "modules/audio_processing/include/audio_frame_view.h" #include "test/gmock.h" namespace webrtc { @@ -35,10 +38,18 @@ (const AudioFrameView<const float>& src), (override)); MOCK_METHOD(void, + AddCaptureStreamInput, + (MonoView<const float> channel), + (override)); + MOCK_METHOD(void, AddCaptureStreamOutput, (const AudioFrameView<const float>& src), (override)); MOCK_METHOD(void, + AddCaptureStreamOutput, + (MonoView<const float> channel), + (override)); + MOCK_METHOD(void, AddCaptureStreamInput, (const int16_t* const data, int num_channels, @@ -66,6 +77,12 @@ WriteRenderStreamMessage, (const AudioFrameView<const float>& src), (override)); + MOCK_METHOD(void, + WriteRenderStreamMessage, + (const float* const* data, + int num_channels, + int samples_per_channel), + (override)); MOCK_METHOD(void, WriteConfig, (const InternalAPMConfig& config), (override));
diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn index 8660950..e9d1743 100644 --- a/modules/audio_processing/agc2/BUILD.gn +++ b/modules/audio_processing/agc2/BUILD.gn
@@ -196,6 +196,7 @@ ] visibility = [ + "..:audio_processing", "..:gain_controller2", "./*", ]
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index dfca465..b5b43e2 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc
@@ -11,30 +11,54 @@ #include "modules/audio_processing/audio_processing_impl.h" #include <algorithm> +#include <array> +#include <atomic> #include <cstdint> +#include <cstdio> #include <cstring> #include <memory> #include <optional> #include <string> -#include <type_traits> #include <utility> +#include <vector> #include "absl/base/nullability.h" #include "absl/strings/string_view.h" #include "api/array_view.h" -#include "api/audio/audio_frame.h" +#include "api/audio/audio_processing.h" +#include "api/audio/audio_processing_statistics.h" +#include "api/audio/audio_view.h" +#include "api/audio/echo_canceller3_config.h" +#include "api/audio/echo_control.h" #include "api/environment/environment.h" #include "api/field_trials_view.h" +#include "api/scoped_refptr.h" #include "api/task_queue/task_queue_base.h" #include "common_audio/audio_converter.h" #include "common_audio/include/audio_util.h" +#include "modules/audio_processing/aec3/echo_canceller3.h" #include "modules/audio_processing/aec_dump/aec_dump_factory.h" +#include "modules/audio_processing/agc/agc_manager_direct.h" +#include "modules/audio_processing/agc/gain_control.h" +#include "modules/audio_processing/agc2/input_volume_controller.h" +#include "modules/audio_processing/agc2/input_volume_stats_reporter.h" #include "modules/audio_processing/audio_buffer.h" -#include "modules/audio_processing/include/audio_frame_view.h" +#include "modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.h" +#include "modules/audio_processing/echo_control_mobile_impl.h" +#include "modules/audio_processing/gain_control_impl.h" +#include "modules/audio_processing/gain_controller2.h" +#include "modules/audio_processing/high_pass_filter.h" +#include "modules/audio_processing/include/aec_dump.h" #include "modules/audio_processing/logging/apm_data_dumper.h" +#include "modules/audio_processing/ns/noise_suppressor.h" +#include "modules/audio_processing/ns/ns_config.h" +#include "modules/audio_processing/render_queue_item_verifier.h" +#include "modules/audio_processing/rms_level.h" #include "rtc_base/checks.h" #include "rtc_base/denormal_disabler.h" #include "rtc_base/logging.h" +#include "rtc_base/swap_queue.h" +#include "rtc_base/synchronization/mutex.h" #include "rtc_base/time_utils.h" #include "rtc_base/trace_event.h" #include "system_wrappers/include/metrics.h" @@ -1587,8 +1611,7 @@ formats_.api_format.reverse_input_stream().num_frames(); const size_t num_channels = formats_.api_format.reverse_input_stream().num_channels(); - aec_dump_->WriteRenderStreamMessage( - AudioFrameView<const float>(src, num_channels, channel_size)); + aec_dump_->WriteRenderStreamMessage(src, num_channels, channel_size); } render_.render_audio->CopyFrom(src, formats_.api_format.reverse_input_stream()); @@ -2201,8 +2224,10 @@ const size_t channel_size = formats_.api_format.input_stream().num_frames(); const size_t num_channels = formats_.api_format.input_stream().num_channels(); - aec_dump_->AddCaptureStreamInput( - AudioFrameView<const float>(src, num_channels, channel_size)); + for (size_t ch = 0u; ch < num_channels; ++ch) { + aec_dump_->AddCaptureStreamInput( + MonoView<const float>(src[ch], channel_size)); + } RecordAudioProcessingState(); } @@ -2224,8 +2249,11 @@ const size_t channel_size = formats_.api_format.output_stream().num_frames(); const size_t num_channels = formats_.api_format.output_stream().num_channels(); - aec_dump_->AddCaptureStreamOutput(AudioFrameView<const float>( - processed_capture_stream, num_channels, channel_size)); + for (size_t ch = 0u; ch < num_channels; ++ch) { + aec_dump_->AddCaptureStreamOutput( + MonoView<const float>(processed_capture_stream[ch], channel_size)); + } + aec_dump_->WriteCaptureStreamMessage(); }
diff --git a/modules/audio_processing/include/aec_dump.h b/modules/audio_processing/include/aec_dump.h index 532fa21..4e273d4 100644 --- a/modules/audio_processing/include/aec_dump.h +++ b/modules/audio_processing/include/aec_dump.h
@@ -18,6 +18,7 @@ #include "absl/base/attributes.h" #include "api/audio/audio_processing.h" +#include "api/audio/audio_view.h" #include "modules/audio_processing/include/audio_frame_view.h" namespace webrtc { @@ -87,8 +88,10 @@ // by a WriteCaptureStreamMessage call. virtual void AddCaptureStreamInput( const AudioFrameView<const float>& src) = 0; + virtual void AddCaptureStreamInput(MonoView<const float> channel) = 0; virtual void AddCaptureStreamOutput( const AudioFrameView<const float>& src) = 0; + virtual void AddCaptureStreamOutput(MonoView<const float> channel) = 0; virtual void AddCaptureStreamInput(const int16_t* const data, int num_channels, int samples_per_channel) = 0; @@ -104,6 +107,9 @@ int samples_per_channel) = 0; virtual void WriteRenderStreamMessage( const AudioFrameView<const float>& src) = 0; + virtual void WriteRenderStreamMessage(const float* const* data, + int num_channels, + int samples_per_channel) = 0; virtual void WriteRuntimeSetting( const AudioProcessing::RuntimeSetting& runtime_setting) = 0;