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 15 matching lines...) Expand all Loading... |
26 #include "webrtc/base/location.h" | 26 #include "webrtc/base/location.h" |
27 #include "webrtc/base/logging.h" | 27 #include "webrtc/base/logging.h" |
28 #include "webrtc/base/optional.h" | 28 #include "webrtc/base/optional.h" |
29 #include "webrtc/base/task_queue.h" | 29 #include "webrtc/base/task_queue.h" |
30 #include "webrtc/base/thread_annotations.h" | 30 #include "webrtc/base/thread_annotations.h" |
31 #include "webrtc/base/thread_checker.h" | 31 #include "webrtc/base/thread_checker.h" |
32 #include "webrtc/base/trace_event.h" | 32 #include "webrtc/base/trace_event.h" |
33 #include "webrtc/call/bitrate_allocator.h" | 33 #include "webrtc/call/bitrate_allocator.h" |
34 #include "webrtc/call/call.h" | 34 #include "webrtc/call/call.h" |
35 #include "webrtc/call/flexfec_receive_stream_impl.h" | 35 #include "webrtc/call/flexfec_receive_stream_impl.h" |
| 36 #include "webrtc/call/rtp_transport_controller_send.h" |
36 #include "webrtc/config.h" | 37 #include "webrtc/config.h" |
37 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 38 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
38 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" | 39 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
39 #include "webrtc/modules/congestion_controller/include/receive_side_congestion_c
ontroller.h" | 40 #include "webrtc/modules/congestion_controller/include/receive_side_congestion_c
ontroller.h" |
40 #include "webrtc/modules/congestion_controller/include/send_side_congestion_cont
roller.h" | 41 #include "webrtc/modules/congestion_controller/include/send_side_congestion_cont
roller.h" |
41 #include "webrtc/modules/pacing/paced_sender.h" | 42 #include "webrtc/modules/pacing/paced_sender.h" |
42 #include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" | 43 #include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" |
43 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 44 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
44 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 45 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
45 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 46 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 } | 82 } |
82 | 83 |
83 bool UseSendSideBwe(const AudioReceiveStream::Config& config) { | 84 bool UseSendSideBwe(const AudioReceiveStream::Config& config) { |
84 return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); | 85 return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); |
85 } | 86 } |
86 | 87 |
87 bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) { | 88 bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) { |
88 return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc); | 89 return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc); |
89 } | 90 } |
90 | 91 |
| 92 class RtpTransportControllerSend : public RtpTransportControllerSendInterface { |
| 93 public: |
| 94 RtpTransportControllerSend(Clock* clock, webrtc::RtcEventLog* event_log); |
| 95 |
| 96 void InitCongestionControl(SendSideCongestionController::Observer* observer); |
| 97 PacketRouter* packet_router() override { return &packet_router_; } |
| 98 SendSideCongestionController* send_side_cc() override { |
| 99 return send_side_cc_.get(); |
| 100 } |
| 101 TransportFeedbackObserver* transport_feedback_observer() override { |
| 102 return send_side_cc_.get(); |
| 103 } |
| 104 RtpPacketSender* packet_sender() override { return send_side_cc_->pacer(); } |
| 105 |
| 106 private: |
| 107 Clock* const clock_; |
| 108 webrtc::RtcEventLog* const event_log_; |
| 109 PacketRouter packet_router_; |
| 110 // Construction delayed until InitCongestionControl, since the |
| 111 // CongestionController wants its observer as a construction time |
| 112 // argument, and setting it later seems non-trivial. |
| 113 std::unique_ptr<SendSideCongestionController> send_side_cc_; |
| 114 }; |
| 115 |
| 116 RtpTransportControllerSend::RtpTransportControllerSend( |
| 117 Clock* clock, |
| 118 webrtc::RtcEventLog* event_log) |
| 119 : clock_(clock), event_log_(event_log) {} |
| 120 |
| 121 void RtpTransportControllerSend::InitCongestionControl( |
| 122 SendSideCongestionController::Observer* observer) { |
| 123 // Must be called only once. |
| 124 RTC_CHECK(!send_side_cc_); |
| 125 send_side_cc_.reset(new SendSideCongestionController( |
| 126 clock_, observer, event_log_, &packet_router_)); |
| 127 } |
| 128 |
91 } // namespace | 129 } // namespace |
92 | 130 |
93 namespace internal { | 131 namespace internal { |
94 | 132 |
95 class Call : public webrtc::Call, | 133 class Call : public webrtc::Call, |
96 public PacketReceiver, | 134 public PacketReceiver, |
97 public RecoveredPacketReceiver, | 135 public RecoveredPacketReceiver, |
98 public SendSideCongestionController::Observer, | 136 public SendSideCongestionController::Observer, |
99 public BitrateAllocator::LimitObserver { | 137 public BitrateAllocator::LimitObserver { |
100 public: | 138 public: |
101 explicit Call(const Call::Config& config); | 139 Call(const Call::Config& config, |
| 140 std::unique_ptr<RtpTransportControllerSend> transport_send); |
102 virtual ~Call(); | 141 virtual ~Call(); |
103 | 142 |
104 // Implements webrtc::Call. | 143 // Implements webrtc::Call. |
105 PacketReceiver* Receiver() override; | 144 PacketReceiver* Receiver() override; |
106 | 145 |
107 webrtc::AudioSendStream* CreateAudioSendStream( | 146 webrtc::AudioSendStream* CreateAudioSendStream( |
108 const webrtc::AudioSendStream::Config& config) override; | 147 const webrtc::AudioSendStream::Config& config) override; |
109 void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override; | 148 void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override; |
110 | 149 |
111 webrtc::AudioReceiveStream* CreateAudioReceiveStream( | 150 webrtc::AudioReceiveStream* CreateAudioReceiveStream( |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 // TODO(holmer): Remove this lock once BitrateController no longer calls | 304 // TODO(holmer): Remove this lock once BitrateController no longer calls |
266 // OnNetworkChanged from multiple threads. | 305 // OnNetworkChanged from multiple threads. |
267 rtc::CriticalSection bitrate_crit_; | 306 rtc::CriticalSection bitrate_crit_; |
268 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 307 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
269 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 308 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
270 AvgCounter estimated_send_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); | 309 AvgCounter estimated_send_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
271 AvgCounter pacer_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); | 310 AvgCounter pacer_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
272 | 311 |
273 std::map<std::string, rtc::NetworkRoute> network_routes_; | 312 std::map<std::string, rtc::NetworkRoute> network_routes_; |
274 | 313 |
| 314 std::unique_ptr<RtpTransportControllerSend> transport_send_; |
275 VieRemb remb_; | 315 VieRemb remb_; |
276 PacketRouter packet_router_; | |
277 SendSideCongestionController send_side_cc_; | |
278 ReceiveSideCongestionController receive_side_cc_; | 316 ReceiveSideCongestionController receive_side_cc_; |
279 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; | 317 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; |
280 const int64_t start_ms_; | 318 const int64_t start_ms_; |
281 // TODO(perkj): |worker_queue_| is supposed to replace | 319 // TODO(perkj): |worker_queue_| is supposed to replace |
282 // |module_process_thread_|. | 320 // |module_process_thread_|. |
283 // |worker_queue| is defined last to ensure all pending tasks are cancelled | 321 // |worker_queue| is defined last to ensure all pending tasks are cancelled |
284 // and deleted before any other members. | 322 // and deleted before any other members. |
285 rtc::TaskQueue worker_queue_; | 323 rtc::TaskQueue worker_queue_; |
286 | 324 |
287 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 325 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
288 }; | 326 }; |
289 } // namespace internal | 327 } // namespace internal |
290 | 328 |
291 std::string Call::Stats::ToString(int64_t time_ms) const { | 329 std::string Call::Stats::ToString(int64_t time_ms) const { |
292 std::stringstream ss; | 330 std::stringstream ss; |
293 ss << "Call stats: " << time_ms << ", {"; | 331 ss << "Call stats: " << time_ms << ", {"; |
294 ss << "send_bw_bps: " << send_bandwidth_bps << ", "; | 332 ss << "send_bw_bps: " << send_bandwidth_bps << ", "; |
295 ss << "recv_bw_bps: " << recv_bandwidth_bps << ", "; | 333 ss << "recv_bw_bps: " << recv_bandwidth_bps << ", "; |
296 ss << "max_pad_bps: " << max_padding_bitrate_bps << ", "; | 334 ss << "max_pad_bps: " << max_padding_bitrate_bps << ", "; |
297 ss << "pacer_delay_ms: " << pacer_delay_ms << ", "; | 335 ss << "pacer_delay_ms: " << pacer_delay_ms << ", "; |
298 ss << "rtt_ms: " << rtt_ms; | 336 ss << "rtt_ms: " << rtt_ms; |
299 ss << '}'; | 337 ss << '}'; |
300 return ss.str(); | 338 return ss.str(); |
301 } | 339 } |
302 | 340 |
303 Call* Call::Create(const Call::Config& config) { | 341 Call* Call::Create(const Call::Config& config) { |
304 return new internal::Call(config); | 342 return new internal::Call( |
| 343 config, std::unique_ptr<RtpTransportControllerSend>( |
| 344 new RtpTransportControllerSend(Clock::GetRealTimeClock(), |
| 345 config.event_log))); |
305 } | 346 } |
306 | 347 |
307 namespace internal { | 348 namespace internal { |
308 | 349 |
309 Call::Call(const Call::Config& config) | 350 Call::Call(const Call::Config& config, |
| 351 std::unique_ptr<RtpTransportControllerSend> transport_send) |
310 : clock_(Clock::GetRealTimeClock()), | 352 : clock_(Clock::GetRealTimeClock()), |
311 num_cpu_cores_(CpuInfo::DetectNumberOfCores()), | 353 num_cpu_cores_(CpuInfo::DetectNumberOfCores()), |
312 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), | 354 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), |
313 pacer_thread_(ProcessThread::Create("PacerThread")), | 355 pacer_thread_(ProcessThread::Create("PacerThread")), |
314 call_stats_(new CallStats(clock_)), | 356 call_stats_(new CallStats(clock_)), |
315 bitrate_allocator_(new BitrateAllocator(this)), | 357 bitrate_allocator_(new BitrateAllocator(this)), |
316 config_(config), | 358 config_(config), |
317 audio_network_state_(kNetworkDown), | 359 audio_network_state_(kNetworkDown), |
318 video_network_state_(kNetworkDown), | 360 video_network_state_(kNetworkDown), |
319 receive_crit_(RWLockWrapper::CreateRWLock()), | 361 receive_crit_(RWLockWrapper::CreateRWLock()), |
320 send_crit_(RWLockWrapper::CreateRWLock()), | 362 send_crit_(RWLockWrapper::CreateRWLock()), |
321 event_log_(config.event_log), | 363 event_log_(config.event_log), |
322 first_packet_sent_ms_(-1), | 364 first_packet_sent_ms_(-1), |
323 received_bytes_per_second_counter_(clock_, nullptr, true), | 365 received_bytes_per_second_counter_(clock_, nullptr, true), |
324 received_audio_bytes_per_second_counter_(clock_, nullptr, true), | 366 received_audio_bytes_per_second_counter_(clock_, nullptr, true), |
325 received_video_bytes_per_second_counter_(clock_, nullptr, true), | 367 received_video_bytes_per_second_counter_(clock_, nullptr, true), |
326 received_rtcp_bytes_per_second_counter_(clock_, nullptr, true), | 368 received_rtcp_bytes_per_second_counter_(clock_, nullptr, true), |
327 min_allocated_send_bitrate_bps_(0), | 369 min_allocated_send_bitrate_bps_(0), |
328 configured_max_padding_bitrate_bps_(0), | 370 configured_max_padding_bitrate_bps_(0), |
329 estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), | 371 estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), |
330 pacer_bitrate_kbps_counter_(clock_, nullptr, true), | 372 pacer_bitrate_kbps_counter_(clock_, nullptr, true), |
| 373 transport_send_(std::move(transport_send)), |
331 remb_(clock_), | 374 remb_(clock_), |
332 send_side_cc_(clock_, this, event_log_, &packet_router_), | 375 receive_side_cc_(clock_, &remb_, transport_send_->packet_router()), |
333 receive_side_cc_(clock_, &remb_, &packet_router_), | |
334 video_send_delay_stats_(new SendDelayStats(clock_)), | 376 video_send_delay_stats_(new SendDelayStats(clock_)), |
335 start_ms_(clock_->TimeInMilliseconds()), | 377 start_ms_(clock_->TimeInMilliseconds()), |
336 worker_queue_("call_worker_queue") { | 378 worker_queue_("call_worker_queue") { |
337 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 379 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
338 RTC_DCHECK(config.event_log != nullptr); | 380 RTC_DCHECK(config.event_log != nullptr); |
339 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); | 381 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); |
340 RTC_DCHECK_GT(config.bitrate_config.start_bitrate_bps, | 382 RTC_DCHECK_GT(config.bitrate_config.start_bitrate_bps, |
341 config.bitrate_config.min_bitrate_bps); | 383 config.bitrate_config.min_bitrate_bps); |
342 if (config.bitrate_config.max_bitrate_bps != -1) { | 384 if (config.bitrate_config.max_bitrate_bps != -1) { |
343 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, | 385 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, |
344 config.bitrate_config.start_bitrate_bps); | 386 config.bitrate_config.start_bitrate_bps); |
345 } | 387 } |
346 Trace::CreateTrace(); | 388 Trace::CreateTrace(); |
347 call_stats_->RegisterStatsObserver(&send_side_cc_); | 389 transport_send_->InitCongestionControl(this); |
348 | 390 transport_send_->send_side_cc()->SignalNetworkState(kNetworkDown); |
349 send_side_cc_.SignalNetworkState(kNetworkDown); | 391 transport_send_->send_side_cc()->SetBweBitrates( |
350 send_side_cc_.SetBweBitrates(config_.bitrate_config.min_bitrate_bps, | 392 config_.bitrate_config.min_bitrate_bps, |
351 config_.bitrate_config.start_bitrate_bps, | 393 config_.bitrate_config.start_bitrate_bps, |
352 config_.bitrate_config.max_bitrate_bps); | 394 config_.bitrate_config.max_bitrate_bps); |
| 395 call_stats_->RegisterStatsObserver(transport_send_->send_side_cc()); |
353 | 396 |
354 module_process_thread_->Start(); | 397 module_process_thread_->Start(); |
355 module_process_thread_->RegisterModule(call_stats_.get(), RTC_FROM_HERE); | 398 module_process_thread_->RegisterModule(call_stats_.get(), RTC_FROM_HERE); |
356 module_process_thread_->RegisterModule(&send_side_cc_, RTC_FROM_HERE); | |
357 module_process_thread_->RegisterModule(&receive_side_cc_, RTC_FROM_HERE); | 399 module_process_thread_->RegisterModule(&receive_side_cc_, RTC_FROM_HERE); |
358 pacer_thread_->RegisterModule(send_side_cc_.pacer(), RTC_FROM_HERE); | 400 module_process_thread_->RegisterModule(transport_send_->send_side_cc(), |
| 401 RTC_FROM_HERE); |
| 402 pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), |
| 403 RTC_FROM_HERE); |
359 pacer_thread_->RegisterModule( | 404 pacer_thread_->RegisterModule( |
360 receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); | 405 receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
| 406 |
361 pacer_thread_->Start(); | 407 pacer_thread_->Start(); |
362 } | 408 } |
363 | 409 |
364 Call::~Call() { | 410 Call::~Call() { |
365 RTC_DCHECK(!remb_.InUse()); | 411 RTC_DCHECK(!remb_.InUse()); |
366 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 412 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
367 | 413 |
368 RTC_CHECK(audio_send_ssrcs_.empty()); | 414 RTC_CHECK(audio_send_ssrcs_.empty()); |
369 RTC_CHECK(video_send_ssrcs_.empty()); | 415 RTC_CHECK(video_send_ssrcs_.empty()); |
370 RTC_CHECK(video_send_streams_.empty()); | 416 RTC_CHECK(video_send_streams_.empty()); |
371 RTC_CHECK(audio_receive_ssrcs_.empty()); | 417 RTC_CHECK(audio_receive_ssrcs_.empty()); |
372 RTC_CHECK(video_receive_ssrcs_.empty()); | 418 RTC_CHECK(video_receive_ssrcs_.empty()); |
373 RTC_CHECK(video_receive_streams_.empty()); | 419 RTC_CHECK(video_receive_streams_.empty()); |
374 | 420 |
375 pacer_thread_->Stop(); | 421 pacer_thread_->Stop(); |
376 pacer_thread_->DeRegisterModule(send_side_cc_.pacer()); | 422 pacer_thread_->DeRegisterModule(transport_send_->send_side_cc()->pacer()); |
377 pacer_thread_->DeRegisterModule( | 423 pacer_thread_->DeRegisterModule( |
378 receive_side_cc_.GetRemoteBitrateEstimator(true)); | 424 receive_side_cc_.GetRemoteBitrateEstimator(true)); |
379 module_process_thread_->DeRegisterModule(&send_side_cc_); | 425 module_process_thread_->DeRegisterModule(transport_send_->send_side_cc()); |
380 module_process_thread_->DeRegisterModule(&receive_side_cc_); | 426 module_process_thread_->DeRegisterModule(&receive_side_cc_); |
381 module_process_thread_->DeRegisterModule(call_stats_.get()); | 427 module_process_thread_->DeRegisterModule(call_stats_.get()); |
382 module_process_thread_->Stop(); | 428 module_process_thread_->Stop(); |
383 call_stats_->DeregisterStatsObserver(&send_side_cc_); | 429 call_stats_->DeregisterStatsObserver(transport_send_->send_side_cc()); |
384 | 430 |
385 // Only update histograms after process threads have been shut down, so that | 431 // Only update histograms after process threads have been shut down, so that |
386 // they won't try to concurrently update stats. | 432 // they won't try to concurrently update stats. |
387 { | 433 { |
388 rtc::CritScope lock(&bitrate_crit_); | 434 rtc::CritScope lock(&bitrate_crit_); |
389 UpdateSendHistograms(); | 435 UpdateSendHistograms(); |
390 } | 436 } |
391 UpdateReceiveHistograms(); | 437 UpdateReceiveHistograms(); |
392 UpdateHistograms(); | 438 UpdateHistograms(); |
393 | 439 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 537 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
492 return this; | 538 return this; |
493 } | 539 } |
494 | 540 |
495 webrtc::AudioSendStream* Call::CreateAudioSendStream( | 541 webrtc::AudioSendStream* Call::CreateAudioSendStream( |
496 const webrtc::AudioSendStream::Config& config) { | 542 const webrtc::AudioSendStream::Config& config) { |
497 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); | 543 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); |
498 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 544 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
499 event_log_->LogAudioSendStreamConfig(config); | 545 event_log_->LogAudioSendStreamConfig(config); |
500 AudioSendStream* send_stream = new AudioSendStream( | 546 AudioSendStream* send_stream = new AudioSendStream( |
501 config, config_.audio_state, &worker_queue_, &packet_router_, | 547 config, config_.audio_state, &worker_queue_, transport_send_.get(), |
502 &send_side_cc_, bitrate_allocator_.get(), event_log_, | 548 bitrate_allocator_.get(), event_log_, call_stats_->rtcp_rtt_stats()); |
503 call_stats_->rtcp_rtt_stats()); | |
504 { | 549 { |
505 WriteLockScoped write_lock(*send_crit_); | 550 WriteLockScoped write_lock(*send_crit_); |
506 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == | 551 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == |
507 audio_send_ssrcs_.end()); | 552 audio_send_ssrcs_.end()); |
508 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; | 553 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; |
509 } | 554 } |
510 { | 555 { |
511 ReadLockScoped read_lock(*receive_crit_); | 556 ReadLockScoped read_lock(*receive_crit_); |
512 for (const auto& kv : audio_receive_ssrcs_) { | 557 for (const auto& kv : audio_receive_ssrcs_) { |
513 if (kv.second->config().rtp.local_ssrc == config.rtp.ssrc) { | 558 if (kv.second->config().rtp.local_ssrc == config.rtp.ssrc) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 } | 590 } |
546 UpdateAggregateNetworkState(); | 591 UpdateAggregateNetworkState(); |
547 delete audio_send_stream; | 592 delete audio_send_stream; |
548 } | 593 } |
549 | 594 |
550 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 595 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
551 const webrtc::AudioReceiveStream::Config& config) { | 596 const webrtc::AudioReceiveStream::Config& config) { |
552 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 597 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
553 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 598 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
554 event_log_->LogAudioReceiveStreamConfig(config); | 599 event_log_->LogAudioReceiveStreamConfig(config); |
555 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 600 AudioReceiveStream* receive_stream = |
556 &packet_router_, config, | 601 new AudioReceiveStream(transport_send_->packet_router(), config, |
557 config_.audio_state, event_log_); | 602 config_.audio_state, event_log_); |
558 { | 603 { |
559 WriteLockScoped write_lock(*receive_crit_); | 604 WriteLockScoped write_lock(*receive_crit_); |
560 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 605 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
561 audio_receive_ssrcs_.end()); | 606 audio_receive_ssrcs_.end()); |
562 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 607 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
563 receive_rtp_config_[config.rtp.remote_ssrc] = | 608 receive_rtp_config_[config.rtp.remote_ssrc] = |
564 ReceiveRtpConfig(config.rtp.extensions, UseSendSideBwe(config)); | 609 ReceiveRtpConfig(config.rtp.extensions, UseSendSideBwe(config)); |
565 | 610 |
566 ConfigureSync(config.sync_group); | 611 ConfigureSync(config.sync_group); |
567 } | 612 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 | 658 |
614 video_send_delay_stats_->AddSsrcs(config); | 659 video_send_delay_stats_->AddSsrcs(config); |
615 event_log_->LogVideoSendStreamConfig(config); | 660 event_log_->LogVideoSendStreamConfig(config); |
616 | 661 |
617 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if | 662 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if |
618 // the call has already started. | 663 // the call has already started. |
619 // Copy ssrcs from |config| since |config| is moved. | 664 // Copy ssrcs from |config| since |config| is moved. |
620 std::vector<uint32_t> ssrcs = config.rtp.ssrcs; | 665 std::vector<uint32_t> ssrcs = config.rtp.ssrcs; |
621 VideoSendStream* send_stream = new VideoSendStream( | 666 VideoSendStream* send_stream = new VideoSendStream( |
622 num_cpu_cores_, module_process_thread_.get(), &worker_queue_, | 667 num_cpu_cores_, module_process_thread_.get(), &worker_queue_, |
623 call_stats_.get(), &send_side_cc_, &packet_router_, | 668 call_stats_.get(), transport_send_.get(), bitrate_allocator_.get(), |
624 bitrate_allocator_.get(), video_send_delay_stats_.get(), &remb_, | 669 video_send_delay_stats_.get(), &remb_, event_log_, std::move(config), |
625 event_log_, std::move(config), std::move(encoder_config), | 670 std::move(encoder_config), suspended_video_send_ssrcs_); |
626 suspended_video_send_ssrcs_); | |
627 | 671 |
628 { | 672 { |
629 WriteLockScoped write_lock(*send_crit_); | 673 WriteLockScoped write_lock(*send_crit_); |
630 for (uint32_t ssrc : ssrcs) { | 674 for (uint32_t ssrc : ssrcs) { |
631 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); | 675 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); |
632 video_send_ssrcs_[ssrc] = send_stream; | 676 video_send_ssrcs_[ssrc] = send_stream; |
633 } | 677 } |
634 video_send_streams_.insert(send_stream); | 678 video_send_streams_.insert(send_stream); |
635 } | 679 } |
636 send_stream->SignalNetworkState(video_network_state_); | 680 send_stream->SignalNetworkState(video_network_state_); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 UpdateAggregateNetworkState(); | 717 UpdateAggregateNetworkState(); |
674 delete send_stream_impl; | 718 delete send_stream_impl; |
675 } | 719 } |
676 | 720 |
677 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( | 721 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( |
678 webrtc::VideoReceiveStream::Config configuration) { | 722 webrtc::VideoReceiveStream::Config configuration) { |
679 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); | 723 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); |
680 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 724 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
681 | 725 |
682 VideoReceiveStream* receive_stream = new VideoReceiveStream( | 726 VideoReceiveStream* receive_stream = new VideoReceiveStream( |
683 num_cpu_cores_, &packet_router_, std::move(configuration), | 727 num_cpu_cores_, transport_send_->packet_router(), |
684 module_process_thread_.get(), call_stats_.get(), &remb_); | 728 std::move(configuration), module_process_thread_.get(), call_stats_.get(), |
| 729 &remb_); |
685 | 730 |
686 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); | 731 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); |
687 ReceiveRtpConfig receive_config(config.rtp.extensions, | 732 ReceiveRtpConfig receive_config(config.rtp.extensions, |
688 UseSendSideBwe(config)); | 733 UseSendSideBwe(config)); |
689 { | 734 { |
690 WriteLockScoped write_lock(*receive_crit_); | 735 WriteLockScoped write_lock(*receive_crit_); |
691 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 736 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
692 video_receive_ssrcs_.end()); | 737 video_receive_ssrcs_.end()); |
693 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 738 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
694 if (config.rtp.rtx_ssrc) { | 739 if (config.rtp.rtx_ssrc) { |
695 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream; | 740 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream; |
696 // We record identical config for the rtx stream as for the main | 741 // We record identical config for the rtx stream as for the main |
697 // stream. Since the transport_cc negotiation is per payload | 742 // stream. Since the transport_send_cc negotiation is per payload |
698 // type, we may get an incorrect value for the rtx stream, but | 743 // type, we may get an incorrect value for the rtx stream, but |
699 // that is unlikely to matter in practice. | 744 // that is unlikely to matter in practice. |
700 receive_rtp_config_[config.rtp.rtx_ssrc] = receive_config; | 745 receive_rtp_config_[config.rtp.rtx_ssrc] = receive_config; |
701 } | 746 } |
702 receive_rtp_config_[config.rtp.remote_ssrc] = receive_config; | 747 receive_rtp_config_[config.rtp.remote_ssrc] = receive_config; |
703 video_receive_streams_.insert(receive_stream); | 748 video_receive_streams_.insert(receive_stream); |
704 ConfigureSync(config.sync_group); | 749 ConfigureSync(config.sync_group); |
705 } | 750 } |
706 receive_stream->SignalNetworkState(video_network_state_); | 751 receive_stream->SignalNetworkState(video_network_state_); |
707 UpdateAggregateNetworkState(); | 752 UpdateAggregateNetworkState(); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 delete receive_stream_impl; | 867 delete receive_stream_impl; |
823 } | 868 } |
824 | 869 |
825 Call::Stats Call::GetStats() const { | 870 Call::Stats Call::GetStats() const { |
826 // TODO(solenberg): Some test cases in EndToEndTest use this from a different | 871 // TODO(solenberg): Some test cases in EndToEndTest use this from a different |
827 // thread. Re-enable once that is fixed. | 872 // thread. Re-enable once that is fixed. |
828 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 873 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
829 Stats stats; | 874 Stats stats; |
830 // Fetch available send/receive bitrates. | 875 // Fetch available send/receive bitrates. |
831 uint32_t send_bandwidth = 0; | 876 uint32_t send_bandwidth = 0; |
832 send_side_cc_.GetBitrateController()->AvailableBandwidth(&send_bandwidth); | 877 transport_send_->send_side_cc()->GetBitrateController()->AvailableBandwidth( |
| 878 &send_bandwidth); |
833 std::vector<unsigned int> ssrcs; | 879 std::vector<unsigned int> ssrcs; |
834 uint32_t recv_bandwidth = 0; | 880 uint32_t recv_bandwidth = 0; |
835 receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate( | 881 receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate( |
836 &ssrcs, &recv_bandwidth); | 882 &ssrcs, &recv_bandwidth); |
837 stats.send_bandwidth_bps = send_bandwidth; | 883 stats.send_bandwidth_bps = send_bandwidth; |
838 stats.recv_bandwidth_bps = recv_bandwidth; | 884 stats.recv_bandwidth_bps = recv_bandwidth; |
839 stats.pacer_delay_ms = send_side_cc_.GetPacerQueuingDelayMs(); | 885 stats.pacer_delay_ms = |
| 886 transport_send_->send_side_cc()->GetPacerQueuingDelayMs(); |
840 stats.rtt_ms = call_stats_->rtcp_rtt_stats()->LastProcessedRtt(); | 887 stats.rtt_ms = call_stats_->rtcp_rtt_stats()->LastProcessedRtt(); |
841 { | 888 { |
842 rtc::CritScope cs(&bitrate_crit_); | 889 rtc::CritScope cs(&bitrate_crit_); |
843 stats.max_padding_bitrate_bps = configured_max_padding_bitrate_bps_; | 890 stats.max_padding_bitrate_bps = configured_max_padding_bitrate_bps_; |
844 } | 891 } |
845 return stats; | 892 return stats; |
846 } | 893 } |
847 | 894 |
848 void Call::SetBitrateConfig( | 895 void Call::SetBitrateConfig( |
849 const webrtc::Call::Config::BitrateConfig& bitrate_config) { | 896 const webrtc::Call::Config::BitrateConfig& bitrate_config) { |
(...skipping 12 matching lines...) Expand all Loading... |
862 // Nothing new to set, early abort to avoid encoder reconfigurations. | 909 // Nothing new to set, early abort to avoid encoder reconfigurations. |
863 return; | 910 return; |
864 } | 911 } |
865 config_.bitrate_config.min_bitrate_bps = bitrate_config.min_bitrate_bps; | 912 config_.bitrate_config.min_bitrate_bps = bitrate_config.min_bitrate_bps; |
866 // Start bitrate of -1 means we should keep the old bitrate, which there is | 913 // Start bitrate of -1 means we should keep the old bitrate, which there is |
867 // no point in remembering for the future. | 914 // no point in remembering for the future. |
868 if (bitrate_config.start_bitrate_bps > 0) | 915 if (bitrate_config.start_bitrate_bps > 0) |
869 config_.bitrate_config.start_bitrate_bps = bitrate_config.start_bitrate_bps; | 916 config_.bitrate_config.start_bitrate_bps = bitrate_config.start_bitrate_bps; |
870 config_.bitrate_config.max_bitrate_bps = bitrate_config.max_bitrate_bps; | 917 config_.bitrate_config.max_bitrate_bps = bitrate_config.max_bitrate_bps; |
871 RTC_DCHECK_NE(bitrate_config.start_bitrate_bps, 0); | 918 RTC_DCHECK_NE(bitrate_config.start_bitrate_bps, 0); |
872 send_side_cc_.SetBweBitrates(bitrate_config.min_bitrate_bps, | 919 transport_send_->send_side_cc()->SetBweBitrates( |
873 bitrate_config.start_bitrate_bps, | 920 bitrate_config.min_bitrate_bps, bitrate_config.start_bitrate_bps, |
874 bitrate_config.max_bitrate_bps); | 921 bitrate_config.max_bitrate_bps); |
875 } | 922 } |
876 | 923 |
877 void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { | 924 void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { |
878 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 925 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
879 switch (media) { | 926 switch (media) { |
880 case MediaType::AUDIO: | 927 case MediaType::AUDIO: |
881 audio_network_state_ = state; | 928 audio_network_state_ = state; |
882 break; | 929 break; |
883 case MediaType::VIDEO: | 930 case MediaType::VIDEO: |
884 video_network_state_ = state; | 931 video_network_state_ = state; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 kv->second = network_route; | 1006 kv->second = network_route; |
960 LOG(LS_INFO) << "Network route changed on transport " << transport_name | 1007 LOG(LS_INFO) << "Network route changed on transport " << transport_name |
961 << ": new local network id " << network_route.local_network_id | 1008 << ": new local network id " << network_route.local_network_id |
962 << " new remote network id " << network_route.remote_network_id | 1009 << " new remote network id " << network_route.remote_network_id |
963 << " Reset bitrates to min: " | 1010 << " Reset bitrates to min: " |
964 << config_.bitrate_config.min_bitrate_bps | 1011 << config_.bitrate_config.min_bitrate_bps |
965 << " bps, start: " << config_.bitrate_config.start_bitrate_bps | 1012 << " bps, start: " << config_.bitrate_config.start_bitrate_bps |
966 << " bps, max: " << config_.bitrate_config.start_bitrate_bps | 1013 << " bps, max: " << config_.bitrate_config.start_bitrate_bps |
967 << " bps."; | 1014 << " bps."; |
968 RTC_DCHECK_GT(config_.bitrate_config.start_bitrate_bps, 0); | 1015 RTC_DCHECK_GT(config_.bitrate_config.start_bitrate_bps, 0); |
969 send_side_cc_.OnNetworkRouteChanged( | 1016 transport_send_->send_side_cc()->OnNetworkRouteChanged( |
970 network_route, config_.bitrate_config.start_bitrate_bps, | 1017 network_route, config_.bitrate_config.start_bitrate_bps, |
971 config_.bitrate_config.min_bitrate_bps, | 1018 config_.bitrate_config.min_bitrate_bps, |
972 config_.bitrate_config.max_bitrate_bps); | 1019 config_.bitrate_config.max_bitrate_bps); |
973 } | 1020 } |
974 } | 1021 } |
975 | 1022 |
976 void Call::UpdateAggregateNetworkState() { | 1023 void Call::UpdateAggregateNetworkState() { |
977 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 1024 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
978 | 1025 |
979 bool have_audio = false; | 1026 bool have_audio = false; |
(...skipping 15 matching lines...) Expand all Loading... |
995 | 1042 |
996 NetworkState aggregate_state = kNetworkDown; | 1043 NetworkState aggregate_state = kNetworkDown; |
997 if ((have_video && video_network_state_ == kNetworkUp) || | 1044 if ((have_video && video_network_state_ == kNetworkUp) || |
998 (have_audio && audio_network_state_ == kNetworkUp)) { | 1045 (have_audio && audio_network_state_ == kNetworkUp)) { |
999 aggregate_state = kNetworkUp; | 1046 aggregate_state = kNetworkUp; |
1000 } | 1047 } |
1001 | 1048 |
1002 LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregate_state=" | 1049 LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregate_state=" |
1003 << (aggregate_state == kNetworkUp ? "up" : "down"); | 1050 << (aggregate_state == kNetworkUp ? "up" : "down"); |
1004 | 1051 |
1005 send_side_cc_.SignalNetworkState(aggregate_state); | 1052 transport_send_->send_side_cc()->SignalNetworkState(aggregate_state); |
1006 } | 1053 } |
1007 | 1054 |
1008 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { | 1055 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { |
1009 if (first_packet_sent_ms_ == -1) | 1056 if (first_packet_sent_ms_ == -1) |
1010 first_packet_sent_ms_ = clock_->TimeInMilliseconds(); | 1057 first_packet_sent_ms_ = clock_->TimeInMilliseconds(); |
1011 video_send_delay_stats_->OnSentPacket(sent_packet.packet_id, | 1058 video_send_delay_stats_->OnSentPacket(sent_packet.packet_id, |
1012 clock_->TimeInMilliseconds()); | 1059 clock_->TimeInMilliseconds()); |
1013 send_side_cc_.OnSentPacket(sent_packet); | 1060 transport_send_->send_side_cc()->OnSentPacket(sent_packet); |
1014 } | 1061 } |
1015 | 1062 |
1016 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, | 1063 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, |
1017 uint8_t fraction_loss, | 1064 uint8_t fraction_loss, |
1018 int64_t rtt_ms, | 1065 int64_t rtt_ms, |
1019 int64_t probing_interval_ms) { | 1066 int64_t probing_interval_ms) { |
1020 // TODO(perkj): Consider making sure CongestionController operates on | 1067 // TODO(perkj): Consider making sure CongestionController operates on |
1021 // |worker_queue_|. | 1068 // |worker_queue_|. |
1022 if (!worker_queue_.IsCurrent()) { | 1069 if (!worker_queue_.IsCurrent()) { |
1023 worker_queue_.PostTask( | 1070 worker_queue_.PostTask( |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 } | 1103 } |
1057 estimated_send_bitrate_kbps_counter_.Add(target_bitrate_bps / 1000); | 1104 estimated_send_bitrate_kbps_counter_.Add(target_bitrate_bps / 1000); |
1058 // Pacer bitrate may be higher than bitrate estimate if enforcing min bitrate. | 1105 // Pacer bitrate may be higher than bitrate estimate if enforcing min bitrate. |
1059 uint32_t pacer_bitrate_bps = | 1106 uint32_t pacer_bitrate_bps = |
1060 std::max(target_bitrate_bps, min_allocated_send_bitrate_bps_); | 1107 std::max(target_bitrate_bps, min_allocated_send_bitrate_bps_); |
1061 pacer_bitrate_kbps_counter_.Add(pacer_bitrate_bps / 1000); | 1108 pacer_bitrate_kbps_counter_.Add(pacer_bitrate_bps / 1000); |
1062 } | 1109 } |
1063 | 1110 |
1064 void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, | 1111 void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, |
1065 uint32_t max_padding_bitrate_bps) { | 1112 uint32_t max_padding_bitrate_bps) { |
1066 send_side_cc_.SetAllocatedSendBitrateLimits(min_send_bitrate_bps, | 1113 transport_send_->send_side_cc()->SetAllocatedSendBitrateLimits( |
1067 max_padding_bitrate_bps); | 1114 min_send_bitrate_bps, max_padding_bitrate_bps); |
1068 rtc::CritScope lock(&bitrate_crit_); | 1115 rtc::CritScope lock(&bitrate_crit_); |
1069 min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; | 1116 min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; |
1070 configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; | 1117 configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; |
1071 } | 1118 } |
1072 | 1119 |
1073 void Call::ConfigureSync(const std::string& sync_group) { | 1120 void Call::ConfigureSync(const std::string& sync_group) { |
1074 // Set sync only if there was no previous one. | 1121 // Set sync only if there was no previous one. |
1075 if (sync_group.empty()) | 1122 if (sync_group.empty()) |
1076 return; | 1123 return; |
1077 | 1124 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 // should be fixed to use the same MediaType as the production code. | 1323 // should be fixed to use the same MediaType as the production code. |
1277 if (media_type != MediaType::AUDIO || | 1324 if (media_type != MediaType::AUDIO || |
1278 (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { | 1325 (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { |
1279 receive_side_cc_.OnReceivedPacket( | 1326 receive_side_cc_.OnReceivedPacket( |
1280 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), | 1327 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), |
1281 header); | 1328 header); |
1282 } | 1329 } |
1283 } | 1330 } |
1284 | 1331 |
1285 } // namespace internal | 1332 } // namespace internal |
| 1333 |
1286 } // namespace webrtc | 1334 } // namespace webrtc |
OLD | NEW |