Chromium Code Reviews| 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 a4b25fcd2e5946c30b91da327b44984f445c2363..ded398442f980cc15a9b064c3242073341b4cd95 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/thread_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_) { |
| + HandOverFrame(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_ = ThreadWrapper::CreateThread( |
| - IncomingVideoStreamThreadFun, this, "IncomingVideoStreamThread"); |
| - if (!incoming_render_thread_) { |
| - return -1; |
| - } |
| + incoming_render_thread_ = ThreadWrapper::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; |
| @@ -214,43 +222,49 @@ bool IncomingVideoStream::IncomingVideoStreamProcess() { |
| wait_time = render_buffers_->TimeToNextFrameRelease(); |
| } |
| - // Set timer for next frame to render. |
| - if (wait_time > kEventMaxWaitTimeMs) { |
| - wait_time = kEventMaxWaitTimeMs; |
| - } |
| - 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_); |
| - } |
| + if (!disable_prerenderer_smoothing_) { |
| + // Set timer for next frame to render. |
| + if (wait_time > kEventMaxWaitTimeMs) { |
| + wait_time = kEventMaxWaitTimeMs; |
| } |
| - |
| - // No frame. |
| - return true; |
| + deliver_buffer_event_->StartTimer(false, wait_time); |
| } |
| - // 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); |
| + HandOverFrame(frame_to_render); |
| + } |
| + return true; |
| +} |
| + |
| +void IncomingVideoStream::HandOverFrame(const VideoFrame& video_frame) { |
|
pbos
2015/11/24 13:14:40
Should this be called DeliverFrame? HandOverFrame
qiangchen
2015/11/25 01:03:20
Done.
|
| + 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_); |
| + } |
| } |
| - // We're done with this frame. |
| - if (!frame_to_render.IsZeroSize()) |
| - last_render_time_ms_ = frame_to_render.render_time_ms(); |
| + // No frame. |
| + return; |
| } |
| - return true; |
| + |
| + // 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); |
| + } |
| + |
| + // We're done with this frame. |
| + last_render_time_ms_ = video_frame.render_time_ms(); |
| } |
| } // namespace webrtc |