Index: webrtc/test/frame_generator_capturer.cc |
diff --git a/webrtc/test/frame_generator_capturer.cc b/webrtc/test/frame_generator_capturer.cc |
index 00efbc8b40b467e2248169349ac498997b8de3d2..0b2f1d64bdf49dbfbed487fefdc65622193d2b6a 100644 |
--- a/webrtc/test/frame_generator_capturer.cc |
+++ b/webrtc/test/frame_generator_capturer.cc |
@@ -10,10 +10,13 @@ |
#include "webrtc/test/frame_generator_capturer.h" |
+#include <utility> |
+#include <vector> |
+ |
#include "webrtc/base/criticalsection.h" |
#include "webrtc/base/platform_thread.h" |
+#include "webrtc/base/task_queue.h" |
#include "webrtc/system_wrappers/include/clock.h" |
-#include "webrtc/system_wrappers/include/event_wrapper.h" |
#include "webrtc/system_wrappers/include/sleep.h" |
#include "webrtc/test/frame_generator.h" |
#include "webrtc/video_send_stream.h" |
@@ -21,6 +24,31 @@ |
namespace webrtc { |
namespace test { |
+class FrameGeneratorCapturer::InsertFrameTask : public rtc::QueuedTask { |
+ public: |
+ // Repeats in |repeat_interval_ms|. One-time if |repeat_interval_ms| == 0. |
+ InsertFrameTask( |
+ webrtc::test::FrameGeneratorCapturer* frame_generator_capturer, |
+ uint32_t repeat_interval_ms) |
+ : frame_generator_capturer_(frame_generator_capturer), |
+ repeat_interval_ms_(repeat_interval_ms) {} |
+ |
+ private: |
+ bool Run() override { |
+ if (repeat_interval_ms_ > 0) { |
+ rtc::TaskQueue::Current()->PostDelayedTask( |
+ std::unique_ptr<rtc::QueuedTask>(this), |
+ repeat_interval_ms_); |
+ } |
+ frame_generator_capturer_->InsertFrame(); |
+ // Task should be deleted only if it's not repeating. |
+ return repeat_interval_ms_ == 0; |
+ } |
+ |
+ webrtc::test::FrameGeneratorCapturer* const frame_generator_capturer_; |
+ const uint32_t repeat_interval_ms_; |
+}; |
+ |
FrameGeneratorCapturer* FrameGeneratorCapturer::Create(int width, |
int height, |
int target_fps, |
@@ -61,8 +89,7 @@ FrameGeneratorCapturer::FrameGeneratorCapturer( |
sending_(false), |
sink_(nullptr), |
sink_wants_observer_(nullptr), |
- tick_(EventTimerWrapper::Create()), |
- thread_(FrameGeneratorCapturer::Run, this, "FrameGeneratorCapturer"), |
+ task_queue_("FrameGeneratorQueue", rtc::TaskQueue::Priority::HIGH), |
frame_generator_(std::move(frame_generator)), |
target_fps_(target_fps), |
first_frame_capture_time_(-1) { |
@@ -72,8 +99,6 @@ FrameGeneratorCapturer::FrameGeneratorCapturer( |
FrameGeneratorCapturer::~FrameGeneratorCapturer() { |
Stop(); |
- |
- thread_.Stop(); |
} |
void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) { |
@@ -87,15 +112,11 @@ bool FrameGeneratorCapturer::Init() { |
if (frame_generator_.get() == NULL) |
return false; |
- if (!tick_->StartTimer(true, 1000 / target_fps_)) |
- return false; |
- thread_.Start(); |
- thread_.SetPriority(rtc::kHighPriority); |
- return true; |
-} |
+ task_queue_.PostDelayedTask( |
+ std::unique_ptr<rtc::QueuedTask>( |
+ new InsertFrameTask(this, 1000 / target_fps_)), |
+ 1000 / target_fps_); |
-bool FrameGeneratorCapturer::Run(void* obj) { |
- static_cast<FrameGeneratorCapturer*>(obj)->InsertFrame(); |
return true; |
} |
@@ -113,7 +134,6 @@ void FrameGeneratorCapturer::InsertFrame() { |
sink_->OnFrame(*frame); |
} |
} |
- tick_->Wait(WEBRTC_EVENT_INFINITE); |
} |
void FrameGeneratorCapturer::Start() { |
@@ -155,7 +175,11 @@ void FrameGeneratorCapturer::RemoveSink( |
} |
void FrameGeneratorCapturer::ForceFrame() { |
- tick_->Set(); |
+ // One-time non-repeating task, |
+ // therefore repeat_interval_ms is 0 in InsertFrameTask() |
+ task_queue_.PostTask( |
+ std::unique_ptr<rtc::QueuedTask>(new InsertFrameTask(this, 0))); |
} |
-} // test |
-} // webrtc |
+ |
+} // namespace test |
+} // namespace webrtc |