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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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, |
249 Callback* callback, | 249 SenderDelegate* delegate, |
250 int bitrate_kbps, | 250 int estimated_bitrate_bps) |
251 int max_bitrate_kbps, | |
252 int min_bitrate_kbps) | |
253 : clock_(clock), | 251 : clock_(clock), |
254 callback_(callback), | 252 delegate_(delegate), |
255 critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 253 critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
256 paused_(false), | 254 paused_(false), |
257 probing_enabled_(true), | 255 probing_enabled_(true), |
258 media_budget_(new paced_sender::IntervalBudget(max_bitrate_kbps)), | 256 media_budget_(new paced_sender::IntervalBudget( |
259 padding_budget_(new paced_sender::IntervalBudget(min_bitrate_kbps)), | 257 estimated_bitrate_bps / 1000 * kDefaultPaceMultiplier)), |
stefan-webrtc
2016/04/29 10:48:38
I'm slightly hesitant to moving kDefaultPaceMultip
perkj_webrtc
2016/05/02 11:29:10
I think its very weird that it has to be set outsi
| |
258 padding_budget_(new paced_sender::IntervalBudget(0)), | |
260 prober_(new BitrateProber()), | 259 prober_(new BitrateProber()), |
261 bitrate_bps_(1000 * bitrate_kbps), | 260 estimated_bitrate_bps_(estimated_bitrate_bps), |
262 max_bitrate_kbps_(max_bitrate_kbps), | 261 min_send_bitrate_kbps_(0u), |
262 target_bitrate_kbps_(estimated_bitrate_bps / 1000 * | |
stefan-webrtc
2016/04/29 10:48:38
pacing_bitrate_kbps_, perhaps?
perkj_webrtc
2016/05/02 11:29:10
Done.
| |
263 kDefaultPaceMultiplier), | |
263 time_last_update_us_(clock->TimeInMicroseconds()), | 264 time_last_update_us_(clock->TimeInMicroseconds()), |
264 packets_(new paced_sender::PacketQueue(clock)), | 265 packets_(new paced_sender::PacketQueue(clock)), |
265 packet_counter_(0) { | 266 packet_counter_(0) { |
266 UpdateBytesPerInterval(kMinPacketLimitMs); | 267 UpdateBytesPerInterval(kMinPacketLimitMs); |
267 } | 268 } |
268 | 269 |
269 PacedSender::~PacedSender() {} | 270 PacedSender::~PacedSender() {} |
270 | 271 |
271 void PacedSender::Pause() { | 272 void PacedSender::Pause() { |
272 CriticalSectionScoped cs(critsect_.get()); | 273 CriticalSectionScoped cs(critsect_.get()); |
273 paused_ = true; | 274 paused_ = true; |
274 } | 275 } |
275 | 276 |
276 void PacedSender::Resume() { | 277 void PacedSender::Resume() { |
277 CriticalSectionScoped cs(critsect_.get()); | 278 CriticalSectionScoped cs(critsect_.get()); |
278 paused_ = false; | 279 paused_ = false; |
279 } | 280 } |
280 | 281 |
281 void PacedSender::SetProbingEnabled(bool enabled) { | 282 void PacedSender::SetProbingEnabled(bool enabled) { |
282 RTC_CHECK_EQ(0u, packet_counter_); | 283 RTC_CHECK_EQ(0u, packet_counter_); |
283 probing_enabled_ = enabled; | 284 probing_enabled_ = enabled; |
284 } | 285 } |
285 | 286 |
286 void PacedSender::UpdateBitrate(int bitrate_kbps, | 287 void PacedSender::SetMinimumSendBitrate(int bitrate_bps) { |
287 int max_bitrate_kbps, | |
288 int min_bitrate_kbps) { | |
289 CriticalSectionScoped cs(critsect_.get()); | 288 CriticalSectionScoped cs(critsect_.get()); |
290 // Don't set media bitrate here as it may be boosted in order to meet max | 289 min_send_bitrate_kbps_ = bitrate_bps / 1000; |
291 // queue time constraint. Just update max_bitrate_kbps_ and let media_budget_ | 290 target_bitrate_kbps_ = |
292 // be updated in Process(). | 291 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
293 padding_budget_->set_target_rate_kbps(min_bitrate_kbps); | 292 kDefaultPaceMultiplier; |
294 bitrate_bps_ = 1000 * bitrate_kbps; | 293 } |
295 max_bitrate_kbps_ = max_bitrate_kbps; | 294 |
295 void PacedSender::SetNetWorkEstimateTargetBitrate(uint32_t bitrate_bps) { | |
296 LOG(LS_INFO) << "SetNetWorkEstimateTargetBitrate, bitrate " << bitrate_bps; | |
297 | |
298 CriticalSectionScoped cs(critsect_.get()); | |
299 estimated_bitrate_bps_ = bitrate_bps; | |
300 target_bitrate_kbps_ = | |
301 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | |
302 kDefaultPaceMultiplier; | |
303 } | |
304 | |
305 void PacedSender::SetPaddingBitrate(int bitrate_bps) { | |
306 CriticalSectionScoped cs(critsect_.get()); | |
307 padding_budget_->set_target_rate_kbps(bitrate_bps / 1000); | |
296 } | 308 } |
297 | 309 |
298 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, | 310 void PacedSender::InsertPacket(RtpPacketSender::Priority priority, |
299 uint32_t ssrc, | 311 uint32_t ssrc, |
300 uint16_t sequence_number, | 312 uint16_t sequence_number, |
301 int64_t capture_time_ms, | 313 int64_t capture_time_ms, |
302 size_t bytes, | 314 size_t bytes, |
303 bool retransmission) { | 315 bool retransmission) { |
304 CriticalSectionScoped cs(critsect_.get()); | 316 CriticalSectionScoped cs(critsect_.get()); |
305 | 317 |
306 if (probing_enabled_ && !prober_->IsProbing()) | 318 if (probing_enabled_ && !prober_->IsProbing()) |
307 prober_->SetEnabled(true); | 319 prober_->SetEnabled(true); |
308 int64_t now_ms = clock_->TimeInMilliseconds(); | 320 int64_t now_ms = clock_->TimeInMilliseconds(); |
309 prober_->OnIncomingPacket(bitrate_bps_, bytes, now_ms); | 321 prober_->OnIncomingPacket(estimated_bitrate_bps_, bytes, now_ms); |
310 | 322 |
311 if (capture_time_ms < 0) | 323 if (capture_time_ms < 0) |
312 capture_time_ms = now_ms; | 324 capture_time_ms = now_ms; |
313 | 325 |
314 packets_->Push(paced_sender::Packet(priority, ssrc, sequence_number, | 326 packets_->Push(paced_sender::Packet(priority, ssrc, sequence_number, |
315 capture_time_ms, now_ms, bytes, | 327 capture_time_ms, now_ms, bytes, |
316 retransmission, packet_counter_++)); | 328 retransmission, packet_counter_++)); |
317 } | 329 } |
318 | 330 |
319 int64_t PacedSender::ExpectedQueueTimeMs() const { | 331 int64_t PacedSender::ExpectedQueueTimeMs() const { |
320 CriticalSectionScoped cs(critsect_.get()); | 332 CriticalSectionScoped cs(critsect_.get()); |
321 RTC_DCHECK_GT(max_bitrate_kbps_, 0); | 333 RTC_DCHECK_GT(target_bitrate_kbps_, 0u); |
322 return static_cast<int64_t>(packets_->SizeInBytes() * 8 / max_bitrate_kbps_); | 334 return static_cast<int64_t>(packets_->SizeInBytes() * 8 / |
335 target_bitrate_kbps_); | |
323 } | 336 } |
324 | 337 |
325 size_t PacedSender::QueueSizePackets() const { | 338 size_t PacedSender::QueueSizePackets() const { |
326 CriticalSectionScoped cs(critsect_.get()); | 339 CriticalSectionScoped cs(critsect_.get()); |
327 return packets_->SizeInPackets(); | 340 return packets_->SizeInPackets(); |
328 } | 341 } |
329 | 342 |
330 int64_t PacedSender::QueueInMs() const { | 343 int64_t PacedSender::QueueInMs() const { |
331 CriticalSectionScoped cs(critsect_.get()); | 344 CriticalSectionScoped cs(critsect_.get()); |
332 | 345 |
(...skipping 20 matching lines...) Expand all Loading... | |
353 int64_t elapsed_time_us = clock_->TimeInMicroseconds() - time_last_update_us_; | 366 int64_t elapsed_time_us = clock_->TimeInMicroseconds() - time_last_update_us_; |
354 int64_t elapsed_time_ms = (elapsed_time_us + 500) / 1000; | 367 int64_t elapsed_time_ms = (elapsed_time_us + 500) / 1000; |
355 return std::max<int64_t>(kMinPacketLimitMs - elapsed_time_ms, 0); | 368 return std::max<int64_t>(kMinPacketLimitMs - elapsed_time_ms, 0); |
356 } | 369 } |
357 | 370 |
358 void PacedSender::Process() { | 371 void PacedSender::Process() { |
359 int64_t now_us = clock_->TimeInMicroseconds(); | 372 int64_t now_us = clock_->TimeInMicroseconds(); |
360 CriticalSectionScoped cs(critsect_.get()); | 373 CriticalSectionScoped cs(critsect_.get()); |
361 int64_t elapsed_time_ms = (now_us - time_last_update_us_ + 500) / 1000; | 374 int64_t elapsed_time_ms = (now_us - time_last_update_us_ + 500) / 1000; |
362 time_last_update_us_ = now_us; | 375 time_last_update_us_ = now_us; |
363 int target_bitrate_kbps = max_bitrate_kbps_; | 376 int target_bitrate_kbps = target_bitrate_kbps_; |
364 // TODO(holmer): Remove the !paused_ check when issue 5307 has been fixed. | 377 // TODO(holmer): Remove the !paused_ check when issue 5307 has been fixed. |
365 if (!paused_ && elapsed_time_ms > 0) { | 378 if (!paused_ && elapsed_time_ms > 0) { |
366 size_t queue_size_bytes = packets_->SizeInBytes(); | 379 size_t queue_size_bytes = packets_->SizeInBytes(); |
367 if (queue_size_bytes > 0) { | 380 if (queue_size_bytes > 0) { |
368 // Assuming equal size packets and input/output rate, the average packet | 381 // Assuming equal size packets and input/output rate, the average packet |
369 // has avg_time_left_ms left to get queue_size_bytes out of the queue, if | 382 // has avg_time_left_ms left to get queue_size_bytes out of the queue, if |
370 // time constraint shall be met. Determine bitrate needed for that. | 383 // time constraint shall be met. Determine bitrate needed for that. |
371 packets_->UpdateQueueTime(clock_->TimeInMilliseconds()); | 384 packets_->UpdateQueueTime(clock_->TimeInMilliseconds()); |
372 int64_t avg_time_left_ms = std::max<int64_t>( | 385 int64_t avg_time_left_ms = std::max<int64_t>( |
373 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); | 386 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
418 SendPadding(static_cast<size_t>(padding_needed)); | 431 SendPadding(static_cast<size_t>(padding_needed)); |
419 } | 432 } |
420 | 433 |
421 bool PacedSender::SendPacket(const paced_sender::Packet& packet) { | 434 bool PacedSender::SendPacket(const paced_sender::Packet& packet) { |
422 // TODO(holmer): Because of this bug issue 5307 we have to send audio | 435 // TODO(holmer): Because of this bug issue 5307 we have to send audio |
423 // packets even when the pacer is paused. Here we assume audio packets are | 436 // packets even when the pacer is paused. Here we assume audio packets are |
424 // always high priority and that they are the only high priority packets. | 437 // always high priority and that they are the only high priority packets. |
425 if (paused_ && packet.priority != kHighPriority) | 438 if (paused_ && packet.priority != kHighPriority) |
426 return false; | 439 return false; |
427 critsect_->Leave(); | 440 critsect_->Leave(); |
428 const bool success = callback_->TimeToSendPacket(packet.ssrc, | 441 const bool success = delegate_->TimeToSendPacket( |
429 packet.sequence_number, | 442 packet.ssrc, packet.sequence_number, packet.capture_time_ms, |
430 packet.capture_time_ms, | 443 packet.retransmission); |
431 packet.retransmission); | |
432 critsect_->Enter(); | 444 critsect_->Enter(); |
433 | 445 |
434 if (success) { | 446 if (success) { |
435 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes); | 447 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes); |
436 // TODO(holmer): High priority packets should only be accounted for if we | 448 // TODO(holmer): High priority packets should only be accounted for if we |
437 // are allocating bandwidth for audio. | 449 // are allocating bandwidth for audio. |
438 if (packet.priority != kHighPriority) { | 450 if (packet.priority != kHighPriority) { |
439 // Update media bytes sent. | 451 // Update media bytes sent. |
440 media_budget_->UseBudget(packet.bytes); | 452 media_budget_->UseBudget(packet.bytes); |
441 padding_budget_->UseBudget(packet.bytes); | 453 padding_budget_->UseBudget(packet.bytes); |
442 } | 454 } |
443 } | 455 } |
444 | 456 |
445 return success; | 457 return success; |
446 } | 458 } |
447 | 459 |
448 void PacedSender::SendPadding(size_t padding_needed) { | 460 void PacedSender::SendPadding(size_t padding_needed) { |
449 critsect_->Leave(); | 461 critsect_->Leave(); |
450 size_t bytes_sent = callback_->TimeToSendPadding(padding_needed); | 462 size_t bytes_sent = delegate_->TimeToSendPadding(padding_needed); |
451 critsect_->Enter(); | 463 critsect_->Enter(); |
452 | 464 |
453 if (bytes_sent > 0) { | 465 if (bytes_sent > 0) { |
454 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent); | 466 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent); |
455 media_budget_->UseBudget(bytes_sent); | 467 media_budget_->UseBudget(bytes_sent); |
456 padding_budget_->UseBudget(bytes_sent); | 468 padding_budget_->UseBudget(bytes_sent); |
457 } | 469 } |
458 } | 470 } |
459 | 471 |
460 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { | 472 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { |
461 media_budget_->IncreaseBudget(delta_time_ms); | 473 media_budget_->IncreaseBudget(delta_time_ms); |
462 padding_budget_->IncreaseBudget(delta_time_ms); | 474 padding_budget_->IncreaseBudget(delta_time_ms); |
463 } | 475 } |
464 } // namespace webrtc | 476 } // namespace webrtc |
OLD | NEW |