1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/audio_coding/neteq/decision_logic_normal.h" 12 13 #include <assert.h> 14 15 #include <algorithm> 16 17 #include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h" 18 #include "webrtc/modules/audio_coding/neteq/decoder_database.h" 19 #include "webrtc/modules/audio_coding/neteq/delay_manager.h" 20 #include "webrtc/modules/audio_coding/neteq/expand.h" 21 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h" 22 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h" 23 #include "webrtc/modules/include/module_common_types.h" 24 25 namespace webrtc { 26 27 Operations DecisionLogicNormal::GetDecisionSpecialized( 28 const SyncBuffer& sync_buffer, 29 const Expand& expand, 30 size_t decoder_frame_length, 31 const RTPHeader* packet_header, 32 Modes prev_mode, 33 bool play_dtmf, 34 bool* reset_decoder) { 35 assert(playout_mode_ == kPlayoutOn || playout_mode_ == kPlayoutStreaming); 36 // Guard for errors, to avoid getting stuck in error mode. 37 if (prev_mode == kModeError) { 38 if (!packet_header) { 39 return kExpand; 40 } else { 41 return kUndefined; // Use kUndefined to flag for a reset. 42 } 43 } 44 45 uint32_t target_timestamp = sync_buffer.end_timestamp(); 46 uint32_t available_timestamp = 0; 47 bool is_cng_packet = false; 48 if (packet_header) { 49 available_timestamp = packet_header->timestamp; 50 is_cng_packet = 51 decoder_database_->IsComfortNoise(packet_header->payloadType); 52 } 53 54 if (is_cng_packet) { 55 return CngOperation(prev_mode, target_timestamp, available_timestamp); 56 } 57 58 // Handle the case with no packet at all available (except maybe DTMF). 59 if (!packet_header) { 60 return NoPacket(play_dtmf); 61 } 62 63 // If the expand period was very long, reset NetEQ since it is likely that the 64 // sender was restarted. 65 if (num_consecutive_expands_ > kReinitAfterExpands) { 66 *reset_decoder = true; 67 return kNormal; 68 } 69 70 const uint32_t five_seconds_samples = 71 static_cast<uint32_t>(5 * 8000 * fs_mult_); 72 // Check if the required packet is available. 73 if (target_timestamp == available_timestamp) { 74 return ExpectedPacketAvailable(prev_mode, play_dtmf); 75 } else if (!PacketBuffer::IsObsoleteTimestamp( 76 available_timestamp, target_timestamp, five_seconds_samples)) { 77 return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length, 78 prev_mode, target_timestamp, 79 available_timestamp, play_dtmf); 80 } else { 81 // This implies that available_timestamp < target_timestamp, which can 82 // happen when a new stream or codec is received. Signal for a reset. 83 return kUndefined; 84 } 85 } 86 87 Operations DecisionLogicNormal::CngOperation(Modes prev_mode, 88 uint32_t target_timestamp, 89 uint32_t available_timestamp) { 90 // Signed difference between target and available timestamp. 91 int32_t timestamp_diff = static_cast<int32_t>( 92 static_cast<uint32_t>(generated_noise_samples_ + target_timestamp) - 93 available_timestamp); 94 int32_t optimal_level_samp = static_cast<int32_t>( 95 (delay_manager_->TargetLevel() * packet_length_samples_) >> 8); 96 int32_t excess_waiting_time_samp = -timestamp_diff - optimal_level_samp; 97 98 if (excess_waiting_time_samp > optimal_level_samp / 2) { 99 // The waiting time for this packet will be longer than 1.5 100 // times the wanted buffer delay. Advance the clock to cut 101 // waiting time down to the optimal. 102 generated_noise_samples_ += excess_waiting_time_samp; 103 timestamp_diff += excess_waiting_time_samp; 104 } 105 106 if (timestamp_diff < 0 && prev_mode == kModeRfc3389Cng) { 107 // Not time to play this packet yet. Wait another round before using this 108 // packet. Keep on playing CNG from previous CNG parameters. 109 return kRfc3389CngNoPacket; 110 } else { 111 // Otherwise, go for the CNG packet now. 112 return kRfc3389Cng; 113 } 114 } 115 116 Operations DecisionLogicNormal::NoPacket(bool play_dtmf) { 117 if (cng_state_ == kCngRfc3389On) { 118 // Keep on playing comfort noise. 119 return kRfc3389CngNoPacket; 120 } else if (cng_state_ == kCngInternalOn) { 121 // Keep on playing codec internal comfort noise. 122 return kCodecInternalCng; 123 } else if (play_dtmf) { 124 return kDtmf; 125 } else { 126 // Nothing to play, do expand. 127 return kExpand; 128 } 129 } 130 131 Operations DecisionLogicNormal::ExpectedPacketAvailable(Modes prev_mode, 132 bool play_dtmf) { 133 if (prev_mode != kModeExpand && !play_dtmf) { 134 // Check criterion for time-stretching. 135 int low_limit, high_limit; 136 delay_manager_->BufferLimits(&low_limit, &high_limit); 137 if (buffer_level_filter_->filtered_current_level() >= high_limit << 2) 138 return kFastAccelerate; 139 if (TimescaleAllowed()) { 140 if (buffer_level_filter_->filtered_current_level() >= high_limit) 141 return kAccelerate; 142 if (buffer_level_filter_->filtered_current_level() < low_limit) 143 return kPreemptiveExpand; 144 } 145 } 146 return kNormal; 147 } 148 149 Operations DecisionLogicNormal::FuturePacketAvailable( 150 const SyncBuffer& sync_buffer, 151 const Expand& expand, 152 size_t decoder_frame_length, 153 Modes prev_mode, 154 uint32_t target_timestamp, 155 uint32_t available_timestamp, 156 bool play_dtmf) { 157 // Required packet is not available, but a future packet is. 158 // Check if we should continue with an ongoing expand because the new packet 159 // is too far into the future. 160 uint32_t timestamp_leap = available_timestamp - target_timestamp; 161 if ((prev_mode == kModeExpand) && 162 !ReinitAfterExpands(timestamp_leap) && 163 !MaxWaitForPacket() && 164 PacketTooEarly(timestamp_leap) && 165 UnderTargetLevel()) { 166 if (play_dtmf) { 167 // Still have DTMF to play, so do not do expand. 168 return kDtmf; 169 } else { 170 // Nothing to play. 171 return kExpand; 172 } 173 } 174 175 const size_t samples_left = 176 sync_buffer.FutureLength() - expand.overlap_length(); 177 const size_t cur_size_samples = samples_left + 178 packet_buffer_.NumPacketsInBuffer() * decoder_frame_length; 179 180 // If previous was comfort noise, then no merge is needed. 181 if (prev_mode == kModeRfc3389Cng || 182 prev_mode == kModeCodecInternalCng) { 183 // Keep the same delay as before the CNG (or maximum 70 ms in buffer as 184 // safety precaution), but make sure that the number of samples in buffer 185 // is no higher than 4 times the optimal level. (Note that TargetLevel() 186 // is in Q8.) 187 if (static_cast<uint32_t>(generated_noise_samples_ + target_timestamp) >= 188 available_timestamp || 189 cur_size_samples > 190 ((delay_manager_->TargetLevel() * packet_length_samples_) >> 8) * 191 4) { 192 // Time to play this new packet. 193 return kNormal; 194 } else { 195 // Too early to play this new packet; keep on playing comfort noise. 196 if (prev_mode == kModeRfc3389Cng) { 197 return kRfc3389CngNoPacket; 198 } else { // prevPlayMode == kModeCodecInternalCng. 199 return kCodecInternalCng; 200 } 201 } 202 } 203 // Do not merge unless we have done an expand before. 204 // (Convert kAllowMergeWithoutExpand from ms to samples by multiplying with 205 // fs_mult_ * 8 = fs / 1000.) 206 if (prev_mode == kModeExpand || 207 (decoder_frame_length < output_size_samples_ && 208 cur_size_samples > 209 static_cast<size_t>(kAllowMergeWithoutExpandMs * fs_mult_ * 8))) { 210 return kMerge; 211 } else if (play_dtmf) { 212 // Play DTMF instead of expand. 213 return kDtmf; 214 } else { 215 return kExpand; 216 } 217 } 218 219 bool DecisionLogicNormal::UnderTargetLevel() const { 220 return buffer_level_filter_->filtered_current_level() <= 221 delay_manager_->TargetLevel(); 222 } 223 224 bool DecisionLogicNormal::ReinitAfterExpands(uint32_t timestamp_leap) const { 225 return timestamp_leap >= 226 static_cast<uint32_t>(output_size_samples_ * kReinitAfterExpands); 227 } 228 229 bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const { 230 return timestamp_leap > 231 static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_); 232 } 233 234 bool DecisionLogicNormal::MaxWaitForPacket() const { 235 return num_consecutive_expands_ >= kMaxWaitForPacket; 236 } 237 238 } // namespace webrtc 239