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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
79 | 79 |
80 Stats GetStats() const override; | 80 Stats GetStats() const override; |
81 | 81 |
82 DeliveryStatus DeliverPacket(MediaType media_type, | 82 DeliveryStatus DeliverPacket(MediaType media_type, |
83 const uint8_t* packet, | 83 const uint8_t* packet, |
84 size_t length, | 84 size_t length, |
85 const PacketTime& packet_time) override; | 85 const PacketTime& packet_time) override; |
86 | 86 |
87 void SetBitrateConfig( | 87 void SetBitrateConfig( |
88 const webrtc::Call::Config::BitrateConfig& bitrate_config) override; | 88 const webrtc::Call::Config::BitrateConfig& bitrate_config) override; |
89 void SignalNetworkState(NetworkState state) override; | 89 |
90 void SignalChannelNetworkState(MediaType media, NetworkState state) override; | |
90 | 91 |
91 void OnSentPacket(const rtc::SentPacket& sent_packet) override; | 92 void OnSentPacket(const rtc::SentPacket& sent_packet) override; |
92 | 93 |
93 // Implements BitrateObserver. | 94 // Implements BitrateObserver. |
94 void OnNetworkChanged(uint32_t bitrate_bps, uint8_t fraction_loss, | 95 void OnNetworkChanged(uint32_t bitrate_bps, uint8_t fraction_loss, |
95 int64_t rtt_ms) override; | 96 int64_t rtt_ms) override; |
96 | 97 |
97 private: | 98 private: |
98 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet, | 99 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet, |
99 size_t length); | 100 size_t length); |
100 DeliveryStatus DeliverRtp(MediaType media_type, | 101 DeliveryStatus DeliverRtp(MediaType media_type, |
101 const uint8_t* packet, | 102 const uint8_t* packet, |
102 size_t length, | 103 size_t length, |
103 const PacketTime& packet_time); | 104 const PacketTime& packet_time); |
104 | 105 |
105 void ConfigureSync(const std::string& sync_group) | 106 void ConfigureSync(const std::string& sync_group) |
106 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); | 107 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); |
107 | 108 |
108 VoiceEngine* voice_engine() { | 109 VoiceEngine* voice_engine() { |
109 internal::AudioState* audio_state = | 110 internal::AudioState* audio_state = |
110 static_cast<internal::AudioState*>(config_.audio_state.get()); | 111 static_cast<internal::AudioState*>(config_.audio_state.get()); |
111 if (audio_state) | 112 if (audio_state) |
112 return audio_state->voice_engine(); | 113 return audio_state->voice_engine(); |
113 else | 114 else |
114 return nullptr; | 115 return nullptr; |
115 } | 116 } |
116 | 117 |
117 void UpdateSendHistograms() EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_); | 118 void UpdateSendHistograms() EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_); |
118 void UpdateReceiveHistograms(); | 119 void UpdateReceiveHistograms(); |
120 void UpdateAggregateNetworkState(); | |
119 | 121 |
120 Clock* const clock_; | 122 Clock* const clock_; |
121 | 123 |
122 const int num_cpu_cores_; | 124 const int num_cpu_cores_; |
123 const rtc::scoped_ptr<ProcessThread> module_process_thread_; | 125 const rtc::scoped_ptr<ProcessThread> module_process_thread_; |
124 const rtc::scoped_ptr<ProcessThread> pacer_thread_; | 126 const rtc::scoped_ptr<ProcessThread> pacer_thread_; |
125 const rtc::scoped_ptr<CallStats> call_stats_; | 127 const rtc::scoped_ptr<CallStats> call_stats_; |
126 const rtc::scoped_ptr<BitrateAllocator> bitrate_allocator_; | 128 const rtc::scoped_ptr<BitrateAllocator> bitrate_allocator_; |
127 Call::Config config_; | 129 Call::Config config_; |
128 rtc::ThreadChecker configuration_thread_checker_; | 130 rtc::ThreadChecker configuration_thread_checker_; |
129 | 131 |
130 bool network_enabled_; | 132 NetworkState audio_network_state_; |
133 NetworkState video_network_state_; | |
131 | 134 |
132 rtc::scoped_ptr<RWLockWrapper> receive_crit_; | 135 rtc::scoped_ptr<RWLockWrapper> receive_crit_; |
133 // Audio and Video receive streams are owned by the client that creates them. | 136 // Audio and Video receive streams are owned by the client that creates them. |
134 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ | 137 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ |
135 GUARDED_BY(receive_crit_); | 138 GUARDED_BY(receive_crit_); |
136 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ | 139 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ |
137 GUARDED_BY(receive_crit_); | 140 GUARDED_BY(receive_crit_); |
138 std::set<VideoReceiveStream*> video_receive_streams_ | 141 std::set<VideoReceiveStream*> video_receive_streams_ |
139 GUARDED_BY(receive_crit_); | 142 GUARDED_BY(receive_crit_); |
140 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ | 143 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
181 namespace internal { | 184 namespace internal { |
182 | 185 |
183 Call::Call(const Call::Config& config) | 186 Call::Call(const Call::Config& config) |
184 : clock_(Clock::GetRealTimeClock()), | 187 : clock_(Clock::GetRealTimeClock()), |
185 num_cpu_cores_(CpuInfo::DetectNumberOfCores()), | 188 num_cpu_cores_(CpuInfo::DetectNumberOfCores()), |
186 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), | 189 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), |
187 pacer_thread_(ProcessThread::Create("PacerThread")), | 190 pacer_thread_(ProcessThread::Create("PacerThread")), |
188 call_stats_(new CallStats(clock_)), | 191 call_stats_(new CallStats(clock_)), |
189 bitrate_allocator_(new BitrateAllocator()), | 192 bitrate_allocator_(new BitrateAllocator()), |
190 config_(config), | 193 config_(config), |
191 network_enabled_(true), | 194 audio_network_state_(kNetworkUp), |
195 video_network_state_(kNetworkUp), | |
192 receive_crit_(RWLockWrapper::CreateRWLock()), | 196 receive_crit_(RWLockWrapper::CreateRWLock()), |
193 send_crit_(RWLockWrapper::CreateRWLock()), | 197 send_crit_(RWLockWrapper::CreateRWLock()), |
194 received_video_bytes_(0), | 198 received_video_bytes_(0), |
195 received_audio_bytes_(0), | 199 received_audio_bytes_(0), |
196 received_rtcp_bytes_(0), | 200 received_rtcp_bytes_(0), |
197 first_rtp_packet_received_ms_(-1), | 201 first_rtp_packet_received_ms_(-1), |
198 last_rtp_packet_received_ms_(-1), | 202 last_rtp_packet_received_ms_(-1), |
199 first_packet_sent_ms_(-1), | 203 first_packet_sent_ms_(-1), |
200 estimated_send_bitrate_sum_kbits_(0), | 204 estimated_send_bitrate_sum_kbits_(0), |
201 pacer_bitrate_sum_kbits_(0), | 205 pacer_bitrate_sum_kbits_(0), |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 313 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
310 return this; | 314 return this; |
311 } | 315 } |
312 | 316 |
313 webrtc::AudioSendStream* Call::CreateAudioSendStream( | 317 webrtc::AudioSendStream* Call::CreateAudioSendStream( |
314 const webrtc::AudioSendStream::Config& config) { | 318 const webrtc::AudioSendStream::Config& config) { |
315 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); | 319 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); |
316 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 320 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
317 AudioSendStream* send_stream = new AudioSendStream( | 321 AudioSendStream* send_stream = new AudioSendStream( |
318 config, config_.audio_state, congestion_controller_.get()); | 322 config, config_.audio_state, congestion_controller_.get()); |
319 if (!network_enabled_) | |
320 send_stream->SignalNetworkState(kNetworkDown); | |
321 { | 323 { |
322 WriteLockScoped write_lock(*send_crit_); | 324 WriteLockScoped write_lock(*send_crit_); |
323 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == | 325 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == |
324 audio_send_ssrcs_.end()); | 326 audio_send_ssrcs_.end()); |
325 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; | 327 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; |
326 } | 328 } |
329 send_stream->SignalNetworkState(audio_network_state_); | |
330 UpdateAggregateNetworkState(); | |
327 return send_stream; | 331 return send_stream; |
328 } | 332 } |
329 | 333 |
330 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { | 334 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { |
331 TRACE_EVENT0("webrtc", "Call::DestroyAudioSendStream"); | 335 TRACE_EVENT0("webrtc", "Call::DestroyAudioSendStream"); |
332 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 336 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
333 RTC_DCHECK(send_stream != nullptr); | 337 RTC_DCHECK(send_stream != nullptr); |
334 | 338 |
335 send_stream->Stop(); | 339 send_stream->Stop(); |
336 | 340 |
337 webrtc::internal::AudioSendStream* audio_send_stream = | 341 webrtc::internal::AudioSendStream* audio_send_stream = |
338 static_cast<webrtc::internal::AudioSendStream*>(send_stream); | 342 static_cast<webrtc::internal::AudioSendStream*>(send_stream); |
339 { | 343 { |
340 WriteLockScoped write_lock(*send_crit_); | 344 WriteLockScoped write_lock(*send_crit_); |
341 size_t num_deleted = audio_send_ssrcs_.erase( | 345 size_t num_deleted = audio_send_ssrcs_.erase( |
342 audio_send_stream->config().rtp.ssrc); | 346 audio_send_stream->config().rtp.ssrc); |
343 RTC_DCHECK(num_deleted == 1); | 347 RTC_DCHECK(num_deleted == 1); |
344 } | 348 } |
349 UpdateAggregateNetworkState(); | |
345 delete audio_send_stream; | 350 delete audio_send_stream; |
346 } | 351 } |
347 | 352 |
348 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 353 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
349 const webrtc::AudioReceiveStream::Config& config) { | 354 const webrtc::AudioReceiveStream::Config& config) { |
350 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 355 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
351 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 356 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
352 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 357 AudioReceiveStream* receive_stream = new AudioReceiveStream( |
353 congestion_controller_.get(), config, config_.audio_state); | 358 congestion_controller_.get(), config, config_.audio_state); |
354 { | 359 { |
355 WriteLockScoped write_lock(*receive_crit_); | 360 WriteLockScoped write_lock(*receive_crit_); |
356 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 361 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
357 audio_receive_ssrcs_.end()); | 362 audio_receive_ssrcs_.end()); |
358 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 363 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
359 ConfigureSync(config.sync_group); | 364 ConfigureSync(config.sync_group); |
360 } | 365 } |
366 receive_stream->SignalNetworkState(audio_network_state_); | |
367 UpdateAggregateNetworkState(); | |
361 return receive_stream; | 368 return receive_stream; |
362 } | 369 } |
363 | 370 |
364 void Call::DestroyAudioReceiveStream( | 371 void Call::DestroyAudioReceiveStream( |
365 webrtc::AudioReceiveStream* receive_stream) { | 372 webrtc::AudioReceiveStream* receive_stream) { |
366 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); | 373 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); |
367 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 374 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
368 RTC_DCHECK(receive_stream != nullptr); | 375 RTC_DCHECK(receive_stream != nullptr); |
369 webrtc::internal::AudioReceiveStream* audio_receive_stream = | 376 webrtc::internal::AudioReceiveStream* audio_receive_stream = |
370 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); | 377 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); |
371 { | 378 { |
372 WriteLockScoped write_lock(*receive_crit_); | 379 WriteLockScoped write_lock(*receive_crit_); |
373 size_t num_deleted = audio_receive_ssrcs_.erase( | 380 size_t num_deleted = audio_receive_ssrcs_.erase( |
374 audio_receive_stream->config().rtp.remote_ssrc); | 381 audio_receive_stream->config().rtp.remote_ssrc); |
375 RTC_DCHECK(num_deleted == 1); | 382 RTC_DCHECK(num_deleted == 1); |
376 const std::string& sync_group = audio_receive_stream->config().sync_group; | 383 const std::string& sync_group = audio_receive_stream->config().sync_group; |
377 const auto it = sync_stream_mapping_.find(sync_group); | 384 const auto it = sync_stream_mapping_.find(sync_group); |
378 if (it != sync_stream_mapping_.end() && | 385 if (it != sync_stream_mapping_.end() && |
379 it->second == audio_receive_stream) { | 386 it->second == audio_receive_stream) { |
380 sync_stream_mapping_.erase(it); | 387 sync_stream_mapping_.erase(it); |
381 ConfigureSync(sync_group); | 388 ConfigureSync(sync_group); |
382 } | 389 } |
383 } | 390 } |
391 UpdateAggregateNetworkState(); | |
384 delete audio_receive_stream; | 392 delete audio_receive_stream; |
385 } | 393 } |
386 | 394 |
387 webrtc::VideoSendStream* Call::CreateVideoSendStream( | 395 webrtc::VideoSendStream* Call::CreateVideoSendStream( |
388 const webrtc::VideoSendStream::Config& config, | 396 const webrtc::VideoSendStream::Config& config, |
389 const VideoEncoderConfig& encoder_config) { | 397 const VideoEncoderConfig& encoder_config) { |
390 TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream"); | 398 TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream"); |
391 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 399 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
392 | 400 |
393 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if | 401 // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if |
394 // the call has already started. | 402 // the call has already started. |
395 VideoSendStream* send_stream = new VideoSendStream( | 403 VideoSendStream* send_stream = new VideoSendStream( |
396 num_cpu_cores_, module_process_thread_.get(), call_stats_.get(), | 404 num_cpu_cores_, module_process_thread_.get(), call_stats_.get(), |
397 congestion_controller_.get(), &remb_, bitrate_allocator_.get(), config, | 405 congestion_controller_.get(), &remb_, bitrate_allocator_.get(), config, |
398 encoder_config, suspended_video_send_ssrcs_); | 406 encoder_config, suspended_video_send_ssrcs_); |
399 | 407 { |
400 if (!network_enabled_) | 408 WriteLockScoped write_lock(*send_crit_); |
401 send_stream->SignalNetworkState(kNetworkDown); | 409 for (uint32_t ssrc : config.rtp.ssrcs) { |
402 | 410 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); |
403 WriteLockScoped write_lock(*send_crit_); | 411 video_send_ssrcs_[ssrc] = send_stream; |
404 for (uint32_t ssrc : config.rtp.ssrcs) { | 412 } |
405 RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end()); | 413 video_send_streams_.insert(send_stream); |
406 video_send_ssrcs_[ssrc] = send_stream; | 414 send_stream->SignalNetworkState(video_network_state_); |
the sun
2016/03/07 14:16:43
Move SignalNetworkState(), logging and UpdateAggre
skvlad
2016/03/07 19:20:56
Done.
| |
415 if (event_log_) | |
416 event_log_->LogVideoSendStreamConfig(config); | |
407 } | 417 } |
408 video_send_streams_.insert(send_stream); | 418 UpdateAggregateNetworkState(); |
409 | |
410 if (event_log_) | |
411 event_log_->LogVideoSendStreamConfig(config); | |
412 | |
413 return send_stream; | 419 return send_stream; |
414 } | 420 } |
415 | 421 |
416 void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) { | 422 void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) { |
417 TRACE_EVENT0("webrtc", "Call::DestroyVideoSendStream"); | 423 TRACE_EVENT0("webrtc", "Call::DestroyVideoSendStream"); |
418 RTC_DCHECK(send_stream != nullptr); | 424 RTC_DCHECK(send_stream != nullptr); |
419 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 425 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
420 | 426 |
421 send_stream->Stop(); | 427 send_stream->Stop(); |
422 | 428 |
(...skipping 14 matching lines...) Expand all Loading... | |
437 RTC_CHECK(send_stream_impl != nullptr); | 443 RTC_CHECK(send_stream_impl != nullptr); |
438 | 444 |
439 VideoSendStream::RtpStateMap rtp_state = send_stream_impl->GetRtpStates(); | 445 VideoSendStream::RtpStateMap rtp_state = send_stream_impl->GetRtpStates(); |
440 | 446 |
441 for (VideoSendStream::RtpStateMap::iterator it = rtp_state.begin(); | 447 for (VideoSendStream::RtpStateMap::iterator it = rtp_state.begin(); |
442 it != rtp_state.end(); | 448 it != rtp_state.end(); |
443 ++it) { | 449 ++it) { |
444 suspended_video_send_ssrcs_[it->first] = it->second; | 450 suspended_video_send_ssrcs_[it->first] = it->second; |
445 } | 451 } |
446 | 452 |
453 UpdateAggregateNetworkState(); | |
447 delete send_stream_impl; | 454 delete send_stream_impl; |
448 } | 455 } |
449 | 456 |
450 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( | 457 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( |
451 const webrtc::VideoReceiveStream::Config& config) { | 458 const webrtc::VideoReceiveStream::Config& config) { |
452 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); | 459 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); |
453 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 460 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
454 VideoReceiveStream* receive_stream = new VideoReceiveStream( | 461 VideoReceiveStream* receive_stream = new VideoReceiveStream( |
455 num_cpu_cores_, congestion_controller_.get(), config, voice_engine(), | 462 num_cpu_cores_, congestion_controller_.get(), config, voice_engine(), |
456 module_process_thread_.get(), call_stats_.get(), &remb_); | 463 module_process_thread_.get(), call_stats_.get(), &remb_); |
464 { | |
465 WriteLockScoped write_lock(*receive_crit_); | |
466 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == | |
467 video_receive_ssrcs_.end()); | |
468 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | |
469 // TODO(pbos): Configure different RTX payloads per receive payload. | |
470 VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it = | |
471 config.rtp.rtx.begin(); | |
472 if (it != config.rtp.rtx.end()) | |
473 video_receive_ssrcs_[it->second.ssrc] = receive_stream; | |
474 video_receive_streams_.insert(receive_stream); | |
457 | 475 |
458 WriteLockScoped write_lock(*receive_crit_); | 476 ConfigureSync(config.sync_group); |
459 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 477 } |
460 video_receive_ssrcs_.end()); | 478 receive_stream->SignalNetworkState(video_network_state_); |
the sun
2016/03/07 14:16:43
Like above: signal, update, log
There shouldn't be
skvlad
2016/03/07 19:20:56
Done.
| |
461 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | |
462 // TODO(pbos): Configure different RTX payloads per receive payload. | |
463 VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it = | |
464 config.rtp.rtx.begin(); | |
465 if (it != config.rtp.rtx.end()) | |
466 video_receive_ssrcs_[it->second.ssrc] = receive_stream; | |
467 video_receive_streams_.insert(receive_stream); | |
468 | |
469 ConfigureSync(config.sync_group); | |
470 | |
471 if (!network_enabled_) | |
472 receive_stream->SignalNetworkState(kNetworkDown); | |
473 | 479 |
474 if (event_log_) | 480 if (event_log_) |
475 event_log_->LogVideoReceiveStreamConfig(config); | 481 event_log_->LogVideoReceiveStreamConfig(config); |
476 | 482 |
483 UpdateAggregateNetworkState(); | |
477 return receive_stream; | 484 return receive_stream; |
478 } | 485 } |
479 | 486 |
480 void Call::DestroyVideoReceiveStream( | 487 void Call::DestroyVideoReceiveStream( |
481 webrtc::VideoReceiveStream* receive_stream) { | 488 webrtc::VideoReceiveStream* receive_stream) { |
482 TRACE_EVENT0("webrtc", "Call::DestroyVideoReceiveStream"); | 489 TRACE_EVENT0("webrtc", "Call::DestroyVideoReceiveStream"); |
483 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 490 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
484 RTC_DCHECK(receive_stream != nullptr); | 491 RTC_DCHECK(receive_stream != nullptr); |
485 VideoReceiveStream* receive_stream_impl = nullptr; | 492 VideoReceiveStream* receive_stream_impl = nullptr; |
486 { | 493 { |
487 WriteLockScoped write_lock(*receive_crit_); | 494 WriteLockScoped write_lock(*receive_crit_); |
488 // Remove all ssrcs pointing to a receive stream. As RTX retransmits on a | 495 // Remove all ssrcs pointing to a receive stream. As RTX retransmits on a |
489 // separate SSRC there can be either one or two. | 496 // separate SSRC there can be either one or two. |
490 auto it = video_receive_ssrcs_.begin(); | 497 auto it = video_receive_ssrcs_.begin(); |
491 while (it != video_receive_ssrcs_.end()) { | 498 while (it != video_receive_ssrcs_.end()) { |
492 if (it->second == static_cast<VideoReceiveStream*>(receive_stream)) { | 499 if (it->second == static_cast<VideoReceiveStream*>(receive_stream)) { |
493 if (receive_stream_impl != nullptr) | 500 if (receive_stream_impl != nullptr) |
494 RTC_DCHECK(receive_stream_impl == it->second); | 501 RTC_DCHECK(receive_stream_impl == it->second); |
495 receive_stream_impl = it->second; | 502 receive_stream_impl = it->second; |
496 video_receive_ssrcs_.erase(it++); | 503 video_receive_ssrcs_.erase(it++); |
497 } else { | 504 } else { |
498 ++it; | 505 ++it; |
499 } | 506 } |
500 } | 507 } |
501 video_receive_streams_.erase(receive_stream_impl); | 508 video_receive_streams_.erase(receive_stream_impl); |
502 RTC_CHECK(receive_stream_impl != nullptr); | 509 RTC_CHECK(receive_stream_impl != nullptr); |
503 ConfigureSync(receive_stream_impl->config().sync_group); | 510 ConfigureSync(receive_stream_impl->config().sync_group); |
504 } | 511 } |
512 UpdateAggregateNetworkState(); | |
505 delete receive_stream_impl; | 513 delete receive_stream_impl; |
506 } | 514 } |
507 | 515 |
508 Call::Stats Call::GetStats() const { | 516 Call::Stats Call::GetStats() const { |
509 // TODO(solenberg): Some test cases in EndToEndTest use this from a different | 517 // TODO(solenberg): Some test cases in EndToEndTest use this from a different |
510 // thread. Re-enable once that is fixed. | 518 // thread. Re-enable once that is fixed. |
511 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 519 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
512 Stats stats; | 520 Stats stats; |
513 // Fetch available send/receive bitrates. | 521 // Fetch available send/receive bitrates. |
514 uint32_t send_bandwidth = 0; | 522 uint32_t send_bandwidth = 0; |
(...skipping 26 matching lines...) Expand all Loading... | |
541 bitrate_config.max_bitrate_bps) { | 549 bitrate_config.max_bitrate_bps) { |
542 // Nothing new to set, early abort to avoid encoder reconfigurations. | 550 // Nothing new to set, early abort to avoid encoder reconfigurations. |
543 return; | 551 return; |
544 } | 552 } |
545 config_.bitrate_config = bitrate_config; | 553 config_.bitrate_config = bitrate_config; |
546 congestion_controller_->SetBweBitrates(bitrate_config.min_bitrate_bps, | 554 congestion_controller_->SetBweBitrates(bitrate_config.min_bitrate_bps, |
547 bitrate_config.start_bitrate_bps, | 555 bitrate_config.start_bitrate_bps, |
548 bitrate_config.max_bitrate_bps); | 556 bitrate_config.max_bitrate_bps); |
549 } | 557 } |
550 | 558 |
551 void Call::SignalNetworkState(NetworkState state) { | 559 void Call::SignalChannelNetworkState(MediaType media, |
560 NetworkState state) { | |
552 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 561 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
553 network_enabled_ = state == kNetworkUp; | 562 if (media == MediaType::AUDIO) |
the sun
2016/03/07 14:16:43
is MediaType::DATA ok?
I would prefer a
switch (me
skvlad
2016/03/07 19:20:56
Done.
| |
554 congestion_controller_->SignalNetworkState(state); | 563 audio_network_state_ = state; |
564 if (media == MediaType::VIDEO) | |
565 video_network_state_ = state; | |
566 | |
567 UpdateAggregateNetworkState(); | |
555 { | 568 { |
556 ReadLockScoped write_lock(*send_crit_); | 569 ReadLockScoped read_lock(*send_crit_); |
557 for (auto& kv : audio_send_ssrcs_) { | 570 for (auto& kv : audio_send_ssrcs_) { |
558 kv.second->SignalNetworkState(state); | 571 kv.second->SignalNetworkState(audio_network_state_); |
559 } | 572 } |
560 for (auto& kv : video_send_ssrcs_) { | 573 for (auto& kv : video_send_ssrcs_) { |
561 kv.second->SignalNetworkState(state); | 574 kv.second->SignalNetworkState(video_network_state_); |
562 } | 575 } |
563 } | 576 } |
564 { | 577 { |
565 ReadLockScoped write_lock(*receive_crit_); | 578 ReadLockScoped read_lock(*receive_crit_); |
579 for (auto& kv : audio_receive_ssrcs_) { | |
580 kv.second->SignalNetworkState(audio_network_state_); | |
581 } | |
566 for (auto& kv : video_receive_ssrcs_) { | 582 for (auto& kv : video_receive_ssrcs_) { |
567 kv.second->SignalNetworkState(state); | 583 kv.second->SignalNetworkState(video_network_state_); |
568 } | 584 } |
569 } | 585 } |
570 } | 586 } |
571 | 587 |
588 void Call::UpdateAggregateNetworkState() { | |
589 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | |
590 | |
591 bool haveVideo = false; | |
592 bool haveAudio = false; | |
593 { | |
594 ReadLockScoped read_lock(*send_crit_); | |
595 if (audio_send_ssrcs_.size() > 0) haveAudio = true; | |
596 if (video_send_ssrcs_.size() > 0) haveVideo = true; | |
597 } | |
598 { | |
599 ReadLockScoped read_lock(*receive_crit_); | |
600 if (audio_receive_ssrcs_.size() > 0) haveAudio = true; | |
601 if (video_receive_ssrcs_.size() > 0) haveVideo = true; | |
602 } | |
603 | |
604 NetworkState aggregateState = kNetworkDown; | |
605 if ((!haveVideo && !haveAudio) || | |
the sun
2016/03/07 14:16:43
Hmm, was this a special case for the tests? If so,
skvlad
2016/03/07 19:20:56
This used to be a special case for the tests in th
| |
606 (haveVideo && video_network_state_ == kNetworkUp) || | |
607 (haveAudio && audio_network_state_ == kNetworkUp)) { | |
608 aggregateState = kNetworkUp; | |
609 } | |
610 | |
611 LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregateState=" << | |
612 (aggregateState == kNetworkUp ? "up" : "down"); | |
613 | |
614 congestion_controller_ -> SignalNetworkState(aggregateState); | |
615 } | |
616 | |
572 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { | 617 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { |
573 if (first_packet_sent_ms_ == -1) | 618 if (first_packet_sent_ms_ == -1) |
574 first_packet_sent_ms_ = clock_->TimeInMilliseconds(); | 619 first_packet_sent_ms_ = clock_->TimeInMilliseconds(); |
575 congestion_controller_->OnSentPacket(sent_packet); | 620 congestion_controller_->OnSentPacket(sent_packet); |
576 } | 621 } |
577 | 622 |
578 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, uint8_t fraction_loss, | 623 void Call::OnNetworkChanged(uint32_t target_bitrate_bps, uint8_t fraction_loss, |
579 int64_t rtt_ms) { | 624 int64_t rtt_ms) { |
580 uint32_t allocated_bitrate_bps = bitrate_allocator_->OnNetworkChanged( | 625 uint32_t allocated_bitrate_bps = bitrate_allocator_->OnNetworkChanged( |
581 target_bitrate_bps, fraction_loss, rtt_ms); | 626 target_bitrate_bps, fraction_loss, rtt_ms); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
744 // thread. Then this check can be enabled. | 789 // thread. Then this check can be enabled. |
745 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); | 790 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); |
746 if (RtpHeaderParser::IsRtcp(packet, length)) | 791 if (RtpHeaderParser::IsRtcp(packet, length)) |
747 return DeliverRtcp(media_type, packet, length); | 792 return DeliverRtcp(media_type, packet, length); |
748 | 793 |
749 return DeliverRtp(media_type, packet, length, packet_time); | 794 return DeliverRtp(media_type, packet, length, packet_time); |
750 } | 795 } |
751 | 796 |
752 } // namespace internal | 797 } // namespace internal |
753 } // namespace webrtc | 798 } // namespace webrtc |
OLD | NEW |