]> git.sesse.net Git - nageru/blobdiff - nageru/cef_capture.cpp
Fix a missing #include in the CEF code.
[nageru] / nageru / cef_capture.cpp
index 09c451fa2c7b6dff968f9b828e6c08f42a9d570b..fcd91a73ffb13fb858706ceb11f83acfd94a4589 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "cef_capture.h"
 #include "nageru_cef_app.h"
+#include "nageru/defs.h"
 
 #undef CHECK
 #include <cef_app.h>
@@ -97,8 +98,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<recursive_mutex> 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 +139,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 +166,6 @@ void CEFCapture::OnLoadEnd()
        });
 }
 
-#define FRAME_SIZE (8 << 20)  // 8 MB.
-
 void CEFCapture::configure_card()
 {
        if (video_frame_allocator == nullptr) {
@@ -174,13 +182,12 @@ void CEFCapture::start_bm_capture()
                lock_guard<recursive_mutex> 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<void()> &task : deferred_tasks) {
                        task();
                }