3d7663f417
This is very much like previous commit, but there's a catch: there already was an enumeration in place, which is replaced in this commit. The obs_pw_capture_type enum was introduced before splitting the portal code into a separate file, and the enum itself is specific to the screencast portal, so the appropriate place to enumerate it is in portal.h. For completude, PORTAL_CAPTURE_TYPE_VIRTUAL was added to the enum, even though we never used, and probably never will. The values are still the same, since both the old and this new enum were extracted from the screencast portal [1]. https://github.com/flatpak/xdg-desktop-portal/blob/main/data/org.freedesktop.portal.ScreenCast.xml#L290-300
181 lines
5.2 KiB
C
181 lines
5.2 KiB
C
/* pipewire-capture.c
|
|
*
|
|
* Copyright 2020 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "pipewire.h"
|
|
#include "portal.h"
|
|
|
|
/* obs_source_info methods */
|
|
|
|
static const char *pipewire_desktop_capture_get_name(void *data)
|
|
{
|
|
UNUSED_PARAMETER(data);
|
|
return obs_module_text("PipeWireDesktopCapture");
|
|
}
|
|
|
|
static const char *pipewire_window_capture_get_name(void *data)
|
|
{
|
|
UNUSED_PARAMETER(data);
|
|
return obs_module_text("PipeWireWindowCapture");
|
|
}
|
|
|
|
static void *pipewire_desktop_capture_create(obs_data_t *settings,
|
|
obs_source_t *source)
|
|
{
|
|
return obs_pipewire_create(PORTAL_CAPTURE_TYPE_MONITOR, settings,
|
|
source);
|
|
}
|
|
static void *pipewire_window_capture_create(obs_data_t *settings,
|
|
obs_source_t *source)
|
|
{
|
|
return obs_pipewire_create(PORTAL_CAPTURE_TYPE_WINDOW, settings,
|
|
source);
|
|
}
|
|
|
|
static void pipewire_capture_destroy(void *data)
|
|
{
|
|
obs_pipewire_destroy(data);
|
|
}
|
|
|
|
static void pipewire_capture_save(void *data, obs_data_t *settings)
|
|
{
|
|
obs_pipewire_save(data, settings);
|
|
}
|
|
|
|
static void pipewire_capture_get_defaults(obs_data_t *settings)
|
|
{
|
|
obs_pipewire_get_defaults(settings);
|
|
}
|
|
|
|
static obs_properties_t *pipewire_capture_get_properties(void *data)
|
|
{
|
|
enum portal_capture_type capture_type;
|
|
obs_pipewire_data *obs_pw = data;
|
|
|
|
capture_type = obs_pipewire_get_capture_type(obs_pw);
|
|
|
|
switch (capture_type) {
|
|
case PORTAL_CAPTURE_TYPE_MONITOR:
|
|
return obs_pipewire_get_properties(data,
|
|
"PipeWireSelectMonitor");
|
|
case PORTAL_CAPTURE_TYPE_WINDOW:
|
|
return obs_pipewire_get_properties(data,
|
|
"PipeWireSelectWindow");
|
|
case PORTAL_CAPTURE_TYPE_VIRTUAL:
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
static void pipewire_capture_update(void *data, obs_data_t *settings)
|
|
{
|
|
obs_pipewire_update(data, settings);
|
|
}
|
|
|
|
static void pipewire_capture_show(void *data)
|
|
{
|
|
obs_pipewire_show(data);
|
|
}
|
|
|
|
static void pipewire_capture_hide(void *data)
|
|
{
|
|
obs_pipewire_hide(data);
|
|
}
|
|
|
|
static uint32_t pipewire_capture_get_width(void *data)
|
|
{
|
|
return obs_pipewire_get_width(data);
|
|
}
|
|
|
|
static uint32_t pipewire_capture_get_height(void *data)
|
|
{
|
|
return obs_pipewire_get_height(data);
|
|
}
|
|
|
|
static void pipewire_capture_video_render(void *data, gs_effect_t *effect)
|
|
{
|
|
obs_pipewire_video_render(data, effect);
|
|
}
|
|
|
|
static bool initialized = false;
|
|
|
|
void pipewire_capture_load(void)
|
|
{
|
|
uint32_t available_capture_types = portal_get_available_capture_types();
|
|
bool desktop_capture_available =
|
|
(available_capture_types & PORTAL_CAPTURE_TYPE_MONITOR) != 0;
|
|
bool window_capture_available =
|
|
(available_capture_types & PORTAL_CAPTURE_TYPE_WINDOW) != 0;
|
|
|
|
if (available_capture_types == 0) {
|
|
blog(LOG_INFO, "[pipewire] No captures available");
|
|
return;
|
|
}
|
|
|
|
blog(LOG_INFO, "[pipewire] Available captures:");
|
|
if (desktop_capture_available)
|
|
blog(LOG_INFO, "[pipewire] - Desktop capture");
|
|
if (window_capture_available)
|
|
blog(LOG_INFO, "[pipewire] - Window capture");
|
|
|
|
// Desktop capture
|
|
const struct obs_source_info pipewire_desktop_capture_info = {
|
|
.id = "pipewire-desktop-capture-source",
|
|
.type = OBS_SOURCE_TYPE_INPUT,
|
|
.output_flags = OBS_SOURCE_VIDEO,
|
|
.get_name = pipewire_desktop_capture_get_name,
|
|
.create = pipewire_desktop_capture_create,
|
|
.destroy = pipewire_capture_destroy,
|
|
.save = pipewire_capture_save,
|
|
.get_defaults = pipewire_capture_get_defaults,
|
|
.get_properties = pipewire_capture_get_properties,
|
|
.update = pipewire_capture_update,
|
|
.show = pipewire_capture_show,
|
|
.hide = pipewire_capture_hide,
|
|
.get_width = pipewire_capture_get_width,
|
|
.get_height = pipewire_capture_get_height,
|
|
.video_render = pipewire_capture_video_render,
|
|
.icon_type = OBS_ICON_TYPE_DESKTOP_CAPTURE,
|
|
};
|
|
if (desktop_capture_available)
|
|
obs_register_source(&pipewire_desktop_capture_info);
|
|
|
|
// Window capture
|
|
const struct obs_source_info pipewire_window_capture_info = {
|
|
.id = "pipewire-window-capture-source",
|
|
.type = OBS_SOURCE_TYPE_INPUT,
|
|
.output_flags = OBS_SOURCE_VIDEO,
|
|
.get_name = pipewire_window_capture_get_name,
|
|
.create = pipewire_window_capture_create,
|
|
.destroy = pipewire_capture_destroy,
|
|
.save = pipewire_capture_save,
|
|
.get_defaults = pipewire_capture_get_defaults,
|
|
.get_properties = pipewire_capture_get_properties,
|
|
.update = pipewire_capture_update,
|
|
.show = pipewire_capture_show,
|
|
.hide = pipewire_capture_hide,
|
|
.get_width = pipewire_capture_get_width,
|
|
.get_height = pipewire_capture_get_height,
|
|
.video_render = pipewire_capture_video_render,
|
|
.icon_type = OBS_ICON_TYPE_WINDOW_CAPTURE,
|
|
};
|
|
if (window_capture_available)
|
|
obs_register_source(&pipewire_window_capture_info);
|
|
}
|