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;