NetEq: Remove background noise fill during long expansions

NetEq was (up until this CL) capable of fading over to generating a
constant background noise when voice expansion had lasted too long.
However, the code has for a really long time only ever used the "off"
mode, which meant that long expansions are faded down to complete
silence (only zeros), i.e., background noise fill was not used.
Removing the other two modes ("on" and "fade") simplifies the code.

Bug: webrtc:9180
Change-Id: Ia2d46960208f3d75c9659ad3f027c52e5ecfb6b0
Reviewed-on: https://webrtc-review.googlesource.com/71485
Commit-Queue: Henrik Lundin <henrik.lundin@webrtc.org>
Reviewed-by: Minyue Li <minyue@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22969}
This commit is contained in:
Henrik Lundin
2018-04-20 15:34:48 +02:00
committed by Commit Bot
parent 6e396b0188
commit 6719017d19
8 changed files with 7 additions and 111 deletions

View File

@ -27,8 +27,7 @@ const size_t BackgroundNoise::kMaxLpcOrder;
BackgroundNoise::BackgroundNoise(size_t num_channels)
: num_channels_(num_channels),
channel_parameters_(new ChannelParameters[num_channels_]),
mode_(NetEq::kBgnOn) {
channel_parameters_(new ChannelParameters[num_channels_]) {
Reset();
}
@ -39,7 +38,6 @@ void BackgroundNoise::Reset() {
for (size_t channel = 0; channel < num_channels_; ++channel) {
channel_parameters_[channel].Reset();
}
// Keep _bgnMode as it is.
}
void BackgroundNoise::Update(const AudioMultiVector& input,

View File

@ -68,11 +68,6 @@ class BackgroundNoise {
// Accessors.
bool initialized() const { return initialized_; }
NetEq::BackgroundNoiseMode mode() const { return mode_; }
// Sets the mode of the background noise playout for cases when there is long
// duration of packet loss.
void set_mode(NetEq::BackgroundNoiseMode mode) { mode_ = mode; }
private:
static const int kThresholdIncrement = 229; // 0.0035 in Q16.
@ -128,7 +123,6 @@ class BackgroundNoise {
size_t num_channels_;
std::unique_ptr<ChannelParameters[]> channel_parameters_;
bool initialized_;
NetEq::BackgroundNoiseMode mode_;
RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
};

View File

@ -911,46 +911,10 @@ void Expand::GenerateBackgroundNoise(int16_t* random_vector,
// Unmute the background noise.
int16_t bgn_mute_factor = background_noise_->MuteFactor(channel);
NetEq::BackgroundNoiseMode bgn_mode = background_noise_->mode();
if (bgn_mode == NetEq::kBgnFade && too_many_expands &&
bgn_mute_factor > 0) {
// Fade BGN to zero.
// Calculate muting slope, approximately -2^18 / fs_hz.
int mute_slope;
if (fs_hz_ == 8000) {
mute_slope = -32;
} else if (fs_hz_ == 16000) {
mute_slope = -16;
} else if (fs_hz_ == 32000) {
mute_slope = -8;
} else {
mute_slope = -5;
}
// Use UnmuteSignal function with negative slope.
// |bgn_mute_factor| is in Q14. |mute_slope| is in Q20.
DspHelper::UnmuteSignal(noise_samples,
num_noise_samples,
&bgn_mute_factor,
mute_slope,
noise_samples);
} else if (bgn_mute_factor < 16384) {
// If mode is kBgnOn, or if kBgnFade has started fading,
// use regular |mute_slope|.
if (!stop_muting_ && bgn_mode != NetEq::kBgnOff &&
!(bgn_mode == NetEq::kBgnFade && too_many_expands)) {
DspHelper::UnmuteSignal(noise_samples,
static_cast<int>(num_noise_samples),
&bgn_mute_factor,
mute_slope,
noise_samples);
} else {
// kBgnOn and stop muting, or
// kBgnOff (mute factor is always 0), or
// kBgnFade has reached 0.
WebRtcSpl_AffineTransformVector(noise_samples, noise_samples,
bgn_mute_factor, 8192, 14,
num_noise_samples);
}
if (bgn_mute_factor < 16384) {
WebRtcSpl_AffineTransformVector(noise_samples, noise_samples,
bgn_mute_factor, 8192, 14,
num_noise_samples);
}
// Update mute_factor in BackgroundNoise class.
background_noise_->SetMuteFactor(channel, bgn_mute_factor);

View File

@ -84,12 +84,6 @@ enum NetEqPlayoutMode {
// This is the interface class for NetEq.
class NetEq {
public:
enum BackgroundNoiseMode {
kBgnOn, // Default behavior with eternal noise.
kBgnFade, // Noise fades to zero after some time.
kBgnOff // Background noise is always zero.
};
struct Config {
Config();
Config(const Config&);
@ -104,7 +98,6 @@ class NetEq {
bool enable_post_decode_vad = false;
size_t max_packets_in_buffer = 50;
int max_delay_ms = 2000;
BackgroundNoiseMode background_noise_mode = kBgnOff;
NetEqPlayoutMode playout_mode = kPlayoutOn;
bool enable_fast_accelerate = false;
bool enable_muted_state = false;

View File

@ -30,7 +30,6 @@ std::string NetEq::Config::ToString() const {
<< ", enable_post_decode_vad="
<< (enable_post_decode_vad ? "true" : "false")
<< ", max_packets_in_buffer=" << max_packets_in_buffer
<< ", background_noise_mode=" << background_noise_mode
<< ", playout_mode=" << playout_mode
<< ", enable_fast_accelerate="
<< (enable_fast_accelerate ? " true": "false")

View File

@ -101,7 +101,6 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config,
reset_decoder_(false),
ssrc_(0),
first_packet_(true),
background_noise_mode_(config.background_noise_mode),
playout_mode_(config.playout_mode),
enable_fast_accelerate_(config.enable_fast_accelerate),
nack_enabled_(false),
@ -2088,7 +2087,6 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) {
// Delete BackgroundNoise object and create a new one.
background_noise_.reset(new BackgroundNoise(channels));
background_noise_->set_mode(background_noise_mode_);
// Reset random vector.
random_vector_.Reset();

View File

@ -430,7 +430,6 @@ class NetEqImpl : public webrtc::NetEq {
RTC_GUARDED_BY(crit_sect_);
uint32_t ssrc_ RTC_GUARDED_BY(crit_sect_);
bool first_packet_ RTC_GUARDED_BY(crit_sect_);
const BackgroundNoiseMode background_noise_mode_ RTC_GUARDED_BY(crit_sect_);
NetEqPlayoutMode playout_mode_ RTC_GUARDED_BY(crit_sect_);
bool enable_fast_accelerate_ RTC_GUARDED_BY(crit_sect_);
std::unique_ptr<NackTracker> nack_ RTC_GUARDED_BY(crit_sect_);

View File

@ -950,9 +950,6 @@ TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) {
class NetEqBgnTest : public NetEqDecodingTest {
protected:
virtual void TestCondition(double sum_squared_noise,
bool should_be_faded) = 0;
void CheckBgn(int sampling_rate_hz) {
size_t expected_samples_per_channel = 0;
uint8_t payload_type = 0xFF; // Invalid.
@ -1044,7 +1041,7 @@ class NetEqBgnTest : public NetEqDecodingTest {
for (size_t k = 0;
k < output.num_channels_ * output.samples_per_channel_; ++k)
sum_squared += output_data[k] * output_data[k];
TestCondition(sum_squared, n > kFadingThreshold);
EXPECT_EQ(0, sum_squared);
} else {
EXPECT_EQ(AudioFrame::kPLC, output.speech_type_);
}
@ -1053,53 +1050,7 @@ class NetEqBgnTest : public NetEqDecodingTest {
}
};
class NetEqBgnTestOn : public NetEqBgnTest {
protected:
NetEqBgnTestOn() : NetEqBgnTest() {
config_.background_noise_mode = NetEq::kBgnOn;
}
void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) {
EXPECT_NE(0, sum_squared_noise);
}
};
class NetEqBgnTestOff : public NetEqBgnTest {
protected:
NetEqBgnTestOff() : NetEqBgnTest() {
config_.background_noise_mode = NetEq::kBgnOff;
}
void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) {
EXPECT_EQ(0, sum_squared_noise);
}
};
class NetEqBgnTestFade : public NetEqBgnTest {
protected:
NetEqBgnTestFade() : NetEqBgnTest() {
config_.background_noise_mode = NetEq::kBgnFade;
}
void TestCondition(double sum_squared_noise, bool should_be_faded) {
if (should_be_faded)
EXPECT_EQ(0, sum_squared_noise);
}
};
TEST_F(NetEqBgnTestOn, RunTest) {
CheckBgn(8000);
CheckBgn(16000);
CheckBgn(32000);
}
TEST_F(NetEqBgnTestOff, RunTest) {
CheckBgn(8000);
CheckBgn(16000);
CheckBgn(32000);
}
TEST_F(NetEqBgnTestFade, RunTest) {
TEST_F(NetEqBgnTest, RunTest) {
CheckBgn(8000);
CheckBgn(16000);
CheckBgn(32000);