/* * @Author: DI JUNKUN * @Date: 2026-02-27 * Copyright (c) 2026 by DI JUNKUN, All Rights Reserved. */ #ifndef _SCREEN_CAPTURER_DXGI_H_ #define _SCREEN_CAPTURER_DXGI_H_ #include #include #include #include #include #include #include #include #include #include #include #include "rd_log.h" #include "screen_capturer.h" namespace crossdesk { class ScreenCapturerDxgi : public ScreenCapturer { public: ScreenCapturerDxgi(); ~ScreenCapturerDxgi(); public: int Init(const int fps, cb_desktop_data cb) override; int Destroy() override; int Start(bool show_cursor) override; int Stop() override; int Pause(int monitor_index) override; int Resume(int monitor_index) override; int SwitchTo(int monitor_index) override; std::vector GetDisplayInfoList() override { return display_info_list_; } private: bool InitializeDxgi(); void EnumerateDisplays(); bool CreateDuplicationForMonitor(int monitor_index); void CaptureLoop(); void ReleaseDuplication(); private: std::vector display_info_list_; std::vector> outputs_; Microsoft::WRL::ComPtr dxgi_factory_; Microsoft::WRL::ComPtr d3d_device_; Microsoft::WRL::ComPtr d3d_context_; Microsoft::WRL::ComPtr duplication_; Microsoft::WRL::ComPtr staging_; std::atomic running_{false}; std::atomic paused_{false}; std::atomic monitor_index_{0}; std::atomic show_cursor_{true}; std::thread thread_; int fps_ = 60; cb_desktop_data callback_ = nullptr; unsigned char* nv12_frame_ = nullptr; int nv12_width_ = 0; int nv12_height_ = 0; }; } // namespace crossdesk #endif