Adding speech_expand_rate to NetEQ Network Statistics.
There have been requests for separating rate of expanded speech samples from noise samples.
BUG=
R=henrik.lundin@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/37309004
Cr-Commit-Position: refs/heads/master@{#8404}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8404 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/neteq/interface/neteq.h b/webrtc/modules/audio_coding/neteq/interface/neteq.h
index 4847213..5d1bbfc 100644
--- a/webrtc/modules/audio_coding/neteq/interface/neteq.h
+++ b/webrtc/modules/audio_coding/neteq/interface/neteq.h
@@ -33,7 +33,9 @@
uint16_t packet_loss_rate; // Loss rate (network + late) in Q14.
uint16_t packet_discard_rate; // Late loss rate in Q14.
uint16_t expand_rate; // Fraction (of original stream) of synthesized
- // speech inserted through expansion (in Q14).
+ // audio inserted through expansion (in Q14).
+ uint16_t speech_expand_rate; // Fraction (of original stream) of synthesized
+ // speech inserted through expansion (in Q14).
uint16_t preemptive_rate; // Fraction of data inserted through pre-emptive
// expansion (in Q14).
uint16_t accelerate_rate; // Fraction of data removed through acceleration
diff --git a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
index c2ae486..b61bf83 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
@@ -90,6 +90,7 @@
logic packet_loss_rate;
logic packet_discard_rate;
logic expand_rate;
+ logic speech_expand_rate;
logic preemptive_rate;
logic accelerate_rate;
logic secondary_decoded_rate;
@@ -153,6 +154,7 @@
CHECK_NETEQ_NETWORK_STATS(packet_loss_rate);
CHECK_NETEQ_NETWORK_STATS(packet_discard_rate);
CHECK_NETEQ_NETWORK_STATS(expand_rate);
+ CHECK_NETEQ_NETWORK_STATS(speech_expand_rate);
CHECK_NETEQ_NETWORK_STATS(preemptive_rate);
CHECK_NETEQ_NETWORK_STATS(accelerate_rate);
CHECK_NETEQ_NETWORK_STATS(secondary_decoded_rate);
@@ -198,30 +200,55 @@
EQUAL, // packet_loss_rate
EQUAL, // packet_discard_rate
EQUAL, // expand_rate
+ EQUAL, // voice_expand_rate
IGNORE, // preemptive_rate
EQUAL, // accelerate_rate
EQUAL, // decoded_fec_rate
IGNORE, // clockdrift_ppm
EQUAL, // added_zero_samples
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
RunTest(50, expects);
// Next we introduce packet losses.
SetPacketLossRate(0.1);
expects.stats_ref.packet_loss_rate = 1337;
- expects.stats_ref.expand_rate = 1065;
+ expects.stats_ref.expand_rate = expects.stats_ref.speech_expand_rate = 1065;
RunTest(50, expects);
// Next we enable Opus FEC.
external_decoder_->set_fec_enabled(true);
// If FEC fills in the lost packets, no packet loss will be counted.
expects.stats_ref.packet_loss_rate = 0;
- expects.stats_ref.expand_rate = 0;
+ expects.stats_ref.expand_rate = expects.stats_ref.speech_expand_rate = 0;
expects.stats_ref.secondary_decoded_rate = 2006;
RunTest(50, expects);
}
+ void NoiseExpansionTest() {
+ NetEqNetworkStatsCheck expects = {
+ IGNORE, // current_buffer_size_ms
+ IGNORE, // preferred_buffer_size_ms
+ IGNORE, // jitter_peaks_found
+ EQUAL, // packet_loss_rate
+ EQUAL, // packet_discard_rate
+ EQUAL, // expand_rate
+ EQUAL, // speech_expand_rate
+ IGNORE, // preemptive_rate
+ EQUAL, // accelerate_rate
+ EQUAL, // decoded_fec_rate
+ IGNORE, // clockdrift_ppm
+ EQUAL, // added_zero_samples
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+ };
+ RunTest(50, expects);
+
+ SetPacketLossRate(1);
+ expects.stats_ref.expand_rate = 16384;
+ expects.stats_ref.speech_expand_rate = 5324;
+ RunTest(10, expects); // Lost 10 * 20ms in a row.
+ }
+
private:
MockAudioDecoderOpus* external_decoder_;
const int samples_per_ms_;
@@ -250,6 +277,14 @@
EXPECT_CALL(decoder, Die()).Times(1);
}
+TEST(NetEqNetworkStatsTest, NoiseExpansionTest) {
+ MockAudioDecoderOpus decoder(1);
+ EXPECT_CALL(decoder, Init());
+ NetEqNetworkStatsTest test(kDecoderOpus, &decoder);
+ test.NoiseExpansionTest();
+ EXPECT_CALL(decoder, Die()).Times(1);
+}
+
} // namespace test
} // namespace webrtc
diff --git a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
index 420e7bf..0d8f1a1 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
@@ -147,7 +147,7 @@
uint16_t packet_loss_rate; // Loss rate (network + late) in Q14.
uint16_t packet_discard_rate; // Late loss rate in Q14.
uint16_t expand_rate; // Fraction (of original stream) of synthesized
- // speech inserted through expansion (in Q14).
+ // audio inserted through expansion (in Q14).
uint16_t preemptive_rate; // Fraction of data inserted through pre-emptive
// expansion (in Q14).
uint16_t accelerate_rate; // Fraction of data removed through acceleration
@@ -168,11 +168,13 @@
ASSERT_EQ(stats.jitter_peaks_found, ref_stats.jitter_peaks_found);
ASSERT_EQ(stats.packet_loss_rate, ref_stats.packet_loss_rate);
ASSERT_EQ(stats.packet_discard_rate, ref_stats.packet_discard_rate);
+ ASSERT_EQ(stats.expand_rate, ref_stats.expand_rate);
ASSERT_EQ(stats.preemptive_rate, ref_stats.preemptive_rate);
ASSERT_EQ(stats.accelerate_rate, ref_stats.accelerate_rate);
ASSERT_EQ(stats.clockdrift_ppm, ref_stats.clockdrift_ppm);
ASSERT_EQ(stats.added_zero_samples, ref_stats.added_zero_samples);
ASSERT_EQ(stats.secondary_decoded_rate, 0);
+ ASSERT_LE(stats.speech_expand_rate, ref_stats.expand_rate);
}
}
diff --git a/webrtc/modules/audio_coding/neteq/statistics_calculator.cc b/webrtc/modules/audio_coding/neteq/statistics_calculator.cc
index 863923f..14e9385 100644
--- a/webrtc/modules/audio_coding/neteq/statistics_calculator.cc
+++ b/webrtc/modules/audio_coding/neteq/statistics_calculator.cc
@@ -22,7 +22,7 @@
: preemptive_samples_(0),
accelerate_samples_(0),
added_zero_samples_(0),
- expanded_voice_samples_(0),
+ expanded_speech_samples_(0),
expanded_noise_samples_(0),
discarded_packets_(0),
lost_timestamps_(0),
@@ -37,7 +37,7 @@
preemptive_samples_ = 0;
accelerate_samples_ = 0;
added_zero_samples_ = 0;
- expanded_voice_samples_ = 0;
+ expanded_speech_samples_ = 0;
expanded_noise_samples_ = 0;
secondary_decoded_samples_ = 0;
}
@@ -55,7 +55,7 @@
}
void StatisticsCalculator::ExpandedVoiceSamples(int num_samples) {
- expanded_voice_samples_ += num_samples;
+ expanded_speech_samples_ += num_samples;
}
void StatisticsCalculator::ExpandedNoiseSamples(int num_samples) {
@@ -143,9 +143,13 @@
CalculateQ14Ratio(preemptive_samples_, timestamps_since_last_report_);
stats->expand_rate =
- CalculateQ14Ratio(expanded_voice_samples_ + expanded_noise_samples_,
+ CalculateQ14Ratio(expanded_speech_samples_ + expanded_noise_samples_,
timestamps_since_last_report_);
+ stats->speech_expand_rate =
+ CalculateQ14Ratio(expanded_speech_samples_,
+ timestamps_since_last_report_);
+
stats->secondary_decoded_rate =
CalculateQ14Ratio(secondary_decoded_samples_,
timestamps_since_last_report_);
diff --git a/webrtc/modules/audio_coding/neteq/statistics_calculator.h b/webrtc/modules/audio_coding/neteq/statistics_calculator.h
index 03f4835..cd4d867 100644
--- a/webrtc/modules/audio_coding/neteq/statistics_calculator.h
+++ b/webrtc/modules/audio_coding/neteq/statistics_calculator.h
@@ -96,7 +96,7 @@
uint32_t preemptive_samples_;
uint32_t accelerate_samples_;
int added_zero_samples_;
- uint32_t expanded_voice_samples_;
+ uint32_t expanded_speech_samples_;
uint32_t expanded_noise_samples_;
int discarded_packets_;
uint32_t lost_timestamps_;