| 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
|
|
|