diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/modules/audio_coding/codecs/opus/audio_encoder_opus.cc index adc66565d2..1a88acf3c0 100644 --- a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc +++ b/modules/audio_coding/codecs/opus/audio_encoder_opus.cc @@ -471,6 +471,8 @@ AudioEncoderOpusImpl::AudioEncoderOpusImpl( : payload_type_(payload_type), send_side_bwe_with_overhead_( webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")), + use_link_capacity_for_adaptation_(webrtc::field_trial::IsEnabled( + "WebRTC-Audio-LinkCapacityAdaptation")), adjust_bandwidth_( webrtc::field_trial::IsEnabled("WebRTC-AdjustOpusBandwidth")), bitrate_changed_(true), @@ -605,7 +607,8 @@ void AudioEncoderOpusImpl::OnReceivedUplinkRecoverablePacketLossFraction( void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth( int target_audio_bitrate_bps, - absl::optional bwe_period_ms) { + absl::optional bwe_period_ms, + absl::optional link_capacity_allocation_bps) { if (audio_network_adaptor_) { audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); // We give smoothed bitrate allocation to audio network adaptor as @@ -623,6 +626,9 @@ void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth( bitrate_smoother_->SetTimeConstantMs(*bwe_period_ms * 4); bitrate_smoother_->AddSample(target_audio_bitrate_bps); + if (link_capacity_allocation_bps) + link_capacity_allocation_bps_ = link_capacity_allocation_bps; + ApplyAudioNetworkAdaptor(); } else if (send_side_bwe_with_overhead_) { if (!overhead_bytes_per_packet_) { @@ -641,6 +647,18 @@ void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth( SetTargetBitrate(target_audio_bitrate_bps); } } +void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth( + int target_audio_bitrate_bps, + absl::optional bwe_period_ms) { + OnReceivedUplinkBandwidth(target_audio_bitrate_bps, bwe_period_ms, + absl::nullopt); +} + +void AudioEncoderOpusImpl::OnReceivedUplinkAllocation( + BitrateAllocationUpdate update) { + OnReceivedUplinkBandwidth(update.target_bitrate.bps(), update.bwe_period.ms(), + update.link_capacity.bps()); +} void AudioEncoderOpusImpl::OnReceivedRtt(int rtt_ms) { if (!audio_network_adaptor_) @@ -875,14 +893,20 @@ AudioEncoderOpusImpl::DefaultAudioNetworkAdaptorCreator( void AudioEncoderOpusImpl::MaybeUpdateUplinkBandwidth() { if (audio_network_adaptor_) { - int64_t now_ms = rtc::TimeMillis(); - if (!bitrate_smoother_last_update_time_ || - now_ms - *bitrate_smoother_last_update_time_ >= - config_.uplink_bandwidth_update_interval_ms) { - absl::optional smoothed_bitrate = bitrate_smoother_->GetAverage(); - if (smoothed_bitrate) - audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate); - bitrate_smoother_last_update_time_ = now_ms; + if (use_link_capacity_for_adaptation_ && link_capacity_allocation_bps_) { + audio_network_adaptor_->SetUplinkBandwidth( + *link_capacity_allocation_bps_); + } else { + int64_t now_ms = rtc::TimeMillis(); + if (!bitrate_smoother_last_update_time_ || + now_ms - *bitrate_smoother_last_update_time_ >= + config_.uplink_bandwidth_update_interval_ms) { + absl::optional smoothed_bitrate = + bitrate_smoother_->GetAverage(); + if (smoothed_bitrate) + audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate); + bitrate_smoother_last_update_time_ = now_ms; + } } } } diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.h b/modules/audio_coding/codecs/opus/audio_encoder_opus.h index c26c6daaf1..150423fd3e 100644 --- a/modules/audio_coding/codecs/opus/audio_encoder_opus.h +++ b/modules/audio_coding/codecs/opus/audio_encoder_opus.h @@ -119,6 +119,7 @@ class AudioEncoderOpusImpl final : public AudioEncoder { void OnReceivedUplinkBandwidth( int target_audio_bitrate_bps, absl::optional bwe_period_ms) override; + void OnReceivedUplinkAllocation(BitrateAllocationUpdate update) override; void OnReceivedRtt(int rtt_ms) override; void OnReceivedOverhead(size_t overhead_bytes_per_packet) override; void SetReceiverFrameLengthRange(int min_frame_length_ms, @@ -164,6 +165,11 @@ class AudioEncoderOpusImpl final : public AudioEncoder { void SetNumChannelsToEncode(size_t num_channels_to_encode); void SetProjectedPacketLossRate(float fraction); + void OnReceivedUplinkBandwidth( + int target_audio_bitrate_bps, + absl::optional bwe_period_ms, + absl::optional link_capacity_allocation); + // TODO(minyue): remove "override" when we can deprecate // |AudioEncoder::SetTargetBitrate|. void SetTargetBitrate(int target_bps) override; @@ -178,6 +184,7 @@ class AudioEncoderOpusImpl final : public AudioEncoder { AudioEncoderOpusConfig config_; const int payload_type_; const bool send_side_bwe_with_overhead_; + const bool use_link_capacity_for_adaptation_; const bool adjust_bandwidth_; bool bitrate_changed_; float packet_loss_rate_; @@ -195,6 +202,7 @@ class AudioEncoderOpusImpl final : public AudioEncoder { absl::optional overhead_bytes_per_packet_; const std::unique_ptr bitrate_smoother_; absl::optional bitrate_smoother_last_update_time_; + absl::optional link_capacity_allocation_bps_; int consecutive_dtx_frames_; friend struct AudioEncoderOpus;