OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 return NoPacket(play_dtmf); | 60 return NoPacket(play_dtmf); |
61 } | 61 } |
62 | 62 |
63 // If the expand period was very long, reset NetEQ since it is likely that the | 63 // If the expand period was very long, reset NetEQ since it is likely that the |
64 // sender was restarted. | 64 // sender was restarted. |
65 if (num_consecutive_expands_ > kReinitAfterExpands) { | 65 if (num_consecutive_expands_ > kReinitAfterExpands) { |
66 *reset_decoder = true; | 66 *reset_decoder = true; |
67 return kNormal; | 67 return kNormal; |
68 } | 68 } |
69 | 69 |
70 const uint32_t five_seconds_samples = 5 * 8000 * fs_mult_; | 70 const uint32_t five_seconds_samples = |
| 71 static_cast<uint32_t>(5 * 8000 * fs_mult_); |
71 // Check if the required packet is available. | 72 // Check if the required packet is available. |
72 if (target_timestamp == available_timestamp) { | 73 if (target_timestamp == available_timestamp) { |
73 return ExpectedPacketAvailable(prev_mode, play_dtmf); | 74 return ExpectedPacketAvailable(prev_mode, play_dtmf); |
74 } else if (!PacketBuffer::IsObsoleteTimestamp( | 75 } else if (!PacketBuffer::IsObsoleteTimestamp( |
75 available_timestamp, target_timestamp, five_seconds_samples)) { | 76 available_timestamp, target_timestamp, five_seconds_samples)) { |
76 return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length, | 77 return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length, |
77 prev_mode, target_timestamp, | 78 prev_mode, target_timestamp, |
78 available_timestamp, play_dtmf); | 79 available_timestamp, play_dtmf); |
79 } else { | 80 } else { |
80 // This implies that available_timestamp < target_timestamp, which can | 81 // This implies that available_timestamp < target_timestamp, which can |
81 // happen when a new stream or codec is received. Signal for a reset. | 82 // happen when a new stream or codec is received. Signal for a reset. |
82 return kUndefined; | 83 return kUndefined; |
83 } | 84 } |
84 } | 85 } |
85 | 86 |
86 Operations DecisionLogicNormal::CngOperation(Modes prev_mode, | 87 Operations DecisionLogicNormal::CngOperation(Modes prev_mode, |
87 uint32_t target_timestamp, | 88 uint32_t target_timestamp, |
88 uint32_t available_timestamp) { | 89 uint32_t available_timestamp) { |
89 // Signed difference between target and available timestamp. | 90 // Signed difference between target and available timestamp. |
90 int32_t timestamp_diff = (generated_noise_samples_ + target_timestamp) - | 91 int32_t timestamp_diff = static_cast<int32_t>( |
91 available_timestamp; | 92 static_cast<uint32_t>(generated_noise_samples_ + target_timestamp) - |
92 int32_t optimal_level_samp = | 93 available_timestamp); |
93 (delay_manager_->TargetLevel() * packet_length_samples_) >> 8; | 94 int32_t optimal_level_samp = static_cast<int32_t>( |
| 95 (delay_manager_->TargetLevel() * packet_length_samples_) >> 8); |
94 int32_t excess_waiting_time_samp = -timestamp_diff - optimal_level_samp; | 96 int32_t excess_waiting_time_samp = -timestamp_diff - optimal_level_samp; |
95 | 97 |
96 if (excess_waiting_time_samp > optimal_level_samp / 2) { | 98 if (excess_waiting_time_samp > optimal_level_samp / 2) { |
97 // The waiting time for this packet will be longer than 1.5 | 99 // The waiting time for this packet will be longer than 1.5 |
98 // times the wanted buffer delay. Advance the clock to cut | 100 // times the wanted buffer delay. Advance the clock to cut |
99 // waiting time down to the optimal. | 101 // waiting time down to the optimal. |
100 generated_noise_samples_ += excess_waiting_time_samp; | 102 generated_noise_samples_ += excess_waiting_time_samp; |
101 timestamp_diff += excess_waiting_time_samp; | 103 timestamp_diff += excess_waiting_time_samp; |
102 } | 104 } |
103 | 105 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 const int cur_size_samples = samples_left + | 177 const int cur_size_samples = samples_left + |
176 packet_buffer_.NumPacketsInBuffer() * decoder_frame_length; | 178 packet_buffer_.NumPacketsInBuffer() * decoder_frame_length; |
177 | 179 |
178 // If previous was comfort noise, then no merge is needed. | 180 // If previous was comfort noise, then no merge is needed. |
179 if (prev_mode == kModeRfc3389Cng || | 181 if (prev_mode == kModeRfc3389Cng || |
180 prev_mode == kModeCodecInternalCng) { | 182 prev_mode == kModeCodecInternalCng) { |
181 // Keep the same delay as before the CNG (or maximum 70 ms in buffer as | 183 // Keep the same delay as before the CNG (or maximum 70 ms in buffer as |
182 // safety precaution), but make sure that the number of samples in buffer | 184 // safety precaution), but make sure that the number of samples in buffer |
183 // is no higher than 4 times the optimal level. (Note that TargetLevel() | 185 // is no higher than 4 times the optimal level. (Note that TargetLevel() |
184 // is in Q8.) | 186 // is in Q8.) |
185 int32_t timestamp_diff = (generated_noise_samples_ + target_timestamp) - | 187 if (static_cast<uint32_t>(generated_noise_samples_ + target_timestamp) >= |
186 available_timestamp; | 188 available_timestamp || |
187 if (timestamp_diff >= 0 || | |
188 cur_size_samples > | 189 cur_size_samples > |
189 4 * ((delay_manager_->TargetLevel() * packet_length_samples_) >> 8)) { | 190 ((delay_manager_->TargetLevel() * packet_length_samples_) >> 8) * |
| 191 4) { |
190 // Time to play this new packet. | 192 // Time to play this new packet. |
191 return kNormal; | 193 return kNormal; |
192 } else { | 194 } else { |
193 // Too early to play this new packet; keep on playing comfort noise. | 195 // Too early to play this new packet; keep on playing comfort noise. |
194 if (prev_mode == kModeRfc3389Cng) { | 196 if (prev_mode == kModeRfc3389Cng) { |
195 return kRfc3389CngNoPacket; | 197 return kRfc3389CngNoPacket; |
196 } else { // prevPlayMode == kModeCodecInternalCng. | 198 } else { // prevPlayMode == kModeCodecInternalCng. |
197 return kCodecInternalCng; | 199 return kCodecInternalCng; |
198 } | 200 } |
199 } | 201 } |
(...skipping 26 matching lines...) Expand all Loading... |
226 bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const { | 228 bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const { |
227 return timestamp_leap > | 229 return timestamp_leap > |
228 static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_); | 230 static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_); |
229 } | 231 } |
230 | 232 |
231 bool DecisionLogicNormal::MaxWaitForPacket() const { | 233 bool DecisionLogicNormal::MaxWaitForPacket() const { |
232 return num_consecutive_expands_ >= kMaxWaitForPacket; | 234 return num_consecutive_expands_ >= kMaxWaitForPacket; |
233 } | 235 } |
234 | 236 |
235 } // namespace webrtc | 237 } // namespace webrtc |
OLD | NEW |