X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cef_capture.h;fp=cef_capture.h;h=0000000000000000000000000000000000000000;hb=392f9d1ccb835c05a3874c4bea163788b2c37024;hp=29dededf7b60ad8696dfaec10c71c7f7e84844f4;hpb=330ca2f0052b06d91004c6ceb73cd57ab95e7fe1;p=nageru diff --git a/cef_capture.h b/cef_capture.h deleted file mode 100644 index 29deded..0000000 --- a/cef_capture.h +++ /dev/null @@ -1,211 +0,0 @@ -#ifndef _CEF_CAPTURE_H -#define _CEF_CAPTURE_H 1 - -// CEFCapture represents a single CEF virtual capture card (usually, there would only -// be one globally), similar to FFmpegCapture. It owns a CefBrowser, which calls -// OnPaint() back every time it has a frame. Note that it runs asynchronously; -// there's no way to get frame-perfect sync. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#undef CHECK -#include -#include -#include - -#include - -class CefBrowser; -class CefRect; -class CEFCapture; - -// A helper class for CEFCapture to proxy information to CEF, without becoming -// CEF-refcounted itself. -class NageruCEFClient : public CefClient, public CefRenderHandler, public CefLoadHandler -{ -public: - NageruCEFClient(CEFCapture *parent) - : parent(parent) {} - - CefRefPtr GetRenderHandler() override - { - return this; - } - - CefRefPtr GetLoadHandler() override - { - return this; - } - - // CefRenderHandler. - - void OnPaint(CefRefPtr browser, PaintElementType type, const RectList &dirtyRects, const void *buffer, int width, int height) override; - - bool GetViewRect(CefRefPtr browser, CefRect &rect) override; - - // CefLoadHandler. - - void OnLoadEnd(CefRefPtr browser, CefRefPtr frame, int httpStatusCode) override; - -private: - CEFCapture *parent; - - IMPLEMENT_REFCOUNTING(NageruCEFClient); -}; - -class CEFCapture : public bmusb::CaptureInterface -{ -public: - CEFCapture(const std::string &url, unsigned width, unsigned height); - ~CEFCapture(); - - void set_card_index(int card_index) - { - this->card_index = card_index; - } - - int get_card_index() const - { - return card_index; - } - - void set_url(const std::string &url); - void reload(); - void set_max_fps(int max_fps); - void execute_javascript_async(const std::string &js); - void resize(unsigned width, unsigned height); - void request_new_frame(); - - // Callbacks from NageruCEFClient. - void OnPaint(const void *buffer, int width, int height); - bool GetViewRect(CefRect &rect); - void OnLoadEnd(); - - // CaptureInterface. - void set_video_frame_allocator(bmusb::FrameAllocator *allocator) override - { - video_frame_allocator = allocator; - if (owned_video_frame_allocator.get() != allocator) { - owned_video_frame_allocator.reset(); - } - } - - bmusb::FrameAllocator *get_video_frame_allocator() override - { - return video_frame_allocator; - } - - // Does not take ownership. - void set_audio_frame_allocator(bmusb::FrameAllocator *allocator) override - { - } - - bmusb::FrameAllocator *get_audio_frame_allocator() override - { - return nullptr; - } - - void set_frame_callback(bmusb::frame_callback_t callback) override - { - frame_callback = callback; - } - - void set_dequeue_thread_callbacks(std::function init, std::function cleanup) override - { - dequeue_init_callback = init; - dequeue_cleanup_callback = cleanup; - has_dequeue_callbacks = true; - } - - std::string get_description() const override - { - return description; - } - - void configure_card() override; - void start_bm_capture() override; - void stop_dequeue_thread() override; - bool get_disconnected() const override { return false; } - - std::set get_available_pixel_formats() const override - { - return std::set{ bmusb::PixelFormat_8BitBGRA }; - } - - void set_pixel_format(bmusb::PixelFormat pixel_format) override - { - assert(pixel_format == bmusb::PixelFormat_8BitBGRA); - } - - bmusb::PixelFormat get_current_pixel_format() const override - { - return bmusb::PixelFormat_8BitBGRA; - } - - std::map get_available_video_modes() const override; - void set_video_mode(uint32_t video_mode_id) override; - uint32_t get_current_video_mode() const override { return 0; } - - std::map get_available_video_inputs() const override; - void set_video_input(uint32_t video_input_id) override; - uint32_t get_current_video_input() const override { return 0; } - - std::map get_available_audio_inputs() const override; - void set_audio_input(uint32_t audio_input_id) override; - uint32_t get_current_audio_input() const override { return 0; } - -private: - void post_to_cef_ui_thread(std::function &&func, int64_t delay_ms = 0); - - CefRefPtr cef_client; - - // Needs to be different from browser_mutex below, since GetViewRect - // can be called unpredictably from when we are already holding - // . - std::mutex resolution_mutex; - unsigned width, height; // Under . - - int card_index = -1; - - bool has_dequeue_callbacks = false; - std::function dequeue_init_callback = nullptr; - std::function dequeue_cleanup_callback = nullptr; - - bmusb::FrameAllocator *video_frame_allocator = nullptr; - std::unique_ptr owned_video_frame_allocator; - bmusb::frame_callback_t frame_callback = nullptr; - - std::string description, start_url; - std::atomic max_fps{60}; - - // Needs to be recursive because the lambda in OnPaint could cause - // OnPaint itself to be called. - std::recursive_mutex browser_mutex; - CefRefPtr browser; // Under . - - // Tasks waiting for to get ready. Under . - std::vector> deferred_tasks; - - // Whether the last set_url() (includes the implicit one in the constructor) - // has loaded yet. Accessed from the CEF thread only. - bool loaded = false; - - // JavaScript waiting for the first page (well, any page) to have loaded. - // Accessed from the CEF thread only. - std::vector deferred_javascript; - - int timecode = 0; -}; - -#endif // !defined(_CEF_CAPTURE_H)