From 42c65cc7656c7877fe27f98f9dd3c92a2f97892a Mon Sep 17 00:00:00 2001 From: Hugues Fruchet Date: Mon, 11 Sep 2023 18:12:28 +0200 Subject: [PATCH] waylandsink: Fix cropping for video with non-square aspect ratio Padding of unaligned content is still visible at right with some aspect-ratio. Fix this by giving the original content resolution to wp_viewport_set_source() instead of pixel aspect ratio scaled one. Fixes !5259 Part-of: --- .../gst-libs/gst/wayland/gstwlwindow.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwlwindow.c b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwlwindow.c index 4026aa8b25..699d25ef33 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwlwindow.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/wayland/gstwlwindow.c @@ -63,6 +63,9 @@ typedef struct _GstWlWindowPrivate /* the size of the video in the buffers */ gint video_width, video_height; + /* video width scaled according to par */ + gint scaled_width; + enum wl_output_transform buffer_transform; /* when this is not set both the area_surface and the video_surface are not @@ -431,7 +434,7 @@ gst_wl_window_resize_video_surface (GstWlWindow * self, gboolean commit) case WL_OUTPUT_TRANSFORM_180: case WL_OUTPUT_TRANSFORM_FLIPPED: case WL_OUTPUT_TRANSFORM_FLIPPED_180: - src.w = priv->video_width; + src.w = priv->scaled_width; src.h = priv->video_height; break; case WL_OUTPUT_TRANSFORM_90: @@ -439,7 +442,7 @@ gst_wl_window_resize_video_surface (GstWlWindow * self, gboolean commit) case WL_OUTPUT_TRANSFORM_FLIPPED_90: case WL_OUTPUT_TRANSFORM_FLIPPED_270: src.w = priv->video_height; - src.h = priv->video_width; + src.h = priv->scaled_width; break; } @@ -497,8 +500,9 @@ gst_wl_window_render (GstWlWindow * self, GstWlBuffer * buffer, GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); if (G_UNLIKELY (info)) { - priv->video_width = + priv->scaled_width = gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d); + priv->video_width = info->width; priv->video_height = info->height; wl_subsurface_set_sync (priv->video_subsurface); @@ -611,14 +615,14 @@ gst_wl_window_update_geometry (GstWlWindow * self) if (!priv->configured) return; - if (priv->video_width != 0) { + if (priv->scaled_width != 0) { wl_subsurface_set_sync (priv->video_subsurface); gst_wl_window_resize_video_surface (self, TRUE); } wl_surface_commit (priv->area_surface_wrapper); - if (priv->video_width != 0) + if (priv->scaled_width != 0) wl_subsurface_set_desync (priv->video_subsurface); }