X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fcef_capture.cpp;h=68a719a20f753a29eb9cd12adbd23e8a875959bc;hb=f81ae3be1aae619fe4ad022f55d95a4a83ace076;hp=09c451fa2c7b6dff968f9b828e6c08f42a9d570b;hpb=5982dac8e7df84c42f9a42c228e003c60f837f21;p=nageru diff --git a/nageru/cef_capture.cpp b/nageru/cef_capture.cpp index 09c451f..68a719a 100644 --- a/nageru/cef_capture.cpp +++ b/nageru/cef_capture.cpp @@ -1,17 +1,24 @@ #include +#include +#include +#include #include +#include #include #include #include #include +#include #include "cef_capture.h" +#include "base/cef_logging.h" #include "nageru_cef_app.h" +#include "nageru/defs.h" #undef CHECK -#include #include -#include +#include +#include #include "bmusb/bmusb.h" @@ -97,8 +104,17 @@ void CEFCapture::resize(unsigned width, unsigned height) this->height = height; } -void CEFCapture::request_new_frame() +void CEFCapture::request_new_frame(bool ignore_if_locked) { + unique_lock outer_lock(browser_mutex, defer_lock); + if (ignore_if_locked && !outer_lock.try_lock()) { + // If the caller is holding card_mutex, we need to abort here + // if we can't get browser_mutex, since otherwise, the UI thread + // might hold browser_mutex (blocking post_to_cef_ui_thread()) + // and be waiting for card_mutex. + return; + } + // 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. @@ -129,7 +145,7 @@ 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.) - request_new_frame(); + request_new_frame(/*ignore_if_locked=*/false); ++timecode; } else { assert(video_frame.size >= unsigned(width * height * 4)); @@ -156,8 +172,6 @@ void CEFCapture::OnLoadEnd() }); } -#define FRAME_SIZE (8 << 20) // 8 MB. - void CEFCapture::configure_card() { if (video_frame_allocator == nullptr) { @@ -174,13 +188,12 @@ void CEFCapture::start_bm_capture() lock_guard lock(browser_mutex); CefBrowserSettings browser_settings; - browser_settings.web_security = cef_state_t::STATE_DISABLED; browser_settings.webgl = cef_state_t::STATE_ENABLED; browser_settings.windowless_frame_rate = max_fps; CefWindowInfo window_info; window_info.SetAsWindowless(0); - browser = CefBrowserHost::CreateBrowserSync(window_info, cef_client, start_url, browser_settings, nullptr); + browser = CefBrowserHost::CreateBrowserSync(window_info, cef_client, start_url, browser_settings, nullptr, nullptr); for (function &task : deferred_tasks) { task(); }