From 960e0321b61ae615e05b7b809c99b079906a7008 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 13 Nov 2015 15:16:26 +0100 Subject: worker: add compression parameters to dcc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allow different dcc to have different settings from default one. The parameters are copied initially from default settings but then they can change independently for each client. Even having a single client a future client is not affected by a previous setting on the old dcc. Signed-off-by: Marc-André Lureau [updated for the preferred compression] Signed-off-by: Pavel Grunt Acked-by: Frediano Ziglio --- server/red_worker.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'server/red_worker.c') diff --git a/server/red_worker.c b/server/red_worker.c index 9837e09d..9db8d2a7 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -3814,8 +3814,7 @@ static inline int red_compress_image(DisplayChannelClient *dcc, compress_send_data_t* o_comp_data) { DisplayChannel *display_channel = DCC_TO_DC(dcc); - SpiceImageCompression image_compression = - display_channel->common.worker->image_compression; + SpiceImageCompression image_compression = dcc->image_compression; int quic_compress = FALSE; if ((image_compression == SPICE_IMAGE_COMPRESSION_OFF) || @@ -4219,15 +4218,14 @@ static void fill_mask(RedChannelClient *rcc, SpiceMarshaller *m, SpiceImage *mask_bitmap, Drawable *drawable) { DisplayChannelClient *dcc = RCC_TO_DCC(rcc); - DisplayChannel *display = DCC_TO_DC(dcc); if (mask_bitmap && m) { - if (display->common.worker->image_compression != SPICE_IMAGE_COMPRESSION_OFF) { - SpiceImageCompression save_img_comp = - display->common.worker->image_compression; - display->common.worker->image_compression = SPICE_IMAGE_COMPRESSION_OFF; + if (dcc->image_compression != SPICE_IMAGE_COMPRESSION_OFF) { + /* todo: pass compression argument */ + SpiceImageCompression save_img_comp = dcc->image_compression; + dcc->image_compression = SPICE_IMAGE_COMPRESSION_OFF; fill_bits(dcc, m, mask_bitmap, drawable, FALSE); - display->common.worker->image_compression = save_img_comp; + dcc->image_compression = save_img_comp; } else { fill_bits(dcc, m, mask_bitmap, drawable, FALSE); } @@ -6113,7 +6111,7 @@ static void red_marshall_image(RedChannelClient *rcc, SpiceMarshaller *m, ImageI compress_send_data_t comp_send_data = {0}; - comp_mode = display_channel->common.worker->image_compression; + comp_mode = dcc->image_compression; if (((comp_mode == SPICE_IMAGE_COMPRESSION_AUTO_LZ) || (comp_mode == SPICE_IMAGE_COMPRESSION_AUTO_GLZ)) && !bitmap_has_extra_stride(&bitmap)) { @@ -7211,10 +7209,10 @@ static int display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t s if (migrate_data->low_bandwidth_setting) { red_channel_client_ack_set_client_window(rcc, WIDE_CLIENT_ACK_WINDOW); - if (DCC_TO_WORKER(dcc)->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) { + if (dcc->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) { display_channel->enable_jpeg = TRUE; } - if (DCC_TO_WORKER(dcc)->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) { + if (dcc->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) { display_channel->enable_zlib_glz_wrap = TRUE; } } @@ -7282,6 +7280,7 @@ static int display_channel_handle_preferred_compression(DisplayChannelClient *dc case SPICE_IMAGE_COMPRESSION_GLZ: case SPICE_IMAGE_COMPRESSION_OFF: display_channel->common.worker->image_compression = pc->image_compression; + dcc->image_compression = pc->image_compression; return TRUE; default: spice_warning("preferred-compression: unsupported image compression setting"); @@ -7752,7 +7751,8 @@ static void handle_new_display_channel(RedWorker *worker, RedClient *client, Red display_channel = worker->display_channel; spice_info("add display channel client"); dcc = dcc_new(display_channel, client, stream, migrate, - common_caps, num_common_caps, caps, num_caps); + common_caps, num_common_caps, caps, num_caps, + worker->image_compression, worker->jpeg_state, worker->zlib_glz_state); if (!dcc) { return; } @@ -7767,19 +7767,19 @@ static void handle_new_display_channel(RedWorker *worker, RedClient *client, Red DISPLAY_FREE_LIST_DEFAULT_SIZE * sizeof(SpiceResourceID)); dcc->send_data.free_list.res_size = DISPLAY_FREE_LIST_DEFAULT_SIZE; - if (worker->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) { + if (dcc->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) { display_channel->enable_jpeg = dcc->common.is_low_bandwidth; } else { - display_channel->enable_jpeg = (worker->jpeg_state == SPICE_WAN_COMPRESSION_ALWAYS); + display_channel->enable_jpeg = (dcc->jpeg_state == SPICE_WAN_COMPRESSION_ALWAYS); } // todo: tune quality according to bandwidth display_channel->jpeg_quality = 85; - if (worker->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) { + if (dcc->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) { display_channel->enable_zlib_glz_wrap = dcc->common.is_low_bandwidth; } else { - display_channel->enable_zlib_glz_wrap = (worker->zlib_glz_state == + display_channel->enable_zlib_glz_wrap = (dcc->zlib_glz_state == SPICE_WAN_COMPRESSION_ALWAYS); } -- cgit