Index: webrtc/modules/audio_coding/neteq/decision_logic.cc |
diff --git a/webrtc/modules/audio_coding/neteq/decision_logic.cc b/webrtc/modules/audio_coding/neteq/decision_logic.cc |
index 39bb4662c716f68fdb12cf1b89d8ff91e0beb2dd..0d48886d9c729dbc7132b435d2c6a53eb01874fc 100644 |
--- a/webrtc/modules/audio_coding/neteq/decision_logic.cc |
+++ b/webrtc/modules/audio_coding/neteq/decision_logic.cc |
@@ -29,26 +29,19 @@ DecisionLogic* DecisionLogic::Create(int fs_hz, |
DecoderDatabase* decoder_database, |
const PacketBuffer& packet_buffer, |
DelayManager* delay_manager, |
- BufferLevelFilter* buffer_level_filter) { |
+ BufferLevelFilter* buffer_level_filter, |
+ const TickTimer& tick_timer) { |
switch (playout_mode) { |
case kPlayoutOn: |
case kPlayoutStreaming: |
- return new DecisionLogicNormal(fs_hz, |
- output_size_samples, |
- playout_mode, |
- decoder_database, |
- packet_buffer, |
- delay_manager, |
- buffer_level_filter); |
+ return new DecisionLogicNormal( |
+ fs_hz, output_size_samples, playout_mode, decoder_database, |
+ packet_buffer, delay_manager, buffer_level_filter, tick_timer); |
case kPlayoutFax: |
case kPlayoutOff: |
- return new DecisionLogicFax(fs_hz, |
- output_size_samples, |
- playout_mode, |
- decoder_database, |
- packet_buffer, |
- delay_manager, |
- buffer_level_filter); |
+ return new DecisionLogicFax( |
+ fs_hz, output_size_samples, playout_mode, decoder_database, |
+ packet_buffer, delay_manager, buffer_level_filter, tick_timer); |
} |
// This line cannot be reached, but must be here to avoid compiler errors. |
assert(false); |
@@ -61,30 +54,34 @@ DecisionLogic::DecisionLogic(int fs_hz, |
DecoderDatabase* decoder_database, |
const PacketBuffer& packet_buffer, |
DelayManager* delay_manager, |
- BufferLevelFilter* buffer_level_filter) |
+ BufferLevelFilter* buffer_level_filter, |
+ const TickTimer& tick_timer) |
: decoder_database_(decoder_database), |
packet_buffer_(packet_buffer), |
delay_manager_(delay_manager), |
buffer_level_filter_(buffer_level_filter), |
+ tick_timer_(tick_timer), |
cng_state_(kCngOff), |
- generated_noise_samples_(0), |
packet_length_samples_(0), |
sample_memory_(0), |
prev_time_scale_(false), |
- timescale_hold_off_(kMinTimescaleInterval), |
+ timescale_countdown_( |
+ tick_timer_.GetNewCountdown(kMinTimescaleInterval + 1)), |
num_consecutive_expands_(0), |
playout_mode_(playout_mode) { |
delay_manager_->set_streaming_mode(playout_mode_ == kPlayoutStreaming); |
SetSampleRate(fs_hz, output_size_samples); |
} |
+DecisionLogic::~DecisionLogic() = default; |
+ |
void DecisionLogic::Reset() { |
cng_state_ = kCngOff; |
- generated_noise_samples_ = 0; |
+ noise_fast_forward_ = 0; |
packet_length_samples_ = 0; |
sample_memory_ = 0; |
prev_time_scale_ = false; |
- timescale_hold_off_ = 0; |
+ timescale_countdown_.reset(); |
num_consecutive_expands_ = 0; |
} |
@@ -92,7 +89,7 @@ void DecisionLogic::SoftReset() { |
packet_length_samples_ = 0; |
sample_memory_ = 0; |
prev_time_scale_ = false; |
- timescale_hold_off_ = kMinTimescaleInterval; |
+ timescale_countdown_ = tick_timer_.GetNewCountdown(kMinTimescaleInterval + 1); |
} |
void DecisionLogic::SetSampleRate(int fs_hz, size_t output_size_samples) { |
@@ -107,15 +104,15 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer, |
size_t decoder_frame_length, |
const RTPHeader* packet_header, |
Modes prev_mode, |
- bool play_dtmf, bool* reset_decoder) { |
+ bool play_dtmf, |
+ size_t noise_samples_played, |
+ bool* reset_decoder) { |
if (prev_mode == kModeRfc3389Cng || |
prev_mode == kModeCodecInternalCng || |
prev_mode == kModeExpand) { |
// If last mode was CNG (or Expand, since this could be covering up for |
- // a lost CNG packet), increase the |generated_noise_samples_| counter. |
- generated_noise_samples_ += output_size_samples_; |
- // Remember that CNG is on. This is needed if comfort noise is interrupted |
- // by DTMF. |
+ // a lost CNG packet), remember that CNG is on. This is needed if comfort |
+ // noise is interrupted by DTMF. |
if (prev_mode == kModeRfc3389Cng) { |
cng_state_ = kCngRfc3389On; |
} else if (prev_mode == kModeCodecInternalCng) { |
@@ -139,7 +136,7 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer, |
return GetDecisionSpecialized(sync_buffer, expand, decoder_frame_length, |
packet_header, prev_mode, play_dtmf, |
- reset_decoder); |
+ reset_decoder, noise_samples_played); |
} |
void DecisionLogic::ExpandDecision(Operations operation) { |
@@ -152,10 +149,6 @@ void DecisionLogic::ExpandDecision(Operations operation) { |
void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples, |
Modes prev_mode) { |
- const int elapsed_time_ms = |
- static_cast<int>(output_size_samples_ / (8 * fs_mult_)); |
- delay_manager_->UpdateCounters(elapsed_time_ms); |
- |
// Do not update buffer history if currently playing CNG since it will bias |
// the filtered buffer level. |
if ((prev_mode != kModeRfc3389Cng) && (prev_mode != kModeCodecInternalCng)) { |
@@ -170,14 +163,12 @@ void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples, |
int sample_memory_local = 0; |
if (prev_time_scale_) { |
sample_memory_local = sample_memory_; |
- timescale_hold_off_ = kMinTimescaleInterval; |
+ timescale_countdown_ = tick_timer_.GetNewCountdown(kMinTimescaleInterval); |
} |
buffer_level_filter_->Update(buffer_size_packets, sample_memory_local, |
packet_length_samples_); |
prev_time_scale_ = false; |
} |
- |
- timescale_hold_off_ = std::max(timescale_hold_off_ - 1, 0); |
} |
} // namespace webrtc |