Draft
Conversation
…in tab-scroll mode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A Remote Display application for Plato, tested on Clara 2E and Libra 2. An MQTT server relays messages between the Kobo device and Firefox extension. The extension controls the browser with gestures, and encodes tab screenshots as display updates using a WebAssembly module. Display update keyframes are QOI images, or lossy JPEG as fallback if any display update is too large. Interframes are provided by a bidiff of the previous and new frame for QOI keyframes only. All display updates are compressed with zstd.
The first iteration of Remote Display used zlib compressed PBM or PGM images, which could not be as efficiently diffed for interframes. 1-bit PBM+zlib frames had a great payload size but sacrificed grays. Then, JPEG XL was used instead to allow user-configured lossiness/quality, with lossless having better compression than PGM+zlib. 1-bit images compressed worse than 8-bit grayscale with lossless JPEG XL. Lossy JPEG XL didn't improve payload sizes much over lossless. It also had very slow encode and decode times in either mode, lossy being the slowest, made worse by instantiating ImageMagick in WASM for every frame. A custom WASM module to improve JPEG XL performance and use interframes was planned, but there is currently no pure-Rust encoder supporting the interframe feature easily.
QOI+zstd compresses as well as lossless JPEG XL for reading most webpages, and a fallback to lossy JPEG for pages with high-detail images prevents oversized MQTT payloads. Bidiff+zstd of QOI for interframes achieves significant or near total reduction in payload size when scrolling or interacting with webpages with no noticeable speed impact, and only one full QOI frame of memory consumption.
Currently the gestures are: