Thanks for your feedback.
The conference
example is just for testing the codec in visioconference-like conditions, but is not intended to be a convenient visioconferencing tool. (I would really like to do this later, probably wrapping syeve in WebRTC, which should be reliable and full of cool features)
The "blocky" appearance is because chunks are enabled. It allows encoding and decoding a frame in parallel, at the cost of reducing a little bit compression efficiency, and the SIMD implementation is still a bit bugged. You can disable it by setting chunk_size
to 0
here. (I agree a CLI option would be better here)
I guess the memory allocation problems are due to the frame buffering. I don't know how to buffer the frames correctly between each module (channels, ring buffers, queues, stacks...). Anyway I'm aiming for good performance at 1080p 30fps maximum. There is no practical need to go further, and most of the time 20fps is already enough.
Benchmarking streaming performance is out of scope, since it depends on the frame buffering, which is not handled by the codec.
I never tested it on Wayland, only X11/XFCE.
Also, I'm trying to adapt QOI to replace syeve's PNG-like algorithm. This should lead to memory, speed and bandwidth improvements (and will allow to get rid of deflate|brotli), but it's tricky.
The README.md could benefit from something like "The server is the one that will have the video playing on it, the client will be sending it data"
So I stumbled across this.
Most crates have a binary that is produced when doing cargo build --release
or cargo install
and the binary also typically has the distinct name (syeve) so it's harder to forget. I notice that the settings appear to be in rust itself, but I'm not going to change them, so I did the following:
# Get source
git clone https://framagit.org/ZettaScript/syeve
# Build release binary
cd syeve
cargo build --release -p conference
# Place binary in system-wide location and rename to syeve
sudo mv ./target/release/conference /usr/local/bin/syeve
# Make sure it is treated as an executable
sudo chmod +x /usr/local/bin/syeve
# Run server
syeve server 0.0.0.0:8080
# Connect client, set compression level low, fps to 30
syeve client 192.168.1.10:8080 -c 1 --fps 30
I think having a configuration file or a way to set the compression settings (whether to use brotli or not) at runtime will make it much simpler for performance testing, benchmarks.
Notes:
Wayland is not supported. There's no real indication that it's not working. Might be good to catch that and stop the process because otherwise I might think that I misconfigured something.
Even on a fairly modern system, I don't think that high compression settings are going to be particularly useful for this application. Just for testing, I increase the FPS to a really high number and see how fast it can actually go. It might be good to run a FPS counter.
There's some blocky-ness to the output. This is probably a known issue, but if not, it may be just a gnome thing?
The README.md could benefit from something like "The server is the one that will have the video playing on it, the client will be sending it data"
The stream isn't particularly reliable at higher FPS such as 30 and beyond. I'll upload a video demonstrating this.
If trying to send a 4K stream, I run into memory allocation problems from trying to allocate 8.6 Zetabytes
Overall, I'm quite impressed that you were able to get such low latency out of this simple project.
ZettaScript (f3b66409) at 11 Jan 22:47
conference: rec/play
Hello, sorry for responding this late. It compiles for me, with Rust 1.59.0 Nightly. As written on packed_simd_2's readme, stable Rust is not supported. Are you using a recent nightly?
ZettaScript (dd52a8ca) at 13 Nov 07:49
conference: crossbeam_channel
ZettaScript (eed804f8) at 08 Nov 19:53
Edition 2021
Hi, I have this error when I try to build this crates^^.
error: type parameters must be declared prior to const parameters --> /home/jourdelune/.cargo/registry/src/github.com-1ecc6299db9ec823/packed_simd_2-0.3.6/src/codegen/llvm.rs:20:54 | 20 | pub unsafe fn __shuffle_vector2<const IDX: [u32; 2], T, U>(x: T, y: T) -> U | ----------------------^--^- help: reorder the parameters: lifetimes, then types, then consts:
<T, U, const IDX: [u32; 2]>
ZettaScript (f36359cc) at 05 Nov 16:22
util: Best chunk size
ZettaScript (54d18124) at 28 Sep 21:58
Doc, Readme
ZettaScript (54d18124) at 28 Sep 21:50
Doc, Readme
ZettaScript (54d3524d) at 28 Sep 21:47
Doc, Readme
ZettaScript (6feace04) at 27 Sep 21:57
Change project name
ZettaScript (b105bcf4) at 27 Sep 17:18
opti: SIMD filter
ZettaScript (754a2cdc) at 23 Sep 17:56
Conference: structopt, random seq number
... and 1 more commit