diff options
author | Cameron Esfahani <dirty@apple.com> | 2020-01-20 21:00:52 -0800 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2020-01-21 07:29:03 +0100 |
commit | 557ba0e57200014bd4f453f6516f02b61bdfc782 (patch) | |
tree | de3705821464e65fbef38cb3b6abc9b2ab502508 | |
parent | 0780ec7be82dd4781e9fd216b5d99a125882ff5a (diff) | |
download | qemu-557ba0e57200014bd4f453f6516f02b61bdfc782.zip qemu-557ba0e57200014bd4f453f6516f02b61bdfc782.tar.gz qemu-557ba0e57200014bd4f453f6516f02b61bdfc782.tar.bz2 |
vnc: prioritize ZRLE compression over ZLIB
In my investigation, ZRLE always compresses better than ZLIB so
prioritize ZRLE over ZLIB, even if the client hints that ZLIB is
preferred.
zlib buffer is always reset in zrle_compress_data(), so using offset to
calculate next_out and avail_out is useless.
Signed-off-by: Cameron Esfahani <dirty@apple.com>
Message-Id: <b5d129895d08a90d0a2a6183b95875bacfa998b8.1579582674.git.dirty@apple.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | ui/vnc-enc-zrle.c | 4 | ||||
-rw-r--r-- | ui/vnc.c | 11 |
2 files changed, 11 insertions, 4 deletions
diff --git a/ui/vnc-enc-zrle.c b/ui/vnc-enc-zrle.c index 17fd28a..b4f71e3 100644 --- a/ui/vnc-enc-zrle.c +++ b/ui/vnc-enc-zrle.c @@ -98,8 +98,8 @@ static int zrle_compress_data(VncState *vs, int level) /* set pointers */ zstream->next_in = vs->zrle->zrle.buffer; zstream->avail_in = vs->zrle->zrle.offset; - zstream->next_out = vs->zrle->zlib.buffer + vs->zrle->zlib.offset; - zstream->avail_out = vs->zrle->zlib.capacity - vs->zrle->zlib.offset; + zstream->next_out = vs->zrle->zlib.buffer; + zstream->avail_out = vs->zrle->zlib.capacity; zstream->data_type = Z_BINARY; /* start encoding */ @@ -2071,8 +2071,15 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) break; #endif case VNC_ENCODING_ZLIB: - vs->features |= VNC_FEATURE_ZLIB_MASK; - vs->vnc_encoding = enc; + /* + * VNC_ENCODING_ZRLE compresses better than VNC_ENCODING_ZLIB. + * So prioritize ZRLE, even if the client hints that it prefers + * ZLIB. + */ + if ((vs->features & VNC_FEATURE_ZRLE_MASK) == 0) { + vs->features |= VNC_FEATURE_ZLIB_MASK; + vs->vnc_encoding = enc; + } break; case VNC_ENCODING_ZRLE: vs->features |= VNC_FEATURE_ZRLE_MASK; |