[vlc-devel] [PATCH v2 01/19] display: specify if vout_display_PlacePicture() alignment is top/bottom-left
Romain Vimont
rom1v at videolabs.io
Tue Aug 25 17:17:40 CEST 2020
On Tue, Aug 25, 2020 at 04:20:14PM +0200, Steve Lhomme wrote:
> For OpenGL the picture alignment must be computed from the bottom-left, whereas
> all other modules align from top-left.
IMO, the core should not be aware of any "internal" vflip by the vout.
It should just request the alignment it wants, and the vout handles it.
> This was handled internally by OpenGL modules, but for center vertical
> alignment on odd vertical dimensions, it may round to the same value regardless
> of the display coordinate system, which is incorrect.
What is rounded to the same value in that case?
> ---
> include/vlc_vout_display.h | 10 +++++++++-
> modules/hw/mmal/vout.c | 2 +-
> modules/hw/vdpau/display.c | 6 +++---
> modules/video_output/caopengllayer.m | 8 +-------
> modules/video_output/ios.m | 2 +-
> modules/video_output/kva.c | 4 ++--
> modules/video_output/macosx.m | 14 +++-----------
> modules/video_output/opengl/display.c | 18 ++----------------
> modules/video_output/vulkan/display.c | 2 +-
> modules/video_output/wayland/shm.c | 4 ++--
> modules/video_output/win32/common.c | 6 +++++-
> modules/video_output/xcb/render.c | 2 +-
> modules/video_output/xcb/x11.c | 4 ++--
> src/video_output/display.c | 16 +++++++++++-----
> src/video_output/video_output.c | 2 +-
> 15 files changed, 45 insertions(+), 55 deletions(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index 2a0b593a13e..0610c4134ba 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -500,6 +500,11 @@ static inline bool vout_display_PlaceEquals(const vout_display_place_t *p1,
> p1->y == p2->y && p1->height == p2->height;
> }
>
> +enum vout_place_origin {
> + VOUT_ORIGIN_TOP_LEFT,
> + VOUT_ORIGIN_BOTTOM_LEFT,
> +};
> +
> /**
> * Computes the intended picture placement inside the display.
> *
> @@ -512,8 +517,11 @@ static inline bool vout_display_PlaceEquals(const vout_display_place_t *p1,
> * \param place Storage space for the picture placement [OUT]
> * \param source Video source format
> * \param cfg Display configuration
> + * \param origin whether the alignement should be done from the bottom-left or
> + * the top-left corner.
> */
> -VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg);
> +VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source,
> + const vout_display_cfg_t *cfg, enum vout_place_origin origin);
>
> /**
> * Translates mouse state.
> diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
> index e0eeeb0513b..6d4c8a2c7c5 100644
> --- a/modules/hw/mmal/vout.c
> +++ b/modules/hw/mmal/vout.c
> @@ -524,7 +524,7 @@ place_dest(vout_display_sys_t * const sys,
> tcfg.display.width = sys->display_width;
> tcfg.display.height = sys->display_height;
> tcfg.is_display_filled = true;
> - vout_display_PlacePicture(&place, fmt, &tcfg);
> + vout_display_PlacePicture(&place, fmt, &tcfg, VOUT_ORIGIN_TOP_LEFT);
>
> sys->dest_rect = place_to_mmal_rect(place);
> }
> diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c
> index 5963be63718..61d4c1a1430 100644
> --- a/modules/hw/vdpau/display.c
> +++ b/modules/hw/vdpau/display.c
> @@ -237,7 +237,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> vout_display_place_t place;
>
> msg_Dbg(vd, "resetting pictures");
> - vout_display_PlacePicture(&place, src, cfg);
> + vout_display_PlacePicture(&place, src, cfg, VOUT_ORIGIN_TOP_LEFT);
>
> fmt->i_width = src->i_width * place.width / src->i_visible_width;
> fmt->i_height = src->i_height * place.height / src->i_visible_height;
> @@ -259,7 +259,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> const vout_display_cfg_t *cfg = va_arg(ap, const vout_display_cfg_t *);
> vout_display_place_t place;
>
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
> if (place.width != vd->fmt.i_visible_width
> || place.height != vd->fmt.i_visible_height)
> return VLC_EGENERIC;
> @@ -427,7 +427,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> };
> vout_display_place_t place;
>
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
> sys->window = xcb_generate_id(sys->conn);
>
> xcb_void_cookie_t c =
> diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
> index 0dafcec000a..3eeaba0ce10 100644
> --- a/modules/video_output/caopengllayer.m
> +++ b/modules/video_output/caopengllayer.m
> @@ -319,14 +319,8 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> cfg_tmp.display.width = bounds.size.width;
> cfg_tmp.display.height = bounds.size.height;
>
> - /* Reverse vertical alignment as the GL tex are Y inverted */
> - if (cfg_tmp.align.vertical == VLC_VIDEO_ALIGN_TOP)
> - cfg_tmp.align.vertical = VLC_VIDEO_ALIGN_BOTTOM;
> - else if (cfg_tmp.align.vertical == VLC_VIDEO_ALIGN_BOTTOM)
> - cfg_tmp.align.vertical = VLC_VIDEO_ALIGN_TOP;
> -
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, &cfg_tmp);
> + vout_display_PlacePicture(&place, &vd->source, &cfg_tmp, VOUT_ORIGIN_BOTTOM_LEFT);
> if (unlikely(OpenglLock(sys->gl)))
> // don't return an error or we need to handle VOUT_DISPLAY_RESET_PICTURES
> return VLC_SUCCESS;
> diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
> index 80b75147c7e..771cbbb649e 100644
> --- a/modules/video_output/ios.m
> +++ b/modules/video_output/ios.m
> @@ -645,7 +645,7 @@ static void GLESSwap(vlc_gl_t *gl)
> cfg.display.width = _viewSize.width * _scaleFactor;
> cfg.display.height = _viewSize.height * _scaleFactor;
>
> - vout_display_PlacePicture(place, &_voutDisplay->source, &cfg);
> + vout_display_PlacePicture(place, &_voutDisplay->source, &cfg, VOUT_ORIGIN_TOP_LEFT);
> }
>
> - (void)reshape
> diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c
> index 185e8269600..09d5fcf8add 100644
> --- a/modules/video_output/kva.c
> +++ b/modules/video_output/kva.c
> @@ -433,7 +433,7 @@ static int Control( vout_display_t *vd, int query, va_list args )
> case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
> {
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + vout_display_PlacePicture(&place, &vd->source, vd->cfg, VOUT_ORIGIN_TOP_LEFT);
>
> sys->kvas.ulAspectWidth = place.width;
> sys->kvas.ulAspectHeight = place.height;
> @@ -938,7 +938,7 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
> i_movie_height = movie_rect.yTop - movie_rect.yBottom;
>
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + vout_display_PlacePicture(&place, &vd->source, vd->cfg, VOUT_ORIGIN_TOP_LEFT);
>
> int x = ( i_mouse_x - movie_rect.xLeft ) *
> place.width / i_movie_width + place.x;
> diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
> index 15d0c305772..12d18ab842f 100644
> --- a/modules/video_output/macosx.m
> +++ b/modules/video_output/macosx.m
> @@ -321,7 +321,7 @@ static void PictureDisplay (vout_display_t *vd, picture_t *pic)
> {
> if (@available(macOS 10.14, *)) {
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, &sys->cfg);
> + vout_display_PlacePicture(&place, &vd->source, &sys->cfg, VOUT_ORIGIN_BOTTOM_LEFT);
> vout_display_opengl_Viewport(vd->sys->vgl, place.x,
> sys->cfg.display.height - (place.y + place.height),
> place.width, place.height);
> @@ -355,16 +355,8 @@ static int Control (vout_display_t *vd, int query, va_list ap)
>
> /* we always use our current frame here, because we have some size constraints
> in the ui vout provider */
> - vout_display_cfg_t cfg_tmp = *cfg;
> -
> - /* Reverse vertical alignment as the GL tex are Y inverted */
> - if (cfg_tmp.align.vertical == VLC_VIDEO_ALIGN_TOP)
> - cfg_tmp.align.vertical = VLC_VIDEO_ALIGN_BOTTOM;
> - else if (cfg_tmp.align.vertical == VLC_VIDEO_ALIGN_BOTTOM)
> - cfg_tmp.align.vertical = VLC_VIDEO_ALIGN_TOP;
> -
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, &cfg_tmp);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_BOTTOM_LEFT);
> @synchronized (sys->glView) {
> sys->cfg = *cfg;
> }
> @@ -627,7 +619,7 @@ static void OpenglSwap (vlc_gl_t *gl)
> sys->cfg.display.width = bounds.size.width;
> sys->cfg.display.height = bounds.size.height;
>
> - vout_display_PlacePicture(&place, &vd->source, &sys->cfg);
> + vout_display_PlacePicture(&place, &vd->source, &sys->cfg, VOUT_ORIGIN_BOTTOM_LEFT);
> // FIXME: this call leads to a fatal mutex locking error in vout_ChangeDisplaySize()
> // vout_window_ReportSize(sys->embed, bounds.size.width, bounds.size.height);
> }
> diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
> index 2db08ccc03b..fae920dd6ec 100644
> --- a/modules/video_output/opengl/display.c
> +++ b/modules/video_output/opengl/display.c
> @@ -206,16 +206,6 @@ static void PictureDisplay (vout_display_t *vd, picture_t *pic)
> }
> }
>
> -static void
> -FlipVerticalAlign(vout_display_cfg_t *cfg)
> -{
> - /* Reverse vertical alignment as the GL tex are Y inverted */
> - if (cfg->align.vertical == VLC_VIDEO_ALIGN_TOP)
> - cfg->align.vertical = VLC_VIDEO_ALIGN_BOTTOM;
> - else if (cfg->align.vertical == VLC_VIDEO_ALIGN_BOTTOM)
> - cfg->align.vertical = VLC_VIDEO_ALIGN_TOP;
> -}
> -
> static int Control (vout_display_t *vd, int query, va_list ap)
> {
> vout_display_sys_t *sys = vd->sys;
> @@ -234,9 +224,7 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> vout_display_cfg_t cfg = *va_arg(ap, const vout_display_cfg_t *);
> const video_format_t *src = &vd->source;
>
> - FlipVerticalAlign(&cfg);
> -
> - vout_display_PlacePicture(&sys->place, src, &cfg);
> + vout_display_PlacePicture(&sys->place, src, &cfg, VOUT_ORIGIN_BOTTOM_LEFT);
> sys->place_changed = true;
> vlc_gl_Resize (sys->gl, cfg.display.width, cfg.display.height);
> return VLC_SUCCESS;
> @@ -247,9 +235,7 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> {
> vout_display_cfg_t cfg = *va_arg(ap, const vout_display_cfg_t *);
>
> - FlipVerticalAlign(&cfg);
> -
> - vout_display_PlacePicture(&sys->place, &vd->source, &cfg);
> + vout_display_PlacePicture(&sys->place, &vd->source, &cfg, VOUT_ORIGIN_BOTTOM_LEFT);
> sys->place_changed = true;
> return VLC_SUCCESS;
> }
> diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
> index 226165f2838..119583d1379 100644
> --- a/modules/video_output/vulkan/display.c
> +++ b/modules/video_output/vulkan/display.c
> @@ -348,7 +348,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
> case VOUT_DISPLAY_CHANGE_ZOOM: {
> vout_display_cfg_t cfg = *va_arg (ap, const vout_display_cfg_t *);
> - vout_display_PlacePicture(&sys->place, &vd->source, &cfg);
> + vout_display_PlacePicture(&sys->place, &vd->source, &cfg, VOUT_ORIGIN_TOP_LEFT);
> return VLC_SUCCESS;
> }
>
> diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c
> index 77acabdd0c2..811682b8f96 100644
> --- a/modules/video_output/wayland/shm.c
> +++ b/modules/video_output/wayland/shm.c
> @@ -166,7 +166,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> video_format_t src;
> assert(sys->viewport == NULL);
>
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
> video_format_ApplyRotation(&src, &vd->source);
>
> fmt->i_width = src.i_width * place.width
> @@ -198,7 +198,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> vout_display_place_t place;
>
> video_format_ApplyRotation(&fmt, &vd->source);
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
>
> wp_viewport_set_source(sys->viewport,
> wl_fixed_from_int(fmt.i_x_offset),
> diff --git a/modules/video_output/win32/common.c b/modules/video_output/win32/common.c
> index 60fb4e0f25a..5e65da9071a 100644
> --- a/modules/video_output/win32/common.c
> +++ b/modules/video_output/win32/common.c
> @@ -98,17 +98,21 @@ void CommonPlacePicture(vout_display_t *vd, display_win32_area_t *area, vout_dis
> {
> /* Update the window position and size */
> vout_display_cfg_t place_cfg = area->vdcfg;
> + enum vout_place_origin origin;
>
> #if (defined(MODULE_NAME_IS_glwin32))
> + origin = VOUT_ORIGIN_BOTTOM_LEFT;
> /* Reverse vertical alignment as the GL tex are Y inverted */
> if (place_cfg.align.vertical == VLC_VIDEO_ALIGN_TOP)
> place_cfg.align.vertical = VLC_VIDEO_ALIGN_BOTTOM;
> else if (place_cfg.align.vertical == VLC_VIDEO_ALIGN_BOTTOM)
> place_cfg.align.vertical = VLC_VIDEO_ALIGN_TOP;
> +#else
> + origin = VOUT_ORIGIN_TOP_LEFT;
> #endif
>
> vout_display_place_t before_place = area->place;
> - vout_display_PlacePicture(&area->place, &vd->source, &place_cfg);
> + vout_display_PlacePicture(&area->place, &vd->source, &place_cfg, origin);
>
> /* Signal the change in size/position */
> if (!vout_display_PlaceEquals(&before_place, &area->place))
> diff --git a/modules/video_output/xcb/render.c b/modules/video_output/xcb/render.c
> index c3e71933f35..cede80fd246 100644
> --- a/modules/video_output/xcb/render.c
> +++ b/modules/video_output/xcb/render.c
> @@ -281,7 +281,7 @@ static void CreateBuffers(vout_display_t *vd, const vout_display_cfg_t *cfg)
> sys->format.argb, 0, NULL);
>
> vout_display_place_t *place = &sys->place;
> - vout_display_PlacePicture(place, fmt, cfg);
> + vout_display_PlacePicture(place, fmt, cfg, VOUT_ORIGIN_TOP_LEFT);
>
> /* Homogeneous coordinates transform from destination(place)
> * to source(fmt) */
> diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c
> index 05e012f3897..6ea5b82d908 100644
> --- a/modules/video_output/xcb/x11.c
> +++ b/modules/video_output/xcb/x11.c
> @@ -150,7 +150,7 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> vout_display_place_t place;
> int ret = VLC_SUCCESS;
>
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
>
> uint32_t mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
> const uint32_t values[] = {
> @@ -313,7 +313,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
> };
> vout_display_place_t place;
>
> - vout_display_PlacePicture(&place, &vd->source, cfg);
> + vout_display_PlacePicture(&place, &vd->source, cfg, VOUT_ORIGIN_TOP_LEFT);
> sys->window = xcb_generate_id (conn);
> sys->gc = xcb_generate_id (conn);
>
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index 0112425ac14..5d59c7af2a1 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -143,7 +143,8 @@ void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
> /* */
> void vout_display_PlacePicture(vout_display_place_t *place,
> const video_format_t *source,
> - const vout_display_cfg_t *cfg)
> + const vout_display_cfg_t *cfg,
> + enum vout_place_origin origin)
> {
> /* vout_display_PlacePicture() is called from vd plugins. They should not
> * care about the initial window properties. */
> @@ -212,13 +213,18 @@ void vout_display_PlacePicture(vout_display_place_t *place,
>
> switch (cfg->align.vertical) {
> case VLC_VIDEO_ALIGN_TOP:
> - place->y = 0;
> + place->y = origin == VOUT_ORIGIN_BOTTOM_LEFT ? (cfg->display.height - place->height) : 0;
> break;
> case VLC_VIDEO_ALIGN_BOTTOM:
> - place->y = cfg->display.height - place->height;
> + place->y = origin == VOUT_ORIGIN_TOP_LEFT ? (cfg->display.height - place->height) : 0;
> break;
> default:
> - place->y = ((int)cfg->display.height - (int)place->height) / 2;
> + if (origin == VOUT_ORIGIN_BOTTOM_LEFT)
> + // round to upper value
> + place->y = ((int)cfg->display.height - (int)place->height + 1) / 2;
> + else
> + // round to lower value
> + place->y = ((int)cfg->display.height - (int)place->height) / 2;
> break;
> }
> }
> @@ -229,7 +235,7 @@ void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video,
> vout_display_place_t place;
>
> /* Translate window coordinates to video coordinates */
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + vout_display_PlacePicture(&place, &vd->source, vd->cfg, VOUT_ORIGIN_TOP_LEFT);
>
> if (place.width <= 0 || place.height <= 0) {
> memset(video, 0, sizeof (*video));
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 4f48754cf2e..edb029893c4 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1257,7 +1257,7 @@ static int ThreadDisplayRenderPicture(vout_thread_sys_t *vout, bool is_forced)
> video_format_t fmt_spu;
> if (do_dr_spu) {
> vout_display_place_t place;
> - vout_display_PlacePicture(&place, &vd->source, vd->cfg);
> + vout_display_PlacePicture(&place, &vd->source, vd->cfg, VOUT_ORIGIN_TOP_LEFT);
>
> fmt_spu = vd->source;
> if (fmt_spu.i_width * fmt_spu.i_height < place.width * place.height) {
> --
> 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