Little better docs
This commit is contained in:
parent
2dbdd8340e
commit
073d3a1248
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
/target
|
/target
|
||||||
|
tags
|
||||||
|
.direnv
|
||||||
|
|
31
README.md
31
README.md
|
@ -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
7
shell.nix
Normal 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}";
|
||||||
|
}
|
13
src/main.rs
13
src/main.rs
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue