From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- server/dcc.c | 5 ++-- server/red_worker.c | 74 +++++++---------------------------------------------- server/stream.c | 65 ++++++++++++++++++++++++++++++++++++++++++++-- server/stream.h | 1 - 4 files changed, 74 insertions(+), 71 deletions(-) diff --git a/server/dcc.c b/server/dcc.c index 9af6d84..8cc2c0a 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -654,13 +654,12 @@ int dcc_compress_image_lz4(DisplayChannelClient *dcc, SpiceImage *dest, SpiceBitmap *src, compress_send_data_t* o_comp_data, uint32_t group_id) { - DisplayChannel *display_channel = DCC_TO_DC(dcc); Lz4Data *lz4_data = &dcc->lz4_data; Lz4EncoderContext *lz4 = dcc->lz4; int lz4_size = 0; #ifdef COMPRESS_STAT - stat_time_t start_time = stat_now(display_channel->lz4_stat.clock); + stat_time_t start_time = stat_now(DCC_TO_DC(dcc)->lz4_stat.clock); #endif lz4_data->data.bufs_tail = compress_buf_new(); @@ -707,7 +706,7 @@ int dcc_compress_image_lz4(DisplayChannelClient *dcc, SpiceImage *dest, o_comp_data->comp_buf = lz4_data->data.bufs_head; o_comp_data->comp_buf_size = lz4_size; - stat_compress_add(&display_channel->lz4_stat, start_time, src->stride * src->y, + stat_compress_add(&DCC_TO_DC(dcc)->lz4_stat, start_time, src->stride * src->y, o_comp_data->comp_buf_size); return TRUE; } diff --git a/server/red_worker.c b/server/red_worker.c index 1963b0c..6e859fe 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -191,50 +191,6 @@ static void red_create_surface(DisplayChannel *display, uint32_t surface_id, uin uint32_t height, int32_t stride, uint32_t format, void *line_0, int data_is_valid, int send_client); -void attach_stream(DisplayChannel *display, Drawable *drawable, Stream *stream) -{ - DisplayChannelClient *dcc; - RingItem *item, *next; - - spice_assert(!drawable->stream && !stream->current); - spice_assert(drawable && stream); - stream->current = drawable; - drawable->stream = stream; - stream->last_time = drawable->creation_time; - - uint64_t duration = drawable->creation_time - stream->input_fps_start_time; - if (duration >= RED_STREAM_INPUT_FPS_TIMEOUT) { - /* Round to the nearest integer, for instance 24 for 23.976 */ - stream->input_fps = ((uint64_t)stream->num_input_frames * 1000 * 1000 * 1000 + duration / 2) / duration; - spice_debug("input-fps=%u", stream->input_fps); - stream->num_input_frames = 0; - stream->input_fps_start_time = drawable->creation_time; - } else { - stream->num_input_frames++; - } - - FOREACH_DCC(display, item, next, dcc) { - StreamAgent *agent; - QRegion clip_in_draw_dest; - - agent = &dcc->stream_agents[get_stream_id(display, stream)]; - region_or(&agent->vis_region, &drawable->tree_item.base.rgn); - - region_init(&clip_in_draw_dest); - region_add(&clip_in_draw_dest, &drawable->red_drawable->bbox); - region_and(&clip_in_draw_dest, &agent->clip); - - if (!region_is_equal(&clip_in_draw_dest, &drawable->tree_item.base.rgn)) { - region_remove(&agent->clip, &drawable->red_drawable->bbox); - region_or(&agent->clip, &drawable->tree_item.base.rgn); - dcc_stream_agent_clip(dcc, agent); - } -#ifdef STREAM_STATS - agent->stats.num_input_frames++; -#endif - } -} - /* fixme: move to display channel */ DrawablePipeItem *drawable_pipe_item_new(DisplayChannelClient *dcc, Drawable *drawable) @@ -829,18 +785,6 @@ static void red_clear_surface_drawables_from_pipes(DisplayChannel *display, } } -void detach_stream(DisplayChannel *display, Stream *stream, - int detach_sized) -{ - spice_assert(stream->current && stream->current->stream); - spice_assert(stream->current->stream == stream); - stream->current->stream = NULL; - if (detach_sized) { - stream->current->sized_stream = NULL; - } - stream->current = NULL; -} - static int red_display_drawable_is_in_pipe(DisplayChannelClient *dcc, Drawable *drawable) { DrawablePipeItem *dpi; @@ -1391,15 +1335,6 @@ static SpiceCanvas *image_surfaces_get(SpiceImageSurfaces *surfaces, return display->surfaces[surface_id].context.canvas; } -static void image_surface_init(DisplayChannel *display) -{ - static SpiceImageSurfacesOps image_surfaces_ops = { - image_surfaces_get, - }; - - display->image_surfaces.ops = &image_surfaces_ops; -} - static void drawable_draw(DisplayChannel *display, Drawable *drawable) { RedSurface *surface; @@ -5500,6 +5435,15 @@ static void display_channel_release_item(RedChannelClient *rcc, PipeItem *item, } } +static void image_surface_init(DisplayChannel *display) +{ + static SpiceImageSurfacesOps image_surfaces_ops = { + image_surfaces_get, + }; + + display->image_surfaces.ops = &image_surfaces_ops; +} + static void display_channel_create(RedWorker *worker, int migrate, int stream_video, uint32_t n_surfaces) { diff --git a/server/stream.c b/server/stream.c index a2acd3a..357c632 100644 --- a/server/stream.c +++ b/server/stream.c @@ -258,6 +258,67 @@ static int is_next_stream_frame(DisplayChannel *display, } } +static void attach_stream(DisplayChannel *display, Drawable *drawable, Stream *stream) +{ + DisplayChannelClient *dcc; + RingItem *item, *next; + + spice_return_if_fail(!drawable->stream); + spice_return_if_fail(!stream->current); + spice_return_if_fail(drawable); + spice_return_if_fail(stream); + + stream->current = drawable; + drawable->stream = stream; + stream->last_time = drawable->creation_time; + + uint64_t duration = drawable->creation_time - stream->input_fps_start_time; + if (duration >= RED_STREAM_INPUT_FPS_TIMEOUT) { + /* Round to the nearest integer, for instance 24 for 23.976 */ + stream->input_fps = ((uint64_t)stream->num_input_frames * 1000 * 1000 * 1000 + duration / 2) / duration; + spice_debug("input-fps=%u", stream->input_fps); + stream->num_input_frames = 0; + stream->input_fps_start_time = drawable->creation_time; + } else { + stream->num_input_frames++; + } + + FOREACH_DCC(display, item, next, dcc) { + StreamAgent *agent; + QRegion clip_in_draw_dest; + + agent = &dcc->stream_agents[get_stream_id(display, stream)]; + region_or(&agent->vis_region, &drawable->tree_item.base.rgn); + + region_init(&clip_in_draw_dest); + region_add(&clip_in_draw_dest, &drawable->red_drawable->bbox); + region_and(&clip_in_draw_dest, &agent->clip); + + if (!region_is_equal(&clip_in_draw_dest, &drawable->tree_item.base.rgn)) { + region_remove(&agent->clip, &drawable->red_drawable->bbox); + region_or(&agent->clip, &drawable->tree_item.base.rgn); + dcc_stream_agent_clip(dcc, agent); + } +#ifdef STREAM_STATS + agent->stats.num_input_frames++; +#endif + } +} + +void detach_stream(DisplayChannel *display, Stream *stream, + int detach_sized) +{ + spice_return_if_fail(stream->current); + spice_return_if_fail(stream->current->stream); + spice_return_if_fail(stream->current->stream == stream); + + stream->current->stream = NULL; + if (detach_sized) { + stream->current->sized_stream = NULL; + } + stream->current = NULL; +} + static void before_reattach_stream(DisplayChannel *display, Stream *stream, Drawable *new_frame) { @@ -350,13 +411,13 @@ static void display_channel_create_stream(DisplayChannel *display, Drawable *dra Stream *stream; SpiceRect* src_rect; - spice_assert(!drawable->stream); + spice_return_if_fail(!drawable->stream); if (!(stream = display_channel_stream_try_new(display))) { return; } - spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY); + spice_return_if_fail(drawable->red_drawable->type == QXL_DRAW_COPY); src_rect = &drawable->red_drawable->u.copy.src_area; ring_add(&display->streams, &stream->link); diff --git a/server/stream.h b/server/stream.h index 3627b0f..efe7ceb 100644 --- a/server/stream.h +++ b/server/stream.h @@ -155,7 +155,6 @@ void stream_agent_stats_print (StreamAgent void stream_agent_stop (DisplayChannelClient *dcc, StreamAgent *agent); -void attach_stream(DisplayChannel *display, Drawable *drawable, Stream *stream); void detach_stream(DisplayChannel *display, Stream *stream, int detach_sized); #endif /* STREAM_H */ -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel