aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2026-07-13 12:35:57 +0200
committerdec05eba <dec05eba@protonmail.com>2026-07-13 12:35:57 +0200
commitc09fb1b15dff6a06ac5e704022cd8e0193c7ca91 (patch)
tree35c182d8b5ae83c25994691ba4d816c76d77501b /src
parenta453e85f72acf116e1bd2021864c6a715f98362c (diff)
Change -s to scale to fit rather than absolute scale
Diffstat (limited to 'src')
-rw-r--r--src/capture/kms.c10
-rw-r--r--src/capture/nvfbc.c5
-rw-r--r--src/capture/xcomposite.c5
-rw-r--r--src/utils.c6
4 files changed, 19 insertions, 7 deletions
diff --git a/src/capture/kms.c b/src/capture/kms.c
index 1544e2c..e061492 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -182,13 +182,15 @@ static int gsr_capture_kms_start(gsr_capture *cap, gsr_capture_metadata *capture
else
self->capture_size = rotate_capture_size_if_rotated(self, monitor.size, self->display_server_monitor_rotation);
+ vec2i capture_size = self->capture_size;
+ if(self->params.region_size.x > 0 && self->params.region_size.y > 0)
+ capture_size = self->params.region_size;
+
if(self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0) {
- self->params.output_resolution = scale_keep_aspect_ratio(self->capture_size, self->params.output_resolution);
+ self->params.output_resolution = scale_keep_aspect_ratio(capture_size, self->params.output_resolution);
capture_metadata->video_size = self->params.output_resolution;
- } else if(self->params.region_size.x > 0 && self->params.region_size.y > 0) {
- capture_metadata->video_size = self->params.region_size;
} else {
- capture_metadata->video_size = self->capture_size;
+ capture_metadata->video_size = capture_size;
}
self->last_time_monitor_check = clock_get_monotonic_seconds();
diff --git a/src/capture/nvfbc.c b/src/capture/nvfbc.c
index 144f88a..1504323 100644
--- a/src/capture/nvfbc.c
+++ b/src/capture/nvfbc.c
@@ -287,11 +287,12 @@ static int gsr_capture_nvfbc_start(gsr_capture *cap, gsr_capture_metadata *captu
capture_metadata->video_size.x = self->tracking_width;
capture_metadata->video_size.y = self->tracking_height;
+ if(self->params.region_size.x > 0 && self->params.region_size.y > 0)
+ capture_metadata->video_size = self->params.region_size;
+
if(self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0) {
self->params.output_resolution = scale_keep_aspect_ratio(capture_metadata->video_size, self->params.output_resolution);
capture_metadata->video_size = self->params.output_resolution;
- } else if(self->params.region_size.x > 0 && self->params.region_size.y > 0) {
- capture_metadata->video_size = self->params.region_size;
}
return 0;
diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c
index 56b2cd5..c1bef4f 100644
--- a/src/capture/xcomposite.c
+++ b/src/capture/xcomposite.c
@@ -98,8 +98,11 @@ static int gsr_capture_xcomposite_start(gsr_capture *cap, gsr_capture_metadata *
if(self->params.output_resolution.x == 0 && self->params.output_resolution.y == 0) {
capture_metadata->video_size = self->texture_size;
- } else {
+ } else if(self->params.follow_focused) {
+ /* The video size has to stay the same even when the focused window changes, so it cant be based on the size of the captured window */
capture_metadata->video_size = self->params.output_resolution;
+ } else {
+ capture_metadata->video_size = scale_keep_aspect_ratio(self->texture_size, self->params.output_resolution);
}
self->window_resize_timer = clock_get_monotonic_seconds();
diff --git a/src/utils.c b/src/utils.c
index abe8354..9010064 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -599,6 +599,12 @@ vec2i scale_keep_aspect_ratio(vec2i from, vec2i to) {
from.x = from.y * width_height_ratio;
}
+ /* An extreme aspect ratio can cause a dimension to truncate to 0, which the video encoder cant handle */
+ if(from.x < 1)
+ from.x = 1;
+ if(from.y < 1)
+ from.y = 1;
+
return from;
}