From 382a72a0d321f19ac9cdc9bb30712cefe2639f88 Mon Sep 17 00:00:00 2001 From: ilnik Date: Mon, 13 Mar 2017 01:54:13 -0700 Subject: [PATCH] Revert of rewrite frame generator capturer to use TaskQueue instead of EventTimeWrapper (patchset #2 id:90001 of https://codereview.webrtc.org/2744003002/ ) Reason for revert: CallPerfTest.ReceivesCpuOveruseAndUnderuse perf test fails due to this CL. It requires very accurate frame rate, which may not be so accurate now. Original issue's description: > Reland of rewrite frame generator capturer to use TaskQueue instead of EventTimeWrapper (patchset #1 id:1 of https://codereview.webrtc.org/2743993002/ ) > > And enable large full-stack test depending on that change (Reland of https://codereview.webrtc.org/2741823003/) > TBR=stefan@webrtc.org,tommi@webrtc.org > BUG=webrtc:7301,webrtc:7325 > > Review-Url: https://codereview.webrtc.org/2744003002 > Cr-Commit-Position: refs/heads/master@{#17196} > Committed: https://chromium.googlesource.com/external/webrtc/+/8c0a5896d1cdc7bb81307c33fa4b3538d8160a0f TBR=stefan@webrtc.org,tommi@webrtc.org,sprang@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:7301,webrtc:7325 Review-Url: https://codereview.webrtc.org/2748643002 Cr-Commit-Position: refs/heads/master@{#17198} --- webrtc/call/call_perf_tests.cc | 2 +- webrtc/test/frame_generator_capturer.cc | 60 ++++++++----------------- webrtc/test/frame_generator_capturer.h | 13 +++--- webrtc/video/full_stack_tests.cc | 4 +- 4 files changed, 26 insertions(+), 53 deletions(-) diff --git a/webrtc/call/call_perf_tests.cc b/webrtc/call/call_perf_tests.cc index 079b7027de..1551cd7b86 100644 --- a/webrtc/call/call_perf_tests.cc +++ b/webrtc/call/call_perf_tests.cc @@ -476,7 +476,7 @@ TEST_F(CallPerfTest, ReceivesCpuOveruseAndUnderuse) { LoadObserver() : SendTest(kLongTimeoutMs), expect_lower_resolution_wants_(true), - encoder_(Clock::GetRealTimeClock(), 40 /* delay_ms */) {} + encoder_(Clock::GetRealTimeClock(), 35 /* delay_ms */) {} void OnFrameGeneratorCapturerCreated( test::FrameGeneratorCapturer* frame_generator_capturer) override { diff --git a/webrtc/test/frame_generator_capturer.cc b/webrtc/test/frame_generator_capturer.cc index 98f7a4b0ef..00efbc8b40 100644 --- a/webrtc/test/frame_generator_capturer.cc +++ b/webrtc/test/frame_generator_capturer.cc @@ -10,13 +10,10 @@ #include "webrtc/test/frame_generator_capturer.h" -#include -#include - #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" @@ -24,30 +21,6 @@ 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(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, @@ -88,17 +61,19 @@ FrameGeneratorCapturer::FrameGeneratorCapturer( 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), - task_queue_("FrameGeneratorCapturerQueue", - rtc::TaskQueue::Priority::HIGH) { + first_frame_capture_time_(-1) { RTC_DCHECK(frame_generator_); RTC_DCHECK_GT(target_fps, 0); } FrameGeneratorCapturer::~FrameGeneratorCapturer() { Stop(); + + thread_.Stop(); } void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) { @@ -112,11 +87,15 @@ bool FrameGeneratorCapturer::Init() { if (frame_generator_.get() == NULL) return false; - task_queue_.PostDelayedTask( - std::unique_ptr( - new InsertFrameTask(this, 1000 / target_fps_)), - 1000 / target_fps_); + if (!tick_->StartTimer(true, 1000 / target_fps_)) + return false; + thread_.Start(); + thread_.SetPriority(rtc::kHighPriority); + return true; +} +bool FrameGeneratorCapturer::Run(void* obj) { + static_cast(obj)->InsertFrame(); return true; } @@ -134,6 +113,7 @@ void FrameGeneratorCapturer::InsertFrame() { sink_->OnFrame(*frame); } } + tick_->Wait(WEBRTC_EVENT_INFINITE); } void FrameGeneratorCapturer::Start() { @@ -175,11 +155,7 @@ void FrameGeneratorCapturer::RemoveSink( } void FrameGeneratorCapturer::ForceFrame() { - // One-time non-repeating task, - // therefore repeat_interval_ms is 0 in InsertFrameTask() - task_queue_.PostTask( - std::unique_ptr(new InsertFrameTask(this, 0))); + tick_->Set(); } - -} // namespace test -} // namespace webrtc +} // test +} // webrtc diff --git a/webrtc/test/frame_generator_capturer.h b/webrtc/test/frame_generator_capturer.h index 75e48497be..dfd12711d1 100644 --- a/webrtc/test/frame_generator_capturer.h +++ b/webrtc/test/frame_generator_capturer.h @@ -15,7 +15,7 @@ #include "webrtc/api/video/video_frame.h" #include "webrtc/base/criticalsection.h" -#include "webrtc/base/task_queue.h" +#include "webrtc/base/platform_thread.h" #include "webrtc/test/video_capturer.h" #include "webrtc/typedefs.h" @@ -74,8 +74,6 @@ class FrameGeneratorCapturer : public VideoCapturer { bool Init(); private: - class InsertFrameTask; - void InsertFrame(); static bool Run(void* obj); @@ -84,18 +82,17 @@ class FrameGeneratorCapturer : public VideoCapturer { rtc::VideoSinkInterface* sink_ GUARDED_BY(&lock_); SinkWantsObserver* sink_wants_observer_ GUARDED_BY(&lock_); + std::unique_ptr tick_; rtc::CriticalSection lock_; + rtc::PlatformThread thread_; std::unique_ptr frame_generator_; int target_fps_; VideoRotation fake_rotation_ = kVideoRotation_0; int64_t first_frame_capture_time_; - // Must be the last field, so it will be deconstructed first as tasks - // in the TaskQueue access other fields of the instance of this class. - rtc::TaskQueue task_queue_; }; -} // namespace test -} // namespace webrtc +} // test +} // webrtc #endif // WEBRTC_TEST_FRAME_GENERATOR_CAPTURER_H_ diff --git a/webrtc/video/full_stack_tests.cc b/webrtc/video/full_stack_tests.cc index eb7e68bc74..e59280a055 100644 --- a/webrtc/video/full_stack_tests.cc +++ b/webrtc/video/full_stack_tests.cc @@ -534,8 +534,8 @@ TEST_F(FullStackTest, LargeRoomVP8_5thumb) { RunTest(large_room); } -#if defined(WEBRTC_ANDROID) -// Fails on Android: +#if defined(WEBRTC_ANDROID) || defined(WEBRTC_WIN) +// Fails on Android and win: // https://bugs.chromium.org/p/webrtc/issues/detail?id=7301 #define MAYBE_LargeRoomVP8_50thumb DISABLED_LargeRoomVP8_50thumb #define MAYBE_LargeRoomVP8_15thumb DISABLED_LargeRoomVP8_15thumb