diff options
Diffstat (limited to 'win')
-rw-r--r-- | win/vncviewer/CConn.cxx | 63 | ||||
-rw-r--r-- | win/vncviewer/OptionsDialog.cxx | 25 |
2 files changed, 51 insertions, 37 deletions
diff --git a/win/vncviewer/CConn.cxx b/win/vncviewer/CConn.cxx index 81df866b..874db094 100644 --- a/win/vncviewer/CConn.cxx +++ b/win/vncviewer/CConn.cxx @@ -514,40 +514,51 @@ CConn::framebufferUpdateEnd() { } -// Note: The method below is duplicated in vncviewer_unix/CConn.cxx! +// Note: The method below is duplicated in win/vncviewer/CConn.cxx! // autoSelectFormatAndEncoding() chooses the format and encoding appropriate // to the connection speed: // -// Above 16Mbps (timing for at least a second), switch to hextile -// Otherwise, switch to ZRLE +// First we wait for at least one second of bandwidth measurement. // -// Above 256Kbps, use full colour mode +// Above 16Mbps (i.e. LAN), we choose the second highest JPEG quality, +// which should be perceptually lossless. // -void -CConn::autoSelectFormatAndEncoding() { +// If the bandwidth is below that, we choose a more lossy JPEG quality. +// +// If the bandwidth drops below 256 Kbps, we switch to palette mode. +// +// Note: The system here is fairly arbitrary and should be replaced +// with something more intelligent at the server end. +// +void CConn::autoSelectFormatAndEncoding() +{ int kbitsPerSecond = sock->inStream().kbitsPerSecond(); - unsigned int newEncoding = options.preferredEncoding; - - bool newFullColour = options.fullColour; unsigned int timeWaited = sock->inStream().timeWaited(); + bool newFullColour = options.fullColour; + int newQualityLevel = options.qualityLevel; - // Select best encoding - if (kbitsPerSecond > 16000 && timeWaited >= 10000) { - newEncoding = encodingHextile; - } else { - newEncoding = encodingZRLE; - } - - if (newEncoding != options.preferredEncoding) { - vlog.info("Throughput %d kbit/s - changing to %s encoding", - kbitsPerSecond, encodingName(newEncoding)); - options.preferredEncoding = newEncoding; - encodingChange = true; - } + // Always use Tight + options.preferredEncoding = encodingTight; - if (kbitsPerSecond == 0) { + // Check that we have a decent bandwidth measurement + if ((kbitsPerSecond == 0) || (timeWaited < 10000)) return; + + // Select appropriate quality level + if (!options.noJpeg) { + if (kbitsPerSecond > 16000) + newQualityLevel = 8; + else + newQualityLevel = 6; + + if (newQualityLevel != options.qualityLevel) { + vlog.info("Throughput %d kbit/s - changing to quality %d ", + kbitsPerSecond, newQualityLevel); + cp.qualityLevel = newQualityLevel; + options.qualityLevel = newQualityLevel; + encodingChange = true; + } } if (cp.beforeVersion(3, 8)) { @@ -565,11 +576,11 @@ CConn::autoSelectFormatAndEncoding() { newFullColour = (kbitsPerSecond > 256); if (newFullColour != options.fullColour) { vlog.info("Throughput %d kbit/s - full color is now %s", - kbitsPerSecond, - newFullColour ? "enabled" : "disabled"); + kbitsPerSecond, + newFullColour ? "enabled" : "disabled"); options.fullColour = newFullColour; formatChange = true; - } + } } void diff --git a/win/vncviewer/OptionsDialog.cxx b/win/vncviewer/OptionsDialog.cxx index 545522e7..f8562510 100644 --- a/win/vncviewer/OptionsDialog.cxx +++ b/win/vncviewer/OptionsDialog.cxx @@ -121,24 +121,27 @@ public: return true; } virtual bool onCommand(int id, int cmd) { + bool aut = isItemChecked(IDC_ENCODING_AUTO); + bool jpeg = isItemChecked(IDC_ALLOW_JPEG); + bool custom_comp = isItemChecked(IDC_CUSTOM_COMPRESSLEVEL); if (id == IDC_ENCODING_AUTO) { - bool ok = !isItemChecked(IDC_ENCODING_AUTO); - enableItem(IDC_ENCODING_TIGHT, ok); - enableItem(IDC_ENCODING_ZRLE, ok); - enableItem(IDC_ENCODING_HEXTILE, ok); - enableItem(IDC_ENCODING_RAW, ok); - enableItem(IDC_FORMAT_FULLCOLOUR, ok); - enableItem(IDC_FORMAT_MEDIUMCOLOUR, ok); - enableItem(IDC_FORMAT_LOWCOLOUR, ok); - enableItem(IDC_FORMAT_VERYLOWCOLOUR, ok); + enableItem(IDC_ENCODING_TIGHT, !aut); + enableItem(IDC_ENCODING_ZRLE, !aut); + enableItem(IDC_ENCODING_HEXTILE, !aut); + enableItem(IDC_ENCODING_RAW, !aut); + enableItem(IDC_FORMAT_FULLCOLOUR, !aut); + enableItem(IDC_FORMAT_MEDIUMCOLOUR, !aut); + enableItem(IDC_FORMAT_LOWCOLOUR, !aut); + enableItem(IDC_FORMAT_VERYLOWCOLOUR, !aut); + enableItem(IDC_QUALITYLEVEL, !aut && jpeg); return true; } if (id == IDC_CUSTOM_COMPRESSLEVEL) { - enableItem(IDC_COMPRESSLEVEL, isItemChecked(IDC_CUSTOM_COMPRESSLEVEL)); + enableItem(IDC_COMPRESSLEVEL, custom_comp); return true; } if (id == IDC_ALLOW_JPEG) { - enableItem(IDC_QUALITYLEVEL, isItemChecked(IDC_ALLOW_JPEG)); + enableItem(IDC_QUALITYLEVEL, !aut && jpeg); return true; } return false; |