0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 04:42:18 +02:00

linux-pipewire: Unify ScreenCast sources as Screen Capture

Allow to select both main type of ScreenCast (monitor, window)
with only one source type rather than adding a source type per
ScreenCast type.

This change is made as a new Screen Capture source type which
obsoletes the use of the previous Screen Capture (monitor-only)
and Window Capture.
This commit is contained in:
tytan652 2024-04-18 13:41:34 +02:00 committed by Georges Basile Stavracas Neto
parent 5b2e2a9c68
commit dfef65c30f
2 changed files with 68 additions and 20 deletions

View File

@ -6,6 +6,7 @@ PipeWireDesktopCapture="Screen Capture (PipeWire)"
PipeWireSelectMonitor="Select Monitor"
PipeWireSelectWindow="Select Window"
PipeWireWindowCapture="Window Capture (PipeWire)"
PipeWireSelectScreenCast="Open Selector"
Resolution="Resolution"
ShowCursor="Show Cursor"
VideoFormat="Video Format"

View File

@ -35,8 +35,15 @@ enum portal_cursor_mode {
PORTAL_CURSOR_MODE_METADATA = 1 << 2,
};
enum obs_portal_capture_type {
OBS_PORTAL_CAPTURE_TYPE_MONITOR = PORTAL_CAPTURE_TYPE_MONITOR,
OBS_PORTAL_CAPTURE_TYPE_WINDOW = PORTAL_CAPTURE_TYPE_WINDOW,
OBS_PORTAL_CAPTURE_TYPE_UNIFIED = PORTAL_CAPTURE_TYPE_MONITOR |
PORTAL_CAPTURE_TYPE_WINDOW,
};
struct screencast_portal_capture {
enum portal_capture_type capture_type;
enum obs_portal_capture_type capture_type;
GCancellable *cancellable;
@ -139,18 +146,19 @@ static uint32_t get_screencast_version(void)
/* ------------------------------------------------- */
static const char *capture_type_to_string(enum portal_capture_type capture_type)
static const char *
capture_type_to_string(enum obs_portal_capture_type capture_type)
{
switch (capture_type) {
case PORTAL_CAPTURE_TYPE_MONITOR:
return "desktop";
case PORTAL_CAPTURE_TYPE_WINDOW:
case OBS_PORTAL_CAPTURE_TYPE_MONITOR:
return "monitor";
case OBS_PORTAL_CAPTURE_TYPE_WINDOW:
return "window";
case PORTAL_CAPTURE_TYPE_VIRTUAL:
case OBS_PORTAL_CAPTURE_TYPE_UNIFIED:
return "monitor and window";
default:
return "unknown";
}
return "unknown";
}
/* ------------------------------------------------- */
@ -285,8 +293,7 @@ static void on_start_response_received_cb(GVariant *parameters, void *user_data)
obs_source_save(capture->source);
}
blog(LOG_INFO, "[pipewire] %s selected, setting up screencast",
capture_type_to_string(capture->capture_type));
blog(LOG_INFO, "[pipewire] source selected, setting up screencast");
open_pipewire_remote(capture);
}
@ -582,7 +589,7 @@ static void *screencast_portal_desktop_capture_create(obs_data_t *settings,
struct screencast_portal_capture *capture;
capture = bzalloc(sizeof(struct screencast_portal_capture));
capture->capture_type = PORTAL_CAPTURE_TYPE_MONITOR;
capture->capture_type = OBS_PORTAL_CAPTURE_TYPE_MONITOR;
capture->cursor_visible = obs_data_get_bool(settings, "ShowCursor");
capture->restore_token =
bstrdup(obs_data_get_string(settings, "RestoreToken"));
@ -598,7 +605,24 @@ static void *screencast_portal_window_capture_create(obs_data_t *settings,
struct screencast_portal_capture *capture;
capture = bzalloc(sizeof(struct screencast_portal_capture));
capture->capture_type = PORTAL_CAPTURE_TYPE_WINDOW;
capture->capture_type = OBS_PORTAL_CAPTURE_TYPE_WINDOW;
capture->cursor_visible = obs_data_get_bool(settings, "ShowCursor");
capture->restore_token =
bstrdup(obs_data_get_string(settings, "RestoreToken"));
capture->source = source;
init_screencast_capture(capture);
return capture;
}
static void *screencast_portal_capture_create(obs_data_t *settings,
obs_source_t *source)
{
struct screencast_portal_capture *capture;
capture = bzalloc(sizeof(struct screencast_portal_capture));
capture->capture_type = OBS_PORTAL_CAPTURE_TYPE_UNIFIED;
capture->cursor_visible = obs_data_get_bool(settings, "ShowCursor");
capture->restore_token =
bstrdup(obs_data_get_string(settings, "RestoreToken"));
@ -657,13 +681,15 @@ static obs_properties_t *screencast_portal_capture_get_properties(void *data)
obs_properties_t *properties;
switch (capture->capture_type) {
case PORTAL_CAPTURE_TYPE_MONITOR:
case OBS_PORTAL_CAPTURE_TYPE_MONITOR:
reload_string_id = "PipeWireSelectMonitor";
break;
case PORTAL_CAPTURE_TYPE_WINDOW:
case OBS_PORTAL_CAPTURE_TYPE_WINDOW:
reload_string_id = "PipeWireSelectWindow";
break;
case PORTAL_CAPTURE_TYPE_VIRTUAL:
case OBS_PORTAL_CAPTURE_TYPE_UNIFIED:
reload_string_id = "PipeWireSelectScreenCast";
break;
default:
return NULL;
}
@ -744,21 +770,21 @@ void screencast_portal_load(void)
(available_capture_types & PORTAL_CAPTURE_TYPE_WINDOW) != 0;
if (available_capture_types == 0) {
blog(LOG_INFO, "[pipewire] No captures available");
blog(LOG_INFO, "[pipewire] No capture sources available");
return;
}
blog(LOG_INFO, "[pipewire] Available captures:");
blog(LOG_INFO, "[pipewire] Available capture sources:");
if (desktop_capture_available)
blog(LOG_INFO, "[pipewire] - Desktop capture");
blog(LOG_INFO, "[pipewire] - Monitor source");
if (window_capture_available)
blog(LOG_INFO, "[pipewire] - Window capture");
blog(LOG_INFO, "[pipewire] - Window source");
// Desktop capture
const struct obs_source_info screencast_portal_desktop_capture_info = {
.id = "pipewire-desktop-capture-source",
.type = OBS_SOURCE_TYPE_INPUT,
.output_flags = OBS_SOURCE_VIDEO,
.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CAP_OBSOLETE,
.get_name = screencast_portal_desktop_capture_get_name,
.create = screencast_portal_desktop_capture_create,
.destroy = screencast_portal_capture_destroy,
@ -780,7 +806,7 @@ void screencast_portal_load(void)
const struct obs_source_info screencast_portal_window_capture_info = {
.id = "pipewire-window-capture-source",
.type = OBS_SOURCE_TYPE_INPUT,
.output_flags = OBS_SOURCE_VIDEO,
.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CAP_OBSOLETE,
.get_name = screencast_portal_window_capture_get_name,
.create = screencast_portal_window_capture_create,
.destroy = screencast_portal_capture_destroy,
@ -797,6 +823,27 @@ void screencast_portal_load(void)
};
if (window_capture_available)
obs_register_source(&screencast_portal_window_capture_info);
// Screen capture (monitor and window)
const struct obs_source_info screencast_portal_capture_info = {
.id = "pipewire-screen-capture-source",
.type = OBS_SOURCE_TYPE_INPUT,
.output_flags = OBS_SOURCE_VIDEO,
.get_name = screencast_portal_desktop_capture_get_name,
.create = screencast_portal_capture_create,
.destroy = screencast_portal_capture_destroy,
.save = screencast_portal_capture_save,
.get_defaults = screencast_portal_capture_get_defaults,
.get_properties = screencast_portal_capture_get_properties,
.update = screencast_portal_capture_update,
.show = screencast_portal_capture_show,
.hide = screencast_portal_capture_hide,
.get_width = screencast_portal_capture_get_width,
.get_height = screencast_portal_capture_get_height,
.video_render = screencast_portal_capture_video_render,
.icon_type = OBS_ICON_TYPE_DESKTOP_CAPTURE,
};
obs_register_source(&screencast_portal_capture_info);
}
void screencast_portal_unload(void)