Reland of write frame generator capturer to use TaskQueue instead of EventTimeWrapper (patchset #1 id:1 of https://codereview.webrtc.org/2751063005/ )

Fix reduced frame-rate on Mac and Android.

Also enable huge full-stack test Largeroom_50thumbs on Windows.

BUG=webrtc:7301

Review-Url: https://codereview.webrtc.org/2760583003
Cr-Commit-Position: refs/heads/master@{#17288}
diff --git a/webrtc/test/frame_generator_capturer.cc b/webrtc/test/frame_generator_capturer.cc
index 00efbc8..9e74e40 100644
--- a/webrtc/test/frame_generator_capturer.cc
+++ b/webrtc/test/frame_generator_capturer.cc
@@ -10,10 +10,14 @@
 
 #include "webrtc/test/frame_generator_capturer.h"
 
+#include <utility>
+#include <vector>
+
 #include "webrtc/base/criticalsection.h"
+#include "webrtc/base/logging.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 +25,49 @@
 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),
+        intended_run_time_ms_(-1) {}
+
+ private:
+  bool Run() override {
+    if (repeat_interval_ms_ > 0) {
+      int64_t delay_ms;
+      int64_t time_now_ms = rtc::TimeMillis();
+      if (intended_run_time_ms_ > 0) {
+        delay_ms = time_now_ms - intended_run_time_ms_;
+      } else {
+        delay_ms = 0;
+        intended_run_time_ms_ = time_now_ms;
+      }
+      intended_run_time_ms_ += repeat_interval_ms_;
+      if (delay_ms < repeat_interval_ms_) {
+        rtc::TaskQueue::Current()->PostDelayedTask(
+            std::unique_ptr<rtc::QueuedTask>(this),
+            repeat_interval_ms_ - delay_ms);
+      } else {
+        rtc::TaskQueue::Current()->PostDelayedTask(
+            std::unique_ptr<rtc::QueuedTask>(this), 0);
+        LOG(LS_ERROR)
+            << "Frame Generator Capturer can't keep up with requested fps";
+      }
+    }
+    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_;
+  int64_t intended_run_time_ms_;
+};
+
 FrameGeneratorCapturer* FrameGeneratorCapturer::Create(int width,
                                                        int height,
                                                        int target_fps,
@@ -61,19 +108,17 @@
       sending_(false),
       sink_(nullptr),
       sink_wants_observer_(nullptr),
-      tick_(EventTimerWrapper::Create()),
-      thread_(FrameGeneratorCapturer::Run, this, "FrameGeneratorCapturer"),
       frame_generator_(std::move(frame_generator)),
       target_fps_(target_fps),
-      first_frame_capture_time_(-1) {
+      first_frame_capture_time_(-1),
+      task_queue_("FrameGenCapQ",
+                  rtc::TaskQueue::Priority::HIGH) {
   RTC_DCHECK(frame_generator_);
   RTC_DCHECK_GT(target_fps, 0);
 }
 
 FrameGeneratorCapturer::~FrameGeneratorCapturer() {
   Stop();
-
-  thread_.Stop();
 }
 
 void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) {
@@ -87,15 +132,11 @@
   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 +154,6 @@
         sink_->OnFrame(*frame);
     }
   }
-  tick_->Wait(WEBRTC_EVENT_INFINITE);
 }
 
 void FrameGeneratorCapturer::Start() {
@@ -155,7 +195,11 @@
 }
 
 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