diff mbox

[14/15] vnc-tight: make the encoding palette static

Message ID 1467104499-27517-15-git-send-email-pl@kamp.de
State New
Headers show

Commit Message

Peter Lieven June 28, 2016, 9:01 a.m. UTC
for the calculation of number of subcolors of each subrect a new palette was allocated,
memset to zero and then destroyed. Use a static palette for this instead.

Signed-off-by: Peter Lieven <pl@kamp.de>
---
 ui/vnc-enc-tight.c | 21 ++++++++++-----------
 ui/vnc.h           |  1 +
 2 files changed, 11 insertions(+), 11 deletions(-)

Comments

Paolo Bonzini June 28, 2016, 11:12 a.m. UTC | #1
On 28/06/2016 11:01, Peter Lieven wrote:
> @@ -201,6 +201,7 @@ typedef struct VncTight {
>  #endif
>      int levels[4];
>      z_stream stream[4];
> +    VncPalette palette;
>  } VncTight;

VncTight is copied back and forth in vnc_async_encoding_start and
vnc_async_encoding_end, so this should not be included in VncTight.
Perhaps however if you include a VncPalette* it allows reuse and avoids
fragmentation?  Or perhaps you can use a thread-local static variable?

Paolo
Peter Lieven June 28, 2016, 11:18 a.m. UTC | #2
Am 28.06.2016 um 13:12 schrieb Paolo Bonzini:
>
> On 28/06/2016 11:01, Peter Lieven wrote:
>> @@ -201,6 +201,7 @@ typedef struct VncTight {
>>   #endif
>>       int levels[4];
>>       z_stream stream[4];
>> +    VncPalette palette;
>>   } VncTight;
> VncTight is copied back and forth in vnc_async_encoding_start and
> vnc_async_encoding_end, so this should not be included in VncTight.
> Perhaps however if you include a VncPalette* it allows reuse and avoids
> fragmentation?  Or perhaps you can use a thread-local static variable?

I will have look. I missed the copying. However, this palette is only
used to count the number of distinct colors. So it should only be
used in the encoding thread.

Peter
diff mbox

Patch

diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c
index e5cba0e..d3a9cc5 100644
--- a/ui/vnc-enc-tight.c
+++ b/ui/vnc-enc-tight.c
@@ -349,7 +349,7 @@  tight_detect_smooth_image(VncState *vs, int w, int h)
     tight_fill_palette##bpp(VncState *vs, int x, int y,                 \
                             int max, size_t count,                      \
                             uint32_t *bg, uint32_t *fg,                 \
-                            VncPalette **palette) {                     \
+                            VncPalette *palette) {                      \
         uint##bpp##_t *data;                                            \
         uint##bpp##_t c0, c1, ci;                                       \
         int i, n0, n1;                                                  \
@@ -396,23 +396,23 @@  tight_detect_smooth_image(VncState *vs, int w, int h)
             return 0;                                                   \
         }                                                               \
                                                                         \
-        *palette = palette_new(max, bpp);                               \
-        palette_put(*palette, c0);                                      \
-        palette_put(*palette, c1);                                      \
-        palette_put(*palette, ci);                                      \
+        palette_init(palette, max, bpp);                                \
+        palette_put(palette, c0);                                       \
+        palette_put(palette, c1);                                       \
+        palette_put(palette, ci);                                       \
                                                                         \
         for (i++; i < count; i++) {                                     \
             if (data[i] == ci) {                                        \
                 continue;                                               \
             } else {                                                    \
                 ci = data[i];                                           \
-                if (!palette_put(*palette, (uint32_t)ci)) {             \
+                if (!palette_put(palette, (uint32_t)ci)) {              \
                     return 0;                                           \
                 }                                                       \
             }                                                           \
         }                                                               \
                                                                         \
-        return palette_size(*palette);                                  \
+        return palette_size(palette);                                   \
     }
 
 DEFINE_FILL_PALETTE_FUNCTION(8)
@@ -421,7 +421,7 @@  DEFINE_FILL_PALETTE_FUNCTION(32)
 
 static int tight_fill_palette(VncState *vs, int x, int y,
                               size_t count, uint32_t *bg, uint32_t *fg,
-                              VncPalette **palette)
+                              VncPalette *palette)
 {
     int max;
 
@@ -1459,7 +1459,7 @@  static int send_sub_rect_jpeg(VncState *vs, int x, int y, int w, int h,
 
 static int send_sub_rect(VncState *vs, int x, int y, int w, int h)
 {
-    VncPalette *palette = NULL;
+    VncPalette *palette = &vs->tight.palette;
     uint32_t bg = 0, fg = 0;
     int colors;
     int ret = 0;
@@ -1488,7 +1488,7 @@  static int send_sub_rect(VncState *vs, int x, int y, int w, int h)
     }
 #endif
 
-    colors = tight_fill_palette(vs, x, y, w * h, &bg, &fg, &palette);
+    colors = tight_fill_palette(vs, x, y, w * h, &bg, &fg, palette);
 
 #ifdef CONFIG_VNC_JPEG
     if (allow_jpeg && vs->tight.quality != (uint8_t)-1) {
@@ -1501,7 +1501,6 @@  static int send_sub_rect(VncState *vs, int x, int y, int w, int h)
     ret = send_sub_rect_nojpeg(vs, x, y, w, h, bg, fg, colors, palette);
 #endif
 
-    palette_destroy(palette);
     return ret;
 }
 
diff --git a/ui/vnc.h b/ui/vnc.h
index 6568bca..e24e2cc 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -201,6 +201,7 @@  typedef struct VncTight {
 #endif
     int levels[4];
     z_stream stream[4];
+    VncPalette palette;
 } VncTight;
 
 typedef struct VncHextile {