From 81df62b4568cf377da50f0ebc0401a0c2ebfad73 Mon Sep 17 00:00:00 2001 From: Jakob Ivarsson Date: Wed, 17 Jul 2019 14:09:04 +0200 Subject: [PATCH] Add field trial to introduce extra delay after target level calculation. Bug: webrtc:10817 Change-Id: Id9eced821df2859b2cb7174062b6f5e29e145f62 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145902 Reviewed-by: Ivo Creusen Commit-Queue: Jakob Ivarsson Cr-Commit-Position: refs/heads/master@{#28825} --- modules/audio_coding/neteq/delay_manager.cc | 24 ++++++++++++++++++- modules/audio_coding/neteq/delay_manager.h | 1 + .../neteq/delay_manager_unittest.cc | 23 ++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/modules/audio_coding/neteq/delay_manager.cc b/modules/audio_coding/neteq/delay_manager.cc index bdaa28c9dc..b101759496 100644 --- a/modules/audio_coding/neteq/delay_manager.cc +++ b/modules/audio_coding/neteq/delay_manager.cc @@ -131,6 +131,23 @@ absl::optional GetDecelerationTargetLevelOffsetMs() { return absl::nullopt; } +absl::optional GetExtraDelayMs() { + constexpr char kExtraDelayFieldTrial[] = "WebRTC-Audio-NetEqExtraDelay"; + if (!webrtc::field_trial::IsEnabled(kExtraDelayFieldTrial)) { + return absl::nullopt; + } + + const auto field_trial_string = + webrtc::field_trial::FindFullName(kExtraDelayFieldTrial); + int extra_delay_ms = -1; + sscanf(field_trial_string.c_str(), "Enabled-%d", &extra_delay_ms); + if (extra_delay_ms >= 0) { + RTC_LOG(LS_INFO) << "NetEq extra delay in milliseconds: " << extra_delay_ms; + return extra_delay_ms; + } + return absl::nullopt; +} + } // namespace namespace webrtc { @@ -166,7 +183,8 @@ DelayManager::DelayManager(size_t max_packets_in_buffer, field_trial::IsEnabled("WebRTC-Audio-NetEqFramelengthExperiment")), enable_rtx_handling_(enable_rtx_handling), deceleration_target_level_offset_ms_( - GetDecelerationTargetLevelOffsetMs()) { + GetDecelerationTargetLevelOffsetMs()), + extra_delay_ms_(GetExtraDelayMs()) { assert(peak_detector); // Should never be NULL. RTC_CHECK(histogram_); RTC_DCHECK_GE(base_minimum_delay_ms_, 0); @@ -385,6 +403,10 @@ int DelayManager::CalculateTargetLevel(int iat_packets, bool reordered) { target_level = std::max(target_level, 1); // Scale to Q8 and assign to member variable. target_level_ = target_level << 8; + if (extra_delay_ms_ && packet_len_ms_ > 0) { + int extra_delay = (extra_delay_ms_.value() << 8) / packet_len_ms_; + target_level_ += extra_delay; + } return target_level_; } diff --git a/modules/audio_coding/neteq/delay_manager.h b/modules/audio_coding/neteq/delay_manager.h index adefea1c61..851ed46147 100644 --- a/modules/audio_coding/neteq/delay_manager.h +++ b/modules/audio_coding/neteq/delay_manager.h @@ -209,6 +209,7 @@ class DelayManager { // impose deceleration to increase the buffer level. The value is in Q8, and // measured in milliseconds. const absl::optional deceleration_target_level_offset_ms_; + const absl::optional extra_delay_ms_; RTC_DISALLOW_COPY_AND_ASSIGN(DelayManager); }; diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc index a8e2b3d18e..2d15e479e7 100644 --- a/modules/audio_coding/neteq/delay_manager_unittest.cc +++ b/modules/audio_coding/neteq/delay_manager_unittest.cc @@ -850,4 +850,27 @@ TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) { } } +TEST_F(DelayManagerTest, ExtraDelay) { + { + // Default behavior. Insert two packets so that a new target level is + // calculated. + SetPacketAudioLength(kFrameSizeMs); + InsertNextPacket(); + IncreaseTime(kFrameSizeMs); + InsertNextPacket(); + EXPECT_EQ(dm_->TargetLevel(), 1 << 8); + } + { + // Add 80 ms extra delay and calculate a new target level. + test::ScopedFieldTrials field_trial( + "WebRTC-Audio-NetEqExtraDelay/Enabled-80/"); + RecreateDelayManager(); + SetPacketAudioLength(kFrameSizeMs); + InsertNextPacket(); + IncreaseTime(kFrameSizeMs); + InsertNextPacket(); + EXPECT_EQ(dm_->TargetLevel(), 5 << 8); + } +} + } // namespace webrtc