From: Steinar H. Gunderson Date: Sun, 18 Mar 2018 22:10:24 +0000 (+0100) Subject: When dropping CEF frames, ask for invalidation only a bit later. X-Git-Tag: 1.7.1~18 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=06608bb52fa8788a7a6498198143fc38fa83df44 When dropping CEF frames, ask for invalidation only a bit later. --- diff --git a/cef_capture.cpp b/cef_capture.cpp index ff978f2..853c6b4 100644 --- a/cef_capture.cpp +++ b/cef_capture.cpp @@ -39,11 +39,15 @@ CEFCapture::~CEFCapture() } } -void CEFCapture::post_to_cef_ui_thread(std::function &&func) +void CEFCapture::post_to_cef_ui_thread(std::function &&func, int64_t delay_ms) { lock_guard lock(browser_mutex); if (browser != nullptr) { - CefPostTask(TID_UI, new CEFTaskAdapter(std::move(func))); + if (delay_ms <= 0) { + CefPostTask(TID_UI, new CEFTaskAdapter(std::move(func))); + } else { + CefPostDelayedTask(TID_UI, new CEFTaskAdapter(std::move(func)), delay_ms); + } } else { deferred_tasks.push_back(std::move(func)); } @@ -112,12 +116,16 @@ void CEFCapture::OnPaint(const void *buffer, int width, int height) // (CEF only sends OnPaint when there are actual changes, // so we need to do this explicitly, or we could be stuck on an // old frame forever if the image doesn't change.) + // + // By adding a delay, we make sure we don't get a new frame + // delivered immediately (we probably already are on the UI thread), + // where we couldn't really deal with it. post_to_cef_ui_thread([this] { lock_guard lock(browser_mutex); if (browser != nullptr) { // Could happen if we are shutting down. browser->GetHost()->Invalidate(PET_VIEW); } - }); + }, 16); ++timecode; } else { assert(video_frame.size >= unsigned(width * height * 4)); diff --git a/cef_capture.h b/cef_capture.h index 9e231c9..0d9bd52 100644 --- a/cef_capture.h +++ b/cef_capture.h @@ -166,7 +166,7 @@ public: uint32_t get_current_audio_input() const override { return 0; } private: - void post_to_cef_ui_thread(std::function &&func); + void post_to_cef_ui_thread(std::function &&func, int64_t delay_ms = 0); CefRefPtr cef_client;