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
|
||||
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
|
||||
ETEXI
|
||||
|
||||
|
@ -1546,7 +1546,7 @@ static int send_sub_rect(VncState *vs, int x, int y, int w, int h)
|
||||
vnc_tight_stop(vs);
|
||||
|
||||
#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);
|
||||
|
||||
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;
|
||||
int has_dirty = 0;
|
||||
|
||||
struct timeval tv;
|
||||
struct timeval tv = { 0, 0 };
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
has_dirty = vnc_update_stats(vd, &tv);
|
||||
if (!vd->non_adaptive) {
|
||||
gettimeofday(&tv, NULL);
|
||||
has_dirty = vnc_update_stats(vd, &tv);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
continue;
|
||||
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) {
|
||||
set_bit((x / 16), vs->dirty[y]);
|
||||
}
|
||||
@ -2754,6 +2757,8 @@ int vnc_display_open(DisplayState *ds, const char *display)
|
||||
#endif
|
||||
} else if (strncmp(options, "lossy", 5) == 0) {
|
||||
vs->lossy = true;
|
||||
} else if (strncmp(options, "non-adapative", 13) == 0) {
|
||||
vs->non_adaptive = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user