| Index: webrtc/video/video_send_stream.cc
 | 
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
 | 
| index 7ae55dcf72af857985f368602967764f3735ae82..c98e5187dbbaae1443b33bff14be403788742357 100644
 | 
| --- a/webrtc/video/video_send_stream.cc
 | 
| +++ b/webrtc/video/video_send_stream.cc
 | 
| @@ -171,6 +171,9 @@ VideoSendStream::VideoSendStream(
 | 
|        call_stats_(call_stats),
 | 
|        congestion_controller_(congestion_controller),
 | 
|        remb_(remb),
 | 
| +      encoder_thread_(EncoderThreadFunction, this, "EncoderThread"),
 | 
| +      encoder_wakeup_event_(false, false),
 | 
| +      stop_encoder_thread_(0),
 | 
|        overuse_detector_(
 | 
|            Clock::GetRealTimeClock(),
 | 
|            GetCpuOveruseOptions(config.encoder_settings.full_overuse_time),
 | 
| @@ -203,7 +206,7 @@ VideoSendStream::VideoSendStream(
 | 
|                     bitrate_allocator),
 | 
|        vcm_(vie_encoder_.vcm()),
 | 
|        rtp_rtcp_modules_(vie_channel_.rtp_rtcp()),
 | 
| -      input_(&vie_encoder_,
 | 
| +      input_(&encoder_wakeup_event_,
 | 
|               config_.local_renderer,
 | 
|               &stats_proxy_,
 | 
|               &overuse_detector_) {
 | 
| @@ -303,12 +306,20 @@ VideoSendStream::VideoSendStream(
 | 
|    vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_);
 | 
|  
 | 
|    module_process_thread_->RegisterModule(&overuse_detector_);
 | 
| +
 | 
| +  encoder_thread_.Start();
 | 
| +  encoder_thread_.SetPriority(rtc::kHighPriority);
 | 
|  }
 | 
|  
 | 
|  VideoSendStream::~VideoSendStream() {
 | 
|    LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString();
 | 
|    Stop();
 | 
|  
 | 
| +  // Stop the encoder thread permanently.
 | 
| +  rtc::AtomicOps::ReleaseStore(&stop_encoder_thread_, 1);
 | 
| +  encoder_wakeup_event_.Set();
 | 
| +  encoder_thread_.Stop();
 | 
| +
 | 
|    module_process_thread_->DeRegisterModule(&overuse_detector_);
 | 
|    vie_channel_.RegisterSendFrameCountObserver(nullptr);
 | 
|    vie_channel_.RegisterSendBitrateObserver(nullptr);
 | 
| @@ -351,6 +362,24 @@ void VideoSendStream::Stop() {
 | 
|    vie_receiver_->StopReceive();
 | 
|  }
 | 
|  
 | 
| +bool VideoSendStream::EncoderThreadFunction(void* obj) {
 | 
| +  static_cast<VideoSendStream*>(obj)->EncoderProcess();
 | 
| +  // We're done, return false to abort.
 | 
| +  return false;
 | 
| +}
 | 
| +
 | 
| +void VideoSendStream::EncoderProcess() {
 | 
| +  while (true) {
 | 
| +    encoder_wakeup_event_.Wait(rtc::Event::kForever);
 | 
| +    if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_))
 | 
| +      return;
 | 
| +
 | 
| +    VideoFrame frame;
 | 
| +    if (input_.GetVideoFrame(&frame))
 | 
| +      vie_encoder_.EncodeVideoFrame(frame);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  void VideoSendStream::ReconfigureVideoEncoder(
 | 
|      const VideoEncoderConfig& config) {
 | 
|    TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder");
 | 
| 
 |