summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc')
-rw-r--r--chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc235
1 files changed, 0 insertions, 235 deletions
diff --git a/chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc b/chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc
deleted file mode 100644
index 8688737c3ed..00000000000
--- a/chromium/third_party/webrtc/modules/audio_coding/neteq4/decision_logic_normal.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "webrtc/modules/audio_coding/neteq4/decision_logic_normal.h"
-
-#include <assert.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/neteq4/buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq4/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq4/delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq4/expand.h"
-#include "webrtc/modules/audio_coding/neteq4/packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq4/sync_buffer.h"
-#include "webrtc/modules/interface/module_common_types.h"
-
-namespace webrtc {
-
-Operations DecisionLogicNormal::GetDecisionSpecialized(
- const SyncBuffer& sync_buffer,
- const Expand& expand,
- int decoder_frame_length,
- const RTPHeader* packet_header,
- Modes prev_mode,
- bool play_dtmf,
- bool* reset_decoder) {
- assert(playout_mode_ == kPlayoutOn || playout_mode_ == kPlayoutStreaming);
- // Guard for errors, to avoid getting stuck in error mode.
- if (prev_mode == kModeError) {
- if (!packet_header) {
- return kExpand;
- } else {
- return kUndefined; // Use kUndefined to flag for a reset.
- }
- }
-
- uint32_t target_timestamp = sync_buffer.end_timestamp();
- uint32_t available_timestamp = 0;
- int is_cng_packet = 0;
- if (packet_header) {
- available_timestamp = packet_header->timestamp;
- is_cng_packet =
- decoder_database_->IsComfortNoise(packet_header->payloadType);
- }
-
- if (is_cng_packet) {
- return CngOperation(prev_mode, target_timestamp, available_timestamp);
- }
-
- // Handle the case with no packet at all available (except maybe DTMF).
- if (!packet_header) {
- return NoPacket(play_dtmf);
- }
-
- // If the expand period was very long, reset NetEQ since it is likely that the
- // sender was restarted.
- if (num_consecutive_expands_ > kReinitAfterExpands) {
- *reset_decoder = true;
- return kNormal;
- }
-
- // Check if the required packet is available.
- if (target_timestamp == available_timestamp) {
- return ExpectedPacketAvailable(prev_mode, play_dtmf);
- } else if (IsNewerTimestamp(available_timestamp, target_timestamp)) {
- return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length,
- prev_mode, target_timestamp,
- available_timestamp, play_dtmf);
- } else {
- // This implies that available_timestamp < target_timestamp, which can
- // happen when a new stream or codec is received. Signal for a reset.
- return kUndefined;
- }
-}
-
-Operations DecisionLogicNormal::CngOperation(Modes prev_mode,
- uint32_t target_timestamp,
- uint32_t available_timestamp) {
- // Signed difference between target and available timestamp.
- int32_t timestamp_diff = (generated_noise_samples_ + target_timestamp) -
- available_timestamp;
- int32_t optimal_level_samp =
- (delay_manager_->TargetLevel() * packet_length_samples_) >> 8;
- int32_t excess_waiting_time_samp = -timestamp_diff - optimal_level_samp;
-
- if (excess_waiting_time_samp > optimal_level_samp / 2) {
- // The waiting time for this packet will be longer than 1.5
- // times the wanted buffer delay. Advance the clock to cut
- // waiting time down to the optimal.
- generated_noise_samples_ += excess_waiting_time_samp;
- timestamp_diff += excess_waiting_time_samp;
- }
-
- if (timestamp_diff < 0 && prev_mode == kModeRfc3389Cng) {
- // Not time to play this packet yet. Wait another round before using this
- // packet. Keep on playing CNG from previous CNG parameters.
- return kRfc3389CngNoPacket;
- } else {
- // Otherwise, go for the CNG packet now.
- return kRfc3389Cng;
- }
-}
-
-Operations DecisionLogicNormal::NoPacket(bool play_dtmf) {
- if (cng_state_ == kCngRfc3389On) {
- // Keep on playing comfort noise.
- return kRfc3389CngNoPacket;
- } else if (cng_state_ == kCngInternalOn) {
- // Keep on playing codec internal comfort noise.
- return kCodecInternalCng;
- } else if (play_dtmf) {
- return kDtmf;
- } else {
- // Nothing to play, do expand.
- return kExpand;
- }
-}
-
-Operations DecisionLogicNormal::ExpectedPacketAvailable(Modes prev_mode,
- bool play_dtmf) {
- if (prev_mode != kModeExpand && !play_dtmf) {
- // Check criterion for time-stretching.
- int low_limit, high_limit;
- delay_manager_->BufferLimits(&low_limit, &high_limit);
- if ((buffer_level_filter_->filtered_current_level() >= high_limit &&
- TimescaleAllowed()) ||
- buffer_level_filter_->filtered_current_level() >= high_limit << 2) {
- // Buffer level higher than limit and time-scaling allowed,
- // or buffer level really high.
- return kAccelerate;
- } else if ((buffer_level_filter_->filtered_current_level() < low_limit)
- && TimescaleAllowed()) {
- return kPreemptiveExpand;
- }
- }
- return kNormal;
-}
-
-Operations DecisionLogicNormal::FuturePacketAvailable(
- const SyncBuffer& sync_buffer,
- const Expand& expand,
- int decoder_frame_length,
- Modes prev_mode,
- uint32_t target_timestamp,
- uint32_t available_timestamp,
- bool play_dtmf) {
- // Required packet is not available, but a future packet is.
- // Check if we should continue with an ongoing expand because the new packet
- // is too far into the future.
- uint32_t timestamp_leap = available_timestamp - target_timestamp;
- if ((prev_mode == kModeExpand) &&
- !ReinitAfterExpands(timestamp_leap) &&
- !MaxWaitForPacket() &&
- PacketTooEarly(timestamp_leap) &&
- UnderTargetLevel()) {
- if (play_dtmf) {
- // Still have DTMF to play, so do not do expand.
- return kDtmf;
- } else {
- // Nothing to play.
- return kExpand;
- }
- }
-
- const int samples_left = static_cast<int>(sync_buffer.FutureLength() -
- expand.overlap_length());
- const int cur_size_samples = samples_left +
- packet_buffer_.NumPacketsInBuffer() * decoder_frame_length;
-
- // If previous was comfort noise, then no merge is needed.
- if (prev_mode == kModeRfc3389Cng ||
- prev_mode == kModeCodecInternalCng) {
- // Keep the same delay as before the CNG (or maximum 70 ms in buffer as
- // safety precaution), but make sure that the number of samples in buffer
- // is no higher than 4 times the optimal level. (Note that TargetLevel()
- // is in Q8.)
- int32_t timestamp_diff = (generated_noise_samples_ + target_timestamp) -
- available_timestamp;
- if (timestamp_diff >= 0 ||
- cur_size_samples >
- 4 * ((delay_manager_->TargetLevel() * packet_length_samples_) >> 8)) {
- // Time to play this new packet.
- return kNormal;
- } else {
- // Too early to play this new packet; keep on playing comfort noise.
- if (prev_mode == kModeRfc3389Cng) {
- return kRfc3389CngNoPacket;
- } else { // prevPlayMode == kModeCodecInternalCng.
- return kCodecInternalCng;
- }
- }
- }
- // Do not merge unless we have done an expand before.
- // (Convert kAllowMergeWithoutExpand from ms to samples by multiplying with
- // fs_mult_ * 8 = fs / 1000.)
- if (prev_mode == kModeExpand ||
- (decoder_frame_length < output_size_samples_ &&
- cur_size_samples > kAllowMergeWithoutExpandMs * fs_mult_ * 8)) {
- return kMerge;
- } else if (play_dtmf) {
- // Play DTMF instead of expand.
- return kDtmf;
- } else {
- return kExpand;
- }
-}
-
-bool DecisionLogicNormal::UnderTargetLevel() const {
- return buffer_level_filter_->filtered_current_level() <=
- delay_manager_->TargetLevel();
-}
-
-bool DecisionLogicNormal::ReinitAfterExpands(uint32_t timestamp_leap) const {
- return timestamp_leap >=
- static_cast<uint32_t>(output_size_samples_ * kReinitAfterExpands);
-}
-
-bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const {
- return timestamp_leap >
- static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_);
-}
-
-bool DecisionLogicNormal::MaxWaitForPacket() const {
- return num_consecutive_expands_ >= kMaxWaitForPacket;
-}
-
-} // namespace webrtc