vnc: add a non-adaptive option
This option allow to disable adaptive behaviors in some encodings. Signed-off-by: Corentin Chary <corentincj@iksaif.net> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
8cb4a6b755
commit
80e0c8c39b
|
@ -913,6 +913,15 @@ option is set, VNC client may receive lossy framebuffer updates
|
||||||
depending on its encoding settings. Enabling this option can save
|
depending on its encoding settings. Enabling this option can save
|
||||||
a lot of bandwidth at the expense of quality.
|
a lot of bandwidth at the expense of quality.
|
||||||
|
|
||||||
|
@item non-adaptive
|
||||||
|
|
||||||
|
Disable adaptive encodings. Adaptive encodings are enabled by default.
|
||||||
|
An adaptive encoding will try to detect frequently updated screen regions,
|
||||||
|
and send updates in these regions using a lossy encoding (like JPEG).
|
||||||
|
This can be really helpfull to save bandwidth when playing videos. Disabling
|
||||||
|
adaptive encodings allow to restore the original static behavior of encodings
|
||||||
|
like Tight.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
|
|
|
@ -1546,7 +1546,7 @@ static int send_sub_rect(VncState *vs, int x, int y, int w, int h)
|
||||||
vnc_tight_stop(vs);
|
vnc_tight_stop(vs);
|
||||||
|
|
||||||
#ifdef CONFIG_VNC_JPEG
|
#ifdef CONFIG_VNC_JPEG
|
||||||
if (vs->tight.quality != (uint8_t)-1) {
|
if (!vs->vd->non_adaptive && vs->tight.quality != (uint8_t)-1) {
|
||||||
double freq = vnc_update_freq(vs, x, y, w, h);
|
double freq = vnc_update_freq(vs, x, y, w, h);
|
||||||
|
|
||||||
if (freq < tight_jpeg_conf[vs->tight.quality].jpeg_freq_min) {
|
if (freq < tight_jpeg_conf[vs->tight.quality].jpeg_freq_min) {
|
||||||
|
|
13
ui/vnc.c
13
ui/vnc.c
|
@ -2387,10 +2387,12 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
|
||||||
VncState *vs;
|
VncState *vs;
|
||||||
int has_dirty = 0;
|
int has_dirty = 0;
|
||||||
|
|
||||||
struct timeval tv;
|
struct timeval tv = { 0, 0 };
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
if (!vd->non_adaptive) {
|
||||||
has_dirty = vnc_update_stats(vd, &tv);
|
gettimeofday(&tv, NULL);
|
||||||
|
has_dirty = vnc_update_stats(vd, &tv);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Walk through the guest dirty map.
|
* Walk through the guest dirty map.
|
||||||
|
@ -2419,7 +2421,8 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
|
||||||
if (memcmp(server_ptr, guest_ptr, cmp_bytes) == 0)
|
if (memcmp(server_ptr, guest_ptr, cmp_bytes) == 0)
|
||||||
continue;
|
continue;
|
||||||
memcpy(server_ptr, guest_ptr, cmp_bytes);
|
memcpy(server_ptr, guest_ptr, cmp_bytes);
|
||||||
vnc_rect_updated(vd, x, y, &tv);
|
if (!vd->non_adaptive)
|
||||||
|
vnc_rect_updated(vd, x, y, &tv);
|
||||||
QTAILQ_FOREACH(vs, &vd->clients, next) {
|
QTAILQ_FOREACH(vs, &vd->clients, next) {
|
||||||
set_bit((x / 16), vs->dirty[y]);
|
set_bit((x / 16), vs->dirty[y]);
|
||||||
}
|
}
|
||||||
|
@ -2754,6 +2757,8 @@ int vnc_display_open(DisplayState *ds, const char *display)
|
||||||
#endif
|
#endif
|
||||||
} else if (strncmp(options, "lossy", 5) == 0) {
|
} else if (strncmp(options, "lossy", 5) == 0) {
|
||||||
vs->lossy = true;
|
vs->lossy = true;
|
||||||
|
} else if (strncmp(options, "non-adapative", 13) == 0) {
|
||||||
|
vs->non_adaptive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
ui/vnc.h
1
ui/vnc.h
|
@ -144,6 +144,7 @@ struct VncDisplay
|
||||||
time_t expires;
|
time_t expires;
|
||||||
int auth;
|
int auth;
|
||||||
bool lossy;
|
bool lossy;
|
||||||
|
bool non_adaptive;
|
||||||
#ifdef CONFIG_VNC_TLS
|
#ifdef CONFIG_VNC_TLS
|
||||||
int subauth; /* Used by VeNCrypt */
|
int subauth; /* Used by VeNCrypt */
|
||||||
VncDisplayTLS tls;
|
VncDisplayTLS tls;
|
||||||
|
|
Loading…
Reference in New Issue