qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 09/16] vnc: tight: specific zlib level and filters f


From: Corentin Chary
Subject: [Qemu-devel] [PATCH 09/16] vnc: tight: specific zlib level and filters for each compression level
Date: Wed, 16 Jun 2010 09:12:06 +0200

Disable png filters for lower compression levels. This should lower
the CPU consumption and reduce encoding time.

This isn't in tight_conf because:
* tight_conf structure must not change, because it's shared with other
  tight implementations (libvncserver, etc..).
* it'd exceed the 80 col limit.
* PNG_ macros are only defined if CONFIG_VNC_PNG is defined

Signed-off-by: Corentin Chary <address@hidden>
---
 ui/vnc-enc-tight.c |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c
index 007d88f..9e1f214 100644
--- a/ui/vnc-enc-tight.c
+++ b/ui/vnc-enc-tight.c
@@ -69,6 +69,21 @@ static const struct {
 };
 
 #ifdef CONFIG_VNC_PNG
+static const struct {
+    int png_zlib_level, png_filters;
+} tight_png_conf[] = {
+    { 0, PNG_NO_FILTERS },
+    { 1, PNG_NO_FILTERS },
+    { 2, PNG_NO_FILTERS },
+    { 3, PNG_NO_FILTERS },
+    { 4, PNG_NO_FILTERS },
+    { 5, PNG_ALL_FILTERS },
+    { 6, PNG_ALL_FILTERS },
+    { 7, PNG_ALL_FILTERS },
+    { 8, PNG_ALL_FILTERS },
+    { 9, PNG_ALL_FILTERS },
+};
+
 static int send_png_rect(VncState *vs, int x, int y, int w, int h,
                          QDict *palette);
 
@@ -1424,7 +1439,8 @@ static int send_png_rect(VncState *vs, int x, int y, int 
w, int h,
     png_infop info_ptr;
     png_colorp png_palette = NULL;
     size_t offset;
-    int level = tight_conf[vs->tight_compression].raw_zlib_level;
+    int level = tight_png_conf[vs->tight_compression].png_zlib_level;
+    int filters = tight_png_conf[vs->tight_compression].png_filters;
     uint8_t *buf;
     int dy;
 
@@ -1443,6 +1459,7 @@ static int send_png_rect(VncState *vs, int x, int y, int 
w, int h,
 
     png_set_write_fn(png_ptr, (void *) vs, png_write_data, png_flush_data);
     png_set_compression_level(png_ptr, level);
+    png_set_filter(png_ptr, PNG_FILTER_TYPE_DEFAULT, filters);
 
     if (palette) {
         color_type = PNG_COLOR_TYPE_PALETTE;
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]