Chromium Code Reviews| Index: webrtc/call/call.cc |
| diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc |
| index 41ac328eab14f44249a20d7ac0dba85a36bb9d1d..64fcc072e1326891ad2b4298358797213eed6ed8 100644 |
| --- a/webrtc/call/call.cc |
| +++ b/webrtc/call/call.cc |
| @@ -86,7 +86,9 @@ class Call : public webrtc::Call, public PacketReceiver, |
| void SetBitrateConfig( |
| const webrtc::Call::Config::BitrateConfig& bitrate_config) override; |
| - void SignalNetworkState(NetworkState state) override; |
| + |
| + void SignalChannelNetworkState(MediaType media, |
| + ChannelNetworkState state) override; |
| void OnSentPacket(const rtc::SentPacket& sent_packet) override; |
| @@ -127,7 +129,8 @@ class Call : public webrtc::Call, public PacketReceiver, |
| Call::Config config_; |
| rtc::ThreadChecker configuration_thread_checker_; |
| - bool network_enabled_; |
| + ChannelNetworkState audio_network_state_; |
| + ChannelNetworkState video_network_state_; |
| rtc::scoped_ptr<RWLockWrapper> receive_crit_; |
| // Audio and Video receive streams are owned by the client that creates them. |
| @@ -178,6 +181,30 @@ Call* Call::Create(const Call::Config& config) { |
| return new internal::Call(config); |
| } |
| +NetworkState ChannelStateToNetworkState(ChannelNetworkState channelState) { |
| + return (channelState == ChannelNetworkState::CHANNEL_NETWORK_DOWN ? |
| + kNetworkDown : kNetworkUp); |
| +} |
| + |
| +NetworkState AggregateNetworkState(ChannelNetworkState channelA, |
| + ChannelNetworkState channelB) { |
| + NetworkState aggregateState = kNetworkDown; |
| + if (channelA == ChannelNetworkState::CHANNEL_NOT_PRESENT && |
| + channelB == ChannelNetworkState::CHANNEL_NOT_PRESENT) { |
| + // When no channels are configured - such as in tests - |
| + // the network is assumed to be up |
| + aggregateState = kNetworkUp; |
| + } else if (channelA == ChannelNetworkState::CHANNEL_NETWORK_UP || |
| + channelB == ChannelNetworkState::CHANNEL_NETWORK_UP) { |
| + // There is at least one channel that reports the network to be up |
| + aggregateState = kNetworkUp; |
| + } else { |
| + // All the channels report that the network is down |
| + aggregateState = kNetworkDown; |
| + } |
| + return aggregateState; |
| +} |
| + |
| namespace internal { |
| Call::Call(const Call::Config& config) |
| @@ -188,7 +215,8 @@ Call::Call(const Call::Config& config) |
| call_stats_(new CallStats(clock_)), |
| bitrate_allocator_(new BitrateAllocator()), |
| config_(config), |
| - network_enabled_(true), |
| + audio_network_state_(ChannelNetworkState::CHANNEL_NOT_PRESENT), |
| + video_network_state_(ChannelNetworkState::CHANNEL_NOT_PRESENT), |
| receive_crit_(RWLockWrapper::CreateRWLock()), |
| send_crit_(RWLockWrapper::CreateRWLock()), |
| received_video_bytes_(0), |
| @@ -316,8 +344,9 @@ webrtc::AudioSendStream* Call::CreateAudioSendStream( |
| RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
| AudioSendStream* send_stream = new AudioSendStream( |
| config, config_.audio_state, congestion_controller_.get()); |
| - if (!network_enabled_) |
| - send_stream->SignalNetworkState(kNetworkDown); |
| + |
| + send_stream->SignalNetworkState( |
| + ChannelStateToNetworkState(audio_network_state_)); |
| { |
| WriteLockScoped write_lock(*send_crit_); |
| RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == |
| @@ -397,8 +426,8 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream( |
| congestion_controller_.get(), &remb_, bitrate_allocator_.get(), config, |
| encoder_config, suspended_video_send_ssrcs_); |
| - if (!network_enabled_) |
| - send_stream->SignalNetworkState(kNetworkDown); |
| + send_stream->SignalNetworkState( |
| + ChannelStateToNetworkState(video_network_state_)); |
| WriteLockScoped write_lock(*send_crit_); |
| for (uint32_t ssrc : config.rtp.ssrcs) { |
| @@ -468,8 +497,8 @@ webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( |
| ConfigureSync(config.sync_group); |
| - if (!network_enabled_) |
| - receive_stream->SignalNetworkState(kNetworkDown); |
| + receive_stream->SignalNetworkState( |
|
the sun
2016/03/04 12:40:48
For the send streams, the network state is signale
|
| + ChannelStateToNetworkState(video_network_state_)); |
| if (event_log_) |
| event_log_->LogVideoReceiveStreamConfig(config); |
| @@ -548,23 +577,35 @@ void Call::SetBitrateConfig( |
| bitrate_config.max_bitrate_bps); |
| } |
| -void Call::SignalNetworkState(NetworkState state) { |
| +void Call::SignalChannelNetworkState(MediaType media, |
| + ChannelNetworkState state) { |
| RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
| - network_enabled_ = state == kNetworkUp; |
| - congestion_controller_->SignalNetworkState(state); |
| + if (media == MediaType::AUDIO) |
| + audio_network_state_ = state; |
| + if (media == MediaType::VIDEO) |
| + video_network_state_ = state; |
| + |
| + NetworkState aggregateState = AggregateNetworkState(audio_network_state_, |
| + video_network_state_); |
| + LOG(LS_INFO) << "SignalChannelNetworkState: aggregateState=" << |
| + (aggregateState == kNetworkUp ? "up" : "down"); |
| + congestion_controller_->SignalNetworkState(aggregateState); |
| { |
| ReadLockScoped write_lock(*send_crit_); |
| for (auto& kv : audio_send_ssrcs_) { |
| - kv.second->SignalNetworkState(state); |
| + kv.second->SignalNetworkState( |
| + ChannelStateToNetworkState(audio_network_state_)); |
| } |
| for (auto& kv : video_send_ssrcs_) { |
| - kv.second->SignalNetworkState(state); |
| + kv.second->SignalNetworkState( |
| + ChannelStateToNetworkState(video_network_state_)); |
| } |
| } |
| { |
| ReadLockScoped write_lock(*receive_crit_); |
| for (auto& kv : video_receive_ssrcs_) { |
| - kv.second->SignalNetworkState(state); |
| + kv.second->SignalNetworkState( |
| + ChannelStateToNetworkState(video_network_state_)); |
| } |
| } |
| } |