@@ -41,8 +41,15 @@ namespace
4141 }
4242}
4343
44+ #if defined(HAVE_WAYLAND_CAPTURE)
45+ std::unique_ptr<ScreenCaptureReader::CaptureBackendReader> CreateWaylandScreenCaptureReader (
46+ const ScreenCaptureSettings& settings,
47+ ReaderInfo& info);
48+ #endif
49+
4450ScreenCaptureReader::ScreenCaptureReader (const ScreenCaptureSettings& new_settings)
4551 : settings(new_settings)
52+ , backend_reader(nullptr )
4653 , is_open(false )
4754 , video_stream(-1 )
4855 , frames_read(0 )
@@ -59,17 +66,40 @@ ScreenCaptureReader::ScreenCaptureReader(const ScreenCaptureSettings& new_settin
5966 }
6067 ValidateSettings ();
6168 PopulateInfo ();
69+ if (UsesWaylandPortal ()) {
70+ #if defined(HAVE_WAYLAND_CAPTURE)
71+ backend_reader = CreateWaylandScreenCaptureReader (settings, info);
72+ if (!backend_reader) {
73+ throw InvalidOptions (" Wayland screen capture backend is unavailable in this build." );
74+ }
75+ #else
76+ throw InvalidOptions (" Wayland screen capture backend is unavailable in this build." );
77+ #endif
78+ }
6279}
6380
6481ScreenCaptureReader::~ScreenCaptureReader ()
6582{
6683 Close ();
6784}
6885
86+ bool ScreenCaptureReader::IsOpen ()
87+ {
88+ return backend_reader ? backend_reader->IsOpen () : is_open;
89+ }
90+
6991bool ScreenCaptureReader::IsBackendSupported (ScreenCaptureBackend backend)
7092{
7193#if defined(__linux__)
72- return backend == SCREEN_CAPTURE_X11 || backend == SCREEN_CAPTURE_AUTO ;
94+ if (backend == SCREEN_CAPTURE_X11 || backend == SCREEN_CAPTURE_AUTO ) {
95+ return true ;
96+ }
97+ #if defined(HAVE_WAYLAND_CAPTURE)
98+ if (backend == SCREEN_CAPTURE_WAYLAND ) {
99+ return true ;
100+ }
101+ #endif
102+ return false ;
73103#else
74104 (void ) backend;
75105 return false ;
@@ -80,6 +110,9 @@ ScreenCaptureBackend ScreenCaptureReader::DefaultBackend()
80110{
81111#if defined(__linux__)
82112 const char * session = std::getenv (" XDG_SESSION_TYPE" );
113+ if (session && std::string (session) == " wayland" && IsBackendSupported (SCREEN_CAPTURE_WAYLAND )) {
114+ return SCREEN_CAPTURE_WAYLAND ;
115+ }
83116 if (!session || std::string (session) == " x11" ) {
84117 return SCREEN_CAPTURE_X11 ;
85118 }
@@ -93,7 +126,7 @@ void ScreenCaptureReader::ValidateSettings() const
93126 if (!IsBackendSupported (settings.backend )) {
94127 throw InvalidOptions (" Screen capture backend is not supported on this OS or session." );
95128 }
96- if (settings. backend != SCREEN_CAPTURE_X11 && !using_v4l2_device) {
129+ if (! UsesFFmpegDevice () && ! UsesWaylandPortal () && !using_v4l2_device) {
97130 throw InvalidOptions (" Only the X11 screen capture backend is implemented in this build." );
98131 }
99132 if (settings.width <= 0 || settings.height <= 0 ) {
@@ -104,6 +137,17 @@ void ScreenCaptureReader::ValidateSettings() const
104137 }
105138}
106139
140+ bool ScreenCaptureReader::UsesFFmpegDevice () const
141+ {
142+ const bool using_v4l2_device = settings.options .count (" input_format_name" ) && settings.options .at (" input_format_name" ) == " v4l2" ;
143+ return settings.backend == SCREEN_CAPTURE_X11 || using_v4l2_device;
144+ }
145+
146+ bool ScreenCaptureReader::UsesWaylandPortal () const
147+ {
148+ return settings.backend == SCREEN_CAPTURE_WAYLAND ;
149+ }
150+
107151std::string ScreenCaptureReader::InputFormatName () const
108152{
109153 const auto override_format = settings.options .find (" input_format_name" );
@@ -168,6 +212,10 @@ void ScreenCaptureReader::PopulateInfo()
168212
169213void ScreenCaptureReader::Open ()
170214{
215+ if (backend_reader) {
216+ backend_reader->Open ();
217+ return ;
218+ }
171219 if (is_open) {
172220 return ;
173221 }
@@ -260,6 +308,13 @@ void ScreenCaptureReader::OpenDecoder()
260308
261309std::shared_ptr<Frame> ScreenCaptureReader::GetFrame (int64_t number)
262310{
311+ if (backend_reader) {
312+ if (!backend_reader->IsOpen ()) {
313+ throw ReaderClosed (" The ScreenCaptureReader is closed. Call Open() before GetFrame()." );
314+ }
315+ const std::lock_guard<std::recursive_mutex> lock (getFrameMutex);
316+ return backend_reader->GetFrame (number);
317+ }
263318 if (!is_open) {
264319 throw ReaderClosed (" The ScreenCaptureReader is closed. Call Open() before GetFrame()." );
265320 }
@@ -337,6 +392,9 @@ std::shared_ptr<Frame> ScreenCaptureReader::DecodeNextFrame(int64_t number)
337392
338393void ScreenCaptureReader::Close ()
339394{
395+ if (backend_reader) {
396+ backend_reader->Close ();
397+ }
340398 if (packet) {
341399 av_packet_free (&packet);
342400 }
@@ -362,6 +420,9 @@ void ScreenCaptureReader::Close()
362420
363421openshot::CaptureReaderStats ScreenCaptureReader::GetStats () const
364422{
423+ if (backend_reader) {
424+ return backend_reader->GetStats ();
425+ }
365426 CaptureReaderStats stats;
366427 stats.is_open = is_open;
367428 stats.frames_read = frames_read;
0 commit comments