[gnome-remote-desktop] rdp: Adapt to GrdRdpBuffer



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]