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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 #include "webrtc/system_wrappers/include/clock.h" | 49 #include "webrtc/system_wrappers/include/clock.h" |
50 #include "webrtc/system_wrappers/include/cpu_info.h" | 50 #include "webrtc/system_wrappers/include/cpu_info.h" |
51 #include "webrtc/system_wrappers/include/metrics.h" | 51 #include "webrtc/system_wrappers/include/metrics.h" |
52 #include "webrtc/system_wrappers/include/rw_lock_wrapper.h" | 52 #include "webrtc/system_wrappers/include/rw_lock_wrapper.h" |
53 #include "webrtc/system_wrappers/include/trace.h" | 53 #include "webrtc/system_wrappers/include/trace.h" |
54 #include "webrtc/video/call_stats.h" | 54 #include "webrtc/video/call_stats.h" |
55 #include "webrtc/video/send_delay_stats.h" | 55 #include "webrtc/video/send_delay_stats.h" |
56 #include "webrtc/video/stats_counter.h" | 56 #include "webrtc/video/stats_counter.h" |
57 #include "webrtc/video/video_receive_stream.h" | 57 #include "webrtc/video/video_receive_stream.h" |
58 #include "webrtc/video/video_send_stream.h" | 58 #include "webrtc/video/video_send_stream.h" |
59 #include "webrtc/video/vie_remb.h" | |
60 | 59 |
61 namespace webrtc { | 60 namespace webrtc { |
62 | 61 |
63 const int Call::Config::kDefaultStartBitrateBps = 300000; | 62 const int Call::Config::kDefaultStartBitrateBps = 300000; |
64 | 63 |
65 namespace { | 64 namespace { |
66 | 65 |
67 // TODO(nisse): This really begs for a shared context struct. | 66 // TODO(nisse): This really begs for a shared context struct. |
68 bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, | 67 bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, |
69 bool transport_cc) { | 68 bool transport_cc) { |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 // OnNetworkChanged from multiple threads. | 303 // OnNetworkChanged from multiple threads. |
305 rtc::CriticalSection bitrate_crit_; | 304 rtc::CriticalSection bitrate_crit_; |
306 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 305 uint32_t min_allocated_send_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
307 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); | 306 uint32_t configured_max_padding_bitrate_bps_ GUARDED_BY(&bitrate_crit_); |
308 AvgCounter estimated_send_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); | 307 AvgCounter estimated_send_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
309 AvgCounter pacer_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); | 308 AvgCounter pacer_bitrate_kbps_counter_ GUARDED_BY(&bitrate_crit_); |
310 | 309 |
311 std::map<std::string, rtc::NetworkRoute> network_routes_; | 310 std::map<std::string, rtc::NetworkRoute> network_routes_; |
312 | 311 |
313 std::unique_ptr<RtpTransportControllerSend> transport_send_; | 312 std::unique_ptr<RtpTransportControllerSend> transport_send_; |
314 VieRemb remb_; | |
315 ReceiveSideCongestionController receive_side_cc_; | 313 ReceiveSideCongestionController receive_side_cc_; |
316 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; | 314 const std::unique_ptr<SendDelayStats> video_send_delay_stats_; |
317 const int64_t start_ms_; | 315 const int64_t start_ms_; |
318 // TODO(perkj): |worker_queue_| is supposed to replace | 316 // TODO(perkj): |worker_queue_| is supposed to replace |
319 // |module_process_thread_|. | 317 // |module_process_thread_|. |
320 // |worker_queue| is defined last to ensure all pending tasks are cancelled | 318 // |worker_queue| is defined last to ensure all pending tasks are cancelled |
321 // and deleted before any other members. | 319 // and deleted before any other members. |
322 rtc::TaskQueue worker_queue_; | 320 rtc::TaskQueue worker_queue_; |
323 | 321 |
324 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 322 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 first_packet_sent_ms_(-1), | 361 first_packet_sent_ms_(-1), |
364 received_bytes_per_second_counter_(clock_, nullptr, true), | 362 received_bytes_per_second_counter_(clock_, nullptr, true), |
365 received_audio_bytes_per_second_counter_(clock_, nullptr, true), | 363 received_audio_bytes_per_second_counter_(clock_, nullptr, true), |
366 received_video_bytes_per_second_counter_(clock_, nullptr, true), | 364 received_video_bytes_per_second_counter_(clock_, nullptr, true), |
367 received_rtcp_bytes_per_second_counter_(clock_, nullptr, true), | 365 received_rtcp_bytes_per_second_counter_(clock_, nullptr, true), |
368 min_allocated_send_bitrate_bps_(0), | 366 min_allocated_send_bitrate_bps_(0), |
369 configured_max_padding_bitrate_bps_(0), | 367 configured_max_padding_bitrate_bps_(0), |
370 estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), | 368 estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), |
371 pacer_bitrate_kbps_counter_(clock_, nullptr, true), | 369 pacer_bitrate_kbps_counter_(clock_, nullptr, true), |
372 transport_send_(std::move(transport_send)), | 370 transport_send_(std::move(transport_send)), |
373 remb_(clock_), | 371 receive_side_cc_(clock_, transport_send_->packet_router()), |
374 receive_side_cc_(clock_, &remb_, transport_send_->packet_router()), | |
375 video_send_delay_stats_(new SendDelayStats(clock_)), | 372 video_send_delay_stats_(new SendDelayStats(clock_)), |
376 start_ms_(clock_->TimeInMilliseconds()), | 373 start_ms_(clock_->TimeInMilliseconds()), |
377 worker_queue_("call_worker_queue") { | 374 worker_queue_("call_worker_queue") { |
378 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 375 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
379 RTC_DCHECK(config.event_log != nullptr); | 376 RTC_DCHECK(config.event_log != nullptr); |
380 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); | 377 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); |
381 RTC_DCHECK_GT(config.bitrate_config.start_bitrate_bps, | 378 RTC_DCHECK_GT(config.bitrate_config.start_bitrate_bps, |
382 config.bitrate_config.min_bitrate_bps); | 379 config.bitrate_config.min_bitrate_bps); |
383 if (config.bitrate_config.max_bitrate_bps != -1) { | 380 if (config.bitrate_config.max_bitrate_bps != -1) { |
384 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, | 381 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, |
(...skipping 16 matching lines...) Expand all Loading... |
401 RTC_FROM_HERE); | 398 RTC_FROM_HERE); |
402 pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), | 399 pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), |
403 RTC_FROM_HERE); | 400 RTC_FROM_HERE); |
404 pacer_thread_->RegisterModule( | 401 pacer_thread_->RegisterModule( |
405 receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); | 402 receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
406 | 403 |
407 pacer_thread_->Start(); | 404 pacer_thread_->Start(); |
408 } | 405 } |
409 | 406 |
410 Call::~Call() { | 407 Call::~Call() { |
411 RTC_DCHECK(!remb_.InUse()); | |
412 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 408 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
413 | 409 |
414 RTC_CHECK(audio_send_ssrcs_.empty()); | 410 RTC_CHECK(audio_send_ssrcs_.empty()); |
415 RTC_CHECK(video_send_ssrcs_.empty()); | 411 RTC_CHECK(video_send_ssrcs_.empty()); |
416 RTC_CHECK(video_send_streams_.empty()); | 412 RTC_CHECK(video_send_streams_.empty()); |
417 RTC_CHECK(audio_receive_ssrcs_.empty()); | 413 RTC_CHECK(audio_receive_ssrcs_.empty()); |
418 RTC_CHECK(video_receive_ssrcs_.empty()); | 414 RTC_CHECK(video_receive_ssrcs_.empty()); |
419 RTC_CHECK(video_receive_streams_.empty()); | 415 RTC_CHECK(video_receive_streams_.empty()); |
420 | 416 |
421 pacer_thread_->Stop(); | 417 pacer_thread_->Stop(); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 video_send_delay_stats_->AddSsrcs(config); | 656 video_send_delay_stats_->AddSsrcs(config); |
661 event_log_->LogVideoSendStreamConfig(config); | 657 event_log_->LogVideoSendStreamConfig(config); |
662 | 658 |
663 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if | 659 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if |
664 // the call has already started. | 660 // the call has already started. |
665 // Copy ssrcs from |config| since |config| is moved. | 661 // Copy ssrcs from |config| since |config| is moved. |
666 std::vector<uint32_t> ssrcs = config.rtp.ssrcs; | 662 std::vector<uint32_t> ssrcs = config.rtp.ssrcs; |
667 VideoSendStream* send_stream = new VideoSendStream( | 663 VideoSendStream* send_stream = new VideoSendStream( |
668 num_cpu_cores_, module_process_thread_.get(), &worker_queue_, | 664 num_cpu_cores_, module_process_thread_.get(), &worker_queue_, |
669 call_stats_.get(), transport_send_.get(), bitrate_allocator_.get(), | 665 call_stats_.get(), transport_send_.get(), bitrate_allocator_.get(), |
670 video_send_delay_stats_.get(), &remb_, event_log_, std::move(config), | 666 video_send_delay_stats_.get(), event_log_, std::move(config), |
671 std::move(encoder_config), suspended_video_send_ssrcs_); | 667 std::move(encoder_config), suspended_video_send_ssrcs_); |
672 | 668 |
673 { | 669 { |
674 WriteLockScoped write_lock(*send_crit_); | 670 WriteLockScoped write_lock(*send_crit_); |
675 for (uint32_t ssrc : ssrcs) { | 671 for (uint32_t ssrc : ssrcs) { |
676 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); | 672 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); |
677 video_send_ssrcs_[ssrc] = send_stream; | 673 video_send_ssrcs_[ssrc] = send_stream; |
678 } | 674 } |
679 video_send_streams_.insert(send_stream); | 675 video_send_streams_.insert(send_stream); |
680 } | 676 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 | 713 |
718 UpdateAggregateNetworkState(); | 714 UpdateAggregateNetworkState(); |
719 delete send_stream_impl; | 715 delete send_stream_impl; |
720 } | 716 } |
721 | 717 |
722 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( | 718 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( |
723 webrtc::VideoReceiveStream::Config configuration) { | 719 webrtc::VideoReceiveStream::Config configuration) { |
724 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); | 720 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); |
725 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 721 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
726 | 722 |
727 VideoReceiveStream* receive_stream = new VideoReceiveStream( | 723 VideoReceiveStream* receive_stream = |
728 num_cpu_cores_, transport_send_->packet_router(), | 724 new VideoReceiveStream(num_cpu_cores_, transport_send_->packet_router(), |
729 std::move(configuration), module_process_thread_.get(), call_stats_.get(), | 725 std::move(configuration), |
730 &remb_); | 726 module_process_thread_.get(), call_stats_.get()); |
731 | 727 |
732 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); | 728 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); |
733 ReceiveRtpConfig receive_config(config.rtp.extensions, | 729 ReceiveRtpConfig receive_config(config.rtp.extensions, |
734 UseSendSideBwe(config)); | 730 UseSendSideBwe(config)); |
735 { | 731 { |
736 WriteLockScoped write_lock(*receive_crit_); | 732 WriteLockScoped write_lock(*receive_crit_); |
737 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 733 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
738 video_receive_ssrcs_.end()); | 734 video_receive_ssrcs_.end()); |
739 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 735 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
740 if (config.rtp.rtx_ssrc) { | 736 if (config.rtp.rtx_ssrc) { |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { | 1321 (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { |
1326 receive_side_cc_.OnReceivedPacket( | 1322 receive_side_cc_.OnReceivedPacket( |
1327 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), | 1323 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), |
1328 header); | 1324 header); |
1329 } | 1325 } |
1330 } | 1326 } |
1331 | 1327 |
1332 } // namespace internal | 1328 } // namespace internal |
1333 | 1329 |
1334 } // namespace webrtc | 1330 } // namespace webrtc |
OLD | NEW |