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 |