Adding field trial to force target level percentile in NetEQ.
Bug: webrtc:9822
Change-Id: I636f75de10851729825311ee5783e836f3b583cd
Reviewed-on: https://webrtc-review.googlesource.com/c/101220
Commit-Queue: Minyue Li <minyue@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24975}
diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc
index 6afed66..e4e865f 100644
--- a/modules/audio_coding/neteq/delay_manager_unittest.cc
+++ b/modules/audio_coding/neteq/delay_manager_unittest.cc
@@ -15,6 +15,7 @@
#include <math.h>
#include "modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
+#include "test/field_trial.h"
#include "test/gmock.h"
#include "test/gtest.h"
@@ -34,11 +35,12 @@
DelayManagerTest();
virtual void SetUp();
virtual void TearDown();
+ void RecreateDelayManager();
void SetPacketAudioLength(int lengt_ms);
void InsertNextPacket();
void IncreaseTime(int inc_ms);
- DelayManager* dm_;
+ std::unique_ptr<DelayManager> dm_;
TickTimer tick_timer_;
MockDelayPeakDetector detector_;
uint16_t seq_no_;
@@ -46,11 +48,15 @@
};
DelayManagerTest::DelayManagerTest()
- : dm_(NULL), detector_(&tick_timer_), seq_no_(0x1234), ts_(0x12345678) {}
+ : dm_(nullptr), detector_(&tick_timer_), seq_no_(0x1234), ts_(0x12345678) {}
void DelayManagerTest::SetUp() {
+ RecreateDelayManager();
+}
+
+void DelayManagerTest::RecreateDelayManager() {
EXPECT_CALL(detector_, Reset()).Times(1);
- dm_ = new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_);
+ dm_.reset(new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_));
}
void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
@@ -71,7 +77,6 @@
}
void DelayManagerTest::TearDown() {
EXPECT_CALL(detector_, Die());
- delete dm_;
}
TEST_F(DelayManagerTest, CreateAndDestroy) {
@@ -326,6 +331,61 @@
EXPECT_FALSE(dm_->SetMaximumDelay(60));
}
+TEST_F(DelayManagerTest, TargetDelayGreaterThanOne) {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-0/");
+ RecreateDelayManager();
+ EXPECT_EQ(absl::make_optional<int>(1 << 30),
+ dm_->forced_limit_probability_for_test());
+
+ SetPacketAudioLength(kFrameSizeMs);
+ // First packet arrival.
+ InsertNextPacket();
+ // Advance time by one frame size.
+ IncreaseTime(kFrameSizeMs);
+ // Second packet arrival.
+ // Expect detector update method to be called once with inter-arrival time
+ // equal to 1 packet.
+ EXPECT_CALL(detector_, Update(1, 1)).WillOnce(Return(false));
+ InsertNextPacket();
+ constexpr int kExpectedTarget = 1;
+ EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8.
+}
+
+TEST_F(DelayManagerTest, ForcedTargetDelayPercentile) {
+ {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-95/");
+ RecreateDelayManager();
+ EXPECT_EQ(absl::make_optional<int>(53687091),
+ dm_->forced_limit_probability_for_test()); // 1/20 in Q30
+ }
+ {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-99.95/");
+ RecreateDelayManager();
+ EXPECT_EQ(absl::make_optional<int>(536871),
+ dm_->forced_limit_probability_for_test()); // 1/2000 in Q30
+ }
+ {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Disabled/");
+ RecreateDelayManager();
+ EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+ }
+ {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled--1/");
+ EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+ }
+ {
+ test::ScopedFieldTrials field_trial(
+ "WebRTC-Audio-NetEqForceTargetDelayPercentile/Enabled-100.1/");
+ RecreateDelayManager();
+ EXPECT_EQ(absl::nullopt, dm_->forced_limit_probability_for_test());
+ }
+}
+
// Test if the histogram is stretched correctly if the packet size is decreased.
TEST(DelayManagerIATScalingTest, StretchTest) {
using IATVector = DelayManager::IATVector;
@@ -437,4 +497,5 @@
scaled_iat = DelayManager::ScaleHistogram(iat, 20, 60);
EXPECT_EQ(scaled_iat, expected_result);
}
+
} // namespace webrtc