Skip to content
Commits on Source (35)
gnome-remote-desktop (42.7-0ubuntu1) jammy; urgency=medium
* New upstream release (LP: #1998966)
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 06 Dec 2022 16:34:29 -0500
gnome-remote-desktop (42.4-0ubuntu1) jammy; urgency=medium
* New upstream version (LP: #1983788)
......
......@@ -2,7 +2,7 @@
pristine-tar = True
debian-branch = ubuntu/jammy
debian-tag=ubuntu/%(version)s
upstream-branch = upstream/latest
upstream-branch = upstream/42.x
[buildpackage]
sign-tags = True
......
version=4
opts="searchmode=plain, uversionmangle=s/\.(alpha|beta|rc)/~$1/, downloadurlmangle=s|cache.json||" \
https://download.gnome.org/sources/@PACKAGE@/cache.json \
[\d.]+/@PACKAGE@-([\d.]+)@ARCHIVE_EXT@
42/@PACKAGE@-([\d.]+)@ARCHIVE_EXT@
project('gnome-remote-desktop', 'c',
version: '42.4',
version: '42.7',
meson_version: '>= 0.47.0',
default_options: ['warning_level=1',
'buildtype=debugoptimized'])
......
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Sveinn í Felli <sv1@fellsnet.is>, 2021.
# Sveinn í Felli <sv1@fellsnet.is>, 2021, 2022.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/issu"
"es\n"
"POT-Creation-Date: 2021-12-08 10:00+0000\n"
"PO-Revision-Date: 2021-12-15 09:17+0000\n"
"POT-Creation-Date: 2022-08-02 15:36+0000\n"
"PO-Revision-Date: 2022-09-05 10:04+0000\n"
"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
"Language-Team: Icelandic <translation-team-is@lists.sourceforge.org>\n"
"Language-Team: Icelandic\n"
"Language: is\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 19.12.3\n"
"X-Generator: Lokalize 21.12.3\n"
#: src/grd-daemon.c:367
#: src/grd-daemon.c:480
msgid "GNOME Remote Desktop"
msgstr "Fjartengt GNOME skjáborð"
......@@ -33,8 +33,8 @@ msgid ""
"A user on the computer '%s' is trying to remotely view or control your "
"desktop."
msgstr ""
"Notandi á fjartengdu tölvunni '%s' er að reyna að skoða eða stýra skjáborðinu"
" þínu."
"Notandi á fjartengdu tölvunni '%s' er að reyna að skoða eða stýra "
"skjáborðinu þínu."
#: src/grd-prompt.c:131
msgid "Refuse"
......@@ -44,49 +44,139 @@ msgstr "Hafna"
msgid "Accept"
msgstr "Samþykkja"
#: src/grd-ctl.c:44
#, c-format
msgid "Usage: %s [OPTIONS...] COMMAND [SUBCOMMAND]...\n"
msgstr ""
#: src/grd-ctl.c:383
msgid "Commands:\n"
msgstr "Skipanir:\n"
#: src/grd-ctl.c:388
msgid ""
" rdp - RDP subcommands:\n"
" enable - Enable the RDP backend\n"
" disable - Disable the RDP backend\n"
" set-tls-cert <path-to-cert> - Set path to TLS certificate\n"
" set-tls-key <path-to-key> - Set path to TLS key\n"
" set-credentials <username> <password> - Set username and password\n"
" credentials\n"
" clear-credentials - Clear username and password\n"
" credentials\n"
" enable-view-only - Disable remote control of "
"input\n"
" devices\n"
" disable-view-only - Enable remote control of "
"input\n"
" devices\n"
"\n"
msgstr ""
#: src/grd-ctl.c:407
msgid ""
" vnc - VNC subcommands:\n"
" enable - Enable the VNC backend\n"
" disable - Disable the VNC backend\n"
" set-password <password> - Set the VNC password\n"
" clear-password - Clear the VNC password\n"
" set-auth-method password|prompt - Set the authorization method\n"
" enable-view-only - Disable remote control of "
"input\n"
" devices\n"
" disable-view-only - Enable remote control of "
"input\n"
" devices\n"
"\n"
msgstr ""
#: src/grd-ctl.c:422
msgid ""
" status [--show-credentials] - Show current status\n"
"\n"
"Options:\n"
" --help - Print this help text\n"
msgstr ""
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:7
msgid "Whether the RDP backend is enabled or not"
msgstr "Hvort RDP-bakendinn sé virkur eða ekki"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
msgid "If set to to 'true' the RDP backend will be initialized."
msgstr "Ef þetta er stillt á 'satt' verður RDP-bakendinn virkjaður."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:14
msgid "Screenshare mode of RDP connections"
msgstr "Skjádeilingarhamur RDP-tenginga"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15
msgid ""
"The screenshare mode specifies, whether the RDP backend mirrors the primary "
"screen, or whether a virtual monitor is created. For the initial resolution "
"of the virtual monitor, the RDP backend uses either the client core data "
"([MS-RDPBCGR] 2.2.1.3.2) or the client monitor data ([MS-RDPBCGR] "
"2.2.1.3.6), depending on what is available. When using a remote desktop "
"session with a virtual monitor, clients can resize the resolution of the "
"virtual monitor during a session with the Display Control Channel Extension "
"([MS-RDPEDISP]). Allowed screenshare modes include: * mirror-primary - "
"Record the primary monitor of the current user session. * extend - Create a "
"new virtual monitor and use it for the remote desktop session. The "
"resolution of this virtual monitor is derived from the monitor "
"configuration, submitted by the remote desktop client."
msgstr ""
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41
msgid "Path to the certificate file"
msgstr "Slóð að skilríkjaskránni"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:16
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:50
msgid ""
"In order to be able to use RDP with TLS Security, both the private key file "
"and the certificate file need to be provided to the RDP server."
msgstr ""
"Til að geta notað RDP með TLS-öryggi, verður að gefa upp slóð á einkalykils-"
" og skilríkjaskránna til RDP-þjónsins."
"Til að geta notað RDP með TLS-öryggi, verður að gefa upp slóð á einkalykils- "
"og skilríkjaskránna til RDP-þjónsins."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:49
msgid "Path to the private key file"
msgstr "Slóð að einkalykilskránni"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:23
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:57
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:74
msgid "Only allow remote connections to view the screen content"
msgstr "Einungis leyfa fjartengingum að skoða efni á skjánum"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:58
msgid ""
"When view-only is true, remote RDP connections cannot manipulate input "
"devices (e.g. mouse and keyboard)."
msgstr ""
"Þegar einungis-skoða er virkt, geta fjartengdir RDP-notendur ekki stjórnað"
" inntakstækjum (t.d. mús og lyklaborði)."
"Þegar einungis-skoða er virkt, geta fjartengdir RDP-notendur ekki stjórnað "
"inntakstækjum (t.d. mús og lyklaborði)."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:67
msgid "Whether the VNC backend is enabled or not"
msgstr "Hvort VNC-bakendinn sé virkur eða ekki"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:34
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:68
msgid "If set to to 'true' the VNC backend will be initialized."
msgstr "Ef þetta er stillt á 'satt' verður VNC-bakendinn virkjaður."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:75
msgid ""
"When view-only is true, remote VNC connections cannot manipulate input "
"devices (e.g. mouse and keyboard)."
msgstr ""
"Þegar einungis-skoða er virkt, geta fjartengdir VNC-notendur ekki stjórnað"
" inntakstækjum (t.d. mús og lyklaborði)."
"Þegar einungis-skoða er virkt, geta fjartengdir VNC-notendur ekki stjórnað "
"inntakstækjum (t.d. mús og lyklaborði)."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:82
msgid "Method used to authenticate VNC connections"
msgstr "Aðferð notuð við auðkenningu VNC-tenginga"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:83
msgid ""
"The VNC authentication method describes how a remote connection is "
"authenticated. It can currently be done in two different ways: * prompt - by "
......@@ -94,9 +184,9 @@ msgid ""
"access to the workstation to explicitly approve the new connection. * "
"password - by requiring the remote client to provide a known password"
msgstr ""
"Aðferð við auðkenningu VNC-tenginga lýsir því hvernig fjartenging er"
" auðkennd. Eins og er má gera það á tvo mismunandi vegu: * prompt - biðja"
" notandann að staðfesta allar nýjar tengingar, sem krefst þess að raunveruleg"
" manneskja hafi aðgang að viðkomandi tölvu og samþykki sérstakleg nýju"
" tenginguna. * "
"password - þar sem fjartengdi notandinn þarf að gefa upp þekkt lykilorð"
"Aðferð við auðkenningu VNC-tenginga lýsir því hvernig fjartenging er "
"auðkennd. Eins og er má gera það á tvo mismunandi vegu: * prompt - biðja "
"notandann að staðfesta allar nýjar tengingar, sem krefst þess að raunveruleg "
"manneskja hafi aðgang að viðkomandi tölvu og samþykki sérstakleg nýju "
"tenginguna. * password - þar sem fjartengdi notandinn þarf að gefa upp þekkt "
"lykilorð"
......@@ -5,19 +5,19 @@
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-remote-desktop\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/"
"issues\n"
"POT-Creation-Date: 2022-05-10 16:53+0000\n"
"PO-Revision-Date: 2022-05-13 06:48+0200\n"
"POT-Creation-Date: 2022-08-07 20:41+0000\n"
"PO-Revision-Date: 2022-08-15 21:31+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <(nothing)>\n"
"Language-Team: \n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.0.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1.1\n"
#: src/grd-daemon.c:480
msgid "GNOME Remote Desktop"
......@@ -50,11 +50,11 @@ msgstr "დასტური"
msgid "Usage: %s [OPTIONS...] COMMAND [SUBCOMMAND]...\n"
msgstr "გამოყენება: %s [პარამეტრები...] ბრძანება [ქვებრძანება]...\n"
#: src/grd-ctl.c:383
#: src/grd-ctl.c:405
msgid "Commands:\n"
msgstr "ბრძანებები:\n"
#: src/grd-ctl.c:388
#: src/grd-ctl.c:410
msgid ""
" rdp - RDP subcommands:\n"
" enable - Enable the RDP backend\n"
......@@ -94,7 +94,7 @@ msgstr ""
"უფლების მიცემა\n"
"\n"
#: src/grd-ctl.c:407
#: src/grd-ctl.c:429
msgid ""
" vnc - VNC subcommands:\n"
" enable - Enable the VNC backend\n"
......@@ -124,7 +124,7 @@ msgstr ""
" უფლების მიცემა\n"
"\n"
#: src/grd-ctl.c:422
#: src/grd-ctl.c:444
msgid ""
" status [--show-credentials] - Show current status\n"
"\n"
......@@ -141,7 +141,7 @@ msgid "Whether the RDP backend is enabled or not"
msgstr "ჩართულია RDP უკანა ბოლო თუ არა"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
msgid "If set to 'true' the RDP backend will be initialized."
msgid "If set to to 'true' the RDP backend will be initialized."
msgstr "თუ ჩართულია, გამოყენებული იქნება RDP უკანაბოლო."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:14
......@@ -209,7 +209,7 @@ msgid "Whether the VNC backend is enabled or not"
msgstr "ჩართულია VNC-ის უკანაბოლო თუ არა"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:68
msgid "If set to 'true' the VNC backend will be initialized."
msgid "If set to to 'true' the VNC backend will be initialized."
msgstr "თუ ჩართულია, გამოყენებული იქნება VNC უკანაბოლო."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:75
......
......@@ -589,7 +589,10 @@ maybe_send_next_mime_type_content_request (GrdClipboardRdp *clipboard_rdp)
g_free (mime_type_table);
maybe_send_next_mime_type_content_request (clipboard_rdp);
return;
}
g_free (mime_type_table);
}
static gboolean
......@@ -1628,6 +1631,23 @@ extract_format_data_response (GrdClipboardRdp *clipboard_rdp,
return response_ok && *data;
}
static gboolean
filedescriptorw_filename_is_valid (const WCHAR *filename)
{
uint16_t i;
if (filename[0] == L'\0')
return FALSE;
for (i = 1; i < 260; ++i)
{
if (filename[i] == L'\0')
return TRUE;
}
return FALSE;
}
static uint8_t *
get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
uint8_t *src_data,
......@@ -1636,7 +1656,7 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
gboolean has_clip_data_id,
uint32_t clip_data_id)
{
FILEDESCRIPTORW *files = NULL;
g_autofree FILEDESCRIPTORW *files = NULL;
FILEDESCRIPTORW *file;
uint32_t n_files = 0;
g_autofree char *clip_data_dir_name = NULL;
......@@ -1658,11 +1678,15 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
{
file = &files[i];
if (!filedescriptorw_filename_is_valid (file->cFileName))
{
g_array_free (dst_data, TRUE);
return NULL;
}
if (ConvertFromUnicode (CP_UTF8, 0, file->cFileName, -1, &filename,
0, NULL, NULL) <= 0)
{
g_array_free (dst_data, TRUE);
g_free (files);
return NULL;
}
if (strchr (filename, '\\'))
......@@ -1686,8 +1710,6 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
*dst_size = dst_data->len;
g_free (files);
return (uint8_t *) g_array_free (dst_data, FALSE);
}
......
......@@ -311,8 +311,7 @@ grd_clipboard_request_server_content_for_mime_type_async (GrdClipboard *clipboar
g_return_if_fail (klass->submit_requested_server_content);
if (!priv->enabled)
return;
g_assert (priv->enabled);
g_debug ("Clipboard[SelectionRead]: Requesting data from servers clipboard"
" (mime type: %s)", grd_mime_type_to_string (mime_type));
......@@ -375,7 +374,6 @@ grd_clipboard_update_client_mime_type_list (GrdClipboard *clipboard,
{
GrdClipboardClass *klass = GRD_CLIPBOARD_GET_CLASS (clipboard);
GrdClipboardPrivate *priv = grd_clipboard_get_instance_private (clipboard);
GList *l;
/**
* Ensure that the response with the read mime type content is sent to the
......@@ -388,8 +386,7 @@ grd_clipboard_update_client_mime_type_list (GrdClipboard *clipboard,
if (!klass->update_client_mime_type_list)
return;
for (l = mime_type_list; l; l = l->next)
g_hash_table_remove (priv->client_mime_type_tables, l->data);
g_hash_table_remove_all (priv->client_mime_type_tables);
g_debug ("Clipboard[SelectionOwnerChanged]: Updating clients clipboard");
klass->update_client_mime_type_list (clipboard, mime_type_list);
......
......@@ -116,13 +116,36 @@ grd_hwaccel_nvidia_get_cuda_damage_kernels (GrdHwAccelNvidia *hwaccel_nvidia,
*cu_simplify_dmg_arr = hwaccel_nvidia->cu_simplify_dmg_arr;
}
static const char *
get_cuda_error_string (GrdHwAccelNvidia *hwaccel_nvidia,
CUresult cu_result)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
const char *error_string = NULL;
CUresult local_cu_result;
g_assert (cuda_funcs);
g_assert (cuda_funcs->cuGetErrorString);
local_cu_result = cuda_funcs->cuGetErrorString (cu_result, &error_string);
if (G_UNLIKELY (local_cu_result != CUDA_SUCCESS))
g_warning ("[HWAccel.CUDA] cuGetErrorString() failed: %i", local_cu_result);
return error_string;
}
void
grd_hwaccel_nvidia_push_cuda_context (GrdHwAccelNvidia *hwaccel_nvidia)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context) != CUDA_SUCCESS)
g_error ("[HWAccel.CUDA] Failed to push CUDA context");
cu_result = cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context);
if (cu_result != CUDA_SUCCESS)
{
g_error ("[HWAccel.CUDA] Failed to push CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
}
}
void
......@@ -139,12 +162,15 @@ grd_hwaccel_nvidia_register_read_only_gl_buffer (GrdHwAccelNvidia *hwaccel_nvi
uint32_t buffer)
{
ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
CUresult cu_result;
if (extra_cuda_funcs->cuGraphicsGLRegisterBuffer (
cuda_resource, buffer,
CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY) != CUDA_SUCCESS)
cu_result =
extra_cuda_funcs->cuGraphicsGLRegisterBuffer (cuda_resource, buffer,
CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to register GL buffer");
g_warning ("[HWAccel.CUDA] Failed to register GL buffer: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -169,17 +195,22 @@ grd_hwaccel_nvidia_map_cuda_resource (GrdHwAccelNvidia *hwaccel_nvidia,
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuGraphicsMapResources (1, &cuda_resource,
cuda_stream) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuGraphicsMapResources (1, &cuda_resource,
cuda_stream);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to map resources");
g_warning ("[HWAccel.CUDA] Failed to map resources: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
if (extra_cuda_funcs->cuGraphicsResourceGetMappedPointer (dev_ptr, size,
cuda_resource) != CUDA_SUCCESS)
cu_result = extra_cuda_funcs->cuGraphicsResourceGetMappedPointer (dev_ptr, size,
cuda_resource);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to get mapped pointer");
g_warning ("[HWAccel.CUDA] Failed to get mapped pointer: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
cuda_funcs->cuGraphicsUnmapResources (1, &cuda_resource, cuda_stream);
return FALSE;
}
......@@ -201,11 +232,13 @@ grd_hwaccel_nvidia_create_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
CUstream *cuda_stream)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuStreamCreate (cuda_stream,
CU_STREAM_NON_BLOCKING) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuStreamCreate (cuda_stream, CU_STREAM_NON_BLOCKING);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to create stream");
g_warning ("[HWAccel.CUDA] Failed to create stream: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -226,10 +259,13 @@ grd_hwaccel_nvidia_alloc_mem (GrdHwAccelNvidia *hwaccel_nvidia,
size_t size)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuMemAlloc (device_ptr, size) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuMemAlloc (device_ptr, size);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to allocate memory");
g_warning ("[HWAccel.CUDA] Failed to allocate memory: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -261,6 +297,18 @@ get_next_free_encode_session_id (GrdHwAccelNvidia *hwaccel_nvidia)
return encode_session_id;
}
static const char *
get_last_nvenc_error_string (GrdHwAccelNvidia *hwaccel_nvidia,
void *encoder)
{
NV_ENCODE_API_FUNCTION_LIST *nvenc_api = &hwaccel_nvidia->nvenc_api;
g_assert (nvenc_api);
g_assert (nvenc_api->nvEncGetLastErrorString);
return nvenc_api->nvEncGetLastErrorString (encoder);
}
gboolean
grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t *encode_session_id,
......@@ -292,7 +340,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncOpenEncodeSessionEx (
&open_params, &encode_session->encoder) != NV_ENC_SUCCESS)
{
g_debug ("[HWAccel.NVENC] Failed to open encode session");
g_debug ("[HWAccel.NVENC] Failed to open encode session: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
g_free (encode_session);
return FALSE;
}
......@@ -326,7 +375,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
{
NV_ENC_PIC_PARAMS pic_params = {0};
g_warning ("[HWAccel.NVENC] Failed to initialize encoder");
g_warning ("[HWAccel.NVENC] Failed to initialize encoder: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
hwaccel_nvidia->nvenc_api.nvEncEncodePicture (encode_session->encoder,
&pic_params);
......@@ -342,7 +392,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
{
NV_ENC_PIC_PARAMS pic_params = {0};
g_warning ("[HWAccel.NVENC] Failed to create bitstream buffer");
g_warning ("[HWAccel.NVENC] Failed to create bitstream buffer: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
hwaccel_nvidia->nvenc_api.nvEncEncodePicture (encode_session->encoder,
&pic_params);
......@@ -397,16 +448,17 @@ grd_hwaccel_nvidia_free_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
}
gboolean
grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id,
CUdeviceptr src_data,
CUdeviceptr *main_view_nv12,
uint16_t src_width,
uint16_t src_height,
uint16_t aligned_width,
uint16_t aligned_height,
CUstream cuda_stream)
grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id,
CUdeviceptr src_data,
CUdeviceptr *main_view_nv12,
uint16_t src_width,
uint16_t src_height,
uint16_t aligned_width,
uint16_t aligned_height,
CUstream cuda_stream)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
NvEncEncodeSession *encode_session;
NV_ENC_REGISTER_RESOURCE register_res = {0};
NV_ENC_MAP_INPUT_RESOURCE map_input_res = {0};
......@@ -414,6 +466,7 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
unsigned int grid_dim_x, grid_dim_y, grid_dim_z;
unsigned int block_dim_x, block_dim_y, block_dim_z;
void *args[7];
CUresult cu_result;
if (!g_hash_table_lookup_extended (hwaccel_nvidia->encode_sessions,
GUINT_TO_POINTER (encode_session_id),
......@@ -450,17 +503,22 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
args[5] = &aligned_height;
args[6] = &aligned_width;
if (hwaccel_nvidia->cuda_funcs->cuLaunchKernel (
hwaccel_nvidia->cu_bgrx_to_yuv420, grid_dim_x, grid_dim_y, grid_dim_z,
block_dim_x, block_dim_y, block_dim_z, 0, cuda_stream, args, NULL) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuLaunchKernel (hwaccel_nvidia->cu_bgrx_to_yuv420,
grid_dim_x, grid_dim_y, grid_dim_z,
block_dim_x, block_dim_y, block_dim_z,
0, cuda_stream, args, NULL);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to launch BGRX_TO_YUV420 kernel");
g_warning ("[HWAccel.CUDA] Failed to launch BGRX_TO_YUV420 kernel: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
if (hwaccel_nvidia->cuda_funcs->cuStreamSynchronize (cuda_stream) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuStreamSynchronize (cuda_stream);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to synchronize stream");
g_warning ("[HWAccel.CUDA] Failed to synchronize stream: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -476,7 +534,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncRegisterResource (
encode_session->encoder, &register_res) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to register resource");
g_warning ("[HWAccel.NVENC] Failed to register resource: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
return FALSE;
}
......@@ -486,7 +545,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncMapInputResource (
encode_session->encoder, &map_input_res) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to map input resource");
g_warning ("[HWAccel.NVENC] Failed to map input resource: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
hwaccel_nvidia->nvenc_api.nvEncUnregisterResource (encode_session->encoder,
register_res.registeredResource);
return FALSE;
......@@ -504,7 +564,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncEncodePicture (
encode_session->encoder, &pic_params) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to encode frame");
g_warning ("[HWAccel.NVENC] Failed to encode frame: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
hwaccel_nvidia->nvenc_api.nvEncUnmapInputResource (encode_session->encoder,
map_input_res.mappedResource);
hwaccel_nvidia->nvenc_api.nvEncUnregisterResource (encode_session->encoder,
......@@ -543,7 +604,8 @@ grd_hwaccel_nvidia_avc420_retrieve_bitstream (GrdHwAccelNvidia *hwaccel_nvidia,
if (nvenc_api->nvEncLockBitstream (encode_session->encoder,
&lock_bitstream) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to lock bitstream");
g_warning ("[HWAccel.NVENC] Failed to lock bitstream: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
goto out;
}
......@@ -697,10 +759,13 @@ load_cuda_module (GrdHwAccelNvidia *hwaccel_nvidia,
const char *ptx_instructions)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuModuleLoadData (module, ptx_instructions) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuModuleLoadData (module, ptx_instructions);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to load %s module", name);
g_warning ("[HWAccel.CUDA] Failed to load %s module: %s",
name, get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -714,10 +779,13 @@ load_cuda_function (GrdHwAccelNvidia *hwaccel_nvidia,
const char *name)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuModuleGetFunction (function, module, name) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuModuleGetFunction (function, module, name);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to get kernel %s", name);
g_warning ("[HWAccel.CUDA] Failed to get kernel %s: %s",
name, get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -739,6 +807,7 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
g_autofree char *avc_ptx_path = NULL;
g_autofree char *avc_ptx_instructions = NULL;
g_autoptr (GError) error = NULL;
CUresult cu_result;
unsigned int i;
hwaccel_nvidia = g_object_new (GRD_TYPE_HWACCEL_NVIDIA, NULL);
......@@ -761,9 +830,11 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
cuda_funcs = hwaccel_nvidia->cuda_funcs;
nvenc_funcs = hwaccel_nvidia->nvenc_funcs;
if (cuda_funcs->cuInit (0) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuInit (0);
if (cu_result != CUDA_SUCCESS)
{
g_debug ("[HWAccel.CUDA] Failed to initialize CUDA");
g_debug ("[HWAccel.CUDA] Failed to initialize CUDA: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return NULL;
}
if (!get_cuda_devices_from_gl_context (hwaccel_nvidia, egl_thread,
......@@ -798,10 +869,12 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
}
hwaccel_nvidia->cu_device = cu_device;
if (cuda_funcs->cuDevicePrimaryCtxRetain (&hwaccel_nvidia->cu_context,
hwaccel_nvidia->cu_device) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuDevicePrimaryCtxRetain (&hwaccel_nvidia->cu_context,
hwaccel_nvidia->cu_device);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to retain CUDA context");
g_warning ("[HWAccel.CUDA] Failed to retain CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return NULL;
}
......@@ -813,9 +886,11 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
return NULL;
}
if (cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to push CUDA context");
g_warning ("[HWAccel.CUDA] Failed to push CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
cuda_funcs->cuDevicePrimaryCtxRelease (hwaccel_nvidia->cu_device);
return NULL;
}
......
......@@ -87,15 +87,15 @@ gboolean grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvid
void grd_hwaccel_nvidia_free_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id);
gboolean grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id,
CUdeviceptr src_data,
CUdeviceptr *main_view_nv12,
uint16_t src_width,
uint16_t src_height,
uint16_t aligned_width,
uint16_t aligned_height,
CUstream cuda_stream);
gboolean grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id,
CUdeviceptr src_data,
CUdeviceptr *main_view_nv12,
uint16_t src_width,
uint16_t src_height,
uint16_t aligned_width,
uint16_t aligned_height,
CUstream cuda_stream);
gboolean grd_hwaccel_nvidia_avc420_retrieve_bitstream (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t encode_session_id,
......
......@@ -579,6 +579,9 @@ is_fuse_file_parent (gpointer key,
FuseFile *fuse_file = value;
const char *parent_path = user_data;
if (!fuse_file->is_directory)
return FALSE;
if (strcmp (parent_path, fuse_file->filename_with_root) == 0)
return TRUE;
......
......@@ -40,6 +40,8 @@ struct _GrdRdpGfxSurface
uint16_t width;
uint16_t height;
gboolean is_auxiliary_surface;
GrdRdpGfxSurface *render_surface;
GrdRdpGfxFrameController *frame_controller;
......@@ -83,6 +85,12 @@ grd_rdp_gfx_surface_get_height (GrdRdpGfxSurface *gfx_surface)
return gfx_surface->height;
}
gboolean
grd_rdp_gfx_surface_is_auxiliary_surface (GrdRdpGfxSurface *gfx_surface)
{
return gfx_surface->is_auxiliary_surface;
}
gboolean
grd_rdp_gfx_surface_disallows_hwaccel_sessions (GrdRdpGfxSurface *gfx_surface)
{
......@@ -105,6 +113,7 @@ grd_rdp_gfx_surface_override_render_surface (GrdRdpGfxSurface *gfx_surface,
g_assert (!gfx_surface->render_surface);
gfx_surface->render_surface = render_surface;
render_surface->is_auxiliary_surface = TRUE;
}
GrdRdpGfxFrameController *
......
......@@ -65,6 +65,8 @@ uint16_t grd_rdp_gfx_surface_get_width (GrdRdpGfxSurface *gfx_surface);
uint16_t grd_rdp_gfx_surface_get_height (GrdRdpGfxSurface *gfx_surface);
gboolean grd_rdp_gfx_surface_is_auxiliary_surface (GrdRdpGfxSurface *gfx_surface);
gboolean grd_rdp_gfx_surface_disallows_hwaccel_sessions (GrdRdpGfxSurface *gfx_surface);
GrdRdpGfxSurface *grd_rdp_gfx_surface_get_render_surface (GrdRdpGfxSurface *gfx_surface);
......
......@@ -169,6 +169,8 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
uint16_t aligned_width;
uint16_t aligned_height;
g_debug ("[RDP.RDPGFX] Creating surface with id %u", surface_id);
surface_context = g_malloc0 (sizeof (GfxSurfaceContext));
g_mutex_lock (&graphics_pipeline->gfx_mutex);
......@@ -193,7 +195,7 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
uint16_t aligned_width_16;
uint16_t aligned_height_16;
g_debug ("[RDP.RDPGFX] Creating NVENC session for surface %u", surface_id);
g_debug ("[RDP.RDPGFX] Created NVENC session for surface %u", surface_id);
aligned_width_16 = grd_get_aligned_size (surface_width, 16);
aligned_height_16 = grd_get_aligned_size (surface_height, 16);
......@@ -223,9 +225,6 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
g_autoptr (GrdRdpGfxSurface) render_surface = NULL;
GrdRdpGfxSurfaceDescriptor surface_descriptor = {};
g_debug ("[RDP.RDPGFX] Creating separate render surface for surface %u",
surface_id);
surface_descriptor.flags = GRD_RDP_GFX_SURFACE_FLAG_ALIGNED_SIZE |
GRD_RDP_GFX_SURFACE_FLAG_NO_HWACCEL_SESSIONS;
surface_descriptor.surface_id = get_next_free_surface_id (graphics_pipeline);
......@@ -235,6 +234,9 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
surface_descriptor.aligned_width = aligned_width;
surface_descriptor.aligned_height = aligned_height;
g_debug ("[RDP.RDPGFX] Creating separate render surface (id %u) for "
"surface %u", surface_descriptor.surface_id, surface_id);
render_surface = grd_rdp_gfx_surface_new (graphics_pipeline,
&surface_descriptor);
grd_rdp_gfx_surface_override_render_surface (gfx_surface,
......@@ -264,6 +266,8 @@ grd_rdp_graphics_pipeline_delete_surface (GrdRdpGraphicsPipeline *graphics_pipel
codec_context_id = grd_rdp_gfx_surface_get_codec_context_id (gfx_surface);
surface_serial = grd_rdp_gfx_surface_get_serial (gfx_surface);
g_debug ("[RDP.RDPGFX] Deleting surface with id %u", surface_id);
g_mutex_lock (&graphics_pipeline->gfx_mutex);
if (!g_hash_table_lookup_extended (graphics_pipeline->serial_surface_table,
GUINT_TO_POINTER (surface_serial),
......@@ -313,6 +317,23 @@ grd_rdp_graphics_pipeline_delete_surface (GrdRdpGraphicsPipeline *graphics_pipel
rdpgfx_context->DeleteSurface (rdpgfx_context, &delete_surface);
}
static GList *
get_main_surfaces_from_surface_list (GList *surfaces)
{
GList *main_surfaces = NULL;
GList *l;
for (l = surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
if (!grd_rdp_gfx_surface_is_auxiliary_surface (gfx_surface))
main_surfaces = g_list_append (main_surfaces, gfx_surface);
}
return main_surfaces;
}
void
grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipeline,
uint32_t width,
......@@ -322,6 +343,7 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
{
RdpgfxServerContext *rdpgfx_context = graphics_pipeline->rdpgfx_context;
RDPGFX_RESET_GRAPHICS_PDU reset_graphics = {0};
GList *main_surfaces;
GList *surfaces;
GList *l;
......@@ -333,7 +355,10 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
g_hash_table_steal_all (graphics_pipeline->surface_table);
g_mutex_unlock (&graphics_pipeline->gfx_mutex);
for (l = surfaces; l; l = l->next)
main_surfaces = get_main_surfaces_from_surface_list (surfaces);
g_list_free (surfaces);
for (l = main_surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
GrdRdpSurface *rdp_surface;
......@@ -341,7 +366,7 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
rdp_surface = grd_rdp_gfx_surface_get_rdp_surface (gfx_surface);
g_clear_object (&rdp_surface->gfx_surface);
}
g_list_free (surfaces);
g_list_free (main_surfaces);
/*
* width and height refer here to the size of the Graphics Output Buffer
......@@ -1466,6 +1491,7 @@ grd_rdp_graphics_pipeline_new (GrdSessionRdp *session_rdp,
static void
reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
{
GList *main_surfaces;
GList *surfaces;
GList *l;
......@@ -1478,7 +1504,10 @@ reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
frame_serial_free, graphics_pipeline);
g_mutex_unlock (&graphics_pipeline->gfx_mutex);
for (l = surfaces; l; l = l->next)
main_surfaces = get_main_surfaces_from_surface_list (surfaces);
g_list_free (surfaces);
for (l = main_surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
GrdRdpSurface *rdp_surface;
......@@ -1486,7 +1515,7 @@ reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
rdp_surface = grd_rdp_gfx_surface_get_rdp_surface (gfx_surface);
g_clear_object (&rdp_surface->gfx_surface);
}
g_list_free (surfaces);
g_list_free (main_surfaces);
g_mutex_lock (&graphics_pipeline->gfx_mutex);
graphics_pipeline->frame_acks_suspended = FALSE;
......
......@@ -147,7 +147,7 @@ verify_monitor_config (GrdRdpMonitorConfig *monitor_config)
for (i = 0; i < monitor_config->monitor_count; ++i)
{
rect.x = monitor_config->virtual_monitors[i].pos_x;
rect.y = monitor_config->virtual_monitors[i].pos_x;
rect.y = monitor_config->virtual_monitors[i].pos_y;
rect.width = monitor_config->virtual_monitors[i].width;
rect.height = monitor_config->virtual_monitors[i].height;
......
......@@ -183,8 +183,10 @@ update_ping_source (GrdRdpNetworkAutodetection *network_autodetection)
else
new_ping_interval_type = PING_INTERVAL_LOW;
if (network_autodetection->ping_interval != new_ping_interval_type &&
network_autodetection->ping_source)
if (network_autodetection->ping_interval == new_ping_interval_type)
return;
if (network_autodetection->ping_source)
{
g_source_destroy (network_autodetection->ping_source);
g_clear_pointer (&network_autodetection->ping_source, g_source_unref);
......@@ -343,7 +345,7 @@ track_round_trip_time (GrdRdpNetworkAutodetection *network_autodetection,
RTTInfo *rtt_info;
rtt_info = g_malloc0 (sizeof (RTTInfo));
rtt_info->round_trip_time_us = MIN (pong_time_us - ping_time_us, G_USEC_PER_SEC);
rtt_info->round_trip_time_us = pong_time_us - ping_time_us;
rtt_info->response_time_us = pong_time_us;
g_queue_push_tail (network_autodetection->round_trip_times, rtt_info);
......
......@@ -132,8 +132,6 @@ struct _GrdRdpPipeWireStream
uint32_t src_node_id;
struct spa_video_info_raw spa_format;
gboolean destroyed;
};
G_DEFINE_TYPE (GrdRdpPipeWireStream, grd_rdp_pipewire_stream,
......@@ -907,7 +905,7 @@ process_frame_data (GrdRdpPipeWireStream *stream,
}
else
{
callback (stream, g_steal_pointer (&frame), TRUE, user_data);
g_assert_not_reached ();
}
}
......@@ -978,9 +976,6 @@ on_stream_process (void *user_data)
struct pw_buffer *last_frame_buffer = NULL;
struct pw_buffer *next_buffer;
if (stream->destroyed)
return;
while ((next_buffer = pw_stream_dequeue_buffer (stream->pipewire_stream)))
{
if (grd_pipewire_buffer_has_pointer_bitmap (next_buffer))
......@@ -1289,21 +1284,15 @@ grd_rdp_pipewire_stream_finalize (GObject *object)
GrdContext *context = grd_session_get_context (session);
GrdEglThread *egl_thread;
stream->destroyed = TRUE;
/* Setting a PipeWire stream inactive will wait for the data thread to end */
if (stream->pipewire_stream)
pw_stream_flush (stream->pipewire_stream, false);
pw_stream_set_active (stream->pipewire_stream, false);
egl_thread = grd_context_get_egl_thread (context);
if (egl_thread && stream->pipewire_stream)
sync_egl_thread (egl_thread);
/*
* We can't clear stream->pipewire_stream before destroying it, as the data
* thread in PipeWire might access the variable during destruction.
*/
if (stream->pipewire_stream)
pw_stream_destroy (stream->pipewire_stream);
g_clear_pointer (&stream->pipewire_stream, pw_stream_destroy);
g_clear_pointer (&stream->pipewire_core, pw_core_disconnect);
g_clear_pointer (&stream->pipewire_context, pw_context_destroy);
......
......@@ -31,7 +31,6 @@
#include "grd-hwaccel-nvidia.h"
#include "grd-session-rdp.h"
enum
{
PROP_0,
......
......@@ -1659,6 +1659,14 @@ rdp_peer_capabilities (freerdp_peer *peer)
session_rdp->monitor_config->monitor_count = 1;
}
if ((rdp_settings->SupportGraphicsPipeline || rdp_settings->RemoteFxCodec ||
rdp_settings->NSCodec) &&
rdp_settings->ColorDepth != 32)
{
g_debug ("[RDP] Fixing invalid colour depth set by client");
rdp_settings->ColorDepth = 32;
}
switch (rdp_settings->ColorDepth)
{
case 32:
......@@ -1818,7 +1826,8 @@ rdp_peer_context_free (freerdp_peer *peer,
if (!rdp_peer_context)
return;
g_clear_pointer (&rdp_peer_context->vcm, WTSCloseServer);
if (rdp_peer_context->vcm != INVALID_HANDLE_VALUE)
g_clear_pointer (&rdp_peer_context->vcm, WTSCloseServer);
if (rdp_peer_context->encode_stream)
{
......@@ -1860,9 +1869,9 @@ rdp_peer_context_new (freerdp_peer *peer,
rdp_peer_context->planar_flags |= PLANAR_FORMAT_HEADER_RLE;
rdp_peer_context->vcm = WTSOpenServerA ((LPSTR) peer->context);
if (!rdp_peer_context->vcm)
if (!rdp_peer_context->vcm || rdp_peer_context->vcm == INVALID_HANDLE_VALUE)
{
g_warning ("[RDP] Failed to retrieve VCM handle");
g_warning ("[RDP] Failed to create virtual channel manager");
rdp_peer_context_free (peer, rdp_peer_context);
return FALSE;
}
......
......@@ -480,8 +480,6 @@ grd_session_enable_clipboard (GrdSession *session,
if (!priv->remote_desktop_session)
return FALSE;
priv->clipboard = clipboard;
options_variant = serialize_clipboard_options (mime_type_tables);
if (!grd_dbus_remote_desktop_session_call_enable_clipboard_sync (
priv->remote_desktop_session, options_variant, NULL, &error))
......@@ -489,6 +487,7 @@ grd_session_enable_clipboard (GrdSession *session,
g_warning ("Failed to enable clipboard: %s", error->message);
return FALSE;
}
priv->clipboard = clipboard;
return TRUE;
}
......