From 1c46d14f7058c7ade2afc14e2cf30dabb38a931c Mon Sep 17 00:00:00 2001 From: Steve Lhomme Date: Thu, 10 Aug 2023 15:02:13 +0200 Subject: [PATCH] display: keep the video placement internally --- src/video_output/display.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/video_output/display.c b/src/video_output/display.c index d36512ae25..320bc724d8 100644 --- a/src/video_output/display.c +++ b/src/video_output/display.c @@ -253,10 +253,20 @@ typedef struct { video_format_t display_fmt; vlc_video_context *src_vctx; + vout_display_place_t src_place; + // filters to convert the vout source to fmt, NULL means no conversion is needed struct pooled_filter_chain *converter; } vout_display_priv_t; +static bool PlaceVideoInDisplay(vout_display_priv_t *osys) +{ + struct vout_display_placement place_cfg = osys->cfg.display; + vout_display_place_t prev_place = osys->src_place; + vout_display_PlacePicture(&osys->src_place, &osys->source, &place_cfg); + return vout_display_PlaceEquals(&prev_place, &osys->src_place); +} + /***************************************************************************** * FIXME/TODO see how to have direct rendering here (interact with vout.c) *****************************************************************************/ @@ -493,6 +503,8 @@ static int vout_UpdateSourceCrop(vout_display_t *vd) osys->source.i_visible_height = bottom - top; video_format_Print(VLC_OBJECT(vd), "CROPPED ", &osys->source); + PlaceVideoInDisplay(osys); + return vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP); } @@ -507,6 +519,8 @@ static int vout_SetSourceAspect(vout_display_t *vd, osys->source.i_sar_den = sar_den; } + PlaceVideoInDisplay(osys); + err1 = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_ASPECT); /* If a crop ratio is requested, recompute the parameters */ @@ -569,6 +583,9 @@ void vout_display_SetSize(vout_display_t *vd, unsigned width, unsigned height) osys->cfg.display.width = width; osys->cfg.display.height = height; + + PlaceVideoInDisplay(osys); + if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE) != VLC_SUCCESS) vout_display_Reset(vd); } @@ -581,6 +598,9 @@ void vout_SetDisplayFitting(vout_display_t *vd, enum vlc_video_fitting fit) return; /* nothing to do */ osys->cfg.display.fitting = fit; + + PlaceVideoInDisplay(osys); + if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_FILLED) != VLC_SUCCESS) vout_display_Reset(vd); } @@ -598,6 +618,9 @@ void vout_SetDisplayZoom(vout_display_t *vd, unsigned num, unsigned den) return; /* zoom has no effects */ if (onum * den == num * oden) return; /* zoom has not changed */ + + PlaceVideoInDisplay(osys); + if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_ZOOM) != VLC_SUCCESS) vout_display_Reset(vd); } @@ -739,6 +762,8 @@ vout_display_t *vout_display_New(vlc_object_t *parent, if (owner) vd->owner = *owner; + PlaceVideoInDisplay(osys); + if (module == NULL || module[0] == '\0') module = "any";