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_)); |
} |
} |
} |