| Index: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
 | 
| diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
 | 
| index f466926f195c8f386c685f6021b491b447714f8a..39d82a9d47035d9423a358961e51920eacaf152b 100644
 | 
| --- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
 | 
| +++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
 | 
| @@ -44,6 +44,9 @@ AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) {
 | 
|    config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
 | 
|                                                  : AudioEncoderOpus::kAudio;
 | 
|    config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
 | 
| +#if WEBRTC_OPUS_VARIABLE_COMPLEXITY
 | 
| +  config.low_rate_complexity = 9;
 | 
| +#endif
 | 
|    return config;
 | 
|  }
 | 
|  
 | 
| @@ -118,7 +121,11 @@ class AudioEncoderOpus::PacketLossFractionSmoother {
 | 
|    rtc::ExpFilter smoother_;
 | 
|  };
 | 
|  
 | 
| -AudioEncoderOpus::Config::Config() = default;
 | 
| +AudioEncoderOpus::Config::Config() {
 | 
| +#if WEBRTC_OPUS_VARIABLE_COMPLEXITY
 | 
| +  low_rate_complexity = 9;
 | 
| +#endif
 | 
| +}
 | 
|  AudioEncoderOpus::Config::Config(const Config&) = default;
 | 
|  AudioEncoderOpus::Config::~Config() = default;
 | 
|  auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default;
 | 
| @@ -133,6 +140,8 @@ bool AudioEncoderOpus::Config::IsOk() const {
 | 
|      return false;
 | 
|    if (complexity < 0 || complexity > 10)
 | 
|      return false;
 | 
| +  if (low_rate_complexity < 0 || low_rate_complexity > 10)
 | 
| +    return false;
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| @@ -144,6 +153,12 @@ int AudioEncoderOpus::Config::GetBitrateBps() const {
 | 
|      return num_channels == 1 ? 32000 : 64000;  // Default value.
 | 
|  }
 | 
|  
 | 
| +int AudioEncoderOpus::Config::GetComplexity() const {
 | 
| +  RTC_DCHECK(IsOk());
 | 
| +  return GetBitrateBps() <= complexity_threshold_bps ? low_rate_complexity
 | 
| +                                                     : complexity;
 | 
| +}
 | 
| +
 | 
|  AudioEncoderOpus::AudioEncoderOpus(
 | 
|      const Config& config,
 | 
|      AudioNetworkAdaptorCreator&& audio_network_adaptor_creator)
 | 
| @@ -250,6 +265,10 @@ void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
 | 
|        std::max(std::min(bits_per_second, kMaxBitrateBps), kMinBitrateBps));
 | 
|    RTC_DCHECK(config_.IsOk());
 | 
|    RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps()));
 | 
| +  if (complexity_ != config_.GetComplexity()) {
 | 
| +    complexity_ = config_.GetComplexity();
 | 
| +    RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  bool AudioEncoderOpus::EnableAudioNetworkAdaptor(
 | 
| @@ -399,7 +418,8 @@ bool AudioEncoderOpus::RecreateEncoderInstance(const Config& config) {
 | 
|    }
 | 
|    RTC_CHECK_EQ(
 | 
|        0, WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz));
 | 
| -  RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, config.complexity));
 | 
| +  complexity_ = config.GetComplexity();
 | 
| +  RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
 | 
|    if (config.dtx_enabled) {
 | 
|      RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
 | 
|    } else {
 | 
| 
 |