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 ed7b9ea29d8267d47cda582cbf8773a171985660..c1f61d1cfb87c94b55f57246a4ceaf684f98526d 100644 |
--- a/webrtc/common_video/incoming_video_stream.cc |
+++ b/webrtc/common_video/incoming_video_stream.cc |
@@ -16,13 +16,18 @@ |
#include "webrtc/system_wrappers/include/event_wrapper.h" |
namespace webrtc { |
+namespace { |
+const int kEventStartupTimeMs = 10; |
+const int kEventMaxWaitTimeMs = 100; |
+} // namespace |
IncomingVideoStream::IncomingVideoStream( |
int32_t delay_ms, |
rtc::VideoSinkInterface<VideoFrame>* callback) |
: incoming_render_thread_(&IncomingVideoStreamThreadFun, |
this, |
- "IncomingVideoStreamThread"), |
+ "IncomingVideoStreamThread", |
+ rtc::kRealtimePriority), |
deliver_buffer_event_(EventTimerWrapper::Create()), |
external_callback_(callback), |
render_buffers_(new VideoRenderFrames(delay_ms)) { |
@@ -32,7 +37,6 @@ IncomingVideoStream::IncomingVideoStream( |
deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs); |
incoming_render_thread_.Start(); |
- incoming_render_thread_.SetPriority(rtc::kRealtimePriority); |
} |
IncomingVideoStream::~IncomingVideoStream() { |
@@ -57,39 +61,44 @@ void IncomingVideoStream::OnFrame(const VideoFrame& video_frame) { |
} |
} |
-bool IncomingVideoStream::IncomingVideoStreamThreadFun(void* obj) { |
- return static_cast<IncomingVideoStream*>(obj)->IncomingVideoStreamProcess(); |
+// static |
+void IncomingVideoStream::IncomingVideoStreamThreadFun(void* obj) { |
+ static_cast<IncomingVideoStream*>(obj)->IncomingVideoStreamProcess(); |
} |
-bool IncomingVideoStream::IncomingVideoStreamProcess() { |
+void IncomingVideoStream::IncomingVideoStreamProcess() { |
RTC_DCHECK_RUN_ON(&render_thread_checker_); |
- if (kEventError != deliver_buffer_event_->Wait(kEventMaxWaitTimeMs)) { |
- // Get a new frame to render and the time for the frame after this one. |
- rtc::Optional<VideoFrame> frame_to_render; |
- uint32_t wait_time; |
- { |
- rtc::CritScope cs(&buffer_critsect_); |
- if (!render_buffers_.get()) { |
- // Terminating |
- return false; |
+ while (true) { |
+ if (kEventError != deliver_buffer_event_->Wait(kEventMaxWaitTimeMs)) { |
+ // Get a new frame to render and the time for the frame after this one. |
+ rtc::Optional<VideoFrame> frame_to_render; |
+ uint32_t wait_time; |
+ { |
+ rtc::CritScope cs(&buffer_critsect_); |
+ if (!render_buffers_.get()) { |
+ // Terminating |
+ return; |
+ } |
+ |
+ frame_to_render = render_buffers_->FrameToRender(); |
+ wait_time = render_buffers_->TimeToNextFrameRelease(); |
} |
- frame_to_render = render_buffers_->FrameToRender(); |
- wait_time = render_buffers_->TimeToNextFrameRelease(); |
- } |
- // Set timer for next frame to render. |
- if (wait_time > kEventMaxWaitTimeMs) { |
- wait_time = kEventMaxWaitTimeMs; |
- } |
+ // Set timer for next frame to render. |
+ if (wait_time > kEventMaxWaitTimeMs) { |
+ wait_time = kEventMaxWaitTimeMs; |
+ } |
- deliver_buffer_event_->StartTimer(false, wait_time); |
+ deliver_buffer_event_->StartTimer(false, wait_time); |
- if (frame_to_render) { |
- external_callback_->OnFrame(*frame_to_render); |
+ if (frame_to_render) { |
+ external_callback_->OnFrame(*frame_to_render); |
+ } |
+ } else { |
+ RTC_NOTREACHED(); |
} |
} |
- return true; |
} |
} // namespace webrtc |