Introduce a new constructor to PlatformThread.
The new constructor introduces two new changes:
* Support specifying thread priority at construction time.
- Moving forward, the SetPriority() method will be removed.
* New thread function type.
- The new type has 'void' as a return type and a polling loop
inside PlatformThread, is not used.
The old function type is still supported until all places have been moved over.
In this CL, the first steps towards deprecating the old mechanism are taken
by moving parts of the code that were simple to move, over to the new callback
type.
BUG=webrtc:7187
Review-Url: https://codereview.webrtc.org/2708723003
Cr-Commit-Position: refs/heads/master@{#16779}
diff --git a/webrtc/common_video/incoming_video_stream.cc b/webrtc/common_video/incoming_video_stream.cc
index ed7b9ea..c1f61d1 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 @@
deliver_buffer_event_->StartTimer(false, kEventStartupTimeMs);
incoming_render_thread_.Start();
- incoming_render_thread_.SetPriority(rtc::kRealtimePriority);
}
IncomingVideoStream::~IncomingVideoStream() {
@@ -57,39 +61,44 @@
}
}
-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