diff options
author | Piotr (Peter) Slatala <psla@webrtc.org> | 2018-11-15 08:26:19 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2018-11-15 17:36:48 +0000 |
commit | cc8e8bb73f8384045d808eace924a955422bc111 (patch) | |
tree | 30314e52dfe60868f1ae2e3a2c04236eeed875de /call | |
parent | 86336a50bd43c3eff64ef97dfda419c5ad5a1ed1 (diff) | |
download | webrtc-cc8e8bb73f8384045d808eace924a955422bc111.tar.gz |
Pass the media transport from JsepTransportController to Call.
Add TargetRateObservers for media transport in the call object.
Bug: webrtc:9719
Change-Id: I5448d05359cf09b8cd2a678b2ac876aa8f8970e7
Reviewed-on: https://webrtc-review.googlesource.com/c/110622
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Anton Sukhanov <sukhanov@webrtc.org>
Commit-Queue: Peter Slatala <psla@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25662}
Diffstat (limited to 'call')
-rw-r--r-- | call/BUILD.gn | 1 | ||||
-rw-r--r-- | call/call.cc | 82 | ||||
-rw-r--r-- | call/call.h | 5 | ||||
-rw-r--r-- | call/call_unittest.cc | 1 | ||||
-rw-r--r-- | call/degraded_call.cc | 6 | ||||
-rw-r--r-- | call/degraded_call.h | 1 |
6 files changed, 95 insertions, 1 deletions
diff --git a/call/BUILD.gn b/call/BUILD.gn index 237e507fbf..34c16efcc0 100644 --- a/call/BUILD.gn +++ b/call/BUILD.gn @@ -332,6 +332,7 @@ if (rtc_include_tests) { ":simulated_network", "..:webrtc_common", "../api:array_view", + "../api:fake_media_transport", "../api:libjingle_peerconnection_api", "../api:mock_audio_mixer", "../api/audio_codecs:builtin_audio_decoder_factory", diff --git a/call/call.cc b/call/call.cc index 1233ecdb7c..ae4525a72d 100644 --- a/call/call.cc +++ b/call/call.cc @@ -224,6 +224,15 @@ class Call final : public webrtc::Call, uint32_t allocated_without_feedback_bps, bool has_packet_feedback) override; + // This method is invoked when the media transport is created and when the + // media transport is being destructed. + // We only allow one media transport per connection. + // + // It should be called with non-null argument at most once, and if it was + // called with non-null argument, it has to be called with a null argument + // at least once after that. + void MediaTransportChange(MediaTransportInterface* media_transport) override; + private: DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet, @@ -244,6 +253,10 @@ class Call final : public webrtc::Call, void UpdateHistograms(); void UpdateAggregateNetworkState(); + // If |media_transport| is not null, it registers the rate observer for the + // media transport. + void RegisterRateObserver() RTC_LOCKS_EXCLUDED(target_observer_crit_); + Clock* const clock_; const int num_cpu_cores_; @@ -362,6 +375,15 @@ class Call final : public webrtc::Call, // Declared last since it will issue callbacks from a task queue. Declaring it // last ensures that it is destroyed first and any running tasks are finished. std::unique_ptr<RtpTransportControllerSendInterface> transport_send_; + + // This is a precaution, since |MediaTransportChange| is not guaranteed to be + // invoked on a particular thread. + rtc::CriticalSection target_observer_crit_; + bool is_target_rate_observer_registered_ + RTC_GUARDED_BY(&target_observer_crit_) = false; + MediaTransportInterface* media_transport_ + RTC_GUARDED_BY(&target_observer_crit_) = nullptr; + RTC_DISALLOW_COPY_AND_ASSIGN(Call); }; } // namespace internal @@ -432,7 +454,6 @@ Call::Call(const Call::Config& config, video_send_delay_stats_(new SendDelayStats(clock_)), start_ms_(clock_->TimeInMilliseconds()) { RTC_DCHECK(config.event_log != nullptr); - transport_send->RegisterTargetTransferRateObserver(this); transport_send_ = std::move(transport_send); transport_send_ptr_ = transport_send_.get(); @@ -474,6 +495,43 @@ Call::~Call() { UpdateHistograms(); } +void Call::RegisterRateObserver() { + rtc::CritScope lock(&target_observer_crit_); + + if (is_target_rate_observer_registered_) { + return; + } + + is_target_rate_observer_registered_ = true; + + if (media_transport_) { + media_transport_->AddTargetTransferRateObserver(this); + } else { + transport_send_ptr_->RegisterTargetTransferRateObserver(this); + } +} + +void Call::MediaTransportChange(MediaTransportInterface* media_transport) { + rtc::CritScope lock(&target_observer_crit_); + + if (is_target_rate_observer_registered_) { + // Only used to unregister rate observer from media transport. Registration + // happens when the stream is created. + if (!media_transport && media_transport_) { + media_transport_->RemoveTargetTransferRateObserver(this); + media_transport_ = nullptr; + is_target_rate_observer_registered_ = false; + } + } else if (media_transport) { + RTC_DCHECK(media_transport_ == nullptr || + media_transport_ == media_transport) + << "media_transport_=" << (media_transport_ != nullptr) + << ", (media_transport_==media_transport)=" + << (media_transport_ == media_transport); + media_transport_ = media_transport; + } +} + void Call::UpdateHistograms() { RTC_HISTOGRAM_COUNTS_100000( "WebRTC.Call.LifetimeInSeconds", @@ -566,6 +624,14 @@ webrtc::AudioSendStream* Call::CreateAudioSendStream( const webrtc::AudioSendStream::Config& config) { TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_); + + { + rtc::CritScope lock(&target_observer_crit_); + RTC_DCHECK(media_transport_ == config.media_transport); + } + + RegisterRateObserver(); + // Stream config is logged in AudioSendStream::ConfigureStream, as it may // change during the stream's lifetime. absl::optional<RtpState> suspended_rtp_state; @@ -695,6 +761,8 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream( TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream"); RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_); + RegisterRateObserver(); + video_send_delay_stats_->AddSsrcs(config); for (size_t ssrc_index = 0; ssrc_index < config.rtp.ssrcs.size(); ++ssrc_index) { @@ -1031,6 +1099,18 @@ void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { } void Call::OnTargetTransferRate(TargetTransferRate msg) { + // TODO(bugs.webrtc.org/9719) + // Call::OnTargetTransferRate requires that on target transfer rate is invoked + // from the worker queue (because bitrate_allocator_ requires it). Media + // transport does not guarantee the callback on the worker queue. + // When the threading model for MediaTransportInterface is update, reconsider + // changing this implementation. + if (!transport_send_ptr_->GetWorkerQueue()->IsCurrent()) { + transport_send_ptr_->GetWorkerQueue()->PostTask( + [this, msg] { this->OnTargetTransferRate(msg); }); + return; + } + uint32_t target_bitrate_bps = msg.target_rate.bps(); int loss_ratio_255 = msg.network_estimate.loss_rate_ratio * 255; uint8_t fraction_loss = diff --git a/call/call.h b/call/call.h index 40941e0d91..5cbbe907f7 100644 --- a/call/call.h +++ b/call/call.h @@ -58,6 +58,11 @@ class Call { virtual AudioSendStream* CreateAudioSendStream( const AudioSendStream::Config& config) = 0; + + // Gets called when media transport is created or removed. + virtual void MediaTransportChange( + MediaTransportInterface* media_transport_interface) = 0; + virtual void DestroyAudioSendStream(AudioSendStream* send_stream) = 0; virtual AudioReceiveStream* CreateAudioReceiveStream( diff --git a/call/call_unittest.cc b/call/call_unittest.cc index 83e96ff387..43c3355159 100644 --- a/call/call_unittest.cc +++ b/call/call_unittest.cc @@ -15,6 +15,7 @@ #include "absl/memory/memory.h" #include "api/audio_codecs/builtin_audio_decoder_factory.h" +#include "api/test/fake_media_transport.h" #include "api/test/mock_audio_mixer.h" #include "audio/audio_receive_stream.h" #include "audio/audio_send_stream.h" diff --git a/call/degraded_call.cc b/call/degraded_call.cc index e02a7f9c8d..a7ef41d490 100644 --- a/call/degraded_call.cc +++ b/call/degraded_call.cc @@ -215,4 +215,10 @@ PacketReceiver::DeliveryStatus DegradedCall::DeliverPacket( return status; } +void DegradedCall::MediaTransportChange( + MediaTransportInterface* media_transport) { + // TODO(bugs.webrtc.org/9719) We should add support for media transport here + // at some point. +} + } // namespace webrtc diff --git a/call/degraded_call.h b/call/degraded_call.h index ab88a51601..d78b1d1026 100644 --- a/call/degraded_call.h +++ b/call/degraded_call.h @@ -91,6 +91,7 @@ class DegradedCall : public Call, private Transport, private PacketReceiver { Clock* const clock_; const std::unique_ptr<Call> call_; + void MediaTransportChange(MediaTransportInterface* media_transport) override; const absl::optional<BuiltInNetworkBehaviorConfig> send_config_; const std::unique_ptr<ProcessThread> send_process_thread_; SimulatedNetwork* send_simulated_network_; |