Patchwork [v2,09/18] vnc: tight: specific zlib level and filters for each compression level

login
register
mail settings
Submitter Corentin Chary
Date July 7, 2010, 6:57 p.m.
Message ID <1278529086-10391-10-git-send-email-corentincj@iksaif.net>
Download mbox | patch
Permalink /patch/58152/
State New
Headers show

Comments

Corentin Chary - July 7, 2010, 6:57 p.m.
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 <corentincj@iksaif.net>
---
 ui/vnc-enc-tight.c |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)

Patch

diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c
index cc57c26..e627e00 100644
--- a/ui/vnc-enc-tight.c
+++ b/ui/vnc-enc-tight.c
@@ -73,6 +73,21 @@  static int tight_send_framebuffer_update(VncState *vs, int x, int y,
                                          int w, int h);
 
 #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);
 
@@ -1425,7 +1440,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;
 
@@ -1444,6 +1460,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;