diff --git a/modules/audio_coding/neteq/delay_manager.cc b/modules/audio_coding/neteq/delay_manager.cc index 70991f38bd..afa2a3fa94 100644 --- a/modules/audio_coding/neteq/delay_manager.cc +++ b/modules/audio_coding/neteq/delay_manager.cc @@ -39,6 +39,7 @@ constexpr int kMaxHistoryMs = 2000; // Oldest packet to include in history to // calculate relative packet arrival delay. constexpr int kDelayBuckets = 100; constexpr int kBucketSizeMs = 20; +constexpr int kDecelerationTargetLevelOffsetMs = 85 << 8; // In Q8. int PercentileToQuantile(double percentile) { return static_cast((1 << 30) * percentile / 100.0 + 0.5); @@ -79,29 +80,6 @@ DelayHistogramConfig GetDelayHistogramConfig() { return config; } -absl::optional GetDecelerationTargetLevelOffsetMs() { - constexpr char kDecelerationTargetLevelOffsetFieldTrial[] = - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset"; - if (!webrtc::field_trial::IsEnabled( - kDecelerationTargetLevelOffsetFieldTrial)) { - return absl::nullopt; - } - - const auto field_trial_string = webrtc::field_trial::FindFullName( - kDecelerationTargetLevelOffsetFieldTrial); - int deceleration_target_level_offset_ms = -1; - sscanf(field_trial_string.c_str(), "Enabled-%d", - &deceleration_target_level_offset_ms); - if (deceleration_target_level_offset_ms >= 0) { - RTC_LOG(LS_INFO) << "NetEq deceleration_target_level_offset " - << "in milliseconds " - << deceleration_target_level_offset_ms; - // Convert into Q8. - return deceleration_target_level_offset_ms << 8; - } - return absl::nullopt; -} - absl::optional GetExtraDelayMs() { constexpr char kExtraDelayFieldTrial[] = "WebRTC-Audio-NetEqExtraDelay"; if (!webrtc::field_trial::IsEnabled(kExtraDelayFieldTrial)) { @@ -153,14 +131,10 @@ DelayManager::DelayManager(size_t max_packets_in_buffer, frame_length_change_experiment_( field_trial::IsEnabled("WebRTC-Audio-NetEqFramelengthExperiment")), enable_rtx_handling_(enable_rtx_handling), - deceleration_target_level_offset_ms_( - GetDecelerationTargetLevelOffsetMs()), extra_delay_ms_(GetExtraDelayMs()) { assert(peak_detector); // Should never be NULL. RTC_CHECK(histogram_); RTC_DCHECK_GE(base_minimum_delay_ms_, 0); - RTC_DCHECK(!deceleration_target_level_offset_ms_ || - *deceleration_target_level_offset_ms_ >= 0); Reset(); } @@ -437,10 +411,10 @@ void DelayManager::BufferLimits(int target_level, // |target_level| is in Q8 already. *lower_limit = (target_level * 3) / 4; - if (deceleration_target_level_offset_ms_ && packet_len_ms_ > 0) { - *lower_limit = std::max( - *lower_limit, - target_level - *deceleration_target_level_offset_ms_ / packet_len_ms_); + if (packet_len_ms_ > 0) { + *lower_limit = + std::max(*lower_limit, target_level - kDecelerationTargetLevelOffsetMs / + packet_len_ms_); } int window_20ms = 0x7FFF; // Default large value for legacy bit-exactness. @@ -549,4 +523,5 @@ int DelayManager::MaxBufferTimeQ75() const { const int max_buffer_time = max_packets_in_buffer_ * packet_len_ms_; return rtc::dchecked_cast(3 * max_buffer_time / 4); } + } // namespace webrtc diff --git a/modules/audio_coding/neteq/delay_manager.h b/modules/audio_coding/neteq/delay_manager.h index 642de4db78..a701242d4f 100644 --- a/modules/audio_coding/neteq/delay_manager.h +++ b/modules/audio_coding/neteq/delay_manager.h @@ -124,11 +124,6 @@ class DelayManager { return effective_minimum_delay_ms_; } - // This accessor is only intended for testing purposes. - absl::optional deceleration_target_level_offset_ms() const { - return deceleration_target_level_offset_ms_; - } - // These accessors are only intended for testing purposes. HistogramMode histogram_mode() const { return histogram_mode_; } int histogram_quantile() const { return histogram_quantile_; } @@ -204,11 +199,6 @@ class DelayManager { }; std::deque delay_history_; - // When current buffer level is more than - // |deceleration_target_level_offset_ms_| below the target level, NetEq will - // 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 beb61b0b02..6979789f27 100644 --- a/modules/audio_coding/neteq/delay_manager_unittest.cc +++ b/modules/audio_coding/neteq/delay_manager_unittest.cc @@ -594,54 +594,17 @@ TEST_F(DelayManagerTest, RelativeArrivalDelayStatistic) { InsertNextPacket(); } -TEST_F(DelayManagerTest, DecelerationTargetLevelOffsetFieldTrial) { - { - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105/"); - RecreateDelayManager(); - EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8); - } - { - // Negative number. - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled--105/"); - RecreateDelayManager(); - EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value()); - } - { - // Disabled. - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Disabled/"); - RecreateDelayManager(); - EXPECT_FALSE(dm_->deceleration_target_level_offset_ms().has_value()); - } - { - // Float number. - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-105.5/"); - RecreateDelayManager(); - EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 105 << 8); - } - { - // Several numbers. - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-20-40/"); - RecreateDelayManager(); - EXPECT_EQ(dm_->deceleration_target_level_offset_ms().value(), 20 << 8); - } -} - TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) { - // Border value where 1/4 target buffer level meets - // WebRTC-Audio-NetEqDecelerationTargetLevelOffset. - constexpr int kBoarderTargetLevel = 100 * 4; + SetPacketAudioLength(kFrameSizeMs); + + // Deceleration target level offset follows the value hardcoded in + // delay_manager.cc. + constexpr int kDecelerationTargetLevelOffsetMs = 85 << 8; // In Q8. + // Border value where |x * 3/4 = target_level - x|. + constexpr int kBoarderTargetLevel = kDecelerationTargetLevelOffsetMs * 4; { // Test that for a low target level, default behaviour is intact. - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/"); - const int target_level_ms = ((kBoarderTargetLevel - 1) << 8) / kFrameSizeMs; - RecreateDelayManager(); - SetPacketAudioLength(kFrameSizeMs); + const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs - 1; int lower, higher; // In Q8. dm_->BufferLimits(target_level_ms, &lower, &higher); @@ -653,32 +616,14 @@ TEST_F(DelayManagerTest, DecelerationTargetLevelOffset) { { // Test that for the high target level, |lower| is below target level by - // fixed constant (100 ms in this Field Trial setup). - test::ScopedFieldTrials field_trial( - "WebRTC-Audio-NetEqDecelerationTargetLevelOffset/Enabled-100/"); - const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs; - RecreateDelayManager(); - SetPacketAudioLength(kFrameSizeMs); + // fixed |kOffset|. + const int target_level_ms = kBoarderTargetLevel / kFrameSizeMs + 1; int lower, higher; // In Q8. dm_->BufferLimits(target_level_ms, &lower, &higher); - EXPECT_EQ(target_level_ms - ((100 << 8) / kFrameSizeMs), lower); - EXPECT_EQ(target_level_ms, higher); - } - - { - // Test that for the high target level, without Field Trial the behaviour - // will remain the same. - const int target_level_ms = ((kBoarderTargetLevel + 1) << 8) / kFrameSizeMs; - RecreateDelayManager(); - SetPacketAudioLength(kFrameSizeMs); - - int lower, higher; // In Q8. - dm_->BufferLimits(target_level_ms, &lower, &higher); - - // Default behaviour of taking 75% of target level. - EXPECT_EQ(target_level_ms * 3 / 4, lower); + EXPECT_EQ(target_level_ms - kDecelerationTargetLevelOffsetMs / kFrameSizeMs, + lower); EXPECT_EQ(target_level_ms, higher); } }