Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Unified Diff: webrtc/call/call.cc

Issue 1757683002: Make the audio channel communicate network state changes to the call. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Made the Call class keep track of network state for audio and video separately Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_));
}
}
}

Powered by Google App Engine
This is Rietveld 408576698