diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/config.proto b/webrtc/modules/audio_coding/audio_network_adaptor/config.proto index 6162a155ca..b1860494bf 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/config.proto +++ b/webrtc/modules/audio_coding/audio_network_adaptor/config.proto @@ -39,6 +39,41 @@ message FecController { optional int32 time_constant_ms = 3; } +message FecControllerRplrBased { + message Threshold { + // Threshold defines a curve in the bandwidth/recoverable-packet-loss + // domain. + // The curve is characterized by the two conjunction points: A and B. + // + // recoverable ^ + // packet | | + // loss | A| + // | \ A: (low_bandwidth_bps, + // | \ low_bandwidth_recoverable_packet_loss) + // | \ B: (high_bandwidth_bps, + // | \ high_bandwidth_recoverable_packet_loss) + // | B\________ + // |---------------> bandwidth + optional int32 low_bandwidth_bps = 1; + optional float low_bandwidth_recoverable_packet_loss = 2; + optional int32 high_bandwidth_bps = 3; + optional float high_bandwidth_recoverable_packet_loss = 4; + } + + // |fec_enabling_threshold| defines a curve, above which FEC should be + // enabled. |fec_disabling_threshold| defines a curve, under which FEC + // should be disabled. See below + // + // packet-loss ^ | | + // | | | FEC + // | \ \ ON + // | FEC \ \_______ fec_enabling_threshold + // | OFF \_________ fec_disabling_threshold + // |-----------------> bandwidth + optional Threshold fec_enabling_threshold = 1; + optional Threshold fec_disabling_threshold = 2; +} + message FrameLengthController { // Uplink packet loss fraction below which frame length can increase. optional float fl_increasing_packet_loss_fraction = 1; @@ -101,6 +136,7 @@ message Controller { ChannelController channel_controller = 23; DtxController dtx_controller = 24; BitrateController bitrate_controller = 25; + FecControllerRplrBased fec_controller_rplr_based = 26; } } diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc b/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc index 6f3bda261a..3e4aa2b541 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc +++ b/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc @@ -18,6 +18,7 @@ #include "webrtc/modules/audio_coding/audio_network_adaptor/channel_controller.h" #include "webrtc/modules/audio_coding/audio_network_adaptor/dtx_controller.h" #include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h" +#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h" #include "webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h" #include "webrtc/system_wrappers/include/clock.h" @@ -73,6 +74,43 @@ std::unique_ptr CreateFecControllerPlrBased( config.time_constant_ms(), clock))); } +std::unique_ptr CreateFecControllerRplrBased( + const audio_network_adaptor::config::FecControllerRplrBased& config, + bool initial_fec_enabled) { + RTC_CHECK(config.has_fec_enabling_threshold()); + RTC_CHECK(config.has_fec_disabling_threshold()); + + auto& fec_enabling_threshold = config.fec_enabling_threshold(); + RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_bps()); + RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_recoverable_packet_loss()); + RTC_CHECK(fec_enabling_threshold.has_high_bandwidth_bps()); + RTC_CHECK( + fec_enabling_threshold.has_high_bandwidth_recoverable_packet_loss()); + + auto& fec_disabling_threshold = config.fec_disabling_threshold(); + RTC_CHECK(fec_disabling_threshold.has_low_bandwidth_bps()); + RTC_CHECK( + fec_disabling_threshold.has_low_bandwidth_recoverable_packet_loss()); + RTC_CHECK(fec_disabling_threshold.has_high_bandwidth_bps()); + RTC_CHECK( + fec_disabling_threshold.has_high_bandwidth_recoverable_packet_loss()); + + return std::unique_ptr( + new FecControllerRplrBased(FecControllerRplrBased::Config( + initial_fec_enabled, + FecControllerRplrBased::Config::Threshold( + fec_enabling_threshold.low_bandwidth_bps(), + fec_enabling_threshold.low_bandwidth_recoverable_packet_loss(), + fec_enabling_threshold.high_bandwidth_bps(), + fec_enabling_threshold.high_bandwidth_recoverable_packet_loss()), + FecControllerRplrBased::Config::Threshold( + fec_disabling_threshold.low_bandwidth_bps(), + fec_disabling_threshold.low_bandwidth_recoverable_packet_loss(), + fec_disabling_threshold.high_bandwidth_bps(), + fec_disabling_threshold + .high_bandwidth_recoverable_packet_loss())))); +} + std::unique_ptr CreateFrameLengthController( const audio_network_adaptor::config::FrameLengthController& config, rtc::ArrayView encoder_frame_lengths_ms, @@ -183,6 +221,10 @@ std::unique_ptr ControllerManagerImpl::Create( controller = CreateFecControllerPlrBased( controller_config.fec_controller(), initial_fec_enabled, clock); break; + case audio_network_adaptor::config::Controller::kFecControllerRplrBased: + controller = CreateFecControllerRplrBased( + controller_config.fec_controller_rplr_based(), initial_fec_enabled); + break; case audio_network_adaptor::config::Controller::kFrameLengthController: controller = CreateFrameLengthController( controller_config.frame_length_controller(), diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc index f2b0f5b460..6252364cd5 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc +++ b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc @@ -14,13 +14,11 @@ #include #include "webrtc/base/checks.h" +#include "webrtc/system_wrappers/include/field_trial.h" namespace webrtc { namespace { -// TODO(elad.alon): Subsequent CL experiments with PLR source. -constexpr bool kUseTwccPlrForAna = false; - class NullSmoothingFilter final : public SmoothingFilter { public: void AddSample(float sample) override { @@ -85,7 +83,7 @@ FecControllerPlrBased::FecControllerPlrBased( FecControllerPlrBased::FecControllerPlrBased(const Config& config) : FecControllerPlrBased( config, - kUseTwccPlrForAna + webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled" ? std::unique_ptr(new NullSmoothingFilter()) : std::unique_ptr( new SmoothingFilterImpl(config.time_constant_ms, diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc index 2658107348..0a59ab6752 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc +++ b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc @@ -31,14 +31,10 @@ FecControllerRplrBased::Config::Threshold::Threshold( FecControllerRplrBased::Config::Config(bool initial_fec_enabled, const Threshold& fec_enabling_threshold, - const Threshold& fec_disabling_threshold, - int time_constant_ms, - const Clock* clock) + const Threshold& fec_disabling_threshold) : initial_fec_enabled(initial_fec_enabled), fec_enabling_threshold(fec_enabling_threshold), - fec_disabling_threshold(fec_disabling_threshold), - time_constant_ms(time_constant_ms), - clock(clock) {} + fec_disabling_threshold(fec_disabling_threshold) {} FecControllerRplrBased::FecControllerRplrBased(const Config& config) : config_(config), diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h index d3ddbd41a3..e03ccacf28 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h +++ b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h @@ -15,7 +15,6 @@ #include "webrtc/base/constructormagic.h" #include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h" -#include "webrtc/system_wrappers/include/clock.h" namespace webrtc { @@ -58,14 +57,10 @@ class FecControllerRplrBased final : public Controller { // |-----------------> bandwidth Config(bool initial_fec_enabled, const Threshold& fec_enabling_threshold, - const Threshold& fec_disabling_threshold, - int time_constant_ms, - const Clock* clock); + const Threshold& fec_disabling_threshold); bool initial_fec_enabled; Threshold fec_enabling_threshold; Threshold fec_disabling_threshold; - int time_constant_ms; - const Clock* clock; }; explicit FecControllerRplrBased(const Config& config); diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc index ce51ff00d8..f7ecaf30fa 100644 --- a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc +++ b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc @@ -68,10 +68,10 @@ std::unique_ptr CreateFecControllerRplrBased( Threshold( kEnablingBandwidthLow, kEnablingRecoverablePacketLossAtLowBw, kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw), - Threshold( - kDisablingBandwidthLow, kDisablingRecoverablePacketLossAtLowBw, - kDisablingBandwidthHigh, kDisablingRecoverablePacketLossAtHighBw), - 0, nullptr))); + Threshold(kDisablingBandwidthLow, + kDisablingRecoverablePacketLossAtLowBw, + kDisablingBandwidthHigh, + kDisablingRecoverablePacketLossAtHighBw)))); } void UpdateNetworkMetrics( @@ -372,8 +372,7 @@ TEST(FecControllerRplrBasedTest, CheckBehaviorOnSpecialCurves) { kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw), Threshold(kDisablingBandwidthLow, kDisablingRecoverablePacketLossAtLowBw, kDisablingBandwidthHigh, - kDisablingRecoverablePacketLossAtHighBw), - 0, nullptr)); + kDisablingRecoverablePacketLossAtHighBw))); UpdateNetworkMetrics(&controller, rtc::Optional(kDisablingBandwidthLow - 1), @@ -412,10 +411,10 @@ TEST(FecControllerRplrBasedDeathTest, InvalidConfig) { Threshold( kDisablingBandwidthLow - 1, kEnablingRecoverablePacketLossAtLowBw, kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw), - Threshold( - kDisablingBandwidthLow, kDisablingRecoverablePacketLossAtLowBw, - kDisablingBandwidthHigh, kDisablingRecoverablePacketLossAtHighBw), - 0, nullptr)), + Threshold(kDisablingBandwidthLow, + kDisablingRecoverablePacketLossAtLowBw, + kDisablingBandwidthHigh, + kDisablingRecoverablePacketLossAtHighBw))), "Check failed"); } #endif diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index 31242f6db9..1ab69714f7 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -36,6 +36,7 @@ #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" #include "webrtc/modules/utility/include/process_thread.h" +#include "webrtc/system_wrappers/include/field_trial.h" #include "webrtc/system_wrappers/include/trace.h" #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" #include "webrtc/voice_engine/output_mixer.h" @@ -905,8 +906,8 @@ Channel::Channel(int32_t channelId, retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(), kMaxRetransmissionWindowMs)), decoder_factory_(config.acm_config.decoder_factory), - // TODO(elad.alon): Subsequent CL experiments with PLR source. - use_twcc_plr_for_ana_(false) { + use_twcc_plr_for_ana_( + webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled") { WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), "Channel::Channel() - ctor"); AudioCodingModule::Config acm_config(config.acm_config);