From 48c5493393f438306a9999759782de65b16491cd Mon Sep 17 00:00:00 2001 From: "Piotr (Peter) Slatala" Date: Mon, 28 Jan 2019 06:50:38 -0800 Subject: [PATCH] Add 'UpdateAllocationLimits' in media transport. Bug: webrtc:9719 Change-Id: I90bd1d9858c259d7339420c574ad83d6fb18299c Reviewed-on: https://webrtc-review.googlesource.com/c/118946 Reviewed-by: Steve Anton Reviewed-by: Sebastian Jansson Reviewed-by: Anton Sukhanov Commit-Queue: Peter Slatala Cr-Commit-Position: refs/heads/master@{#26426} --- api/BUILD.gn | 1 + api/media_transport_interface.cc | 3 +++ api/media_transport_interface.h | 12 ++++++++++++ api/test/fake_media_transport.h | 3 +++ api/test/loopback_media_transport.cc | 7 +++++++ api/test/loopback_media_transport.h | 3 +++ call/call.cc | 11 +++++++++++ 7 files changed, 40 insertions(+) diff --git a/api/BUILD.gn b/api/BUILD.gn index 7b8ae83ba3..2359ebc99f 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -133,6 +133,7 @@ rtc_static_library("libjingle_peerconnection_api") { "audio_codecs:audio_codecs_api", "transport:bitrate_settings", "transport:network_control", + "units:data_rate", "video:encoded_image", "video:video_frame", "//third_party/abseil-cpp/absl/strings", diff --git a/api/media_transport_interface.cc b/api/media_transport_interface.cc index c1a83bb2be..eccb74d79c 100644 --- a/api/media_transport_interface.cc +++ b/api/media_transport_interface.cc @@ -188,4 +188,7 @@ size_t MediaTransportInterface::GetAudioPacketOverhead() const { return 0; } +void MediaTransportInterface::SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits) {} + } // namespace webrtc diff --git a/api/media_transport_interface.h b/api/media_transport_interface.h index a440860ffc..a46c99446e 100644 --- a/api/media_transport_interface.h +++ b/api/media_transport_interface.h @@ -26,6 +26,7 @@ #include "absl/types/optional.h" #include "api/array_view.h" #include "api/rtc_error.h" +#include "api/units/data_rate.h" #include "api/video/encoded_image.h" #include "rtc_base/copy_on_write_buffer.h" #include "rtc_base/deprecation.h" @@ -49,6 +50,12 @@ class AudioPacketReceivedObserver { virtual void OnFirstAudioPacketReceived(int64_t channel_id) = 0; }; +struct MediaTransportAllocatedBitrateLimits { + DataRate min_pacing_rate = DataRate::Zero(); + DataRate max_padding_bitrate = DataRate::Zero(); + DataRate max_total_allocated_bitrate = DataRate::Zero(); +}; + // A collection of settings for creation of media transport. struct MediaTransportSettings final { MediaTransportSettings(); @@ -449,6 +456,11 @@ class MediaTransportInterface { virtual void SetMediaTransportStateCallback( MediaTransportStateCallback* callback) = 0; + // Updates allocation limits. + // TODO(psla): Make abstract when downstream implementation implement it. + virtual void SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits); + // Sends a data buffer to the remote endpoint using the given send parameters. // |buffer| may not be larger than 256 KiB. Returns an error if the send // fails. diff --git a/api/test/fake_media_transport.h b/api/test/fake_media_transport.h index eb6ec93ae2..bc8a320f3d 100644 --- a/api/test/fake_media_transport.h +++ b/api/test/fake_media_transport.h @@ -93,6 +93,9 @@ class FakeMediaTransport : public MediaTransportInterface { } } + void SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits) override {} + int target_rate_observers_size() { return target_rate_observers_.size(); } private: diff --git a/api/test/loopback_media_transport.cc b/api/test/loopback_media_transport.cc index 57cc36d81f..e7ccb0afd8 100644 --- a/api/test/loopback_media_transport.cc +++ b/api/test/loopback_media_transport.cc @@ -81,6 +81,9 @@ class WrapperMediaTransport : public MediaTransportInterface { wrapped_->SetDataSink(sink); } + void SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits) override {} + private: MediaTransportInterface* wrapped_; }; @@ -372,4 +375,8 @@ void MediaTransportPair::LoopbackMediaTransport::OnStateChanged() { state_callback_->OnStateChanged(state_); } } + +void MediaTransportPair::LoopbackMediaTransport::SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits) {} + } // namespace webrtc diff --git a/api/test/loopback_media_transport.h b/api/test/loopback_media_transport.h index 64b8ced24b..bcfdb63fd5 100644 --- a/api/test/loopback_media_transport.h +++ b/api/test/loopback_media_transport.h @@ -127,6 +127,9 @@ class MediaTransportPair { Stats GetStats(); + void SetAllocatedBitrateLimits( + const MediaTransportAllocatedBitrateLimits& limits) override; + private: void OnData(uint64_t channel_id, MediaTransportEncodedAudioFrame frame); diff --git a/call/call.cc b/call/call.cc index 2361c72c08..f3f6cd314b 100644 --- a/call/call.cc +++ b/call/call.cc @@ -1180,6 +1180,17 @@ void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, transport_send_ptr_->SetAllocatedSendBitrateLimits( min_send_bitrate_bps, max_padding_bitrate_bps, total_bitrate_bps); + { + rtc::CritScope lock(&target_observer_crit_); + if (media_transport_) { + MediaTransportAllocatedBitrateLimits limits; + limits.min_pacing_rate = DataRate::bps(min_send_bitrate_bps); + limits.max_padding_bitrate = DataRate::bps(max_padding_bitrate_bps); + limits.max_total_allocated_bitrate = DataRate::bps(total_bitrate_bps); + media_transport_->SetAllocatedBitrateLimits(limits); + } + } + rtc::CritScope lock(&bitrate_crit_); min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps;