[vlc-devel] [PATCH] display: use an optional callback to set the viewpoint
Alexandre Janniaux
ajanni at videolabs.io
Tue Sep 8 10:16:13 CEST 2020
Hi,
On Mon, Sep 07, 2020 at 08:37:49AM +0200, Steve Lhomme wrote:
> In the future it may be called directly from the thread generating the event to
> lower the latency.
Sorry I missed this yesterday, but the commit message doesn't
look correct. Being a control or being a callback will never
lower the latency so the commit message is not adapted to the
commit itself.
> ---
> include/vlc_vout_display.h | 12 ++++++-----
> modules/video_output/caopengllayer.m | 25 +++++++++++-----------
> modules/video_output/ios.m | 12 +++++++----
> modules/video_output/macosx.m | 11 ++++++----
> modules/video_output/opengl/display.c | 10 ++++++---
> modules/video_output/win32/direct3d11.c | 28 +++++++++++++------------
> modules/video_output/win32/glwin32.c | 12 ++++++-----
> src/video_output/display.c | 10 +++++----
> 8 files changed, 69 insertions(+), 51 deletions(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index c0014b2924d..e5ab39d9fd6 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -214,11 +214,6 @@ enum vout_display_query {
> * is necessary
> */
> VOUT_DISPLAY_CHANGE_SOURCE_CROP,
> -
> - /**
> - * Notifies a change of VR/360° viewpoint.
> - */
> - VOUT_DISPLAY_CHANGE_VIEWPOINT, /* const vlc_viewpoint_t * */
> };
>
> /**
> @@ -359,6 +354,13 @@ struct vout_display_t {
> */
> int (*control)(vout_display_t *, int query, va_list);
>
> + /**
> + * Notifies a change of VR/360° viewpoint.
> + *
> + * May be NULL.
> + */
> + int (*set_viewpoint)(vout_display_t *, const vlc_viewpoint_t*);
> +
> /**
> * Destroys the display.
> */
> diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
> index dd4d9ae0625..cd990944686 100644
> --- a/modules/video_output/caopengllayer.m
> +++ b/modules/video_output/caopengllayer.m
> @@ -102,6 +102,17 @@ struct gl_sys
> VLCCAOpenGLLayer *cgLayer;
> };
>
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)
> +{
> + vout_display_sys_t *sys = vd->sys;
> + if (OpenglLock(sys->gl))
> + return VLC_EGENERIC;
> +
> + int ret = vout_display_opengl_SetViewpoint(sys->vgl, vp);
> + OpenglUnlock(sys->gl);
> + return ret;
> +}
> +
> /*****************************************************************************
> * Open: This function allocates and initializes the OpenGL vout method.
> *****************************************************************************/
> @@ -196,6 +207,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = PictureRender;
> vd->display = PictureDisplay;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
>
> if (OSX_SIERRA_AND_HIGHER) {
> @@ -336,19 +348,6 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> return VLC_SUCCESS;
> }
>
> - case VOUT_DISPLAY_CHANGE_VIEWPOINT:
> - {
> - int ret;
> -
> - if (OpenglLock(sys->gl))
> - return VLC_EGENERIC;
> -
> - ret = vout_display_opengl_SetViewpoint(sys->vgl,
> - va_arg(ap, const vlc_viewpoint_t*));
> - OpenglUnlock(sys->gl);
> - return ret;
> - }
> -
> case VOUT_DISPLAY_RESET_PICTURES:
> vlc_assert_unreachable ();
> default:
> diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
> index 9bfb145a841..4faaaa1e91c 100644
> --- a/modules/video_output/ios.m
> +++ b/modules/video_output/ios.m
> @@ -139,6 +139,13 @@ static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
> return dlsym(RTLD_DEFAULT, name);
> }
>
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)
> +{
> + vout_display_sys_t *sys = vd->sys;
> + struct gl_sys *glsys = sys->gl->sys;
> + return vout_display_opengl_SetViewpoint (glsys->vgl, vp);
> +}
> +
> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> video_format_t *fmt, vlc_video_context *context)
> {
> @@ -207,6 +214,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = PictureRender;
> vd->display = PictureDisplay;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
>
> return VLC_SUCCESS;
> @@ -268,10 +276,6 @@ static int Control(vout_display_t *vd, int query, va_list ap)
> return VLC_SUCCESS;
> }
>
> - case VOUT_DISPLAY_CHANGE_VIEWPOINT:
> - return vout_display_opengl_SetViewpoint(glsys->vgl,
> - va_arg(ap, const vlc_viewpoint_t*));
> -
> case VOUT_DISPLAY_RESET_PICTURES:
> vlc_assert_unreachable ();
> default:
> diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
> index 77d8222c232..0d4061051b7 100644
> --- a/modules/video_output/macosx.m
> +++ b/modules/video_output/macosx.m
> @@ -126,6 +126,12 @@ static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
> return dlsym(RTLD_DEFAULT, name);
> }
>
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)
> +{
> + vout_display_sys_t *sys = vd->sys;
> + return vout_display_opengl_SetViewpoint (sys->vgl, vp);
> +}
> +
> static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
> video_format_t *fmt, vlc_video_context *context)
> {
> @@ -239,6 +245,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = PictureRender;
> vd->display = PictureDisplay;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
>
> /* */
> @@ -382,10 +389,6 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> return VLC_SUCCESS;
> }
>
> - case VOUT_DISPLAY_CHANGE_VIEWPOINT:
> - return vout_display_opengl_SetViewpoint (sys->vgl,
> - va_arg(ap, const vlc_viewpoint_t*));
> -
> case VOUT_DISPLAY_RESET_PICTURES:
> vlc_assert_unreachable ();
> default:
> diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
> index e8f073c3bac..630869468de 100644
> --- a/modules/video_output/opengl/display.c
> +++ b/modules/video_output/opengl/display.c
> @@ -81,6 +81,12 @@ static void PictureRender (vout_display_t *, picture_t *, subpicture_t *, vlc_ti
> static void PictureDisplay (vout_display_t *, picture_t *);
> static int Control (vout_display_t *, int, va_list);
>
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)
> +{
> + vout_display_sys_t *sys = vd->sys;
> + return vout_display_opengl_SetViewpoint (sys->vgl, vp);
> +}
> +
> /**
> * Allocates a surface and an OpenGL context for video output.
> */
> @@ -146,6 +152,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = PictureRender;
> vd->display = PictureDisplay;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
> return VLC_SUCCESS;
>
> @@ -252,9 +259,6 @@ static int Control (vout_display_t *vd, int query, va_list ap)
> sys->place_changed = true;
> return VLC_SUCCESS;
> }
> - case VOUT_DISPLAY_CHANGE_VIEWPOINT:
> - return vout_display_opengl_SetViewpoint (sys->vgl,
> - va_arg(ap, const vlc_viewpoint_t*));
> default:
> msg_Err (vd, "Unknown request %d", query);
> }
> diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
> index c4d5b488abe..a9405da65e1 100644
> --- a/modules/video_output/win32/direct3d11.c
> +++ b/modules/video_output/win32/direct3d11.c
> @@ -291,6 +291,19 @@ static void UpdateSize(vout_display_t *vd)
> #endif
> }
>
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *viewpoint)
> +{
> + vout_display_sys_t *sys = vd->sys;
> + if ( sys->picQuad.pVertexShaderConstants )
> + {
> + d3d11_device_lock( sys->d3d_dev );
> + D3D11_UpdateViewpoint( vd, sys->d3d_dev, &sys->picQuad, viewpoint,
> + (float) vd->cfg->display.width / vd->cfg->display.height );
> + d3d11_device_unlock( sys->d3d_dev );
> + }
> + return VLC_SUCCESS;
> +}
> +
> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> video_format_t *fmtp, vlc_video_context *context)
> {
> @@ -380,6 +393,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = Prepare;
> vd->display = Display;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
>
> msg_Dbg(vd, "Direct3D11 Open Succeeded");
> @@ -402,22 +416,10 @@ static void Close(vout_display_t *vd)
> }
> static int Control(vout_display_t *vd, int query, va_list args)
> {
> + VLC_UNUSED(args);
> vout_display_sys_t *sys = vd->sys;
> int res = CommonControl( vd, &sys->area, &sys->sys, query );
>
> - if (query == VOUT_DISPLAY_CHANGE_VIEWPOINT)
> - {
> - if ( sys->picQuad.pVertexShaderConstants )
> - {
> - const vlc_viewpoint_t *viewpoint = va_arg(args, const vlc_viewpoint_t*);
> - d3d11_device_lock( sys->d3d_dev );
> - D3D11_UpdateViewpoint( vd, sys->d3d_dev, &sys->picQuad, viewpoint,
> - (float) vd->cfg->display.width / vd->cfg->display.height );
> - d3d11_device_unlock( sys->d3d_dev );
> - res = VLC_SUCCESS;
> - }
> - }
> -
> if ( sys->area.place_changed )
> {
> UpdateSize(vd);
> diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
> index b88c994c489..765c6bca4eb 100644
> --- a/modules/video_output/win32/glwin32.c
> +++ b/modules/video_output/win32/glwin32.c
> @@ -73,14 +73,15 @@ struct vout_display_sys_t
> static void Prepare(vout_display_t *, picture_t *, subpicture_t *, vlc_tick_t);
> static void Display(vout_display_t *, picture_t *);
>
> -static int Control(vout_display_t *vd, int query, va_list args)
> +static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)
> {
> vout_display_sys_t *sys = vd->sys;
> + return vout_display_opengl_SetViewpoint(sys->vgl, vp);
> +}
>
> - if (query == VOUT_DISPLAY_CHANGE_VIEWPOINT)
> - return vout_display_opengl_SetViewpoint(sys->vgl,
> - va_arg(args, const vlc_viewpoint_t*));
> -
> +static int Control(vout_display_t *vd, int query, va_list args)
> +{
> + vout_display_sys_t *sys = vd->sys;
> return CommonControl(vd, &sys->area, &sys->sys, query);
> }
>
> @@ -161,6 +162,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> vd->prepare = Prepare;
> vd->display = Display;
> vd->control = Control;
> + vd->set_viewpoint = SetViewpoint;
> vd->close = Close;
>
> return VLC_SUCCESS;
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index b76de8ed269..b340b4711ee 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -685,10 +685,12 @@ void vout_SetDisplayViewpoint(vout_display_t *vd,
>
> osys->cfg.viewpoint = *p_viewpoint;
>
> - if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_VIEWPOINT,
> - &osys->cfg.viewpoint)) {
> - msg_Err(vd, "Failed to change Viewpoint");
> - osys->cfg.viewpoint = old_vp;
> + if (vd->set_viewpoint)
> + {
> + if (vd->set_viewpoint(vd, &osys->cfg.viewpoint)) {
> + msg_Err(vd, "Failed to change Viewpoint");
> + osys->cfg.viewpoint = old_vp;
> + }
> }
> }
> }
> --
> 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