Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Side by Side Diff: webrtc/modules/audio_coding/neteq/delay_manager.cc

Issue 1929863002: NetEq: Use TickTimer in DelayManager (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@delay-pdt-tick-timer
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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
11 #include "webrtc/modules/audio_coding/neteq/delay_manager.h" 11 #include "webrtc/modules/audio_coding/neteq/delay_manager.h"
12 12
13 #include <assert.h> 13 #include <assert.h>
14 #include <math.h> 14 #include <math.h>
15 15
16 #include <algorithm> // max, min 16 #include <algorithm> // max, min
17 17
18 #include "webrtc/base/safe_conversions.h" 18 #include "webrtc/base/safe_conversions.h"
19 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 19 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
20 #include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h" 20 #include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
21 #include "webrtc/modules/include/module_common_types.h" 21 #include "webrtc/modules/include/module_common_types.h"
22 #include "webrtc/system_wrappers/include/logging.h" 22 #include "webrtc/system_wrappers/include/logging.h"
23 23
24 namespace webrtc { 24 namespace webrtc {
25 25
26 DelayManager::DelayManager(size_t max_packets_in_buffer, 26 DelayManager::DelayManager(size_t max_packets_in_buffer,
27 DelayPeakDetector* peak_detector) 27 DelayPeakDetector* peak_detector,
28 const TickTimer* tick_timer)
28 : first_packet_received_(false), 29 : first_packet_received_(false),
29 max_packets_in_buffer_(max_packets_in_buffer), 30 max_packets_in_buffer_(max_packets_in_buffer),
30 iat_vector_(kMaxIat + 1, 0), 31 iat_vector_(kMaxIat + 1, 0),
31 iat_factor_(0), 32 iat_factor_(0),
32 packet_iat_count_ms_(0), 33 tick_timer_(tick_timer),
33 base_target_level_(4), // In Q0 domain. 34 base_target_level_(4), // In Q0 domain.
34 target_level_(base_target_level_ << 8), // In Q8 domain. 35 target_level_(base_target_level_ << 8), // In Q8 domain.
35 packet_len_ms_(0), 36 packet_len_ms_(0),
36 streaming_mode_(false), 37 streaming_mode_(false),
37 last_seq_no_(0), 38 last_seq_no_(0),
38 last_timestamp_(0), 39 last_timestamp_(0),
39 minimum_delay_ms_(0), 40 minimum_delay_ms_(0),
40 least_required_delay_ms_(target_level_), 41 least_required_delay_ms_(target_level_),
41 maximum_delay_ms_(target_level_), 42 maximum_delay_ms_(target_level_),
42 iat_cumulative_sum_(0), 43 iat_cumulative_sum_(0),
43 max_iat_cumulative_sum_(0), 44 max_iat_cumulative_sum_(0),
44 max_timer_ms_(0),
45 peak_detector_(*peak_detector), 45 peak_detector_(*peak_detector),
46 last_pack_cng_or_dtmf_(1) { 46 last_pack_cng_or_dtmf_(1) {
47 assert(peak_detector); // Should never be NULL. 47 assert(peak_detector); // Should never be NULL.
48 Reset(); 48 Reset();
49 } 49 }
50 50
51 DelayManager::~DelayManager() {} 51 DelayManager::~DelayManager() {}
52 52
53 const DelayManager::IATVector& DelayManager::iat_vector() const { 53 const DelayManager::IATVector& DelayManager::iat_vector() const {
54 return iat_vector_; 54 return iat_vector_;
(...skipping 17 matching lines...) Expand all
72 72
73 int DelayManager::Update(uint16_t sequence_number, 73 int DelayManager::Update(uint16_t sequence_number,
74 uint32_t timestamp, 74 uint32_t timestamp,
75 int sample_rate_hz) { 75 int sample_rate_hz) {
76 if (sample_rate_hz <= 0) { 76 if (sample_rate_hz <= 0) {
77 return -1; 77 return -1;
78 } 78 }
79 79
80 if (!first_packet_received_) { 80 if (!first_packet_received_) {
81 // Prepare for next packet arrival. 81 // Prepare for next packet arrival.
82 packet_iat_count_ms_ = 0; 82 packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
83 last_seq_no_ = sequence_number; 83 last_seq_no_ = sequence_number;
84 last_timestamp_ = timestamp; 84 last_timestamp_ = timestamp;
85 first_packet_received_ = true; 85 first_packet_received_ = true;
86 return 0; 86 return 0;
87 } 87 }
88 88
89 // Try calculating packet length from current and previous timestamps. 89 // Try calculating packet length from current and previous timestamps.
90 int packet_len_ms; 90 int packet_len_ms;
91 if (!IsNewerTimestamp(timestamp, last_timestamp_) || 91 if (!IsNewerTimestamp(timestamp, last_timestamp_) ||
92 !IsNewerSequenceNumber(sequence_number, last_seq_no_)) { 92 !IsNewerSequenceNumber(sequence_number, last_seq_no_)) {
93 // Wrong timestamp or sequence order; use stored value. 93 // Wrong timestamp or sequence order; use stored value.
94 packet_len_ms = packet_len_ms_; 94 packet_len_ms = packet_len_ms_;
95 } else { 95 } else {
96 // Calculate timestamps per packet and derive packet length in ms. 96 // Calculate timestamps per packet and derive packet length in ms.
97 int64_t packet_len_samp = 97 int64_t packet_len_samp =
98 static_cast<uint32_t>(timestamp - last_timestamp_) / 98 static_cast<uint32_t>(timestamp - last_timestamp_) /
99 static_cast<uint16_t>(sequence_number - last_seq_no_); 99 static_cast<uint16_t>(sequence_number - last_seq_no_);
100 packet_len_ms = 100 packet_len_ms =
101 rtc::checked_cast<int>(1000 * packet_len_samp / sample_rate_hz); 101 rtc::checked_cast<int>(1000 * packet_len_samp / sample_rate_hz);
102 } 102 }
103 103
104 if (packet_len_ms > 0) { 104 if (packet_len_ms > 0) {
105 // Cannot update statistics unless |packet_len_ms| is valid. 105 // Cannot update statistics unless |packet_len_ms| is valid.
106 // Calculate inter-arrival time (IAT) in integer "packet times" 106 // Calculate inter-arrival time (IAT) in integer "packet times"
107 // (rounding down). This is the value used as index to the histogram 107 // (rounding down). This is the value used as index to the histogram
108 // vector |iat_vector_|. 108 // vector |iat_vector_|.
109 int iat_packets = packet_iat_count_ms_ / packet_len_ms; 109 int iat_packets = packet_iat_stopwatch_->ElapsedMs() / packet_len_ms;
110 110
111 if (streaming_mode_) { 111 if (streaming_mode_) {
112 UpdateCumulativeSums(packet_len_ms, sequence_number); 112 UpdateCumulativeSums(packet_len_ms, sequence_number);
113 } 113 }
114 114
115 // Check for discontinuous packet sequence and re-ordering. 115 // Check for discontinuous packet sequence and re-ordering.
116 if (IsNewerSequenceNumber(sequence_number, last_seq_no_ + 1)) { 116 if (IsNewerSequenceNumber(sequence_number, last_seq_no_ + 1)) {
117 // Compensate for gap in the sequence numbers. Reduce IAT with the 117 // Compensate for gap in the sequence numbers. Reduce IAT with the
118 // expected extra time due to lost packets, but ensure that the IAT is 118 // expected extra time due to lost packets, but ensure that the IAT is
119 // not negative. 119 // not negative.
(...skipping 10 matching lines...) Expand all
130 // Calculate new |target_level_| based on updated statistics. 130 // Calculate new |target_level_| based on updated statistics.
131 target_level_ = CalculateTargetLevel(iat_packets); 131 target_level_ = CalculateTargetLevel(iat_packets);
132 if (streaming_mode_) { 132 if (streaming_mode_) {
133 target_level_ = std::max(target_level_, max_iat_cumulative_sum_); 133 target_level_ = std::max(target_level_, max_iat_cumulative_sum_);
134 } 134 }
135 135
136 LimitTargetLevel(); 136 LimitTargetLevel();
137 } // End if (packet_len_ms > 0). 137 } // End if (packet_len_ms > 0).
138 138
139 // Prepare for next packet arrival. 139 // Prepare for next packet arrival.
140 packet_iat_count_ms_ = 0; 140 packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
141 last_seq_no_ = sequence_number; 141 last_seq_no_ = sequence_number;
142 last_timestamp_ = timestamp; 142 last_timestamp_ = timestamp;
143 return 0; 143 return 0;
144 } 144 }
145 145
146 void DelayManager::UpdateCumulativeSums(int packet_len_ms, 146 void DelayManager::UpdateCumulativeSums(int packet_len_ms,
147 uint16_t sequence_number) { 147 uint16_t sequence_number) {
148 // Calculate IAT in Q8, including fractions of a packet (i.e., more 148 // Calculate IAT in Q8, including fractions of a packet (i.e., more
149 // accurate than |iat_packets|. 149 // accurate than |iat_packets|.
150 int iat_packets_q8 = (packet_iat_count_ms_ << 8) / packet_len_ms; 150 int iat_packets_q8 =
151 (packet_iat_stopwatch_->ElapsedMs() << 8) / packet_len_ms;
151 // Calculate cumulative sum IAT with sequence number compensation. The sum 152 // Calculate cumulative sum IAT with sequence number compensation. The sum
152 // is zero if there is no clock-drift. 153 // is zero if there is no clock-drift.
153 iat_cumulative_sum_ += (iat_packets_q8 - 154 iat_cumulative_sum_ += (iat_packets_q8 -
154 (static_cast<int>(sequence_number - last_seq_no_) << 8)); 155 (static_cast<int>(sequence_number - last_seq_no_) << 8));
155 // Subtract drift term. 156 // Subtract drift term.
156 iat_cumulative_sum_ -= kCumulativeSumDrift; 157 iat_cumulative_sum_ -= kCumulativeSumDrift;
157 // Ensure not negative. 158 // Ensure not negative.
158 iat_cumulative_sum_ = std::max(iat_cumulative_sum_, 0); 159 iat_cumulative_sum_ = std::max(iat_cumulative_sum_, 0);
159 if (iat_cumulative_sum_ > max_iat_cumulative_sum_) { 160 if (iat_cumulative_sum_ > max_iat_cumulative_sum_) {
160 // Found a new maximum. 161 // Found a new maximum.
161 max_iat_cumulative_sum_ = iat_cumulative_sum_; 162 max_iat_cumulative_sum_ = iat_cumulative_sum_;
162 max_timer_ms_ = 0; 163 max_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
163 } 164 }
164 if (max_timer_ms_ > kMaxStreamingPeakPeriodMs) { 165 if (max_iat_stopwatch_->ElapsedMs() > kMaxStreamingPeakPeriodMs) {
165 // Too long since the last maximum was observed; decrease max value. 166 // Too long since the last maximum was observed; decrease max value.
166 max_iat_cumulative_sum_ -= kCumulativeSumDrift; 167 max_iat_cumulative_sum_ -= kCumulativeSumDrift;
167 } 168 }
168 } 169 }
169 170
170 // Each element in the vector is first multiplied by the forgetting factor 171 // Each element in the vector is first multiplied by the forgetting factor
171 // |iat_factor_|. Then the vector element indicated by |iat_packets| is then 172 // |iat_factor_|. Then the vector element indicated by |iat_packets| is then
172 // increased (additive) by 1 - |iat_factor_|. This way, the probability of 173 // increased (additive) by 1 - |iat_factor_|. This way, the probability of
173 // |iat_packets| is slightly increased, while the sum of the histogram remains 174 // |iat_packets| is slightly increased, while the sum of the histogram remains
174 // constant (=1). 175 // constant (=1).
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 return target_level_; 293 return target_level_;
293 } 294 }
294 295
295 int DelayManager::SetPacketAudioLength(int length_ms) { 296 int DelayManager::SetPacketAudioLength(int length_ms) {
296 if (length_ms <= 0) { 297 if (length_ms <= 0) {
297 LOG_F(LS_ERROR) << "length_ms = " << length_ms; 298 LOG_F(LS_ERROR) << "length_ms = " << length_ms;
298 return -1; 299 return -1;
299 } 300 }
300 packet_len_ms_ = length_ms; 301 packet_len_ms_ = length_ms;
301 peak_detector_.SetPacketAudioLength(packet_len_ms_); 302 peak_detector_.SetPacketAudioLength(packet_len_ms_);
302 packet_iat_count_ms_ = 0; 303 packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
303 last_pack_cng_or_dtmf_ = 1; // TODO(hlundin): Legacy. Remove? 304 last_pack_cng_or_dtmf_ = 1; // TODO(hlundin): Legacy. Remove?
304 return 0; 305 return 0;
305 } 306 }
306 307
307 308
308 void DelayManager::Reset() { 309 void DelayManager::Reset() {
309 packet_len_ms_ = 0; // Packet size unknown. 310 packet_len_ms_ = 0; // Packet size unknown.
310 streaming_mode_ = false; 311 streaming_mode_ = false;
311 peak_detector_.Reset(); 312 peak_detector_.Reset();
312 ResetHistogram(); // Resets target levels too. 313 ResetHistogram(); // Resets target levels too.
313 iat_factor_ = 0; // Adapt the histogram faster for the first few packets. 314 iat_factor_ = 0; // Adapt the histogram faster for the first few packets.
314 packet_iat_count_ms_ = 0; 315 packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
315 max_timer_ms_ = 0; 316 max_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
316 iat_cumulative_sum_ = 0; 317 iat_cumulative_sum_ = 0;
317 max_iat_cumulative_sum_ = 0; 318 max_iat_cumulative_sum_ = 0;
318 last_pack_cng_or_dtmf_ = 1; 319 last_pack_cng_or_dtmf_ = 1;
319 } 320 }
320 321
321 int DelayManager::AverageIAT() const { 322 int DelayManager::AverageIAT() const {
322 int32_t sum_q24 = 0; 323 int32_t sum_q24 = 0;
323 // Using an int for the upper limit of the following for-loop so the 324 // Using an int for the upper limit of the following for-loop so the
324 // loop-counter can be int. Otherwise we need a cast where |sum_q24| is 325 // loop-counter can be int. Otherwise we need a cast where |sum_q24| is
325 // updated. 326 // updated.
326 const int iat_vec_size = static_cast<int>(iat_vector_.size()); 327 const int iat_vec_size = static_cast<int>(iat_vector_.size());
327 assert(iat_vector_.size() == 65); // Algorithm is hard-coded for this size. 328 assert(iat_vector_.size() == 65); // Algorithm is hard-coded for this size.
328 for (int i = 0; i < iat_vec_size; ++i) { 329 for (int i = 0; i < iat_vec_size; ++i) {
329 // Shift 6 to fit worst case: 2^30 * 64. 330 // Shift 6 to fit worst case: 2^30 * 64.
330 sum_q24 += (iat_vector_[i] >> 6) * i; 331 sum_q24 += (iat_vector_[i] >> 6) * i;
331 } 332 }
332 // Subtract the nominal inter-arrival time 1 = 2^24 in Q24. 333 // Subtract the nominal inter-arrival time 1 = 2^24 in Q24.
333 sum_q24 -= (1 << 24); 334 sum_q24 -= (1 << 24);
334 // Multiply with 1000000 / 2^24 = 15625 / 2^18 to get in parts-per-million. 335 // Multiply with 1000000 / 2^24 = 15625 / 2^18 to get in parts-per-million.
335 // Shift 7 to Q17 first, then multiply with 15625 and shift another 11. 336 // Shift 7 to Q17 first, then multiply with 15625 and shift another 11.
336 return ((sum_q24 >> 7) * 15625) >> 11; 337 return ((sum_q24 >> 7) * 15625) >> 11;
337 } 338 }
338 339
339 bool DelayManager::PeakFound() const { 340 bool DelayManager::PeakFound() const {
340 return peak_detector_.peak_found(); 341 return peak_detector_.peak_found();
341 } 342 }
342 343
343 void DelayManager::UpdateCounters(int elapsed_time_ms) { 344 void DelayManager::ResetPacketIatCount() {
344 packet_iat_count_ms_ += elapsed_time_ms; 345 packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
345 max_timer_ms_ += elapsed_time_ms;
346 } 346 }
347 347
348 void DelayManager::ResetPacketIatCount() { packet_iat_count_ms_ = 0; }
349
350 // Note that |low_limit| and |higher_limit| are not assigned to 348 // Note that |low_limit| and |higher_limit| are not assigned to
351 // |minimum_delay_ms_| and |maximum_delay_ms_| defined by the client of this 349 // |minimum_delay_ms_| and |maximum_delay_ms_| defined by the client of this
352 // class. They are computed from |target_level_| and used for decision making. 350 // class. They are computed from |target_level_| and used for decision making.
353 void DelayManager::BufferLimits(int* lower_limit, int* higher_limit) const { 351 void DelayManager::BufferLimits(int* lower_limit, int* higher_limit) const {
354 if (!lower_limit || !higher_limit) { 352 if (!lower_limit || !higher_limit) {
355 LOG_F(LS_ERROR) << "NULL pointers supplied as input"; 353 LOG_F(LS_ERROR) << "NULL pointers supplied as input";
356 assert(false); 354 assert(false);
357 return; 355 return;
358 } 356 }
359 357
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 int DelayManager::base_target_level() const { return base_target_level_; } 417 int DelayManager::base_target_level() const { return base_target_level_; }
420 void DelayManager::set_streaming_mode(bool value) { streaming_mode_ = value; } 418 void DelayManager::set_streaming_mode(bool value) { streaming_mode_ = value; }
421 int DelayManager::last_pack_cng_or_dtmf() const { 419 int DelayManager::last_pack_cng_or_dtmf() const {
422 return last_pack_cng_or_dtmf_; 420 return last_pack_cng_or_dtmf_;
423 } 421 }
424 422
425 void DelayManager::set_last_pack_cng_or_dtmf(int value) { 423 void DelayManager::set_last_pack_cng_or_dtmf(int value) {
426 last_pack_cng_or_dtmf_ = value; 424 last_pack_cng_or_dtmf_ = value;
427 } 425 }
428 } // namespace webrtc 426 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/delay_manager.h ('k') | webrtc/modules/audio_coding/neteq/delay_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698