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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 padding_budget_(new paced_sender::IntervalBudget(0)), | 257 padding_budget_(new paced_sender::IntervalBudget(0)), |
258 prober_(new BitrateProber(event_log)), | 258 prober_(new BitrateProber(event_log)), |
259 probing_send_failure_(false), | 259 probing_send_failure_(false), |
260 estimated_bitrate_bps_(0), | 260 estimated_bitrate_bps_(0), |
261 min_send_bitrate_kbps_(0u), | 261 min_send_bitrate_kbps_(0u), |
262 max_padding_bitrate_kbps_(0u), | 262 max_padding_bitrate_kbps_(0u), |
263 pacing_bitrate_kbps_(0), | 263 pacing_bitrate_kbps_(0), |
264 time_last_update_us_(clock->TimeInMicroseconds()), | 264 time_last_update_us_(clock->TimeInMicroseconds()), |
265 first_sent_packet_ms_(-1), | 265 first_sent_packet_ms_(-1), |
266 packets_(new paced_sender::PacketQueue(clock)), | 266 packets_(new paced_sender::PacketQueue(clock)), |
267 packet_counter_(0) { | 267 packet_counter_(0), |
| 268 pacing_factor_(kDefaultPaceMultiplier), |
| 269 queue_time_limit(kMaxQueueLengthMs) { |
268 UpdateBudgetWithElapsedTime(kMinPacketLimitMs); | 270 UpdateBudgetWithElapsedTime(kMinPacketLimitMs); |
269 } | 271 } |
270 | 272 |
271 PacedSender::~PacedSender() {} | 273 PacedSender::~PacedSender() {} |
272 | 274 |
273 void PacedSender::CreateProbeCluster(int bitrate_bps) { | 275 void PacedSender::CreateProbeCluster(int bitrate_bps) { |
274 rtc::CritScope cs(&critsect_); | 276 rtc::CritScope cs(&critsect_); |
275 prober_->CreateProbeCluster(bitrate_bps, clock_->TimeInMilliseconds()); | 277 prober_->CreateProbeCluster(bitrate_bps, clock_->TimeInMilliseconds()); |
276 } | 278 } |
277 | 279 |
(...skipping 29 matching lines...) Expand all Loading... |
307 | 309 |
308 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { | 310 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { |
309 if (bitrate_bps == 0) | 311 if (bitrate_bps == 0) |
310 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate."; | 312 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate."; |
311 rtc::CritScope cs(&critsect_); | 313 rtc::CritScope cs(&critsect_); |
312 estimated_bitrate_bps_ = bitrate_bps; | 314 estimated_bitrate_bps_ = bitrate_bps; |
313 padding_budget_->set_target_rate_kbps( | 315 padding_budget_->set_target_rate_kbps( |
314 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); | 316 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); |
315 pacing_bitrate_kbps_ = | 317 pacing_bitrate_kbps_ = |
316 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 318 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
317 kDefaultPaceMultiplier; | 319 pacing_factor_; |
318 alr_detector_->SetEstimatedBitrate(bitrate_bps); | 320 alr_detector_->SetEstimatedBitrate(bitrate_bps); |
319 } | 321 } |
320 | 322 |
321 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps, | 323 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps, |
322 int padding_bitrate) { | 324 int padding_bitrate) { |
323 rtc::CritScope cs(&critsect_); | 325 rtc::CritScope cs(&critsect_); |
324 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000; | 326 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000; |
325 pacing_bitrate_kbps_ = | 327 pacing_bitrate_kbps_ = |
326 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 328 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
327 kDefaultPaceMultiplier; | 329 pacing_factor_; |
328 max_padding_bitrate_kbps_ = padding_bitrate / 1000; | 330 max_padding_bitrate_kbps_ = padding_bitrate / 1000; |
329 padding_budget_->set_target_rate_kbps( | 331 padding_budget_->set_target_rate_kbps( |
330 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); | 332 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); |
331 } | 333 } |
332 | 334 |
333 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, | 335 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, |
334 uint32_t ssrc, | 336 uint32_t ssrc, |
335 uint16_t sequence_number, | 337 uint16_t sequence_number, |
336 int64_t capture_time_ms, | 338 int64_t capture_time_ms, |
337 size_t bytes, | 339 size_t bytes, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 time_last_update_us_ = now_us; | 414 time_last_update_us_ = now_us; |
413 int target_bitrate_kbps = pacing_bitrate_kbps_; | 415 int target_bitrate_kbps = pacing_bitrate_kbps_; |
414 if (!paused_ && elapsed_time_ms > 0) { | 416 if (!paused_ && elapsed_time_ms > 0) { |
415 size_t queue_size_bytes = packets_->SizeInBytes(); | 417 size_t queue_size_bytes = packets_->SizeInBytes(); |
416 if (queue_size_bytes > 0) { | 418 if (queue_size_bytes > 0) { |
417 // Assuming equal size packets and input/output rate, the average packet | 419 // Assuming equal size packets and input/output rate, the average packet |
418 // has avg_time_left_ms left to get queue_size_bytes out of the queue, if | 420 // has avg_time_left_ms left to get queue_size_bytes out of the queue, if |
419 // time constraint shall be met. Determine bitrate needed for that. | 421 // time constraint shall be met. Determine bitrate needed for that. |
420 packets_->UpdateQueueTime(clock_->TimeInMilliseconds()); | 422 packets_->UpdateQueueTime(clock_->TimeInMilliseconds()); |
421 int64_t avg_time_left_ms = std::max<int64_t>( | 423 int64_t avg_time_left_ms = std::max<int64_t>( |
422 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); | 424 1, queue_time_limit - packets_->AverageQueueTimeMs()); |
423 int min_bitrate_needed_kbps = | 425 int min_bitrate_needed_kbps = |
424 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms); | 426 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms); |
425 if (min_bitrate_needed_kbps > target_bitrate_kbps) | 427 if (min_bitrate_needed_kbps > target_bitrate_kbps) |
426 target_bitrate_kbps = min_bitrate_needed_kbps; | 428 target_bitrate_kbps = min_bitrate_needed_kbps; |
427 } | 429 } |
428 | 430 |
429 media_budget_->set_target_rate_kbps(target_bitrate_kbps); | 431 media_budget_->set_target_rate_kbps(target_bitrate_kbps); |
430 | 432 |
431 elapsed_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); | 433 elapsed_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); |
432 UpdateBudgetWithElapsedTime(elapsed_time_ms); | 434 UpdateBudgetWithElapsedTime(elapsed_time_ms); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 | 530 |
529 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { | 531 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { |
530 media_budget_->IncreaseBudget(delta_time_ms); | 532 media_budget_->IncreaseBudget(delta_time_ms); |
531 padding_budget_->IncreaseBudget(delta_time_ms); | 533 padding_budget_->IncreaseBudget(delta_time_ms); |
532 } | 534 } |
533 | 535 |
534 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { | 536 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { |
535 media_budget_->UseBudget(bytes_sent); | 537 media_budget_->UseBudget(bytes_sent); |
536 padding_budget_->UseBudget(bytes_sent); | 538 padding_budget_->UseBudget(bytes_sent); |
537 } | 539 } |
| 540 |
| 541 void PacedSender::SetPacingFactor(float pacing_factor) { |
| 542 rtc::CritScope cs(&critsect_); |
| 543 pacing_factor_ = pacing_factor; |
| 544 } |
| 545 |
| 546 void PacedSender::SetQueueTimeLimit(int limit_ms) { |
| 547 rtc::CritScope cs(&critsect_); |
| 548 queue_time_limit = limit_ms; |
| 549 } |
| 550 |
538 } // namespace webrtc | 551 } // namespace webrtc |
OLD | NEW |