Patchwork [2/5] spice: make compression configurable.

login
register
mail settings
Submitter Gerd Hoffmann
Date Oct. 7, 2010, 7:55 a.m.
Message ID <1286438126-11250-3-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/67003/
State New
Headers show

Comments

Gerd Hoffmann - Oct. 7, 2010, 7:55 a.m.
From: Yonit Halperin <yhalperi@redhat.com>

---
 qemu-config.c   |    9 ++++++
 qemu-options.hx |    9 ++++++
 ui/spice-core.c |   77 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 93 insertions(+), 2 deletions(-)
Blue Swirl - Oct. 7, 2010, 6:12 p.m.
On Thu, Oct 7, 2010 at 7:55 AM, Gerd Hoffmann <kraxel@redhat.com> wrote:
> From: Yonit Halperin <yhalperi@redhat.com>
>

No description?

> ---
>  qemu-config.c   |    9 ++++++
>  qemu-options.hx |    9 ++++++
>  ui/spice-core.c |   77 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 93 insertions(+), 2 deletions(-)
>
> diff --git a/qemu-config.c b/qemu-config.c
> index 26748a5..8b545b1 100644
> --- a/qemu-config.c
> +++ b/qemu-config.c
> @@ -391,6 +391,15 @@ QemuOptsList qemu_spice_opts = {
>         },{
>             .name = "tls-ciphers",
>             .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "image-compression",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "jpeg-wan-compression",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "zlib-glz-wan-compression",
> +            .type = QEMU_OPT_STRING,
>         },
>         { /* end if list */ }
>     },
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 9d3f8ef..59db632 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -704,6 +704,15 @@ The x509 file names can also be configured individually.
>  @item tls-ciphers=<list>
>  Specify which ciphers to use.
>
> +@item image-compression=[auto_glz|auto_lz|quic|glz|lz|off]
> +Configure image compression (lossless).
> +Default is auto_glz.
> +
> +@item jpeg-wan-compression=[auto|never|allways]
> +@item zlib-glz-wan-compression=[auto|never|allways]

'allways' does not match what the code uses:

> +    [ SPICE_WAN_COMPRESSION_ALWAYS ] = "always",
Gerd Hoffmann - Oct. 7, 2010, 7:29 p.m.
On 10/07/10 20:12, Blue Swirl wrote:
> On Thu, Oct 7, 2010 at 7:55 AM, Gerd Hoffmann<kraxel@redhat.com>  wrote:
>> From: Yonit Halperin<yhalperi@redhat.com>
>>
>
> No description?

Detailed description comes here:

>> --- a/qemu-options.hx
>> +++ b/qemu-options.hx
>> @@ -704,6 +704,15 @@ The x509 file names can also be configured individually.
>>   @item tls-ciphers=<list>
>>   Specify which ciphers to use.
>>
>> +@item image-compression=[auto_glz|auto_lz|quic|glz|lz|off]
>> +Configure image compression (lossless).
>> +Default is auto_glz.
>> +
>> +@item jpeg-wan-compression=[auto|never|allways]
>> +@item zlib-glz-wan-compression=[auto|never|allways]
>
> 'allways' does not match what the code uses:
>
>> +    [ SPICE_WAN_COMPRESSION_ALWAYS ] = "always",

Good catch, will fix.

thanks,
   Gerd

Patch

diff --git a/qemu-config.c b/qemu-config.c
index 26748a5..8b545b1 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -391,6 +391,15 @@  QemuOptsList qemu_spice_opts = {
         },{
             .name = "tls-ciphers",
             .type = QEMU_OPT_STRING,
+        },{
+            .name = "image-compression",
+            .type = QEMU_OPT_STRING,
+        },{
+            .name = "jpeg-wan-compression",
+            .type = QEMU_OPT_STRING,
+        },{
+            .name = "zlib-glz-wan-compression",
+            .type = QEMU_OPT_STRING,
         },
         { /* end if list */ }
     },
diff --git a/qemu-options.hx b/qemu-options.hx
index 9d3f8ef..59db632 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -704,6 +704,15 @@  The x509 file names can also be configured individually.
 @item tls-ciphers=<list>
 Specify which ciphers to use.
 
+@item image-compression=[auto_glz|auto_lz|quic|glz|lz|off]
+Configure image compression (lossless).
+Default is auto_glz.
+
+@item jpeg-wan-compression=[auto|never|allways]
+@item zlib-glz-wan-compression=[auto|never|allways]
+Configure wan image compression (lossy for slow links).
+Default is auto.
+
 @end table
 ETEXI
 
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 51aa782..1567046 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -137,6 +137,59 @@  static SpiceCoreInterface core_interface = {
     .watch_remove       = watch_remove,
 };
 
+/* config string parsing */
+
+static int name2enum(const char *string, const char *table[], int entries)
+{
+    int i;
+
+    if (string) {
+        for (i = 0; i < entries; i++) {
+            if (!table[i]) {
+                continue;
+            }
+            if (strcmp(string, table[i]) != 0) {
+                continue;
+            }
+            return i;
+        }
+    }
+    return -1;
+}
+
+static int parse_name(const char *string, const char *optname,
+                      const char *table[], int entries)
+{
+    int value = name2enum(string, table, entries);
+
+    if (value != -1) {
+        return value;
+    }
+    fprintf(stderr, "spice: invalid %s: %s\n", optname, string);
+    exit(1);
+}
+
+static const char *compression_names[] = {
+    [ SPICE_IMAGE_COMPRESS_OFF ]      = "off",
+    [ SPICE_IMAGE_COMPRESS_AUTO_GLZ ] = "auto_glz",
+    [ SPICE_IMAGE_COMPRESS_AUTO_LZ ]  = "auto_lz",
+    [ SPICE_IMAGE_COMPRESS_QUIC ]     = "quic",
+    [ SPICE_IMAGE_COMPRESS_GLZ ]      = "glz",
+    [ SPICE_IMAGE_COMPRESS_LZ ]       = "lz",
+};
+#define parse_compression(_name)                                        \
+    parse_name(_name, "image compression",                              \
+               compression_names, ARRAY_SIZE(compression_names))
+
+static const char *wan_compression_names[] = {
+    [ SPICE_WAN_COMPRESSION_AUTO   ] = "auto",
+    [ SPICE_WAN_COMPRESSION_NEVER  ] = "never",
+    [ SPICE_WAN_COMPRESSION_ALWAYS ] = "always",
+};
+#define parse_wan_compression(_name)                                    \
+    parse_name(_name, "wan compression",                                \
+               wan_compression_names, ARRAY_SIZE(wan_compression_names))
+
 /* functions for the rest of qemu */
 
 void qemu_spice_init(void)
@@ -150,6 +203,8 @@  void qemu_spice_init(void)
         *x509_cert_file = NULL,
         *x509_cacert_file = NULL;
     int port, tls_port, len;
+    spice_image_compression_t compression;
+    spice_wan_compression_t wan_compr;
 
     if (!opts) {
         return;
@@ -217,8 +272,26 @@  void qemu_spice_init(void)
         spice_server_set_noauth(spice_server);
     }
 
-    /* TODO: make configurable via cmdline */
-    spice_server_set_image_compression(spice_server, SPICE_IMAGE_COMPRESS_AUTO_GLZ);
+    compression = SPICE_IMAGE_COMPRESS_AUTO_GLZ;
+    str = qemu_opt_get(opts, "image-compression");
+    if (str) {
+        compression = parse_compression(str);
+    }
+    spice_server_set_image_compression(spice_server, compression);
+
+    wan_compr = SPICE_WAN_COMPRESSION_AUTO;
+    str = qemu_opt_get(opts, "jpeg-wan-compression");
+    if (str) {
+        wan_compr = parse_wan_compression(str);
+    }
+    spice_server_set_jpeg_compression(spice_server, wan_compr);
+
+    wan_compr = SPICE_WAN_COMPRESSION_AUTO;
+    str = qemu_opt_get(opts, "zlib-glz-wan-compression");
+    if (str) {
+        wan_compr = parse_wan_compression(str);
+    }
+    spice_server_set_zlib_glz_compression(spice_server, wan_compr);
 
     spice_server_init(spice_server, &core_interface);
     using_spice = 1;