[Spice-devel] [PATCH spice-server 7/7] Move dcc_detach_stream_gracefully to dcc.[ch]

Jonathon Jongsma jjongsma at redhat.com
Wed Nov 29 20:16:10 UTC 2017


This is a DisplayChannelClient method, so it belongs in this source
file. red_upgrade_item_free() was also moved, since it is only used by
this function.

Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
---
 server/dcc.c          | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++
 server/dcc.h          |  3 ++
 server/video-stream.c | 81 --------------------------------------------------
 server/video-stream.h |  3 --
 4 files changed, 85 insertions(+), 84 deletions(-)

diff --git a/server/dcc.c b/server/dcc.c
index fb5009e91..a0a3676a4 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -1457,3 +1457,85 @@ gboolean dcc_is_low_bandwidth(DisplayChannelClient *dcc)
 {
     return dcc->is_low_bandwidth;
 }
+
+static void red_upgrade_item_free(RedPipeItem *base)
+{
+    g_return_if_fail(base != NULL);
+
+    RedUpgradeItem *item = SPICE_UPCAST(RedUpgradeItem, base);
+
+    g_return_if_fail(item->base.refcount == 0);
+
+    drawable_unref(item->drawable);
+    g_free(item->rects);
+    g_free(item);
+}
+
+/*
+ * after dcc_detach_stream_gracefully is called for all the display channel clients,
+ * video_stream_detach_drawable should be called. See comment (1).
+ */
+void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
+                                  VideoStream *stream,
+                                  Drawable *update_area_limit)
+{
+    DisplayChannel *display = DCC_TO_DC(dcc);
+    int stream_id = display_channel_get_video_stream_id(display, stream);
+    VideoStreamAgent *agent = dcc_get_video_stream_agent(dcc, stream_id);
+
+    /* stopping the client from playing older frames at once*/
+    region_clear(&agent->clip);
+    dcc_video_stream_agent_clip(dcc, agent);
+
+    if (region_is_empty(&agent->vis_region)) {
+        spice_debug("stream %d: vis region empty", stream_id);
+        return;
+    }
+
+    if (stream->current &&
+        region_contains(&stream->current->tree_item.base.rgn, &agent->vis_region)) {
+        RedChannelClient *rcc;
+        RedUpgradeItem *upgrade_item;
+        int n_rects;
+
+        /* (1) The caller should detach the drawable from the stream. This will
+         * lead to sending the drawable losslessly, as an ordinary drawable. */
+        if (dcc_drawable_is_in_pipe(dcc, stream->current)) {
+            spice_debug("stream %d: upgrade by linked drawable. box ==>",
+                        stream_id);
+            rect_debug(&stream->current->red_drawable->bbox);
+            goto clear_vis_region;
+        }
+        spice_debug("stream %d: upgrade by drawable. box ==>", stream_id);
+        rect_debug(&stream->current->red_drawable->bbox);
+        rcc = RED_CHANNEL_CLIENT(dcc);
+        upgrade_item = g_new(RedUpgradeItem, 1);
+        red_pipe_item_init_full(&upgrade_item->base, RED_PIPE_ITEM_TYPE_UPGRADE,
+                                red_upgrade_item_free);
+        upgrade_item->drawable = stream->current;
+        upgrade_item->drawable->refs++;
+        n_rects = pixman_region32_n_rects(&upgrade_item->drawable->tree_item.base.rgn);
+        upgrade_item->rects = g_malloc(sizeof(SpiceClipRects) + n_rects * sizeof(SpiceRect));
+        upgrade_item->rects->num_rects = n_rects;
+        region_ret_rects(&upgrade_item->drawable->tree_item.base.rgn,
+                         upgrade_item->rects->rects, n_rects);
+        red_channel_client_pipe_add(rcc, &upgrade_item->base);
+
+    } else {
+        SpiceRect upgrade_area;
+
+        region_extents(&agent->vis_region, &upgrade_area);
+        spice_debug("stream %d: upgrade by screenshot. has current %d. box ==>",
+                    stream_id, stream->current != NULL);
+        rect_debug(&upgrade_area);
+        if (update_area_limit) {
+            display_channel_draw_until(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
+        } else {
+            display_channel_draw(DCC_TO_DC(dcc), &upgrade_area, 0);
+        }
+        dcc_add_surface_area_image(dcc, 0, &upgrade_area, NULL, FALSE);
+    }
+clear_vis_region:
+    region_clear(&agent->vis_region);
+}
+
diff --git a/server/dcc.h b/server/dcc.h
index ec7dc3ca9..18f01daaf 100644
--- a/server/dcc.h
+++ b/server/dcc.h
@@ -199,6 +199,9 @@ uint64_t dcc_get_max_stream_bit_rate(DisplayChannelClient *dcc);
 void dcc_set_max_stream_bit_rate(DisplayChannelClient *dcc, uint64_t rate);
 gboolean dcc_is_low_bandwidth(DisplayChannelClient *dcc);
 GArray *dcc_get_preferred_video_codecs_for_encoding(DisplayChannelClient *dcc);
+void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
+                                  VideoStream *stream,
+                                  Drawable *update_area_limit);
 
 G_END_DECLS
 
diff --git a/server/video-stream.c b/server/video-stream.c
index 227824fa0..7bf1ef5af 100644
--- a/server/video-stream.c
+++ b/server/video-stream.c
@@ -396,87 +396,6 @@ void video_stream_agent_stop(VideoStreamAgent *agent)
     }
 }
 
-static void red_upgrade_item_free(RedPipeItem *base)
-{
-    g_return_if_fail(base != NULL);
-
-    RedUpgradeItem *item = SPICE_UPCAST(RedUpgradeItem, base);
-
-    g_return_if_fail(item->base.refcount == 0);
-
-    drawable_unref(item->drawable);
-    g_free(item->rects);
-    g_free(item);
-}
-
-/*
- * after dcc_detach_stream_gracefully is called for all the display channel clients,
- * video_stream_detach_drawable should be called. See comment (1).
- */
-void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
-                                  VideoStream *stream,
-                                  Drawable *update_area_limit)
-{
-    DisplayChannel *display = DCC_TO_DC(dcc);
-    int stream_id = display_channel_get_video_stream_id(display, stream);
-    VideoStreamAgent *agent = dcc_get_video_stream_agent(dcc, stream_id);
-
-    /* stopping the client from playing older frames at once*/
-    region_clear(&agent->clip);
-    dcc_video_stream_agent_clip(dcc, agent);
-
-    if (region_is_empty(&agent->vis_region)) {
-        spice_debug("stream %d: vis region empty", stream_id);
-        return;
-    }
-
-    if (stream->current &&
-        region_contains(&stream->current->tree_item.base.rgn, &agent->vis_region)) {
-        RedChannelClient *rcc;
-        RedUpgradeItem *upgrade_item;
-        int n_rects;
-
-        /* (1) The caller should detach the drawable from the stream. This will
-         * lead to sending the drawable losslessly, as an ordinary drawable. */
-        if (dcc_drawable_is_in_pipe(dcc, stream->current)) {
-            spice_debug("stream %d: upgrade by linked drawable. box ==>",
-                        stream_id);
-            rect_debug(&stream->current->red_drawable->bbox);
-            goto clear_vis_region;
-        }
-        spice_debug("stream %d: upgrade by drawable. box ==>", stream_id);
-        rect_debug(&stream->current->red_drawable->bbox);
-        rcc = RED_CHANNEL_CLIENT(dcc);
-        upgrade_item = g_new(RedUpgradeItem, 1);
-        red_pipe_item_init_full(&upgrade_item->base, RED_PIPE_ITEM_TYPE_UPGRADE,
-                                red_upgrade_item_free);
-        upgrade_item->drawable = stream->current;
-        upgrade_item->drawable->refs++;
-        n_rects = pixman_region32_n_rects(&upgrade_item->drawable->tree_item.base.rgn);
-        upgrade_item->rects = g_malloc(sizeof(SpiceClipRects) + n_rects * sizeof(SpiceRect));
-        upgrade_item->rects->num_rects = n_rects;
-        region_ret_rects(&upgrade_item->drawable->tree_item.base.rgn,
-                         upgrade_item->rects->rects, n_rects);
-        red_channel_client_pipe_add(rcc, &upgrade_item->base);
-
-    } else {
-        SpiceRect upgrade_area;
-
-        region_extents(&agent->vis_region, &upgrade_area);
-        spice_debug("stream %d: upgrade by screenshot. has current %d. box ==>",
-                    stream_id, stream->current != NULL);
-        rect_debug(&upgrade_area);
-        if (update_area_limit) {
-            display_channel_draw_until(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
-        } else {
-            display_channel_draw(DCC_TO_DC(dcc), &upgrade_area, 0);
-        }
-        dcc_add_surface_area_image(dcc, 0, &upgrade_area, NULL, FALSE);
-    }
-clear_vis_region:
-    region_clear(&agent->vis_region);
-}
-
 /*
  * region  : a primary surface region. Streams that intersects with the given
  *           region will be detached.
diff --git a/server/video-stream.h b/server/video-stream.h
index b1c50ea25..df95c0573 100644
--- a/server/video-stream.h
+++ b/server/video-stream.h
@@ -137,8 +137,5 @@ void video_stream_agent_unref(VideoStreamAgent *agent);
 void video_stream_agent_stop(VideoStreamAgent *agent);
 
 void video_stream_detach_drawable(VideoStream *stream);
-void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
-                                  VideoStream *stream,
-                                  Drawable *update_area_limit);
 
 #endif /* VIDEO_STREAM_H_ */
-- 
2.13.6



More information about the Spice-devel mailing list