From cc43ca03360e5802d234dcf1d776e87df89a797c Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 17 Nov 2025 23:19:26 +0100 Subject: [PATCH] Scale video/image to output size instead of adding black bars or no scaling --- include/capture/capture.h | 2 +- src/capture/kms.c | 5 +---- src/capture/nvfbc.c | 5 +---- src/capture/portal.c | 5 +---- src/capture/xcomposite.c | 9 +++------ src/capture/ximage.c | 9 +++------ 6 files changed, 10 insertions(+), 25 deletions(-) diff --git a/include/capture/capture.h b/include/capture/capture.h index 9dfd41a..201a271 100644 --- a/include/capture/capture.h +++ b/include/capture/capture.h @@ -20,7 +20,7 @@ typedef struct { } gsr_capture_metadata; struct gsr_capture { - /* These methods should not be called manually. Call gsr_capture_* instead. |capture_metdata->width| and |capture_metadata->height| should be set by this function */ + /* These methods should not be called manually. Call gsr_capture_* instead. |capture_metadata->width| and |capture_metadata->height| should be set by this function */ int (*start)(gsr_capture *cap, gsr_capture_metadata *capture_metadata); void (*on_event)(gsr_capture *cap, gsr_egl *egl); /* can be NULL */ void (*tick)(gsr_capture *cap); /* can be NULL. If there is an event then |on_event| is called before this */ diff --git a/src/capture/kms.c b/src/capture/kms.c index 988c163..e63d230 100644 --- a/src/capture/kms.c +++ b/src/capture/kms.c @@ -625,10 +625,7 @@ static int gsr_capture_kms_capture(gsr_capture *cap, gsr_capture_metadata *captu if(self->params.region_size.x > 0 && self->params.region_size.y > 0) self->capture_size = self->params.region_size; - const bool is_scaled = self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0; - vec2i output_size = is_scaled ? self->params.output_resolution : self->capture_size; - output_size = scale_keep_aspect_ratio(self->capture_size, output_size); - + const vec2i output_size = scale_keep_aspect_ratio(self->capture_size, (vec2i){capture_metadata->width, capture_metadata->height}); const vec2i target_pos = { max_int(0, capture_metadata->width / 2 - output_size.x / 2), max_int(0, capture_metadata->height / 2 - output_size.y / 2) }; gsr_capture_kms_update_capture_size_change(self, color_conversion, target_pos, drm_fd); diff --git a/src/capture/nvfbc.c b/src/capture/nvfbc.c index 17978fd..46c6c02 100644 --- a/src/capture/nvfbc.c +++ b/src/capture/nvfbc.c @@ -333,10 +333,7 @@ static int gsr_capture_nvfbc_capture(gsr_capture *cap, gsr_capture_metadata *cap if(self->params.region_size.x > 0 && self->params.region_size.y > 0) frame_size = self->params.region_size; - const bool is_scaled = self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0; - vec2i output_size = is_scaled ? self->params.output_resolution : frame_size; - output_size = scale_keep_aspect_ratio(frame_size, output_size); - + const vec2i output_size = scale_keep_aspect_ratio(frame_size, (vec2i){capture_metadata->width, capture_metadata->height}); const vec2i target_pos = { max_int(0, capture_metadata->width / 2 - output_size.x / 2), max_int(0, capture_metadata->height / 2 - output_size.y / 2) }; NVFBC_FRAME_GRAB_INFO frame_info; diff --git a/src/capture/portal.c b/src/capture/portal.c index 4604794..b158530 100644 --- a/src/capture/portal.c +++ b/src/capture/portal.c @@ -353,10 +353,7 @@ static int gsr_capture_portal_capture(gsr_capture *cap, gsr_capture_metadata *ca } } - const bool is_scaled = self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0; - vec2i output_size = is_scaled ? self->params.output_resolution : self->capture_size; - output_size = scale_keep_aspect_ratio(self->capture_size, output_size); - + const vec2i output_size = scale_keep_aspect_ratio(self->capture_size, (vec2i){capture_metadata->width, capture_metadata->height}); const vec2i target_pos = { max_int(0, capture_metadata->width / 2 - output_size.x / 2), max_int(0, capture_metadata->height / 2 - output_size.y / 2) }; const vec2i actual_texture_size = {self->pipewire_data.texture_width, self->pipewire_data.texture_height}; diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c index b4e8ca7..e148d28 100644 --- a/src/capture/xcomposite.c +++ b/src/capture/xcomposite.c @@ -224,7 +224,7 @@ static bool gsr_capture_xcomposite_should_stop(gsr_capture *cap, bool *err) { return false; } -static int gsr_capture_xcomposite_capture(gsr_capture *cap, gsr_capture_metadata *capture_metdata, gsr_color_conversion *color_conversion) { +static int gsr_capture_xcomposite_capture(gsr_capture *cap, gsr_capture_metadata *capture_metadata, gsr_color_conversion *color_conversion) { gsr_capture_xcomposite *self = cap->priv; if(self->clear_background) { @@ -232,11 +232,8 @@ static int gsr_capture_xcomposite_capture(gsr_capture *cap, gsr_capture_metadata gsr_color_conversion_clear(color_conversion); } - const bool is_scaled = self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0; - vec2i output_size = is_scaled ? self->params.output_resolution : self->texture_size; - output_size = scale_keep_aspect_ratio(self->texture_size, output_size); - - const vec2i target_pos = { max_int(0, capture_metdata->width / 2 - output_size.x / 2), max_int(0, capture_metdata->height / 2 - output_size.y / 2) }; + const vec2i output_size = scale_keep_aspect_ratio(self->texture_size, (vec2i){capture_metadata->width, capture_metadata->height}); + const vec2i target_pos = { max_int(0, capture_metadata->width / 2 - output_size.x / 2), max_int(0, capture_metadata->height / 2 - output_size.y / 2) }; //self->params.egl->glFlush(); //self->params.egl->glFinish(); diff --git a/src/capture/ximage.c b/src/capture/ximage.c index b119ca6..17e2a02 100644 --- a/src/capture/ximage.c +++ b/src/capture/ximage.c @@ -147,14 +147,11 @@ static bool gsr_capture_ximage_upload_to_texture(gsr_capture_ximage *self, int x return success; } -static int gsr_capture_ximage_capture(gsr_capture *cap, gsr_capture_metadata *capture_metdata, gsr_color_conversion *color_conversion) { +static int gsr_capture_ximage_capture(gsr_capture *cap, gsr_capture_metadata *capture_metadata, gsr_color_conversion *color_conversion) { gsr_capture_ximage *self = cap->priv; - const bool is_scaled = self->params.output_resolution.x > 0 && self->params.output_resolution.y > 0; - vec2i output_size = is_scaled ? self->params.output_resolution : self->capture_size; - output_size = scale_keep_aspect_ratio(self->capture_size, output_size); - - const vec2i target_pos = { max_int(0, capture_metdata->width / 2 - output_size.x / 2), max_int(0, capture_metdata->height / 2 - output_size.y / 2) }; + const vec2i output_size = scale_keep_aspect_ratio(self->capture_size, (vec2i){capture_metadata->width, capture_metadata->height}); + const vec2i target_pos = { max_int(0, capture_metadata->width / 2 - output_size.x / 2), max_int(0, capture_metadata->height / 2 - output_size.y / 2) }; gsr_capture_ximage_upload_to_texture(self, self->capture_pos.x + self->params.region_position.x, self->capture_pos.y + self->params.region_position.y, self->capture_size.x, self->capture_size.y); gsr_color_conversion_draw(color_conversion, self->texture_id,