ACM/NetEq: Restructure how post-decode VAD is enabled
This change avoids calling neteq_->EnableVad() and DisableVad from the AcmReceiver constructor. Instead, the new member enable_post_decode_vad is added to NetEq's config struct. It is disabled by defualt, but ACM sets it to enabled. This preserves the behavior both of NetEq stand-alone (i.e., in tests) and of ACM. BUG=webrtc:3520 Review URL: https://codereview.webrtc.org/1425133002 Cr-Commit-Position: refs/heads/master@{#10476}
This commit is contained in:
committed by
Commit bot
parent
d56d68cd27
commit
9bc2667fa6
@ -128,7 +128,7 @@ AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config)
|
|||||||
audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
|
audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
|
||||||
last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
|
last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
|
||||||
neteq_(NetEq::Create(config.neteq_config)),
|
neteq_(NetEq::Create(config.neteq_config)),
|
||||||
vad_enabled_(true),
|
vad_enabled_(config.neteq_config.enable_post_decode_vad),
|
||||||
clock_(config.clock),
|
clock_(config.clock),
|
||||||
resampled_last_output_frame_(true),
|
resampled_last_output_frame_(true),
|
||||||
av_sync_(false),
|
av_sync_(false),
|
||||||
@ -136,15 +136,6 @@ AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config)
|
|||||||
missing_packets_sync_stream_(),
|
missing_packets_sync_stream_(),
|
||||||
late_packets_sync_stream_() {
|
late_packets_sync_stream_() {
|
||||||
assert(clock_);
|
assert(clock_);
|
||||||
|
|
||||||
// Make sure we are on the same page as NetEq. Post-decode VAD is disabled by
|
|
||||||
// default in NetEq4, however, Audio Conference Mixer relies on VAD decision
|
|
||||||
// and fails if VAD decision is not provided.
|
|
||||||
if (vad_enabled_)
|
|
||||||
neteq_->EnableVad();
|
|
||||||
else
|
|
||||||
neteq_->DisableVad();
|
|
||||||
|
|
||||||
memset(audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
|
memset(audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
|
||||||
memset(last_audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
|
memset(last_audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,7 +60,11 @@ class AudioCodingModule {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
struct Config {
|
struct Config {
|
||||||
Config() : id(0), neteq_config(), clock(Clock::GetRealTimeClock()) {}
|
Config() : id(0), neteq_config(), clock(Clock::GetRealTimeClock()) {
|
||||||
|
// Post-decode VAD is disabled by default in NetEq, however, Audio
|
||||||
|
// Conference Mixer relies on VAD decisions and fails without them.
|
||||||
|
neteq_config.enable_post_decode_vad = true;
|
||||||
|
}
|
||||||
|
|
||||||
int id;
|
int id;
|
||||||
NetEq::Config neteq_config;
|
NetEq::Config neteq_config;
|
||||||
|
|||||||
@ -81,6 +81,7 @@ class NetEq {
|
|||||||
Config()
|
Config()
|
||||||
: sample_rate_hz(16000),
|
: sample_rate_hz(16000),
|
||||||
enable_audio_classifier(false),
|
enable_audio_classifier(false),
|
||||||
|
enable_post_decode_vad(false),
|
||||||
max_packets_in_buffer(50),
|
max_packets_in_buffer(50),
|
||||||
// |max_delay_ms| has the same effect as calling SetMaximumDelay().
|
// |max_delay_ms| has the same effect as calling SetMaximumDelay().
|
||||||
max_delay_ms(2000),
|
max_delay_ms(2000),
|
||||||
@ -92,6 +93,7 @@ class NetEq {
|
|||||||
|
|
||||||
int sample_rate_hz; // Initial value. Will change with input data.
|
int sample_rate_hz; // Initial value. Will change with input data.
|
||||||
bool enable_audio_classifier;
|
bool enable_audio_classifier;
|
||||||
|
bool enable_post_decode_vad;
|
||||||
size_t max_packets_in_buffer;
|
size_t max_packets_in_buffer;
|
||||||
int max_delay_ms;
|
int max_delay_ms;
|
||||||
BackgroundNoiseMode background_noise_mode;
|
BackgroundNoiseMode background_noise_mode;
|
||||||
|
|||||||
@ -32,6 +32,8 @@ std::string NetEq::Config::ToString() const {
|
|||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "sample_rate_hz=" << sample_rate_hz << ", enable_audio_classifier="
|
ss << "sample_rate_hz=" << sample_rate_hz << ", enable_audio_classifier="
|
||||||
<< (enable_audio_classifier ? "true" : "false")
|
<< (enable_audio_classifier ? "true" : "false")
|
||||||
|
<< ", enable_post_decode_vad="
|
||||||
|
<< (enable_post_decode_vad ? "true" : "false")
|
||||||
<< ", max_packets_in_buffer=" << max_packets_in_buffer
|
<< ", max_packets_in_buffer=" << max_packets_in_buffer
|
||||||
<< ", background_noise_mode=" << background_noise_mode
|
<< ", background_noise_mode=" << background_noise_mode
|
||||||
<< ", playout_mode=" << playout_mode
|
<< ", playout_mode=" << playout_mode
|
||||||
|
|||||||
@ -112,6 +112,10 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config,
|
|||||||
if (create_components) {
|
if (create_components) {
|
||||||
SetSampleRateAndChannels(fs, 1); // Default is 1 channel.
|
SetSampleRateAndChannels(fs, 1); // Default is 1 channel.
|
||||||
}
|
}
|
||||||
|
RTC_DCHECK(!vad_->enabled());
|
||||||
|
if (config.enable_post_decode_vad) {
|
||||||
|
vad_->Enable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEqImpl::~NetEqImpl() = default;
|
NetEqImpl::~NetEqImpl() = default;
|
||||||
|
|||||||
Reference in New Issue
Block a user