| Index: webrtc/video/vie_encoder.cc
 | 
| diff --git a/webrtc/video/vie_encoder.cc b/webrtc/video/vie_encoder.cc
 | 
| index c2598f48a9079a9a103ab1f5cf66216997132ffc..e71935377dc8109d2c9f40618d888336ce68ffac 100644
 | 
| --- a/webrtc/video/vie_encoder.cc
 | 
| +++ b/webrtc/video/vie_encoder.cc
 | 
| @@ -19,6 +19,7 @@
 | 
|  #include "webrtc/base/logging.h"
 | 
|  #include "webrtc/base/trace_event.h"
 | 
|  #include "webrtc/base/timeutils.h"
 | 
| +#include "webrtc/common_video/include/video_bitrate_allocator.h"
 | 
|  #include "webrtc/modules/pacing/paced_sender.h"
 | 
|  #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
 | 
|  #include "webrtc/modules/video_coding/include/video_coding.h"
 | 
| @@ -26,7 +27,6 @@
 | 
|  #include "webrtc/video/overuse_frame_detector.h"
 | 
|  #include "webrtc/video/send_statistics_proxy.h"
 | 
|  #include "webrtc/video_frame.h"
 | 
| -
 | 
|  namespace webrtc {
 | 
|  
 | 
|  namespace {
 | 
| @@ -268,6 +268,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
 | 
|        last_frame_log_ms_(clock_->TimeInMilliseconds()),
 | 
|        captured_frame_count_(0),
 | 
|        dropped_frame_count_(0),
 | 
| +      bitrate_observer_(nullptr),
 | 
|        encoder_queue_("EncoderQueue") {
 | 
|    encoder_queue_.PostTask([this] {
 | 
|      RTC_DCHECK_RUN_ON(&encoder_queue_);
 | 
| @@ -290,6 +291,7 @@ void ViEEncoder::Stop() {
 | 
|      RTC_DCHECK_RUN_ON(&encoder_queue_);
 | 
|      overuse_detector_.StopCheckForOveruse();
 | 
|      rate_allocator_.reset();
 | 
| +    bitrate_observer_ = nullptr;
 | 
|      video_sender_.RegisterExternalEncoder(nullptr, settings_.payload_type,
 | 
|                                            false);
 | 
|      shutdown_event_.Set();
 | 
| @@ -311,6 +313,16 @@ void ViEEncoder::DeRegisterProcessThread() {
 | 
|    module_process_thread_->DeRegisterModule(&video_sender_);
 | 
|  }
 | 
|  
 | 
| +void ViEEncoder::SetBitrateObserver(
 | 
| +    VideoBitrateAllocationObserver* bitrate_observer) {
 | 
| +  RTC_DCHECK_RUN_ON(&thread_checker_);
 | 
| +  encoder_queue_.PostTask([this, bitrate_observer] {
 | 
| +    RTC_DCHECK_RUN_ON(&encoder_queue_);
 | 
| +    RTC_DCHECK(!bitrate_observer_);
 | 
| +    bitrate_observer_ = bitrate_observer;
 | 
| +  });
 | 
| +}
 | 
| +
 | 
|  void ViEEncoder::SetSource(
 | 
|      rtc::VideoSourceInterface<VideoFrame>* source,
 | 
|      const VideoSendStream::DegradationPreference& degradation_preference) {
 | 
| @@ -407,7 +419,8 @@ void ViEEncoder::ReconfigureEncoder() {
 | 
|      RTC_DCHECK(success);
 | 
|    }
 | 
|  
 | 
| -  video_sender_.UpdateChannelParemeters(rate_allocator_.get());
 | 
| +  video_sender_.UpdateChannelParemeters(rate_allocator_.get(),
 | 
| +                                        bitrate_observer_);
 | 
|    if (stats_proxy_) {
 | 
|      int framerate = stats_proxy_->GetSendFrameRate();
 | 
|      if (framerate == 0)
 | 
| @@ -639,7 +652,8 @@ void ViEEncoder::OnBitrateUpdated(uint32_t bitrate_bps,
 | 
|                    << " rtt " << round_trip_time_ms;
 | 
|  
 | 
|    video_sender_.SetChannelParameters(bitrate_bps, fraction_lost,
 | 
| -                                     round_trip_time_ms, rate_allocator_.get());
 | 
| +                                     round_trip_time_ms, rate_allocator_.get(),
 | 
| +                                     bitrate_observer_);
 | 
|  
 | 
|    encoder_start_bitrate_bps_ =
 | 
|        bitrate_bps != 0 ? bitrate_bps : encoder_start_bitrate_bps_;
 | 
| 
 |