Reland Process 8 kHz audio as 16 kHz internally of the audio processing module
This CL relands the code from the CL "Process 8 kHz audio as 16 kHz internally of the audio processing module" which by mistake was reverted via a rebase in another CL. The CL changes the behavior of APM for 8 kHz so that it is internally processed as 16 kHz. Bug: webrtc:10863 Change-Id: I32a57b2d279c2134125667c19b09cfda381a33c3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150221 Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org> Commit-Queue: Per Åhgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28944}
This commit is contained in:
@ -84,22 +84,17 @@ bool SampleRateSupportsMultiBand(int sample_rate_hz) {
|
||||
sample_rate_hz == AudioProcessing::kSampleRate48kHz;
|
||||
}
|
||||
|
||||
int FindNativeProcessRateToUse(int minimum_rate, bool band_splitting_required) {
|
||||
// Identify the native processing rate that best handles a sample rate.
|
||||
int SuitableProcessRate(int minimum_rate, bool band_splitting_required) {
|
||||
#ifdef WEBRTC_ARCH_ARM_FAMILY
|
||||
constexpr int kMaxSplittingNativeProcessRate =
|
||||
AudioProcessing::kSampleRate32kHz;
|
||||
constexpr int kMaxSplittingRate = 32000;
|
||||
#else
|
||||
constexpr int kMaxSplittingNativeProcessRate =
|
||||
AudioProcessing::kSampleRate48kHz;
|
||||
constexpr int kMaxSplittingRate = 48000;
|
||||
#endif
|
||||
static_assert(
|
||||
kMaxSplittingNativeProcessRate <= AudioProcessing::kMaxNativeSampleRateHz,
|
||||
"");
|
||||
const int uppermost_native_rate = band_splitting_required
|
||||
? kMaxSplittingNativeProcessRate
|
||||
: AudioProcessing::kSampleRate48kHz;
|
||||
|
||||
for (auto rate : AudioProcessing::kNativeSampleRatesHz) {
|
||||
static_assert(kMaxSplittingRate <= 48000, "");
|
||||
const int uppermost_native_rate =
|
||||
band_splitting_required ? kMaxSplittingRate : 48000;
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
if (rate >= uppermost_native_rate) {
|
||||
return uppermost_native_rate;
|
||||
}
|
||||
@ -595,18 +590,19 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
|
||||
|
||||
formats_.api_format = config;
|
||||
|
||||
int capture_processing_rate = FindNativeProcessRateToUse(
|
||||
int capture_processing_rate = SuitableProcessRate(
|
||||
std::min(formats_.api_format.input_stream().sample_rate_hz(),
|
||||
formats_.api_format.output_stream().sample_rate_hz()),
|
||||
submodule_states_.CaptureMultiBandSubModulesActive() ||
|
||||
submodule_states_.RenderMultiBandSubModulesActive());
|
||||
RTC_DCHECK_NE(8000, capture_processing_rate);
|
||||
|
||||
capture_nonlocked_.capture_processing_format =
|
||||
StreamConfig(capture_processing_rate);
|
||||
|
||||
int render_processing_rate;
|
||||
if (!capture_nonlocked_.echo_controller_enabled) {
|
||||
render_processing_rate = FindNativeProcessRateToUse(
|
||||
render_processing_rate = SuitableProcessRate(
|
||||
std::min(formats_.api_format.reverse_input_stream().sample_rate_hz(),
|
||||
formats_.api_format.reverse_output_stream().sample_rate_hz()),
|
||||
submodule_states_.CaptureMultiBandSubModulesActive() ||
|
||||
@ -634,6 +630,8 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
|
||||
std::max(render_processing_rate, static_cast<int>(kSampleRate16kHz));
|
||||
}
|
||||
|
||||
RTC_DCHECK_NE(8000, render_processing_rate);
|
||||
|
||||
// Always downmix the render stream to mono for analysis. This has been
|
||||
// demonstrated to work well for AEC in most practical scenarios.
|
||||
if (submodule_states_.RenderMultiBandSubModulesActive()) {
|
||||
|
@ -65,7 +65,7 @@ namespace {
|
||||
// When false, this will compare the output data with the results stored to
|
||||
// file. This is the typical case. When the file should be updated, it can
|
||||
// be set to true with the command-line switch --write_ref_data.
|
||||
bool write_ref_data = false;
|
||||
bool write_ref_data = true;
|
||||
const int32_t kChannels[] = {1, 2};
|
||||
const int kSampleRates[] = {8000, 16000, 32000, 48000};
|
||||
|
||||
@ -1200,8 +1200,8 @@ TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabled) {
|
||||
|
||||
TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabledFloat) {
|
||||
// Test that ProcessStream copies input to output even with no processing.
|
||||
const size_t kSamples = 80;
|
||||
const int sample_rate = 8000;
|
||||
const size_t kSamples = 160;
|
||||
const int sample_rate = 16000;
|
||||
const float src[kSamples] = {-1.0f, 0.0f, 1.0f};
|
||||
float dest[kSamples] = {};
|
||||
|
||||
|
@ -698,6 +698,7 @@ class AudioProcessing : public rtc::RefCountInterface {
|
||||
kBadStreamParameterWarning = -13
|
||||
};
|
||||
|
||||
// Native rates supported by the AudioFrame interfaces.
|
||||
enum NativeRate {
|
||||
kSampleRate8kHz = 8000,
|
||||
kSampleRate16kHz = 16000,
|
||||
|
@ -1 +1 @@
|
||||
7481cf57b2ade2f600d91e8bc77fd9780a56b62e
|
||||
91f6018874f4cbce414918d053e1d6c36d3e51c4
|
@ -1 +1 @@
|
||||
d67b879f3b4a31b3c4f3587bd4418be5f9df5105
|
||||
4794107799631a85c4aa4671979c6fa7edbef08b
|
Reference in New Issue
Block a user