diff options
Diffstat (limited to 'webrtc/common_video/incoming_video_stream.cc')
-rw-r--r-- | webrtc/common_video/incoming_video_stream.cc | 115 |
1 files changed, 61 insertions, 54 deletions
diff --git a/webrtc/common_video/incoming_video_stream.cc b/webrtc/common_video/incoming_video_stream.cc index 79bbb8a7b6..1272ecc5bb 100644 --- a/webrtc/common_video/incoming_video_stream.cc +++ b/webrtc/common_video/incoming_video_stream.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "webrtc/common_video/interface/incoming_video_stream.h" +#include "webrtc/common_video/include/incoming_video_stream.h" #include <assert.h> @@ -21,18 +21,21 @@ #include <sys/time.h> #endif +#include "webrtc/base/platform_thread.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" #include "webrtc/common_video/video_render_frames.h" #include "webrtc/system_wrappers/include/critical_section_wrapper.h" #include "webrtc/system_wrappers/include/event_wrapper.h" -#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_) { + DeliverFrame(video_frame); + } else { + CriticalSectionScoped csB(buffer_critsect_.get()); + if (render_buffers_->AddFrame(video_frame) == 1) { + deliver_buffer_event_->Set(); + } + } return 0; } @@ -128,21 +134,20 @@ 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_.reset(new rtc::PlatformThread( + IncomingVideoStreamThreadFun, this, "IncomingVideoStreamThread")); + if (!incoming_render_thread_) { + return -1; + } - if (incoming_render_thread_->Start()) { - } else { - return -1; + incoming_render_thread_->Start(); + incoming_render_thread_->SetPriority(rtc::kRealtimePriority); + deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs); } - incoming_render_thread_->SetPriority(kRealtimePriority); - deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs); running_ = true; return 0; @@ -155,7 +160,7 @@ int32_t IncomingVideoStream::Stop() { return 0; } - ThreadWrapper* thread = NULL; + rtc::PlatformThread* thread = NULL; { CriticalSectionScoped cs_thread(thread_critsect_.get()); if (incoming_render_thread_) { @@ -169,11 +174,8 @@ int32_t IncomingVideoStream::Stop() { } } if (thread) { - if (thread->Stop()) { - delete thread; - } else { - assert(false); - } + thread->Stop(); + delete thread; } running_ = false; return 0; @@ -205,6 +207,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 +223,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 |