OLD | NEW |
---|---|
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 |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 static const int kWindowMs = 500; | 238 static const int kWindowMs = 500; |
239 | 239 |
240 int target_rate_kbps_; | 240 int target_rate_kbps_; |
241 int bytes_remaining_; | 241 int bytes_remaining_; |
242 }; | 242 }; |
243 } // namespace paced_sender | 243 } // namespace paced_sender |
244 | 244 |
245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; | 245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; |
246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; | 246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; |
247 | 247 |
248 PacedSender::PacedSender(Clock* clock, | 248 PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) |
249 PacketSender* packet_sender) | |
250 : clock_(clock), | 249 : clock_(clock), |
251 packet_sender_(packet_sender), | 250 packet_sender_(packet_sender), |
252 critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 251 critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
253 paused_(false), | 252 paused_(false), |
254 probing_enabled_(true), | 253 probing_enabled_(true), |
255 media_budget_(new paced_sender::IntervalBudget(0)), | 254 media_budget_(new paced_sender::IntervalBudget(0)), |
256 padding_budget_(new paced_sender::IntervalBudget(0)), | 255 padding_budget_(new paced_sender::IntervalBudget(0)), |
257 prober_(new BitrateProber()), | 256 prober_(new BitrateProber()), |
258 estimated_bitrate_bps_(0), | 257 estimated_bitrate_bps_(0), |
259 min_send_bitrate_kbps_(0u), | 258 min_send_bitrate_kbps_(0u), |
259 max_padding_bitrate_kbps_(0u), | |
260 pacing_bitrate_kbps_(0), | 260 pacing_bitrate_kbps_(0), |
261 time_last_update_us_(clock->TimeInMicroseconds()), | 261 time_last_update_us_(clock->TimeInMicroseconds()), |
262 packets_(new paced_sender::PacketQueue(clock)), | 262 packets_(new paced_sender::PacketQueue(clock)), |
263 packet_counter_(0) { | 263 packet_counter_(0) { |
264 UpdateBytesPerInterval(kMinPacketLimitMs); | 264 UpdateBytesPerInterval(kMinPacketLimitMs); |
265 } | 265 } |
266 | 266 |
267 PacedSender::~PacedSender() {} | 267 PacedSender::~PacedSender() {} |
268 | 268 |
269 void PacedSender::Pause() { | 269 void PacedSender::Pause() { |
270 CriticalSectionScoped cs(critsect_.get()); | 270 CriticalSectionScoped cs(critsect_.get()); |
271 paused_ = true; | 271 paused_ = true; |
272 } | 272 } |
273 | 273 |
274 void PacedSender::Resume() { | 274 void PacedSender::Resume() { |
275 CriticalSectionScoped cs(critsect_.get()); | 275 CriticalSectionScoped cs(critsect_.get()); |
276 paused_ = false; | 276 paused_ = false; |
277 } | 277 } |
278 | 278 |
279 void PacedSender::SetProbingEnabled(bool enabled) { | 279 void PacedSender::SetProbingEnabled(bool enabled) { |
280 RTC_CHECK_EQ(0u, packet_counter_); | 280 RTC_CHECK_EQ(0u, packet_counter_); |
281 probing_enabled_ = enabled; | 281 probing_enabled_ = enabled; |
282 } | 282 } |
283 | 283 |
284 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { | 284 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { |
285 CriticalSectionScoped cs(critsect_.get()); | 285 CriticalSectionScoped cs(critsect_.get()); |
286 estimated_bitrate_bps_ = bitrate_bps; | 286 estimated_bitrate_bps_ = bitrate_bps; |
287 padding_budget_->set_target_rate_kbps( | |
288 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); | |
287 pacing_bitrate_kbps_ = | 289 pacing_bitrate_kbps_ = |
288 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 290 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
289 kDefaultPaceMultiplier; | 291 kDefaultPaceMultiplier; |
290 } | 292 } |
291 | 293 |
292 void PacedSender::SetAllocatedSendBitrate(int allocated_bitrate, | 294 void PacedSender::SetAllocatedSendBitrate(int allocated_bitrate, |
293 int padding_bitrate) { | 295 int padding_bitrate) { |
294 CriticalSectionScoped cs(critsect_.get()); | 296 CriticalSectionScoped cs(critsect_.get()); |
295 min_send_bitrate_kbps_ = allocated_bitrate / 1000; | 297 min_send_bitrate_kbps_ = allocated_bitrate / 1000; |
296 pacing_bitrate_kbps_ = | 298 pacing_bitrate_kbps_ = |
297 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 299 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
298 kDefaultPaceMultiplier; | 300 kDefaultPaceMultiplier; |
299 padding_budget_->set_target_rate_kbps(padding_bitrate / 1000); | 301 max_padding_bitrate_kbps_ = padding_bitrate / 1000; |
302 padding_budget_->set_target_rate_kbps( | |
303 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); | |
300 } | 304 } |
301 | 305 |
302 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, | 306 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, |
303 uint32_t ssrc, | 307 uint32_t ssrc, |
304 uint16_t sequence_number, | 308 uint16_t sequence_number, |
305 int64_t capture_time_ms, | 309 int64_t capture_time_ms, |
306 size_t bytes, | 310 size_t bytes, |
307 bool retransmission) { | 311 bool retransmission) { |
308 CriticalSectionScoped cs(critsect_.get()); | 312 CriticalSectionScoped cs(critsect_.get()); |
309 RTC_DCHECK(estimated_bitrate_bps_ > 0) | 313 RTC_DCHECK(estimated_bitrate_bps_ > 0) |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
411 // Send failed, put it back into the queue. | 415 // Send failed, put it back into the queue. |
412 packets_->CancelPop(packet); | 416 packets_->CancelPop(packet); |
413 return; | 417 return; |
414 } | 418 } |
415 } | 419 } |
416 | 420 |
417 // TODO(holmer): Remove the paused_ check when issue 5307 has been fixed. | 421 // TODO(holmer): Remove the paused_ check when issue 5307 has been fixed. |
418 if (paused_ || !packets_->Empty()) | 422 if (paused_ || !packets_->Empty()) |
419 return; | 423 return; |
420 | 424 |
421 size_t padding_needed; | 425 // We can not send padding unless a normal packet has first been sent. If we |
422 if (is_probing) { | 426 // do, timestamps gets messed up. |
stefan-webrtc
2016/06/10 13:54:13
This isnt true if we are using rtx. Is this really
perkj_webrtc
2016/06/14 10:58:02
There was a test that failed due to that it checke
| |
423 padding_needed = prober_->RecommendedPacketSize(); | 427 if (packet_counter_ > 0) { |
424 } else { | 428 size_t padding_needed = is_probing ? prober_->RecommendedPacketSize() |
425 padding_needed = padding_budget_->bytes_remaining(); | 429 : padding_budget_->bytes_remaining(); |
430 | |
431 if (padding_needed > 0) | |
432 SendPadding(padding_needed, probe_cluster_id); | |
426 } | 433 } |
427 | |
428 if (padding_needed > 0) | |
429 SendPadding(padding_needed, probe_cluster_id); | |
430 } | 434 } |
431 | 435 |
432 bool PacedSender::SendPacket(const paced_sender::Packet& packet, | 436 bool PacedSender::SendPacket(const paced_sender::Packet& packet, |
433 int probe_cluster_id) { | 437 int probe_cluster_id) { |
434 // TODO(holmer): Because of this bug issue 5307 we have to send audio | 438 // TODO(holmer): Because of this bug issue 5307 we have to send audio |
435 // packets even when the pacer is paused. Here we assume audio packets are | 439 // packets even when the pacer is paused. Here we assume audio packets are |
436 // always high priority and that they are the only high priority packets. | 440 // always high priority and that they are the only high priority packets. |
437 if (paused_ && packet.priority != kHighPriority) | 441 if (paused_ && packet.priority != kHighPriority) |
438 return false; | 442 return false; |
439 critsect_->Leave(); | 443 critsect_->Leave(); |
(...skipping 27 matching lines...) Expand all Loading... | |
467 media_budget_->UseBudget(bytes_sent); | 471 media_budget_->UseBudget(bytes_sent); |
468 padding_budget_->UseBudget(bytes_sent); | 472 padding_budget_->UseBudget(bytes_sent); |
469 } | 473 } |
470 } | 474 } |
471 | 475 |
472 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { | 476 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { |
473 media_budget_->IncreaseBudget(delta_time_ms); | 477 media_budget_->IncreaseBudget(delta_time_ms); |
474 padding_budget_->IncreaseBudget(delta_time_ms); | 478 padding_budget_->IncreaseBudget(delta_time_ms); |
475 } | 479 } |
476 } // namespace webrtc | 480 } // namespace webrtc |
OLD | NEW |