[gnome-remote-desktop] rdp: Adapt to GrdRdpBuffer
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-remote-desktop] rdp: Adapt to GrdRdpBuffer
- Date: Tue, 22 Feb 2022 23:10:23 +0000 (UTC)
commit e2c4031169ab36353691fa9e9dfa2e7aa4bdc472
Author: Pascal Nowack <Pascal Nowack gmx de>
Date: Sun Jan 2 11:08:06 2022 +0100
rdp: Adapt to GrdRdpBuffer
Instead of passing buffer data in form of an uint8_t pointer, pass a
pointer to an instance of the newly introduced RDP buffer.
src/grd-rdp-graphics-pipeline.c | 15 +++++-----
src/grd-rdp-graphics-pipeline.h | 2 +-
src/grd-rdp-pipewire-stream.c | 48 +++++++++++++------------------
src/grd-rdp-surface.c | 6 ++--
src/grd-rdp-surface.h | 4 +--
src/grd-session-rdp.c | 62 +++++++++++++++++++++++------------------
src/grd-session-rdp.h | 5 ++--
7 files changed, 71 insertions(+), 71 deletions(-)
---
diff --git a/src/grd-rdp-graphics-pipeline.c b/src/grd-rdp-graphics-pipeline.c
index 1ea82630..37dc9eb8 100644
--- a/src/grd-rdp-graphics-pipeline.c
+++ b/src/grd-rdp-graphics-pipeline.c
@@ -23,6 +23,7 @@
#include <winpr/sysinfo.h>
+#include "grd-rdp-buffer.h"
#include "grd-rdp-frame-info.h"
#include "grd-rdp-gfx-surface.h"
#include "grd-rdp-network-autodetection.h"
@@ -405,7 +406,7 @@ refresh_gfx_surface_avc420 (GrdRdpGraphicsPipeline *graphics_pipeline,
HWAccelContext *hwaccel_context,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *src_data,
+ GrdRdpBuffer *buffer,
int64_t *enc_time_us)
{
RdpgfxServerContext *rdpgfx_context = graphics_pipeline->rdpgfx_context;
@@ -433,7 +434,7 @@ refresh_gfx_surface_avc420 (GrdRdpGraphicsPipeline *graphics_pipeline,
if (!grd_hwaccel_nvidia_avc420_encode_bgrx_frame (graphics_pipeline->hwaccel_nvidia,
hwaccel_context->encode_session_id,
- src_data,
+ buffer->local_data,
surface_width, surface_height,
aligned_width, aligned_height,
&avc420.data, &avc420.length))
@@ -650,7 +651,7 @@ static gboolean
refresh_gfx_surface_rfx_progressive (GrdRdpGraphicsPipeline *graphics_pipeline,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *src_data,
+ GrdRdpBuffer *buffer,
int64_t *enc_time_us)
{
RdpgfxServerContext *rdpgfx_context = graphics_pipeline->rdpgfx_context;
@@ -703,7 +704,7 @@ refresh_gfx_surface_rfx_progressive (GrdRdpGraphicsPipeline *graphics_pipeline,
rfx_message = rfx_encode_message (graphics_pipeline->rfx_context,
rfx_rects,
n_rects,
- src_data,
+ buffer->local_data,
rdp_surface->width,
rdp_surface->height,
src_stride);
@@ -889,7 +890,7 @@ void
grd_rdp_graphics_pipeline_refresh_gfx (GrdRdpGraphicsPipeline *graphics_pipeline,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *src_data)
+ GrdRdpBuffer *buffer)
{
RdpgfxServerContext *rdpgfx_context = graphics_pipeline->rdpgfx_context;
rdpSettings *rdp_settings = rdpgfx_context->rdpcontext->settings;
@@ -928,14 +929,14 @@ grd_rdp_graphics_pipeline_refresh_gfx (GrdRdpGraphicsPipeline *graphics_pipeline
{
g_assert (hwaccel_context->api == HW_ACCEL_API_NVENC);
success = refresh_gfx_surface_avc420 (graphics_pipeline, hwaccel_context,
- rdp_surface, region, src_data,
+ rdp_surface, region, buffer,
&enc_time_us);
}
else
#endif /* HAVE_HWACCEL_NVIDIA */
{
success = refresh_gfx_surface_rfx_progressive (graphics_pipeline, rdp_surface,
- region, src_data, &enc_time_us);
+ region, buffer, &enc_time_us);
}
if (success)
diff --git a/src/grd-rdp-graphics-pipeline.h b/src/grd-rdp-graphics-pipeline.h
index 535022b2..7ba1d6a5 100644
--- a/src/grd-rdp-graphics-pipeline.h
+++ b/src/grd-rdp-graphics-pipeline.h
@@ -64,6 +64,6 @@ void grd_rdp_graphics_pipeline_notify_new_round_trip_time (GrdRdpGraphicsPipelin
void grd_rdp_graphics_pipeline_refresh_gfx (GrdRdpGraphicsPipeline *graphics_pipeline,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *src_data);
+ GrdRdpBuffer *buffer);
#endif /* GRD_RDP_GRAPHICS_PIPELINE_H */
diff --git a/src/grd-rdp-pipewire-stream.c b/src/grd-rdp-pipewire-stream.c
index 4d2130f1..da8991a2 100644
--- a/src/grd-rdp-pipewire-stream.c
+++ b/src/grd-rdp-pipewire-stream.c
@@ -33,6 +33,7 @@
#include "grd-context.h"
#include "grd-egl-thread.h"
#include "grd-pipewire-utils.h"
+#include "grd-rdp-buffer.h"
#include "grd-rdp-surface.h"
enum
@@ -55,9 +56,7 @@ struct _GrdRdpFrame
{
gatomicrefcount refcount;
- void *data;
- uint16_t width;
- uint16_t height;
+ GrdRdpBuffer *buffer;
gboolean has_pointer_data;
uint8_t *pointer_bitmap;
@@ -135,7 +134,7 @@ grd_rdp_frame_unref (GrdRdpFrame *frame)
{
if (g_atomic_ref_count_dec (&frame->refcount))
{
- g_free (frame->data);
+ g_clear_pointer (&frame->buffer, grd_rdp_buffer_free);
g_free (frame->pointer_bitmap);
g_free (frame);
}
@@ -154,11 +153,10 @@ do_render (gpointer user_data)
if (!frame)
return G_SOURCE_CONTINUE;
- if (frame->data)
+ if (frame->buffer)
{
- grd_session_rdp_take_buffer (stream->session_rdp,
- g_steal_pointer (&frame->data),
- frame->width, frame->height);
+ grd_session_rdp_take_buffer (stream->session_rdp, stream->rdp_surface,
+ g_steal_pointer (&frame->buffer));
}
if (frame->pointer_bitmap)
@@ -353,12 +351,12 @@ copy_frame_data (GrdRdpFrame *frame,
int src_stride,
int bpp)
{
+ GrdRdpBuffer *buffer = frame->buffer;
int y;
- frame->data = g_malloc (height * dst_stride);
for (y = 0; y < height; ++y)
{
- memcpy (((uint8_t *) frame->data) + y * dst_stride,
+ memcpy (((uint8_t *) buffer->local_data) + y * dst_stride,
((uint8_t *) src_data) + y * src_stride,
width * 4);
}
@@ -459,8 +457,9 @@ process_buffer (GrdRdpPipeWireStream *stream,
return;
}
src_data = SPA_MEMBER (map, buffer->datas[0].mapoffset, uint8_t);
- frame->width = width;
- frame->height = height;
+
+ frame->buffer = grd_rdp_buffer_new ();
+ grd_rdp_buffer_resize (frame->buffer, width, height, dst_stride);
copy_frame_data (frame,
src_data,
@@ -487,8 +486,8 @@ process_buffer (GrdRdpPipeWireStream *stream,
unsigned int i;
uint8_t *dst_data;
- frame->width = width;
- frame->height = height;
+ frame->buffer = grd_rdp_buffer_new ();
+ grd_rdp_buffer_resize (frame->buffer, width, height, dst_stride);
row_width = dst_stride / bpp;
@@ -505,9 +504,8 @@ process_buffer (GrdRdpPipeWireStream *stream,
strides[i] = buffer->datas[i].chunk->stride;
modifiers[i] = stream->spa_format.modifier;
}
- dst_data = g_malloc0 (height * dst_stride);
+ dst_data = frame->buffer->local_data;
- frame->data = dst_data;
grd_egl_thread_download (egl_thread,
dst_data,
row_width,
@@ -527,8 +525,9 @@ process_buffer (GrdRdpPipeWireStream *stream,
void *src_data;
src_data = buffer->datas[0].data;
- frame->width = width;
- frame->height = height;
+
+ frame->buffer = grd_rdp_buffer_new ();
+ grd_rdp_buffer_resize (frame->buffer, width, height, dst_stride);
copy_frame_data (frame,
src_data,
@@ -545,15 +544,6 @@ process_buffer (GrdRdpPipeWireStream *stream,
}
}
-static void
-take_frame_data_from (GrdRdpFrame *src_frame,
- GrdRdpFrame *dst_frame)
-{
- dst_frame->data = g_steal_pointer (&src_frame->data);
- dst_frame->width = src_frame->width;
- dst_frame->height = src_frame->height;
-}
-
static void
take_pointer_data_from (GrdRdpFrame *src_frame,
GrdRdpFrame *dst_frame)
@@ -587,8 +577,8 @@ on_frame_ready (GrdRdpPipeWireStream *stream,
pending_frame = g_steal_pointer (&stream->pending_frame);
if (pending_frame)
{
- if (!frame->data && pending_frame->data)
- take_frame_data_from (pending_frame, frame);
+ if (!frame->buffer && pending_frame->buffer)
+ frame->buffer = g_steal_pointer (&pending_frame->buffer);
if (!frame->has_pointer_data && pending_frame->has_pointer_data)
take_pointer_data_from (pending_frame, frame);
diff --git a/src/grd-rdp-surface.c b/src/grd-rdp-surface.c
index e094bc95..b9f59c7b 100644
--- a/src/grd-rdp-surface.c
+++ b/src/grd-rdp-surface.c
@@ -21,12 +21,14 @@
#include "grd-rdp-surface.h"
+#include "grd-rdp-buffer.h"
+
void
grd_rdp_surface_free (GrdRdpSurface *rdp_surface)
{
g_assert (!rdp_surface->gfx_surface);
- g_clear_pointer (&rdp_surface->last_frame, g_free);
- g_clear_pointer (&rdp_surface->pending_frame, g_free);
+ g_clear_pointer (&rdp_surface->last_framebuffer, grd_rdp_buffer_free);
+ g_clear_pointer (&rdp_surface->pending_framebuffer, grd_rdp_buffer_free);
g_free (rdp_surface);
}
diff --git a/src/grd-rdp-surface.h b/src/grd-rdp-surface.h
index 01a01904..3d1d18b6 100644
--- a/src/grd-rdp-surface.h
+++ b/src/grd-rdp-surface.h
@@ -32,8 +32,8 @@ struct _GrdRdpSurface
uint16_t width;
uint16_t height;
- uint8_t *last_frame;
- uint8_t *pending_frame;
+ GrdRdpBuffer *last_framebuffer;
+ GrdRdpBuffer *pending_framebuffer;
gboolean valid;
diff --git a/src/grd-session-rdp.c b/src/grd-session-rdp.c
index a6ad22c0..f3016cf5 100644
--- a/src/grd-session-rdp.c
+++ b/src/grd-session-rdp.c
@@ -31,6 +31,7 @@
#include "grd-clipboard-rdp.h"
#include "grd-context.h"
#include "grd-damage-utils.h"
+#include "grd-rdp-buffer.h"
#include "grd-rdp-event-queue.h"
#include "grd-rdp-graphics-pipeline.h"
#include "grd-rdp-network-autodetection.h"
@@ -170,7 +171,7 @@ static void
rdp_peer_refresh_region (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data);
+ GrdRdpBuffer *buffer);
static gboolean
are_pointer_bitmaps_equal (gconstpointer a,
@@ -247,15 +248,15 @@ maybe_resize_graphics_output_buffer (GrdSessionRdp *session_rdp,
void
grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp,
- void *data,
- uint16_t width,
- uint16_t height)
+ GrdRdpSurface *rdp_surface,
+ GrdRdpBuffer *buffer)
{
- GrdRdpSurface *rdp_surface = session_rdp->rdp_surface;
+ uint16_t width = buffer->width;
+ uint16_t height = buffer->height;
uint32_t stride;
cairo_region_t *region;
- g_clear_pointer (&rdp_surface->pending_frame, g_free);
+ g_clear_pointer (&rdp_surface->pending_framebuffer, grd_rdp_buffer_free);
maybe_resize_graphics_output_buffer (session_rdp, width, height);
if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_ALL_SURFACES_INVALID))
@@ -275,32 +276,37 @@ grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp,
}
if (!rdp_surface->valid)
- g_clear_pointer (&rdp_surface->last_frame, g_free);
+ g_clear_pointer (&rdp_surface->last_framebuffer, grd_rdp_buffer_free);
if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_ACTIVATED) &&
is_rdp_peer_flag_set (session_rdp, RDP_PEER_OUTPUT_ENABLED) &&
!is_rdp_peer_flag_set (session_rdp, RDP_PEER_PENDING_GFX_INIT) &&
!rdp_surface->encoding_suspended)
{
+ uint8_t *last_frame_local_data = NULL;
+
+ if (rdp_surface->last_framebuffer)
+ last_frame_local_data = rdp_surface->last_framebuffer->local_data;
+
stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
- region = grd_get_damage_region ((uint8_t *) data,
- rdp_surface->last_frame,
+ region = grd_get_damage_region (buffer->local_data,
+ last_frame_local_data,
rdp_surface->width,
rdp_surface->height,
64, 64,
stride, 4);
if (!cairo_region_is_empty (region))
- rdp_peer_refresh_region (session_rdp, rdp_surface, region, (uint8_t *) data);
+ rdp_peer_refresh_region (session_rdp, rdp_surface, region, buffer);
- g_clear_pointer (&rdp_surface->last_frame, g_free);
- rdp_surface->last_frame = data;
+ g_clear_pointer (&rdp_surface->last_framebuffer, grd_rdp_buffer_free);
+ rdp_surface->last_framebuffer = buffer;
cairo_region_destroy (region);
}
else
{
- rdp_surface->pending_frame = data;
+ rdp_surface->pending_framebuffer = buffer;
}
}
@@ -315,12 +321,11 @@ grd_session_rdp_maybe_encode_pending_frame (GrdSessionRdp *session_rdp,
is_rdp_peer_flag_set (session_rdp, RDP_PEER_PENDING_GFX_INIT))
return;
- if (!rdp_surface->pending_frame)
+ if (!rdp_surface->pending_framebuffer)
return;
- grd_session_rdp_take_buffer (session_rdp,
- g_steal_pointer (&rdp_surface->pending_frame),
- rdp_surface->width, rdp_surface->height);
+ grd_session_rdp_take_buffer (session_rdp, rdp_surface,
+ g_steal_pointer (&rdp_surface->pending_framebuffer));
}
static gboolean
@@ -636,7 +641,7 @@ static void
rdp_peer_refresh_gfx (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data)
+ GrdRdpBuffer *buffer)
{
freerdp_peer *peer = session_rdp->peer;
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
@@ -659,19 +664,20 @@ rdp_peer_refresh_gfx (GrdSessionRdp *session_rdp,
}
grd_rdp_graphics_pipeline_refresh_gfx (graphics_pipeline,
- rdp_surface, region, data);
+ rdp_surface, region, buffer);
}
static void
rdp_peer_refresh_rfx (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data)
+ GrdRdpBuffer *buffer)
{
freerdp_peer *peer = session_rdp->peer;
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
rdpUpdate *rdp_update = peer->update;
+ uint8_t *data = buffer->local_data;
uint32_t src_stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
SURFACE_BITS_COMMAND cmd = {0};
@@ -813,12 +819,13 @@ static void
rdp_peer_refresh_nsc (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data)
+ GrdRdpBuffer *buffer)
{
freerdp_peer *peer = session_rdp->peer;
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
rdpUpdate *rdp_update = peer->update;
+ uint8_t *data = buffer->local_data;
uint32_t src_stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
NSCThreadPoolContext *thread_pool_context =
@@ -1055,12 +1062,13 @@ static void
rdp_peer_refresh_raw (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data)
+ GrdRdpBuffer *buffer)
{
freerdp_peer *peer = session_rdp->peer;
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
rdpUpdate *rdp_update = peer->update;
+ uint8_t *data = buffer->local_data;
uint32_t src_stride = grd_session_rdp_get_stride_for_width (session_rdp,
rdp_surface->width);
RawThreadPoolContext *thread_pool_context =
@@ -1182,20 +1190,20 @@ static void
rdp_peer_refresh_region (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface,
cairo_region_t *region,
- uint8_t *data)
+ GrdRdpBuffer *buffer)
{
freerdp_peer *peer = session_rdp->peer;
RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
rdpSettings *rdp_settings = peer->settings;
if (rdp_settings->SupportGraphicsPipeline)
- rdp_peer_refresh_gfx (session_rdp, rdp_surface, region, data);
+ rdp_peer_refresh_gfx (session_rdp, rdp_surface, region, buffer);
else if (rdp_settings->RemoteFxCodec)
- rdp_peer_refresh_rfx (session_rdp, rdp_surface, region, data);
+ rdp_peer_refresh_rfx (session_rdp, rdp_surface, region, buffer);
else if (rdp_settings->NSCodec)
- rdp_peer_refresh_nsc (session_rdp, rdp_surface, region, data);
+ rdp_peer_refresh_nsc (session_rdp, rdp_surface, region, buffer);
else
- rdp_peer_refresh_raw (session_rdp, rdp_surface, region, data);
+ rdp_peer_refresh_raw (session_rdp, rdp_surface, region, buffer);
++rdp_peer_context->frame_id;
}
diff --git a/src/grd-session-rdp.h b/src/grd-session-rdp.h
index 1dfe13dc..2572d329 100644
--- a/src/grd-session-rdp.h
+++ b/src/grd-session-rdp.h
@@ -50,9 +50,8 @@ int grd_session_rdp_get_stride_for_width (GrdSessionRdp *session_rdp,
int width);
void grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp,
- void *data,
- uint16_t width,
- uint16_t height);
+ GrdRdpSurface *rdp_surface,
+ GrdRdpBuffer *buffer);
void grd_session_rdp_maybe_encode_pending_frame (GrdSessionRdp *session_rdp,
GrdRdpSurface *rdp_surface);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]