Add 120ms frame ability to ANA

BUG=webrtc:7093

Review-Url: https://codereview.webrtc.org/2669733002
Cr-Commit-Position: refs/heads/master@{#16416}
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index 1ed1e8b..65a238f 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -1478,7 +1478,11 @@
           // The adaptor will only be active for the Opus encoder.
           if (config_.audio_network_adaptor_config &&
               IsCodec(config_.send_codec_spec.codec_inst, kOpusCodecName)) {
+#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
+            max_packet_size_ms = 120;
+#else
             max_packet_size_ms = 60;
+#endif
             min_packet_size_ms = 20;
           }
 
diff --git a/webrtc/modules/audio_coding/BUILD.gn b/webrtc/modules/audio_coding/BUILD.gn
index 59c166d..00b9aa2 100644
--- a/webrtc/modules/audio_coding/BUILD.gn
+++ b/webrtc/modules/audio_coding/BUILD.gn
@@ -850,7 +850,7 @@
     ":webrtc_opus_c",
   ]
 
-  defines = []
+  defines = audio_codec_defines
   if (rtc_opus_variable_complexity) {
     defines += [ "WEBRTC_OPUS_VARIABLE_COMPLEXITY=1" ]
   } else {
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/config.proto b/webrtc/modules/audio_coding/audio_network_adaptor/config.proto
index 302f52c..53a4de0 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/config.proto
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/config.proto
@@ -51,6 +51,12 @@
 
   // Uplink bandwidth above which frame length should switch from 60ms to 20ms.
   optional int32 fl_60ms_to_20ms_bandwidth_bps = 4;
+
+  // Uplink bandwidth below which frame length can switch from 60ms to 120ms.
+  optional int32 fl_60ms_to_120ms_bandwidth_bps = 5;
+
+  // Uplink bandwidth above which frame length should switch from 120ms to 60ms.
+  optional int32 fl_120ms_to_60ms_bandwidth_bps = 6;
 }
 
 message ChannelController {
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 31eff21..95ed4d6 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.cc
@@ -81,12 +81,28 @@
   RTC_CHECK(config.has_fl_20ms_to_60ms_bandwidth_bps());
   RTC_CHECK(config.has_fl_60ms_to_20ms_bandwidth_bps());
 
+  std::map<FrameLengthController::Config::FrameLengthChange, int>
+      fl_changing_bandwidths_bps = {
+          {FrameLengthController::Config::FrameLengthChange(20, 60),
+           config.fl_20ms_to_60ms_bandwidth_bps()},
+          {FrameLengthController::Config::FrameLengthChange(60, 20),
+           config.fl_60ms_to_20ms_bandwidth_bps()}};
+
+  if (config.has_fl_60ms_to_120ms_bandwidth_bps() &&
+      config.has_fl_120ms_to_60ms_bandwidth_bps()) {
+    fl_changing_bandwidths_bps.insert(std::make_pair(
+        FrameLengthController::Config::FrameLengthChange(60, 120),
+        config.fl_60ms_to_120ms_bandwidth_bps()));
+    fl_changing_bandwidths_bps.insert(std::make_pair(
+        FrameLengthController::Config::FrameLengthChange(120, 60),
+        config.fl_120ms_to_60ms_bandwidth_bps()));
+  }
+
   FrameLengthController::Config ctor_config(
       std::vector<int>(), initial_frame_length_ms,
       config.fl_increasing_packet_loss_fraction(),
       config.fl_decreasing_packet_loss_fraction(),
-      config.fl_20ms_to_60ms_bandwidth_bps(),
-      config.fl_60ms_to_20ms_bandwidth_bps());
+      std::move(fl_changing_bandwidths_bps));
 
   for (auto frame_length : encoder_frame_lengths_ms)
     ctor_config.encoder_frame_lengths_ms.push_back(frame_length);
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc
index 1e78db8..d684e95 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc
@@ -22,14 +22,12 @@
     int initial_frame_length_ms,
     float fl_increasing_packet_loss_fraction,
     float fl_decreasing_packet_loss_fraction,
-    int fl_20ms_to_60ms_bandwidth_bps,
-    int fl_60ms_to_20ms_bandwidth_bps)
+    std::map<FrameLengthChange, int> fl_changing_bandwidths_bps)
     : encoder_frame_lengths_ms(encoder_frame_lengths_ms),
       initial_frame_length_ms(initial_frame_length_ms),
       fl_increasing_packet_loss_fraction(fl_increasing_packet_loss_fraction),
       fl_decreasing_packet_loss_fraction(fl_decreasing_packet_loss_fraction),
-      fl_20ms_to_60ms_bandwidth_bps(fl_20ms_to_60ms_bandwidth_bps),
-      fl_60ms_to_20ms_bandwidth_bps(fl_60ms_to_20ms_bandwidth_bps) {}
+      fl_changing_bandwidths_bps(std::move(fl_changing_bandwidths_bps)) {}
 
 FrameLengthController::Config::Config(const Config& other) = default;
 
@@ -42,11 +40,6 @@
                                config_.initial_frame_length_ms);
   // |encoder_frame_lengths_ms| must contain |initial_frame_length_ms|.
   RTC_DCHECK(frame_length_ms_ != config_.encoder_frame_lengths_ms.end());
-
-  frame_length_change_criteria_.insert(std::make_pair(
-      FrameLengthChange(20, 60), config_.fl_20ms_to_60ms_bandwidth_bps));
-  frame_length_change_criteria_.insert(std::make_pair(
-      FrameLengthChange(60, 20), config_.fl_60ms_to_20ms_bandwidth_bps));
 }
 
 FrameLengthController::~FrameLengthController() = default;
@@ -72,15 +65,13 @@
   config->frame_length_ms = rtc::Optional<int>(*frame_length_ms_);
 }
 
-FrameLengthController::FrameLengthChange::FrameLengthChange(
+FrameLengthController::Config::FrameLengthChange::FrameLengthChange(
     int from_frame_length_ms,
     int to_frame_length_ms)
     : from_frame_length_ms(from_frame_length_ms),
       to_frame_length_ms(to_frame_length_ms) {}
 
-FrameLengthController::FrameLengthChange::~FrameLengthChange() = default;
-
-bool FrameLengthController::FrameLengthChange::operator<(
+bool FrameLengthController::Config::FrameLengthChange::operator<(
     const FrameLengthChange& rhs) const {
   return from_frame_length_ms < rhs.from_frame_length_ms ||
          (from_frame_length_ms == rhs.from_frame_length_ms &&
@@ -99,10 +90,10 @@
   if (longer_frame_length_ms == config_.encoder_frame_lengths_ms.end())
     return false;
 
-  auto increase_threshold = frame_length_change_criteria_.find(
-      FrameLengthChange(*frame_length_ms_, *longer_frame_length_ms));
+  auto increase_threshold = config_.fl_changing_bandwidths_bps.find(
+      Config::FrameLengthChange(*frame_length_ms_, *longer_frame_length_ms));
 
-  if (increase_threshold == frame_length_change_criteria_.end())
+  if (increase_threshold == config_.fl_changing_bandwidths_bps.end())
     return false;
 
   return (uplink_bandwidth_bps_ &&
@@ -124,10 +115,10 @@
     return false;
 
   auto shorter_frame_length_ms = std::prev(frame_length_ms_);
-  auto decrease_threshold = frame_length_change_criteria_.find(
-      FrameLengthChange(*frame_length_ms_, *shorter_frame_length_ms));
+  auto decrease_threshold = config_.fl_changing_bandwidths_bps.find(
+      Config::FrameLengthChange(*frame_length_ms_, *shorter_frame_length_ms));
 
-  if (decrease_threshold == frame_length_change_criteria_.end())
+  if (decrease_threshold == config_.fl_changing_bandwidths_bps.end())
     return false;
 
   return (uplink_bandwidth_bps_ &&
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h
index ba0c1c2..fa6e753 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h
@@ -24,12 +24,17 @@
 class FrameLengthController final : public Controller {
  public:
   struct Config {
+    struct FrameLengthChange {
+      FrameLengthChange(int from_frame_length_ms, int to_frame_length_ms);
+      bool operator<(const FrameLengthChange& rhs) const;
+      int from_frame_length_ms;
+      int to_frame_length_ms;
+    };
     Config(const std::vector<int>& encoder_frame_lengths_ms,
            int initial_frame_length_ms,
            float fl_increasing_packet_loss_fraction,
            float fl_decreasing_packet_loss_fraction,
-           int fl_20ms_to_60ms_bandwidth_bps,
-           int fl_60ms_to_20ms_bandwidth_bps);
+           std::map<FrameLengthChange, int> fl_changing_bandwidths_bps);
     Config(const Config& other);
     ~Config();
     std::vector<int> encoder_frame_lengths_ms;
@@ -38,11 +43,7 @@
     float fl_increasing_packet_loss_fraction;
     // Uplink packet loss fraction below which frame length should decrease.
     float fl_decreasing_packet_loss_fraction;
-    // Uplink bandwidth below which frame length can switch from 20ms to 60ms.
-    int fl_20ms_to_60ms_bandwidth_bps;
-    // Uplink bandwidth above which frame length should switch from 60ms to
-    // 20ms.
-    int fl_60ms_to_20ms_bandwidth_bps;
+    std::map<FrameLengthChange, int> fl_changing_bandwidths_bps;
   };
 
   explicit FrameLengthController(const Config& config);
@@ -54,16 +55,6 @@
   void MakeDecision(AudioNetworkAdaptor::EncoderRuntimeConfig* config) override;
 
  private:
-  friend class FrameLengthControllerForTest;
-
-  struct FrameLengthChange {
-    FrameLengthChange(int from_frame_length_ms, int to_frame_length_ms);
-    ~FrameLengthChange();
-    bool operator<(const FrameLengthChange& rhs) const;
-    int from_frame_length_ms;
-    int to_frame_length_ms;
-  };
-
   bool FrameLengthIncreasingDecision(
       const AudioNetworkAdaptor::EncoderRuntimeConfig& config) const;
 
@@ -74,8 +65,6 @@
 
   std::vector<int>::const_iterator frame_length_ms_;
 
-  std::map<FrameLengthChange, int> frame_length_change_criteria_;
-
   rtc::Optional<int> uplink_bandwidth_bps_;
 
   rtc::Optional<float> uplink_packet_loss_fraction_;
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
index 43d4f4f..a16afe2 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
@@ -20,24 +20,51 @@
 
 constexpr float kFlIncreasingPacketLossFraction = 0.04f;
 constexpr float kFlDecreasingPacketLossFraction = 0.05f;
-constexpr int kFl20msTo60msBandwidthBps = 22000;
-constexpr int kFl60msTo20msBandwidthBps = 88000;
+constexpr int kFl20msTo60msBandwidthBps = 40000;
+constexpr int kFl60msTo20msBandwidthBps = 50000;
+constexpr int kFl60msTo120msBandwidthBps = 30000;
+constexpr int kFl120msTo60msBandwidthBps = 40000;
 constexpr int kMediumBandwidthBps =
     (kFl60msTo20msBandwidthBps + kFl20msTo60msBandwidthBps) / 2;
 constexpr float kMediumPacketLossFraction =
     (kFlDecreasingPacketLossFraction + kFlIncreasingPacketLossFraction) / 2;
 
 std::unique_ptr<FrameLengthController> CreateController(
+    const std::map<FrameLengthController::Config::FrameLengthChange, int>&
+        frame_length_change_criteria,
     const std::vector<int>& encoder_frame_lengths_ms,
     int initial_frame_length_ms) {
   std::unique_ptr<FrameLengthController> controller(
       new FrameLengthController(FrameLengthController::Config(
           encoder_frame_lengths_ms, initial_frame_length_ms,
           kFlIncreasingPacketLossFraction, kFlDecreasingPacketLossFraction,
-          kFl20msTo60msBandwidthBps, kFl60msTo20msBandwidthBps)));
+          frame_length_change_criteria)));
+
   return controller;
 }
 
+std::map<FrameLengthController::Config::FrameLengthChange, int>
+CreateChangeCriteriaFor20msAnd60ms() {
+  return std::map<FrameLengthController::Config::FrameLengthChange, int>{
+      {FrameLengthController::Config::FrameLengthChange(20, 60),
+       kFl20msTo60msBandwidthBps},
+      {FrameLengthController::Config::FrameLengthChange(60, 20),
+       kFl60msTo20msBandwidthBps}};
+}
+
+std::map<FrameLengthController::Config::FrameLengthChange, int>
+CreateChangeCriteriaFor20ms60msAnd120ms() {
+  return std::map<FrameLengthController::Config::FrameLengthChange, int>{
+      {FrameLengthController::Config::FrameLengthChange(20, 60),
+       kFl20msTo60msBandwidthBps},
+      {FrameLengthController::Config::FrameLengthChange(60, 20),
+       kFl60msTo20msBandwidthBps},
+      {FrameLengthController::Config::FrameLengthChange(60, 120),
+       kFl60msTo120msBandwidthBps},
+      {FrameLengthController::Config::FrameLengthChange(120, 60),
+       kFl120msTo60msBandwidthBps}};
+}
+
 void UpdateNetworkMetrics(
     FrameLengthController* controller,
     const rtc::Optional<int>& uplink_bandwidth_bps,
@@ -70,7 +97,8 @@
 }  // namespace
 
 TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkBandwidth) {
-  auto controller = CreateController({20, 60}, 60);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kFl60msTo20msBandwidthBps),
                        rtc::Optional<float>());
@@ -78,20 +106,23 @@
 }
 
 TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkPacketLossFraction) {
-  auto controller = CreateController({20, 60}, 60);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
   UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
                        rtc::Optional<float>(kFlDecreasingPacketLossFraction));
   CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
 }
 
 TEST(FrameLengthControllerTest, DecreaseTo20MsWhenFecIsOn) {
-  auto controller = CreateController({20, 60}, 60);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
   CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
 }
 
 TEST(FrameLengthControllerTest,
      Maintain60MsIf20MsNotInReceiverFrameLengthRange) {
-  auto controller = CreateController({60}, 60);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {60}, 60);
   // Set FEC on that would cause frame length to decrease if receiver frame
   // length range included 20ms.
   CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
@@ -102,7 +133,8 @@
   // 1. |uplink_bandwidth_bps| is at medium level,
   // 2. |uplink_packet_loss_fraction| is at medium,
   // 3. FEC is not decided ON.
-  auto controller = CreateController({20, 60}, 60);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kMediumBandwidthBps),
                        rtc::Optional<float>(kMediumPacketLossFraction));
@@ -115,7 +147,8 @@
   // 2. |uplink_packet_loss_fraction| is known to be smaller than a threshold
   //    AND
   // 3. FEC is not decided or OFF.
-  auto controller = CreateController({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kFl20msTo60msBandwidthBps),
                        rtc::Optional<float>(kFlIncreasingPacketLossFraction));
@@ -130,7 +163,8 @@
   // FrameLengthController::UpdateNetworkMetrics(...) can handle multiple
   // network updates at once. This is, however, not a common use case in current
   // audio_network_adaptor_impl.cc.
-  auto controller = CreateController({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
   Controller::NetworkMetrics network_metrics;
   network_metrics.uplink_bandwidth_bps =
       rtc::Optional<int>(kFl20msTo60msBandwidthBps);
@@ -142,7 +176,8 @@
 
 TEST(FrameLengthControllerTest,
      Maintain20MsIf60MsNotInReceiverFrameLengthRange) {
-  auto controller = CreateController({20}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20}, 20);
   // Use a low uplink bandwidth and a low uplink packet loss fraction that would
   // cause frame length to increase if receiver frame length included 60ms.
   UpdateNetworkMetrics(controller.get(),
@@ -152,7 +187,8 @@
 }
 
 TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkBandwidth) {
-  auto controller = CreateController({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kMediumBandwidthBps),
                        rtc::Optional<float>(kFlIncreasingPacketLossFraction));
@@ -160,7 +196,8 @@
 }
 
 TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkPacketLossFraction) {
-  auto controller = CreateController({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
   // Use a low uplink bandwidth that would cause frame length to increase if
   // uplink packet loss fraction was low.
   UpdateNetworkMetrics(controller.get(),
@@ -170,7 +207,8 @@
 }
 
 TEST(FrameLengthControllerTest, Maintain20MsWhenFecIsOn) {
-  auto controller = CreateController({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
   // Use a low uplink bandwidth and a low uplink packet loss fraction that would
   // cause frame length to increase if FEC was not ON.
   UpdateNetworkMetrics(controller.get(),
@@ -179,40 +217,18 @@
   CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
 }
 
-namespace {
-constexpr int kFl60msTo120msBandwidthBps = 18000;
-constexpr int kFl120msTo60msBandwidthBps = 72000;
+TEST(FrameLengthControllerTest, Maintain60MsWhenNo120msCriteriaIsSet) {
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60, 120}, 60);
+  UpdateNetworkMetrics(controller.get(),
+                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
+                       rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+  CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
 }
 
-class FrameLengthControllerForTest {
- public:
-  // This class is to test multiple frame lengths. FrameLengthController is
-  // implemented to support this, but is not enabled for the default constructor
-  // for the time being. We use this class to test it.
-  FrameLengthControllerForTest(const std::vector<int>& encoder_frame_lengths_ms,
-                               int initial_frame_length_ms)
-      : frame_length_controller_(
-            FrameLengthController::Config(encoder_frame_lengths_ms,
-                                          initial_frame_length_ms,
-                                          kFlIncreasingPacketLossFraction,
-                                          kFlDecreasingPacketLossFraction,
-                                          kFl20msTo60msBandwidthBps,
-                                          kFl60msTo20msBandwidthBps)) {
-    frame_length_controller_.frame_length_change_criteria_.insert(
-        std::make_pair(FrameLengthController::FrameLengthChange(60, 120),
-                       kFl60msTo120msBandwidthBps));
-    frame_length_controller_.frame_length_change_criteria_.insert(
-        std::make_pair(FrameLengthController::FrameLengthChange(120, 60),
-                       kFl120msTo60msBandwidthBps));
-  }
-  FrameLengthController* get() { return &frame_length_controller_; }
-
- private:
-  FrameLengthController frame_length_controller_;
-};
-
 TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkBandwidth) {
-  FrameLengthControllerForTest controller({20, 60, 120}, 120);
+  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+                                     {20, 60, 120}, 120);
   // It takes two steps for frame length to go from 120ms to 20ms.
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kFl60msTo20msBandwidthBps),
@@ -226,7 +242,8 @@
 }
 
 TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkPacketLossFraction) {
-  FrameLengthControllerForTest controller({20, 60, 120}, 120);
+  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+                                     {20, 60, 120}, 120);
   // It takes two steps for frame length to go from 120ms to 20ms.
   UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
                        rtc::Optional<float>(kFlDecreasingPacketLossFraction));
@@ -238,7 +255,8 @@
 }
 
 TEST(FrameLengthControllerTest, From120MsTo20MsWhenFecIsOn) {
-  FrameLengthControllerForTest controller({20, 60, 120}, 120);
+  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+                                     {20, 60, 120}, 120);
   // It takes two steps for frame length to go from 120ms to 20ms.
   CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
   CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
@@ -250,7 +268,8 @@
   // 2. |uplink_packet_loss_fraction| is known to be smaller than a threshold
   //    AND
   // 3. FEC is not decided or OFF.
-  FrameLengthControllerForTest controller({20, 60, 120}, 20);
+  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+                                     {20, 60, 120}, 20);
   // It takes two steps for frame length to go from 20ms to 120ms.
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kFl60msTo120msBandwidthBps),
@@ -263,7 +282,8 @@
 }
 
 TEST(FrameLengthControllerTest, Stall60MsIf120MsNotInReceiverFrameLengthRange) {
-  FrameLengthControllerForTest controller({20, 60}, 20);
+  auto controller =
+      CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(), {20, 60}, 20);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kFl60msTo120msBandwidthBps),
                        rtc::Optional<float>(kFlIncreasingPacketLossFraction));
@@ -275,7 +295,8 @@
 }
 
 TEST(FrameLengthControllerTest, CheckBehaviorOnChangingNetworkMetrics) {
-  FrameLengthControllerForTest controller({20, 60, 120}, 20);
+  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+                                     {20, 60, 120}, 20);
   UpdateNetworkMetrics(controller.get(),
                        rtc::Optional<int>(kMediumBandwidthBps),
                        rtc::Optional<float>(kFlIncreasingPacketLossFraction));
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 6b39cc8..515f6c0 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -35,7 +35,12 @@
 constexpr int kMinBitrateBps = 6000;
 
 constexpr int kMaxBitrateBps = 512000;
+
+#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
+constexpr int kSupportedFrameLengths[] = {20, 60, 120};
+#else
 constexpr int kSupportedFrameLengths[] = {20, 60};
+#endif
 
 // PacketLossFractionSmoother uses an exponential filter with a time constant
 // of -1.0 / ln(0.9999) = 10000 ms.