Little better docs

This commit is contained in:
Benjamin Bädorf 2022-01-06 18:27:02 +01:00
parent 2dbdd8340e
commit 073d3a1248
No known key found for this signature in database
GPG key ID: 4406E80E13CD656C
5 changed files with 50 additions and 5 deletions

2
.envrc Normal file
View file

@ -0,0 +1,2 @@
watch_file shell/* shell.nix
use nix

2
.gitignore vendored
View file

@ -1 +1,3 @@
/target /target
tags
.direnv

View file

@ -17,4 +17,33 @@ There's an AUR package called `wlstreamer-git`, alternatively you can build and
## Usage ## Usage
See `--help`. If there are no screens available for streaming, a black screen will be shown instead. See `wlstreamer --help`. If there are no screens available for streaming, a black screen will be shown instead.
```
Usage: wlstreamer [options]
Wrapper around wf-recorder and ffmpeg that automatically switches the screen being recorded based on current window focus
Options:
--not-ws <ws-num> Do not show this workspace. Can be used multiple times. Example: 3
--not-screen <screen> Do not show this screen. Can be used multiple times. Example: HDMI-A-1
-d|--devices-from <id> Use video devices starting at $id. Defaults to 0. /dev/video$id will be used as output. See DIFFERENT RESOLUTIONS below.
-v|--version Display version and exit
--verbose Verbose logging
If there are no screens available for streaming, a black screen will be shown instead.
DIFFERENT RESOLUTIONS
When running outputs with different resolutions, the resulting stream will be the smallest possible resolution that can fit all output resolutions.
For example, two outputs, one 1600x1200, another 1920x1080, will result in an output stream of 1920x1200. Any remaining space will be padded black.
Another example, two outputs, one 640x480, another 1920x1080, will result in an output stream of 1920x1080. Space will only be padded black on the smaller screen.
To support this behaviour, wlstreamer needs access to a v4l2loopback device for each resolution, included the combined upscaled one if applicable. For the first example above, this would mean you would need 3 devices. For the second, you'd need two. If all your outputs have the same resolution, you only need an output device.
The --devices-from or -d option specifies at which device index it is okay to start using loopback devices. For example, if you specify -d 3, and you need 2 capture devices, /dev/video3 and /dev/video4 will be used by wlstreamer, with /dev/video3 being the output you want to use in other applications.
DYNAMICALLY CHANGING RESOLUTIONS
As long as you have enough v4l2loopback devices available for new resolutions, it should be fine to change resolutions on an output.
However, if your resolution is either wider or taller than the output resolution, this will result in failures, since dynamically changing the v4l2loopback device resolution is not possible.
```

7
shell.nix Normal file
View file

@ -0,0 +1,7 @@
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [ rustc cargo gcc wf-recorder ];
buildInputs = with pkgs; [ rustfmt clippy ];
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
}

View file

@ -268,6 +268,7 @@ fn get_resolutions(config: &mut Config) -> Vec<Resolution> {
.collect_vec(); .collect_vec();
if config.verbose { if config.verbose {
println!("Found resolutions:");
println!("{:?}", resolutions); println!("{:?}", resolutions);
} }
@ -291,7 +292,10 @@ fn get_resolutions(config: &mut Config) -> Vec<Resolution> {
); );
if config.verbose { if config.verbose {
println!("Combined maximum resolution {:?}", combined_resolution); println!(
"Found combined maximum resolution {:?}",
combined_resolution
);
} }
resolutions.insert(0, combined_resolution); resolutions.insert(0, combined_resolution);
@ -313,7 +317,7 @@ fn get_valid_screens_for_recording(config: &Config) -> Vec<SwayWorkspace> {
serde_json::from_str(stdout_string.as_str()).expect("Invalid json from get_workspaces"); serde_json::from_str(stdout_string.as_str()).expect("Invalid json from get_workspaces");
if config.verbose { if config.verbose {
println!("Found workspaces"); println!("Found workspaces:");
for elem in workspaces.iter() { for elem in workspaces.iter() {
println!("{:?}", elem); println!("{:?}", elem);
} }
@ -332,7 +336,7 @@ fn get_valid_screens_for_recording(config: &Config) -> Vec<SwayWorkspace> {
.collect(); .collect();
if config.verbose { if config.verbose {
println!("Filtered workspaces"); println!("Blacklisted workspaces filtered out:");
for elem in workspaces.iter() { for elem in workspaces.iter() {
println!("{:?}", elem); println!("{:?}", elem);
} }
@ -423,9 +427,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let reader = BufReader::new(stdout); let reader = BufReader::new(stdout);
reader.lines().filter_map(|line| line.ok()).for_each(|_| { reader.lines().filter_map(|line| line.ok()).for_each(|_| {
println!("Switched focus"); println!("Focus switched event");
let valid_screens = get_valid_screens_for_recording(&config); let valid_screens = get_valid_screens_for_recording(&config);
if valid_screens.len() > 0 && valid_screens[0].output == config.current_output { if valid_screens.len() > 0 && valid_screens[0].output == config.current_output {
println!("Screen is the same, no need to switch");
return; return;
} }
for recorder in recorders.iter_mut() { for recorder in recorders.iter_mut() {