| Index: webrtc/modules/pacing/packet_router.cc
 | 
| diff --git a/webrtc/modules/pacing/packet_router.cc b/webrtc/modules/pacing/packet_router.cc
 | 
| index 64e1aeacc1cde5277be14adf30b2bf1e8d855ad0..b5cd444495ffd63da75e8f911c8d40d9617e01b9 100644
 | 
| --- a/webrtc/modules/pacing/packet_router.cc
 | 
| +++ b/webrtc/modules/pacing/packet_router.cc
 | 
| @@ -10,6 +10,9 @@
 | 
|  
 | 
|  #include "webrtc/modules/pacing/packet_router.h"
 | 
|  
 | 
| +#include <algorithm>
 | 
| +#include <limits>
 | 
| +
 | 
|  #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
 | 
|  #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 | 
|  #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
 | 
| @@ -18,10 +21,17 @@
 | 
|  #include "webrtc/rtc_base/timeutils.h"
 | 
|  
 | 
|  namespace webrtc {
 | 
| +namespace {
 | 
| +
 | 
| +constexpr int kRembSendIntervalMs = 200;
 | 
| +
 | 
| +}  // namespace
 | 
|  
 | 
|  PacketRouter::PacketRouter()
 | 
|      : last_remb_time_ms_(rtc::TimeMillis()),
 | 
|        last_send_bitrate_bps_(0),
 | 
| +      bitrate_bps_(0),
 | 
| +      max_bitrate_bps_(std::numeric_limits<decltype(max_bitrate_bps_)>::max()),
 | 
|        active_remb_module_(nullptr),
 | 
|        transport_seq_(0) {}
 | 
|  
 | 
| @@ -142,8 +152,6 @@ uint16_t PacketRouter::AllocateSequenceNumber() {
 | 
|  
 | 
|  void PacketRouter::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
 | 
|                                             uint32_t bitrate_bps) {
 | 
| -  const int kRembSendIntervalMs = 200;
 | 
| -
 | 
|    // % threshold for if we should send a new REMB asap.
 | 
|    const uint32_t kSendThresholdPercent = 97;
 | 
|  
 | 
| @@ -173,10 +181,26 @@ void PacketRouter::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
 | 
|      // a module to actually send it.
 | 
|      last_remb_time_ms_ = now_ms;
 | 
|      last_send_bitrate_bps_ = bitrate_bps;
 | 
| +    // Cap the value to send in remb with configured value.
 | 
| +    bitrate_bps = std::min(bitrate_bps, max_bitrate_bps_);
 | 
|    }
 | 
|    SendRemb(bitrate_bps, ssrcs);
 | 
|  }
 | 
|  
 | 
| +void PacketRouter::SetMaxDesiredReceiveBitrate(uint32_t bitrate_bps) {
 | 
| +  {
 | 
| +    rtc::CritScope lock(&remb_crit_);
 | 
| +    max_bitrate_bps_ = bitrate_bps;
 | 
| +    if (rtc::TimeMillis() - last_remb_time_ms_ < kRembSendIntervalMs &&
 | 
| +        last_send_bitrate_bps_ > 0 &&
 | 
| +        last_send_bitrate_bps_ <= max_bitrate_bps_) {
 | 
| +      // Recent measured bitrate is already below the cap.
 | 
| +      return;
 | 
| +    }
 | 
| +  }
 | 
| +  SendRemb(bitrate_bps, /*ssrcs=*/{});
 | 
| +}
 | 
| +
 | 
|  bool PacketRouter::SendRemb(uint32_t bitrate_bps,
 | 
|                              const std::vector<uint32_t>& ssrcs) {
 | 
|    rtc::CritScope lock(&modules_crit_);
 | 
| 
 |