aboutsummaryrefslogtreecommitdiff
path: root/call
diff options
context:
space:
mode:
authorPiotr (Peter) Slatala <psla@webrtc.org>2018-11-15 08:26:19 -0800
committerCommit Bot <commit-bot@chromium.org>2018-11-15 17:36:48 +0000
commitcc8e8bb73f8384045d808eace924a955422bc111 (patch)
tree30314e52dfe60868f1ae2e3a2c04236eeed875de /call
parent86336a50bd43c3eff64ef97dfda419c5ad5a1ed1 (diff)
downloadwebrtc-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.gn1
-rw-r--r--call/call.cc82
-rw-r--r--call/call.h5
-rw-r--r--call/call_unittest.cc1
-rw-r--r--call/degraded_call.cc6
-rw-r--r--call/degraded_call.h1
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_;