From b1761377d17c2c64cb52bf4c77972a122874eaf4 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 13 Jul 2010 10:11:48 +0200 Subject: [PATCH 1/4] red_glz_compress_image: lines isn't needed any more --- server/red_worker.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/red_worker.c b/server/red_worker.c index 1dd10b27..4701ba05 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -5674,7 +5674,6 @@ static inline int red_glz_compress_image(DisplayChannel *display_channel, LzImageType type = MAP_BITMAP_FMT_TO_LZ_IMAGE_TYPE[src->format]; RedGlzDrawable *glz_drawable; GlzDrawableInstanceItem *glz_drawable_instance; - uint8_t *lines; int glz_size; int zlib_size; @@ -5698,7 +5697,7 @@ static inline int red_glz_compress_image(DisplayChannel *display_channel, glz_data->usr.more_lines = glz_usr_more_lines; glz_size = glz_encode(display_channel->glz, type, src->x, src->y, - (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN), lines, 0, + (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN), NULL, 0, src->stride, (uint8_t*)glz_data->data.bufs_head->buf, sizeof(glz_data->data.bufs_head->buf), glz_drawable_instance, From c90183da944001e466f60acb58a5052c353995ca Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Mon, 12 Jul 2010 14:16:31 +0300 Subject: [PATCH 2/4] server: enabling/disabling jpeg and zlib-over-glz via spice command line args --- server/red_dispatcher.c | 4 ++++ server/red_worker.c | 27 ++++++++++++++++++++++++--- server/red_worker.h | 2 ++ server/reds.c | 26 ++++++++++++++++++++++++++ server/spice.h | 10 ++++++++++ 5 files changed, 66 insertions(+), 3 deletions(-) diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 426a3811..2a3c297c 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -66,6 +66,8 @@ typedef struct RedWorkeState { extern uint32_t streaming_video; extern spice_image_compression_t image_compression; +extern spice_wan_compression_t jpeg_state; +extern spice_wan_compression_t zlib_glz_state; static RedDispatcher *dispatchers = NULL; @@ -509,6 +511,8 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl) memcpy(init_data.renderers, renderers, sizeof(init_data.renderers)); init_data.image_compression = image_compression; + init_data.jpeg_state = jpeg_state; + init_data.zlib_glz_state = zlib_glz_state; init_data.streaming_video = streaming_video; dispatcher->base.major_version = SPICE_INTERFACE_QXL_MAJOR; diff --git a/server/red_worker.c b/server/red_worker.c index 4701ba05..bfb45607 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -919,6 +919,8 @@ typedef struct RedWorker { ImageCache image_cache; spice_image_compression_t image_compression; + spice_wan_compression_t jpeg_state; + spice_wan_compression_t zlib_glz_state; uint32_t mouse_mode; @@ -8795,6 +8797,7 @@ static void cursor_channel_push(RedWorker *worker) free(pipe_item); break; case PIPE_ITEM_TYPE_CURSOR_INIT: + red_reset_cursor_cache(cursor_channel); red_send_cursor_init(cursor_channel); free(pipe_item); break; @@ -9865,10 +9868,26 @@ static void handle_new_display_channel(RedWorker *worker, RedsStreamContext *pee DISPLAY_FREE_LIST_DEFAULT_SIZE * sizeof(SpiceResourceID)); display_channel->send_data.free_list.res_size = DISPLAY_FREE_LIST_DEFAULT_SIZE; - display_channel->enable_jpeg = IS_LOW_BANDWIDTH(); + if (worker->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) { + display_channel->enable_jpeg = IS_LOW_BANDWIDTH(); + } else { + display_channel->enable_jpeg = (worker->jpeg_state == SPICE_WAN_COMPRESSION_ALWAYS); + } + + // todo: tune quality according to bandwidth display_channel->jpeg_quality = 85; - display_channel->enable_zlib_glz_wrap = IS_LOW_BANDWIDTH(); + if (worker->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) { + display_channel->enable_zlib_glz_wrap = IS_LOW_BANDWIDTH(); + } else { + display_channel->enable_zlib_glz_wrap = (worker->zlib_glz_state == + SPICE_WAN_COMPRESSION_ALWAYS); + } + + red_printf("jpeg %s", display_channel->enable_jpeg ? "enabled" : "disabled"); + red_printf("zlib-over-glz %s", display_channel->enable_zlib_glz_wrap ? "enabled" : "disabled"); + + // todo: tune level according to bandwidth display_channel->zlib_level = ZLIB_DEFAULT_COMPRESSION_LEVEL; red_ref_channel((RedChannel*)display_channel); @@ -10151,7 +10170,7 @@ static inline void handle_dev_destroy_surfaces(RedWorker *worker) { int i; RedWorkerMessage message; - + red_printf(""); flush_all_qxl_commands(worker); //to handle better if (worker->surfaces[0].context.canvas) { @@ -10530,6 +10549,8 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data) worker->renderer = RED_RENDERER_INVALID; worker->mouse_mode = SPICE_MOUSE_MODE_SERVER; worker->image_compression = init_data->image_compression; + worker->jpeg_state = init_data->jpeg_state; + worker->zlib_glz_state = init_data->zlib_glz_state; worker->streaming_video = init_data->streaming_video; ring_init(&worker->current_list); image_cache_init(&worker->image_cache); diff --git a/server/red_worker.h b/server/red_worker.h index 6f87471b..ae2eaeec 100644 --- a/server/red_worker.h +++ b/server/red_worker.h @@ -89,6 +89,8 @@ typedef struct WorkerInitData { uint32_t num_renderers; uint32_t renderers[RED_MAX_RENDERERS]; spice_image_compression_t image_compression; + spice_wan_compression_t jpeg_state; + spice_wan_compression_t zlib_glz_state; int streaming_video; uint32_t num_memslots; uint32_t num_memslots_groups; diff --git a/server/reds.c b/server/reds.c index df82f19a..b2443712 100644 --- a/server/reds.c +++ b/server/reds.c @@ -92,6 +92,8 @@ static pthread_mutex_t *lock_cs; static long *lock_count; uint32_t streaming_video = STREAM_VIDEO_FILTER; spice_image_compression_t image_compression = SPICE_IMAGE_COMPRESS_AUTO_GLZ; +spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_AUTO; +spice_wan_compression_t zlib_glz_state = SPICE_WAN_COMPRESSION_AUTO; #ifdef USE_TUNNEL void *red_tunnel = NULL; #endif @@ -3787,6 +3789,30 @@ __visible__ spice_image_compression_t spice_server_get_image_compression(SpiceSe return image_compression; } +__visible__ int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp) +{ + ASSERT(reds == s); + if (comp == SPICE_WAN_COMPRESSION_INVALID) { + red_printf("invalid jpeg state"); + return -1; + } + // todo: support dynamically changing the state + jpeg_state = comp; + return 0; +} + +__visible__ int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp) +{ + ASSERT(reds == s); + if (comp == SPICE_WAN_COMPRESSION_INVALID) { + red_printf("invalid zlib_glz state"); + return -1; + } + // todo: support dynamically changing the state + zlib_glz_state = comp; + return 0; +} + __visible__ int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security) { static const char *names[] = { diff --git a/server/spice.h b/server/spice.h index 3c2c32e2..2cb8a752 100644 --- a/server/spice.h +++ b/server/spice.h @@ -341,6 +341,16 @@ int spice_server_set_image_compression(SpiceServer *s, spice_image_compression_t comp); spice_image_compression_t spice_server_get_image_compression(SpiceServer *s); +typedef enum { + SPICE_WAN_COMPRESSION_INVALID, + SPICE_WAN_COMPRESSION_AUTO, + SPICE_WAN_COMPRESSION_ALWAYS, + SPICE_WAN_COMPRESSION_NEVER, +} spice_wan_compression_t; + +int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp); +int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp); + #define SPICE_CHANNEL_SECURITY_NONE (1 << 0) #define SPICE_CHANNEL_SECURITY_SSL (1 << 1) From c6af0de841a9fd5f5e7e0a469434a40b06ef32ea Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 14 Jul 2010 18:55:27 +0200 Subject: [PATCH 3/4] update shlib minor commit c90183da944001e466f60acb58a5052c353995ca added two new functions, update shared lib minor version for that. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 6b70329f..26da3f0f 100644 --- a/configure.ac +++ b/configure.ac @@ -27,7 +27,7 @@ AM_PROG_CC_C_O AC_C_BIGENDIAN AC_PATH_PROGS(PYTHON, python2 python) -SPICE_LT_VERSION=m4_format("%d:%d:%d", 1, 0, 0) +SPICE_LT_VERSION=m4_format("%d:%d:%d", 1, 0, 1) AC_SUBST(SPICE_LT_VERSION) # Check for the CPU we are using From cc5b59e0f32b580b85b6ec92bb03fc80fbea4498 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 14 Jul 2010 19:00:52 +0200 Subject: [PATCH 4/4] add SPICE_SERVER_VERSION Allow to ifdef features which depend on a certain libspice-server release. --- server/spice.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/spice.h b/server/spice.h index 2cb8a752..fc7d5b5b 100644 --- a/server/spice.h +++ b/server/spice.h @@ -21,6 +21,8 @@ #include #include +#define SPICE_SERVER_VERSION 0x000503 /* release 0.5.3 */ + /* interface base type */ typedef struct SpiceBaseInterface SpiceBaseInterface;