[vlc-devel] [PATCH 04/20] display: keep the placed picture on open and after changing display settings
Alexandre Janniaux
ajanni at videolabs.io
Tue Aug 25 10:57:12 CEST 2020
Hi,
This seems incompatible with OpenGL modules, since they
need the alignment swapped within picture_place to adapt
the coordinate system.
Regards,
--
Alexandre Janniaux
Videolabs
On Tue, Aug 25, 2020 at 09:29:52AM +0200, Steve Lhomme wrote:
> ---
> include/vlc_vout_display.h | 31 ++++++++++++--------
> src/video_output/display.c | 52 +++++++++++++++++++++++----------
> src/video_output/video_output.c | 9 +++---
> 3 files changed, 60 insertions(+), 32 deletions(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index 485d5634c2a..cdc06fb9f55 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -268,6 +268,18 @@ typedef int (*vout_display_open_cb)(vout_display_t *vd,
> set_capability( "vout display", priority )
>
>
> +/**
> + * Video placement.
> + *
> + * This structure stores the result of a vout_display_PlacePicture() call.
> + */
> +typedef struct {
> + int x; /*< Relative pixel offset from the display left edge */
> + int y; /*< Relative pixel offset from the display top edge */
> + unsigned width; /*< Picture pixel width */
> + unsigned height; /*< Picture pixel height */
> +} vout_display_place_t;
> +
> struct vout_display_t {
> struct vlc_object_t obj;
>
> @@ -278,6 +290,13 @@ struct vout_display_t {
> */
> const vout_display_cfg_t *cfg;
>
> + /**
> + * Placement of the video in the display area.
> + *
> + * This cannot be modified directly. It reflects the current values.
> + */
> + const vout_display_place_t *place;
> +
> /**
> * Source video format.
> *
> @@ -478,18 +497,6 @@ static inline bool vout_display_cfg_IsWindowed(const vout_display_cfg_t *cfg)
> VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *);
>
>
> -/**
> - * Video placement.
> - *
> - * This structure stores the result of a vout_display_PlacePicture() call.
> - */
> -typedef struct {
> - int x; /*< Relative pixel offset from the display left edge */
> - int y; /*< Relative pixel offset from the display top edge */
> - unsigned width; /*< Picture pixel width */
> - unsigned height; /*< Picture pixel height */
> -} vout_display_place_t;
> -
> /**
> * Compares two \ref vout_display_place_t.
> */
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index ebc3a94b615..5ff0400dad5 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -226,12 +226,9 @@ void vout_display_PlacePicture(vout_display_place_t *place,
> void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video,
> const vlc_mouse_t *window)
> {
> - vout_display_place_t place;
> -
> - /* Translate window coordinates to video coordinates */
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + const vout_display_place_t *place = vd->place;
>
> - if (place.width <= 0 || place.height <= 0) {
> + if (place->width <= 0 || place->height <= 0) {
> memset(video, 0, sizeof (*video));
> return;
> }
> @@ -245,16 +242,16 @@ void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video,
> y = wy;
> break;
> case ORIENT_TOP_RIGHT:
> - x = place.width - wx;
> + x = place->width - wx;
> y = wy;
> break;
> case ORIENT_BOTTOM_LEFT:
> x = wx;
> - y = place.height - wy;
> + y = place->height - wy;
> break;
> case ORIENT_BOTTOM_RIGHT:
> - x = place.width - wx;
> - y = place.height - wy;
> + x = place->width - wx;
> + y = place->height - wy;
> break;
> case ORIENT_LEFT_TOP:
> x = wy;
> @@ -262,24 +259,24 @@ void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video,
> break;
> case ORIENT_LEFT_BOTTOM:
> x = wy;
> - y = place.width - wx;
> + y = place->width - wx;
> break;
> case ORIENT_RIGHT_TOP:
> - x = place.height - wy;
> + x = place->height - wy;
> y = wx;
> break;
> case ORIENT_RIGHT_BOTTOM:
> - x = place.height - wy;
> - y = place.width - wx;
> + x = place->height - wy;
> + y = place->width - wx;
> break;
> default:
> vlc_assert_unreachable();
> }
>
> video->i_x = vd->source.i_x_offset
> - + (int64_t)(x - place.x) * vd->source.i_visible_width / place.width;
> + + (int64_t)(x - place->x) * vd->source.i_visible_width / place->width;
> video->i_y = vd->source.i_y_offset
> - + (int64_t)(y - place.y) * vd->source.i_visible_height / place.height;
> + + (int64_t)(y - place->y) * vd->source.i_visible_height / place->height;
> video->i_pressed = window->i_pressed;
> video->b_double_click = window->b_double_click;
> }
> @@ -289,6 +286,7 @@ typedef struct {
>
> /* */
> vout_display_cfg_t cfg;
> + vout_display_place_t place;
>
> struct {
> int left;
> @@ -468,6 +466,12 @@ void vout_FilterFlush(vout_display_t *vd)
> filter_chain_VideoFlush(osys->converters);
> }
>
> +static void UpdatePlacedPicture(vout_display_priv_t *osys)
> +{
> + vout_display_t *vd = &osys->display;
> + vout_display_PlacePicture(&osys->place, &vd->source, &osys->cfg);
> +}
> +
> static void vout_display_Reset(vout_display_t *vd)
> {
> vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display);
> @@ -486,6 +490,8 @@ static void vout_display_Reset(vout_display_t *vd)
> osys->pool = NULL;
> }
>
> + UpdatePlacedPicture(osys);
> +
> if (vout_display_Control(vd, VOUT_DISPLAY_RESET_PICTURES, &vd->fmt)
> || VoutDisplayCreateRender(vd))
> msg_Err(vd, "Failed to adjust render format");
> @@ -547,6 +553,8 @@ static int vout_UpdateSourceCrop(vout_display_t *vd)
> video_format_Print(VLC_OBJECT(vd), "SOURCE ", &osys->source);
> video_format_Print(VLC_OBJECT(vd), "CROPPED", &vd->source);
>
> + UpdatePlacedPicture(osys);
> +
> int ret = vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP);
> osys->crop.left = left - osys->source.i_x_offset;
> osys->crop.top = top - osys->source.i_y_offset;
> @@ -574,6 +582,8 @@ static int vout_SetSourceAspect(vout_display_t *vd,
> vd->source.i_sar_den = osys->source.i_sar_den;
> }
>
> + UpdatePlacedPicture(osys);
> +
> if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_ASPECT))
> ret = -1;
>
> @@ -634,6 +644,9 @@ void vout_display_SetSize(vout_display_t *vd, unsigned width, unsigned height)
>
> osys->cfg.display.width = width;
> osys->cfg.display.height = height;
> +
> + UpdatePlacedPicture(osys);
> +
> if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
> || vout_display_CheckReset(vd))
> vout_display_Reset(vd);
> @@ -647,6 +660,9 @@ void vout_SetDisplayFilled(vout_display_t *vd, bool is_filled)
> return; /* nothing to do */
>
> osys->cfg.is_display_filled = is_filled;
> +
> + UpdatePlacedPicture(osys);
> +
> if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_FILLED)
> || vout_display_CheckReset(vd))
> vout_display_Reset(vd);
> @@ -662,6 +678,9 @@ void vout_SetDisplayZoom(vout_display_t *vd, unsigned num, unsigned den)
>
> osys->cfg.zoom.num = num;
> osys->cfg.zoom.den = den;
> +
> + UpdatePlacedPicture(osys);
> +
> if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_ZOOM) ||
> vout_display_CheckReset(vd))
> vout_display_Reset(vd);
> @@ -773,6 +792,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
> video_format_Copy(&vd->source, source);
> vd->info = (vout_display_info_t){ };
> vd->cfg = &osys->cfg;
> + vd->place = &osys->place;
> vd->prepare = NULL;
> vd->display = NULL;
> vd->control = NULL;
> @@ -781,6 +801,8 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
> if (owner)
> vd->owner = *owner;
>
> + vout_display_PlacePicture(&osys->place, &vd->source, &osys->cfg);
> +
> if (vlc_module_load(vd, "vout display", module, module && *module != '\0',
> vout_display_start, vd, &osys->cfg,
> osys->src_vctx) == NULL)
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 4f48754cf2e..a4e31081ca4 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1256,17 +1256,16 @@ static int ThreadDisplayRenderPicture(vout_thread_sys_t *vout, bool is_forced)
> const vlc_fourcc_t *subpicture_chromas;
> video_format_t fmt_spu;
> if (do_dr_spu) {
> - vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + const vout_display_place_t *place = vd->place;
>
> fmt_spu = vd->source;
> - if (fmt_spu.i_width * fmt_spu.i_height < place.width * place.height) {
> + if (fmt_spu.i_width * fmt_spu.i_height < place->width * place->height) {
> fmt_spu.i_sar_num = vd->cfg->display.sar.num;
> fmt_spu.i_sar_den = vd->cfg->display.sar.den;
> fmt_spu.i_width =
> - fmt_spu.i_visible_width = place.width;
> + fmt_spu.i_visible_width = place->width;
> fmt_spu.i_height =
> - fmt_spu.i_visible_height = place.height;
> + fmt_spu.i_visible_height = place->height;
> }
> subpicture_chromas = vd->info.subpicture_chromas;
> } else {
> --
> 2.26.2
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list