diff --git a/modules/audio_coding/neteq/decision_logic.cc b/modules/audio_coding/neteq/decision_logic.cc index fda12c3ad3..91e828792e 100644 --- a/modules/audio_coding/neteq/decision_logic.cc +++ b/modules/audio_coding/neteq/decision_logic.cc @@ -126,7 +126,13 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer, prev_mode == kModePreemptiveExpandSuccess || prev_mode == kModePreemptiveExpandLowEnergy); - FilterBufferLevel(cur_size_samples, prev_mode); + // Do not update buffer history if currently playing CNG since it will bias + // the filtered buffer level. + if ((prev_mode != kModeRfc3389Cng) && (prev_mode != kModeCodecInternalCng) && + !(next_packet && next_packet->frame && + next_packet->frame->IsDtxPacket())) { + FilterBufferLevel(cur_size_samples); + } // Guard for errors, to avoid getting stuck in error mode. if (prev_mode == kModeError) { @@ -206,29 +212,24 @@ void DecisionLogic::ExpandDecision(Operations operation) { } } -void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples, - Modes prev_mode) { - // Do not update buffer history if currently playing CNG since it will bias - // the filtered buffer level. - if ((prev_mode != kModeRfc3389Cng) && (prev_mode != kModeCodecInternalCng)) { - buffer_level_filter_->SetTargetBufferLevel( - delay_manager_->base_target_level()); +void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples) { + buffer_level_filter_->SetTargetBufferLevel( + delay_manager_->base_target_level()); - size_t buffer_size_packets = 0; - if (packet_length_samples_ > 0) { - // Calculate size in packets. - buffer_size_packets = buffer_size_samples / packet_length_samples_; - } - int sample_memory_local = 0; - if (prev_time_scale_) { - sample_memory_local = sample_memory_; - timescale_countdown_ = - tick_timer_->GetNewCountdown(kMinTimescaleInterval); - } - buffer_level_filter_->Update(buffer_size_packets, sample_memory_local, - packet_length_samples_); - prev_time_scale_ = false; + size_t buffer_size_packets = 0; + if (packet_length_samples_ > 0) { + // Calculate size in packets. + buffer_size_packets = buffer_size_samples / packet_length_samples_; } + int sample_memory_local = 0; + if (prev_time_scale_) { + sample_memory_local = sample_memory_; + timescale_countdown_ = tick_timer_->GetNewCountdown(kMinTimescaleInterval); + } + + buffer_level_filter_->Update(buffer_size_packets, sample_memory_local, + packet_length_samples_); + prev_time_scale_ = false; } Operations DecisionLogic::CngOperation(Modes prev_mode, diff --git a/modules/audio_coding/neteq/decision_logic.h b/modules/audio_coding/neteq/decision_logic.h index ad8e2cd630..2414e8cc25 100644 --- a/modules/audio_coding/neteq/decision_logic.h +++ b/modules/audio_coding/neteq/decision_logic.h @@ -116,7 +116,7 @@ class DecisionLogic final { // Updates the |buffer_level_filter_| with the current buffer level // |buffer_size_packets|. - void FilterBufferLevel(size_t buffer_size_packets, Modes prev_mode); + void FilterBufferLevel(size_t buffer_size_packets); // Returns the operation given that the next available packet is a comfort // noise payload (RFC 3389 only, not codec-internal).