| Index: webrtc/common_video/incoming_video_stream.cc
 | 
| diff --git a/webrtc/common_video/incoming_video_stream.cc b/webrtc/common_video/incoming_video_stream.cc
 | 
| index 78fc38695c113aa8780e4a73c5381e2a86715a7c..010a57ed5b14793a3a9f55f742bc3a0c1543ccad 100644
 | 
| --- a/webrtc/common_video/incoming_video_stream.cc
 | 
| +++ b/webrtc/common_video/incoming_video_stream.cc
 | 
| @@ -28,11 +28,14 @@
 | 
|  #include "webrtc/system_wrappers/include/event_wrapper.h"
 | 
|  #include "webrtc/system_wrappers/include/tick_util.h"
 | 
|  #include "webrtc/system_wrappers/include/trace.h"
 | 
| +#include "webrtc/video_renderer.h"
 | 
|  
 | 
|  namespace webrtc {
 | 
|  
 | 
| -IncomingVideoStream::IncomingVideoStream(uint32_t stream_id)
 | 
| +IncomingVideoStream::IncomingVideoStream(uint32_t stream_id,
 | 
| +                                         bool disable_prerenderer_smoothing)
 | 
|      : stream_id_(stream_id),
 | 
| +      disable_prerenderer_smoothing_(disable_prerenderer_smoothing),
 | 
|        stream_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
 | 
|        thread_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
 | 
|        buffer_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
 | 
| @@ -49,8 +52,7 @@ IncomingVideoStream::IncomingVideoStream(uint32_t stream_id)
 | 
|        temp_frame_(),
 | 
|        start_image_(),
 | 
|        timeout_image_(),
 | 
| -      timeout_time_() {
 | 
| -}
 | 
| +      timeout_time_() {}
 | 
|  
 | 
|  IncomingVideoStream::~IncomingVideoStream() {
 | 
|    Stop();
 | 
| @@ -80,11 +82,15 @@ int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id,
 | 
|      last_rate_calculation_time_ms_ = now_ms;
 | 
|    }
 | 
|  
 | 
| -  // Insert frame.
 | 
| -  CriticalSectionScoped csB(buffer_critsect_.get());
 | 
| -  if (render_buffers_->AddFrame(video_frame) == 1)
 | 
| -    deliver_buffer_event_->Set();
 | 
| -
 | 
| +  // Hand over or insert frame.
 | 
| +  if (disable_prerenderer_smoothing_) {
 | 
| +    DeliverFrame(video_frame);
 | 
| +  } else {
 | 
| +    CriticalSectionScoped csB(buffer_critsect_.get());
 | 
| +    if (render_buffers_->AddFrame(video_frame) == 1) {
 | 
| +      deliver_buffer_event_->Set();
 | 
| +    }
 | 
| +  }
 | 
|    return 0;
 | 
|  }
 | 
|  
 | 
| @@ -128,22 +134,23 @@ int32_t IncomingVideoStream::Start() {
 | 
|      return 0;
 | 
|    }
 | 
|  
 | 
| -  CriticalSectionScoped csT(thread_critsect_.get());
 | 
| -  assert(incoming_render_thread_ == NULL);
 | 
| +  if (!disable_prerenderer_smoothing_) {
 | 
| +    CriticalSectionScoped csT(thread_critsect_.get());
 | 
| +    assert(incoming_render_thread_ == NULL);
 | 
|  
 | 
| -  incoming_render_thread_ = PlatformThread::CreateThread(
 | 
| -      IncomingVideoStreamThreadFun, this, "IncomingVideoStreamThread");
 | 
| -  if (!incoming_render_thread_) {
 | 
| -    return -1;
 | 
| -  }
 | 
| +    incoming_render_thread_ = PlatformThread::CreateThread(
 | 
| +        IncomingVideoStreamThreadFun, this, "IncomingVideoStreamThread");
 | 
| +    if (!incoming_render_thread_) {
 | 
| +      return -1;
 | 
| +    }
 | 
|  
 | 
| -  if (incoming_render_thread_->Start()) {
 | 
| -  } else {
 | 
| -    return -1;
 | 
| +    if (incoming_render_thread_->Start()) {
 | 
| +    } else {
 | 
| +      return -1;
 | 
| +    }
 | 
| +    incoming_render_thread_->SetPriority(kRealtimePriority);
 | 
| +    deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs);
 | 
|    }
 | 
| -  incoming_render_thread_->SetPriority(kRealtimePriority);
 | 
| -  deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs);
 | 
| -
 | 
|    running_ = true;
 | 
|    return 0;
 | 
|  }
 | 
| @@ -205,6 +212,7 @@ bool IncomingVideoStream::IncomingVideoStreamProcess() {
 | 
|        // Terminating
 | 
|        return false;
 | 
|      }
 | 
| +
 | 
|      // Get a new frame to render and the time for the frame after this one.
 | 
|      VideoFrame frame_to_render;
 | 
|      uint32_t wait_time;
 | 
| @@ -220,37 +228,41 @@ bool IncomingVideoStream::IncomingVideoStreamProcess() {
 | 
|      }
 | 
|      deliver_buffer_event_->StartTimer(false, wait_time);
 | 
|  
 | 
| -    if (frame_to_render.IsZeroSize()) {
 | 
| -      if (render_callback_) {
 | 
| -        if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) {
 | 
| -          // We have not rendered anything and have a start image.
 | 
| -          temp_frame_.CopyFrame(start_image_);
 | 
| -          render_callback_->RenderFrame(stream_id_, temp_frame_);
 | 
| -        } else if (!timeout_image_.IsZeroSize() &&
 | 
| -                   last_render_time_ms_ + timeout_time_ <
 | 
| -                       TickTime::MillisecondTimestamp()) {
 | 
| -          // Render a timeout image.
 | 
| -          temp_frame_.CopyFrame(timeout_image_);
 | 
| -          render_callback_->RenderFrame(stream_id_, temp_frame_);
 | 
| -        }
 | 
| -      }
 | 
| +    DeliverFrame(frame_to_render);
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
|  
 | 
| -      // No frame.
 | 
| -      return true;
 | 
| +void IncomingVideoStream::DeliverFrame(const VideoFrame& video_frame) {
 | 
| +  CriticalSectionScoped cs(thread_critsect_.get());
 | 
| +  if (video_frame.IsZeroSize()) {
 | 
| +    if (render_callback_) {
 | 
| +      if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) {
 | 
| +        // We have not rendered anything and have a start image.
 | 
| +        temp_frame_.CopyFrame(start_image_);
 | 
| +        render_callback_->RenderFrame(stream_id_, temp_frame_);
 | 
| +      } else if (!timeout_image_.IsZeroSize() &&
 | 
| +                 last_render_time_ms_ + timeout_time_ <
 | 
| +                     TickTime::MillisecondTimestamp()) {
 | 
| +        // Render a timeout image.
 | 
| +        temp_frame_.CopyFrame(timeout_image_);
 | 
| +        render_callback_->RenderFrame(stream_id_, temp_frame_);
 | 
| +      }
 | 
|      }
 | 
|  
 | 
| -    // Send frame for rendering.
 | 
| -    if (external_callback_) {
 | 
| -      external_callback_->RenderFrame(stream_id_, frame_to_render);
 | 
| -    } else if (render_callback_) {
 | 
| -      render_callback_->RenderFrame(stream_id_, frame_to_render);
 | 
| -    }
 | 
| +    // No frame.
 | 
| +    return;
 | 
| +  }
 | 
|  
 | 
| -    // We're done with this frame.
 | 
| -    if (!frame_to_render.IsZeroSize())
 | 
| -      last_render_time_ms_ = frame_to_render.render_time_ms();
 | 
| +  // Send frame for rendering.
 | 
| +  if (external_callback_) {
 | 
| +    external_callback_->RenderFrame(stream_id_, video_frame);
 | 
| +  } else if (render_callback_) {
 | 
| +    render_callback_->RenderFrame(stream_id_, video_frame);
 | 
|    }
 | 
| -  return true;
 | 
| +
 | 
| +  // We're done with this frame.
 | 
| +  last_render_time_ms_ = video_frame.render_time_ms();
 | 
|  }
 | 
|  
 | 
|  }  // namespace webrtc
 | 
| 
 |