[vlc-devel] [PATCH 1/3] vout: fail if the display module can't handle the projection_mode

Thomas Guillem thomas at gllm.fr
Thu Nov 17 09:10:20 CET 2016



On Wed, Nov 16, 2016, at 19:06, Rémi Denis-Courmont wrote:
> Le keskiviikkona 16. marraskuuta 2016, 17.59.33 EET Thomas Guillem a
> écrit :
> > ---
> >  include/vlc_vout_display.h                    | 19 +++++++++++++++++++
> >  modules/codec/omxil/vout.c                    |  3 +++
> >  modules/hw/mmal/vout.c                        |  2 +-
> >  modules/hw/vdpau/display.c                    |  4 ++++
> >  modules/video_output/aa.c                     |  3 +++
> >  modules/video_output/android/android_window.c |  2 +-
> >  modules/video_output/caca.c                   |  2 +-
> >  modules/video_output/caopengllayer.m          |  3 +++
> >  modules/video_output/decklink.cpp             |  3 +++
> >  modules/video_output/directfb.c               |  2 +-
> >  modules/video_output/evas.c                   |  2 +-
> >  modules/video_output/fb.c                     |  2 +-
> >  modules/video_output/flaschen.c               |  3 +++
> >  modules/video_output/kva.c                    |  3 +++
> >  modules/video_output/sdl.c                    |  2 +-
> >  modules/video_output/win32/direct2d.c         |  3 +++
> >  modules/video_output/win32/direct3d11.c       |  3 +++
> >  modules/video_output/win32/direct3d9.c        |  3 +++
> >  modules/video_output/win32/directdraw.c       |  3 +++
> >  modules/video_output/win32/wingdi.c           |  3 +++
> >  modules/video_output/xcb/x11.c                |  4 ++++
> >  modules/video_output/xcb/xvideo.c             |  3 +++
> >  22 files changed, 70 insertions(+), 7 deletions(-)
> > 
> > diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> > index 04a265a..9092261 100644
> > --- a/include/vlc_vout_display.h
> > +++ b/include/vlc_vout_display.h
> > @@ -424,6 +424,25 @@ static inline bool
> > vout_display_IsWindowed(vout_display_t *vd) }
> > 
> >  /**
> > + * Helper function that can be used by vout display modules that doesn't
> > handle
> > + * a non flat vd->fmt.projection_mode.
> 
> Sigh. Way too long summary for Doxygen function lists. Also grammar.

OK.

> 
> > + *
> > + * If the current module is forced, this function will return true and the
> > + * projection will be forced to PROJECTION_MODE_RECTANGULAR.
> 
> The only case where a failure is unavoidable is if *all* the conditions
> are 
> met:
> (1) the decoding is in hardware,
> (2) the video surfaces are passed through,
> (3) the video output cannot perform projection.
> In that case, there should already be a failure as is, since the core
> would be 
> unable to build a full conversion pipeline.
> 
> Otherwise, either projection is working fine, or a software projection
> filter 
> is required. That filter will be needed anyway, for transcode, snapshot,
> etc.

Ok, for 1/2.
For 3, It's not planed (for now) to have a software projection filter.
Even if we got one, opengl modules should have a better priority than
others module that need a filter, no ?

This patch doesn't exclude to have a projection filter later. Indeed,
with the next patch 2/3, a display module that can't handle projection
can still be used (and projection filtering could still be triggered
since source.projection_mode != fmt.projection_mode).

> 
> Furthermore, iterating through video outputs is rather slow in particular
> due 
> to slow slow OS/driver APIs and due to recursion in the "chain" video
> filter. 
> It will become even slower when yet another parameter and level of
> recursion 
> is added for the conversion pipeline.
> 
> Lastly, it is nonobvious behaviour. That means developers and users will
> have 
> a hard time getting it right.
> 
> > + *
> > + * \return false if the module should fail
> > + */
> > +static inline bool vout_display_FlatSource(vout_display_t *vd)
> > +{
> > +    if (vd->obj.force)
> > +    {
> > +        vd->fmt.projection_mode = PROJECTION_MODE_RECTANGULAR;
> > +        return true;
> > +    } else
> > +        return vd->fmt.projection_mode == PROJECTION_MODE_RECTANGULAR;
> > +}
> > +
> > +/**
> >   * Computes the default display size given the source and
> >   * the display configuration.
> >   *
> > diff --git a/modules/codec/omxil/vout.c b/modules/codec/omxil/vout.c
> > index 4e923ad..3f61e4c 100644
> > --- a/modules/codec/omxil/vout.c
> > +++ b/modules/codec/omxil/vout.c
> > @@ -151,6 +151,9 @@ static int Open(vlc_object_t *p_this)
> >      picture_t** pictures = NULL;
> >      OMX_PARAM_PORTDEFINITIONTYPE *def;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      static OMX_CALLBACKTYPE callbacks =
> >          { OmxEventHandler, OmxEmptyBufferDone, OmxFillBufferDone };
> > 
> > diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
> > index 8c7bc1f..7a04a43 100644
> > --- a/modules/hw/mmal/vout.c
> > +++ b/modules/hw/mmal/vout.c
> > @@ -185,7 +185,7 @@ static int Open(vlc_object_t *object)
> >      int ret = VLC_SUCCESS;
> >      unsigned i;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> > 
> >      sys = calloc(1, sizeof(struct vout_display_sys_t));
> > diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c
> > index b1d17a8..f16966b 100644
> > --- a/modules/hw/vdpau/display.c
> > +++ b/modules/hw/vdpau/display.c
> > @@ -426,6 +426,10 @@ static int Open(vlc_object_t *obj)
> >          return VLC_EGENERIC;
> > 
> >      vout_display_t *vd = (vout_display_t *)obj;
> > +
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vout_display_sys_t *sys = malloc(sizeof (*sys));
> >      if (unlikely(sys == NULL))
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/aa.c b/modules/video_output/aa.c
> > index 26f7575..22baaa7 100644
> > --- a/modules/video_output/aa.c
> > +++ b/modules/video_output/aa.c
> > @@ -90,6 +90,9 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >  #ifndef _WIN32
> >      if (!vlc_xlib_init (object))
> >          return VLC_EGENERIC;
> > diff --git a/modules/video_output/android/android_window.c
> > b/modules/video_output/android/android_window.c index 03e51ef..2b6836d
> > 100644
> > --- a/modules/video_output/android/android_window.c
> > +++ b/modules/video_output/android/android_window.c
> > @@ -656,7 +656,7 @@ static int Open(vlc_object_t *p_this)
> >      vout_display_sys_t *sys;
> >      video_format_t sub_fmt;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> > 
> >      /* Allocate structure */
> > diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c
> > index c082ef3..febeb78 100644
> > --- a/modules/video_output/caca.c
> > +++ b/modules/video_output/caca.c
> > @@ -88,7 +88,7 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> >  #if !defined(__APPLE__) && !defined(_WIN32)
> >  # ifndef X_DISPLAY_MISSING
> > diff --git a/modules/video_output/caopengllayer.m
> > b/modules/video_output/caopengllayer.m index 1be3ee6..ec16d98 100644
> > --- a/modules/video_output/caopengllayer.m
> > +++ b/modules/video_output/caopengllayer.m
> > @@ -117,6 +117,9 @@ static int Open (vlc_object_t *p_this)
> >      vout_display_t *vd = (vout_display_t *)p_this;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      /* Allocate structure */
> >      vd->sys = sys = calloc(1, sizeof(vout_display_sys_t));
> >      if (sys == NULL)
> > diff --git a/modules/video_output/decklink.cpp
> > b/modules/video_output/decklink.cpp index eb98bc7..57c8290 100644
> > --- a/modules/video_output/decklink.cpp
> > +++ b/modules/video_output/decklink.cpp
> > @@ -910,6 +910,9 @@ static int OpenVideo(vlc_object_t *p_this)
> >      vout_display_sys_t *sys;
> >      struct decklink_sys_t *decklink_sys;
> > 
> > +    if (vout_display_IsWindowed(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vd->sys = sys = (vout_display_sys_t*)malloc(sizeof(*sys));
> >      if (!sys)
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/directfb.c
> > b/modules/video_output/directfb.c index 26fa047..5632ab9 100644
> > --- a/modules/video_output/directfb.c
> > +++ b/modules/video_output/directfb.c
> > @@ -76,7 +76,7 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> > 
> >      vd->sys = sys = calloc(1, sizeof(*sys));
> > diff --git a/modules/video_output/evas.c b/modules/video_output/evas.c
> > index b38c6b5..1653aa2 100644
> > --- a/modules/video_output/evas.c
> > +++ b/modules/video_output/evas.c
> > @@ -856,7 +856,7 @@ Open( vlc_object_t *p_this )
> >      vout_display_sys_t *sys;
> >      Evas_Object *p_evas;
> > 
> > -    if( vout_display_IsWindowed( vd ) )
> > +    if( !vout_display_FlatSource( vd ) || vout_display_IsWindowed( vd ) )
> >          return VLC_EGENERIC;
> > 
> >      p_evas = var_InheritAddress( p_this, "drawable-evasobject" );
> > diff --git a/modules/video_output/fb.c b/modules/video_output/fb.c
> > index cf6c2a7..5c93fd7 100644
> > --- a/modules/video_output/fb.c
> > +++ b/modules/video_output/fb.c
> > @@ -176,7 +176,7 @@ static int Open(vlc_object_t *object)
> >      vout_display_t     *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> > 
> >      /* Allocate instance and initialize some members */
> > diff --git a/modules/video_output/flaschen.c
> > b/modules/video_output/flaschen.c index 2eeffab..f45e384 100644
> > --- a/modules/video_output/flaschen.c
> > +++ b/modules/video_output/flaschen.c
> > @@ -91,6 +91,9 @@ static int Open(vlc_object_t *object)
> >      int fd;
> >      unsigned port = 1337;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vd->sys = sys = calloc(1, sizeof(*sys));
> >      if (!sys)
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c
> > index eb9aed4..9880c1c 100644
> > --- a/modules/video_output/kva.c
> > +++ b/modules/video_output/kva.c
> > @@ -323,6 +323,9 @@ static int Open ( vlc_object_t *object )
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if( vout_display_IsWindowed( vd ) )
> > +        return VLC_EGENERIC;
> > +
> >      vd->sys = sys = calloc( 1, sizeof( *sys ));
> >      if( !sys )
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/sdl.c b/modules/video_output/sdl.c
> > index 44992b7..7e81c50 100644
> > --- a/modules/video_output/sdl.c
> > +++ b/modules/video_output/sdl.c
> > @@ -121,7 +121,7 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > -    if (vout_display_IsWindowed(vd))
> > +    if (!vout_display_FlatSource(vd) || vout_display_IsWindowed(vd))
> >          return VLC_EGENERIC;
> >  #if !defined(_WIN32) && !defined(__OS2__)
> >      if (!vlc_xlib_init (object))
> > diff --git a/modules/video_output/win32/direct2d.c
> > b/modules/video_output/win32/direct2d.c index 0e489b8..4698f6a 100644
> > --- a/modules/video_output/win32/direct2d.c
> > +++ b/modules/video_output/win32/direct2d.c
> > @@ -83,6 +83,9 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vd->sys = sys = calloc(1, sizeof(*sys));
> >      if (!sys)
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/win32/direct3d11.c
> > b/modules/video_output/win32/direct3d11.c index 23703b9..bbeccfa 100644
> > --- a/modules/video_output/win32/direct3d11.c
> > +++ b/modules/video_output/win32/direct3d11.c
> > @@ -487,6 +487,9 @@ static int Open(vlc_object_t *object)
> >  {
> >      vout_display_t *vd = (vout_display_t *)object;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >  #if !VLC_WINSTORE_APP
> >      int ret = OpenHwnd(vd);
> >  #else
> > diff --git a/modules/video_output/win32/direct3d9.c
> > b/modules/video_output/win32/direct3d9.c index 6800e9a..b2af589 100644
> > --- a/modules/video_output/win32/direct3d9.c
> > +++ b/modules/video_output/win32/direct3d9.c
> > @@ -173,6 +173,9 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      OSVERSIONINFO winVer;
> >      winVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
> >      if(GetVersionEx(&winVer) && winVer.dwMajorVersion < 6 &&
> > !object->obj.force) diff --git a/modules/video_output/win32/directdraw.c
> > b/modules/video_output/win32/directdraw.c index c2f5eea..4999da8 100644
> > --- a/modules/video_output/win32/directdraw.c
> > +++ b/modules/video_output/win32/directdraw.c
> > @@ -166,6 +166,9 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      /* Allocate structure */
> >      vd->sys = sys = calloc(1, sizeof(*sys));
> >      if (!sys)
> > diff --git a/modules/video_output/win32/wingdi.c
> > b/modules/video_output/win32/wingdi.c index ea4b237..5f78292 100644
> > --- a/modules/video_output/win32/wingdi.c
> > +++ b/modules/video_output/win32/wingdi.c
> > @@ -72,6 +72,9 @@ static int Open(vlc_object_t *object)
> >      vout_display_t *vd = (vout_display_t *)object;
> >      vout_display_sys_t *sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vd->sys = sys = calloc(1, sizeof(*sys));
> >      if (!sys)
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c
> > index 7117881..bdf8af8 100644
> > --- a/modules/video_output/xcb/x11.c
> > +++ b/modules/video_output/xcb/x11.c
> > @@ -105,6 +105,10 @@ static const xcb_depth_t *FindDepth (const xcb_screen_t
> > *scr, static int Open (vlc_object_t *obj)
> >  {
> >      vout_display_t *vd = (vout_display_t *)obj;
> > +
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      vout_display_sys_t *sys = malloc (sizeof (*sys));
> >      if (unlikely(sys == NULL))
> >          return VLC_ENOMEM;
> > diff --git a/modules/video_output/xcb/xvideo.c
> > b/modules/video_output/xcb/xvideo.c index dde4f33..4024ca0 100644
> > --- a/modules/video_output/xcb/xvideo.c
> > +++ b/modules/video_output/xcb/xvideo.c
> > @@ -355,6 +355,9 @@ static int Open (vlc_object_t *obj)
> >      vout_display_t *vd = (vout_display_t *)obj;
> >      vout_display_sys_t *p_sys;
> > 
> > +    if (!vout_display_FlatSource(vd))
> > +        return VLC_EGENERIC;
> > +
> >      {   /* NOTE: Reject hardware surface formats. Blending would break. */
> >          const vlc_chroma_description_t *chroma =
> >              vlc_fourcc_GetChromaDescription(vd->source.i_chroma);
> 
> 
> -- 
> Rémi Denis-Courmont
> https://www.remlab.net/
> 
> _______________________________________________
> 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