[vlc-devel] [PATCH] display: use an optional callback to set the viewpoint
Steve Lhomme
robux4 at ycbcr.xyz
Tue Sep 8 10:46:38 CEST 2020
On 2020-09-08 10:16, Alexandre Janniaux wrote:
> 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.
The control should be called from a determined thread, a callback
doesn't carry this assumption. I think the commit message is correct,
it's even conditional.
>> ---
>> 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
> _______________________________________________
> 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