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

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: Use the presence of send/receive streams to infer which media types are active 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..5eb190693bcc5da0f9b7a92e36444ed8700cc2c1 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -86,7 +86,8 @@ 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, NetworkState state) override;
void OnSentPacket(const rtc::SentPacket& sent_packet) override;
@@ -116,6 +117,7 @@ class Call : public webrtc::Call, public PacketReceiver,
void UpdateSendHistograms() EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_);
void UpdateReceiveHistograms();
+ void UpdateAggregateNetworkState();
Clock* const clock_;
@@ -127,7 +129,8 @@ class Call : public webrtc::Call, public PacketReceiver,
Call::Config config_;
rtc::ThreadChecker configuration_thread_checker_;
- bool network_enabled_;
+ NetworkState audio_network_state_;
+ NetworkState video_network_state_;
rtc::scoped_ptr<RWLockWrapper> receive_crit_;
// Audio and Video receive streams are owned by the client that creates them.
@@ -188,7 +191,8 @@ Call::Call(const Call::Config& config)
call_stats_(new CallStats(clock_)),
bitrate_allocator_(new BitrateAllocator()),
config_(config),
- network_enabled_(true),
+ audio_network_state_(kNetworkUp),
+ video_network_state_(kNetworkUp),
receive_crit_(RWLockWrapper::CreateRWLock()),
send_crit_(RWLockWrapper::CreateRWLock()),
received_video_bytes_(0),
@@ -316,14 +320,14 @@ 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);
{
WriteLockScoped write_lock(*send_crit_);
RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) ==
audio_send_ssrcs_.end());
audio_send_ssrcs_[config.rtp.ssrc] = send_stream;
}
+ send_stream->SignalNetworkState(audio_network_state_);
+ UpdateAggregateNetworkState();
return send_stream;
}
@@ -342,6 +346,7 @@ void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
audio_send_stream->config().rtp.ssrc);
RTC_DCHECK(num_deleted == 1);
}
+ UpdateAggregateNetworkState();
delete audio_send_stream;
}
@@ -358,6 +363,8 @@ webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream(
audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
ConfigureSync(config.sync_group);
}
+ receive_stream->SignalNetworkState(audio_network_state_);
+ UpdateAggregateNetworkState();
return receive_stream;
}
@@ -381,6 +388,7 @@ void Call::DestroyAudioReceiveStream(
ConfigureSync(sync_group);
}
}
+ UpdateAggregateNetworkState();
delete audio_receive_stream;
}
@@ -396,20 +404,18 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream(
num_cpu_cores_, module_process_thread_.get(), call_stats_.get(),
congestion_controller_.get(), &remb_, bitrate_allocator_.get(), config,
encoder_config, suspended_video_send_ssrcs_);
-
- if (!network_enabled_)
- send_stream->SignalNetworkState(kNetworkDown);
-
- WriteLockScoped write_lock(*send_crit_);
- for (uint32_t ssrc : config.rtp.ssrcs) {
- RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end());
- video_send_ssrcs_[ssrc] = send_stream;
+ {
+ WriteLockScoped write_lock(*send_crit_);
+ for (uint32_t ssrc : config.rtp.ssrcs) {
+ RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end());
+ video_send_ssrcs_[ssrc] = send_stream;
+ }
+ video_send_streams_.insert(send_stream);
+ 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.
+ if (event_log_)
+ event_log_->LogVideoSendStreamConfig(config);
}
- video_send_streams_.insert(send_stream);
-
- if (event_log_)
- event_log_->LogVideoSendStreamConfig(config);
-
+ UpdateAggregateNetworkState();
return send_stream;
}
@@ -444,6 +450,7 @@ void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
suspended_video_send_ssrcs_[it->first] = it->second;
}
+ UpdateAggregateNetworkState();
delete send_stream_impl;
}
@@ -454,26 +461,26 @@ webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream(
VideoReceiveStream* receive_stream = new VideoReceiveStream(
num_cpu_cores_, congestion_controller_.get(), config, voice_engine(),
module_process_thread_.get(), call_stats_.get(), &remb_);
+ {
+ WriteLockScoped write_lock(*receive_crit_);
+ RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
+ video_receive_ssrcs_.end());
+ video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
+ // TODO(pbos): Configure different RTX payloads per receive payload.
+ VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it =
+ config.rtp.rtx.begin();
+ if (it != config.rtp.rtx.end())
+ video_receive_ssrcs_[it->second.ssrc] = receive_stream;
+ video_receive_streams_.insert(receive_stream);
- WriteLockScoped write_lock(*receive_crit_);
- RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
- video_receive_ssrcs_.end());
- video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
- // TODO(pbos): Configure different RTX payloads per receive payload.
- VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it =
- config.rtp.rtx.begin();
- if (it != config.rtp.rtx.end())
- video_receive_ssrcs_[it->second.ssrc] = receive_stream;
- video_receive_streams_.insert(receive_stream);
-
- ConfigureSync(config.sync_group);
-
- if (!network_enabled_)
- receive_stream->SignalNetworkState(kNetworkDown);
+ ConfigureSync(config.sync_group);
+ }
+ 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.
if (event_log_)
event_log_->LogVideoReceiveStreamConfig(config);
+ UpdateAggregateNetworkState();
return receive_stream;
}
@@ -502,6 +509,7 @@ void Call::DestroyVideoReceiveStream(
RTC_CHECK(receive_stream_impl != nullptr);
ConfigureSync(receive_stream_impl->config().sync_group);
}
+ UpdateAggregateNetworkState();
delete receive_stream_impl;
}
@@ -548,27 +556,64 @@ void Call::SetBitrateConfig(
bitrate_config.max_bitrate_bps);
}
-void Call::SignalNetworkState(NetworkState state) {
+void Call::SignalChannelNetworkState(MediaType media,
+ NetworkState state) {
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
- network_enabled_ = state == kNetworkUp;
- congestion_controller_->SignalNetworkState(state);
+ 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.
+ audio_network_state_ = state;
+ if (media == MediaType::VIDEO)
+ video_network_state_ = state;
+
+ UpdateAggregateNetworkState();
{
- ReadLockScoped write_lock(*send_crit_);
+ ReadLockScoped read_lock(*send_crit_);
for (auto& kv : audio_send_ssrcs_) {
- kv.second->SignalNetworkState(state);
+ kv.second->SignalNetworkState(audio_network_state_);
}
for (auto& kv : video_send_ssrcs_) {
- kv.second->SignalNetworkState(state);
+ kv.second->SignalNetworkState(video_network_state_);
}
}
{
- ReadLockScoped write_lock(*receive_crit_);
+ ReadLockScoped read_lock(*receive_crit_);
+ for (auto& kv : audio_receive_ssrcs_) {
+ kv.second->SignalNetworkState(audio_network_state_);
+ }
for (auto& kv : video_receive_ssrcs_) {
- kv.second->SignalNetworkState(state);
+ kv.second->SignalNetworkState(video_network_state_);
}
}
}
+void Call::UpdateAggregateNetworkState() {
+ RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
+
+ bool haveVideo = false;
+ bool haveAudio = false;
+ {
+ ReadLockScoped read_lock(*send_crit_);
+ if (audio_send_ssrcs_.size() > 0) haveAudio = true;
+ if (video_send_ssrcs_.size() > 0) haveVideo = true;
+ }
+ {
+ ReadLockScoped read_lock(*receive_crit_);
+ if (audio_receive_ssrcs_.size() > 0) haveAudio = true;
+ if (video_receive_ssrcs_.size() > 0) haveVideo = true;
+ }
+
+ NetworkState aggregateState = kNetworkDown;
+ 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
+ (haveVideo && video_network_state_ == kNetworkUp) ||
+ (haveAudio && audio_network_state_ == kNetworkUp)) {
+ aggregateState = kNetworkUp;
+ }
+
+ LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregateState=" <<
+ (aggregateState == kNetworkUp ? "up" : "down");
+
+ congestion_controller_ -> SignalNetworkState(aggregateState);
+}
+
void Call::OnSentPacket(const rtc::SentPacket& sent_packet) {
if (first_packet_sent_ms_ == -1)
first_packet_sent_ms_ = clock_->TimeInMilliseconds();

Powered by Google App Engine
This is Rietveld 408576698