[vlc-devel] [PATCH v2 3/3] libvlc: add a way to disable the GPU callback engine

Rémi Denis-Courmont remi at remlab.net
Wed Feb 12 17:57:38 CET 2020


Le keskiviikkona 12. helmikuuta 2020, 18.10.50 EET Steve Lhomme a écrit :
> If set to none we fallback to normal playback into a custom window.
> 
> We need the variable in the regular player so the variable can be read even
> when desktop VLC.
> ---
>  include/vlc/libvlc_media_player.h |  2 ++
>  lib/media_player.c                | 10 ++++++++++
>  modules/video_chroma/d3d11_fmt.c  | 12 +++++++++---
>  modules/video_chroma/d3d9_fmt.c   | 13 ++++++++++---
>  modules/video_output/vgl.c        |  5 +++++
>  src/player/player.c               |  2 ++
>  6 files changed, 38 insertions(+), 6 deletions(-)
> 
> diff --git a/include/vlc/libvlc_media_player.h
> b/include/vlc/libvlc_media_player.h index aa4be734181..a19e3bce38d 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -679,6 +679,8 @@ typedef void (*libvlc_video_frameMetadata_cb)(void*
> opaque, libvlc_video_metadat * can be passed to @a
> libvlc_video_set_output_callbacks
>   */
>  typedef enum libvlc_video_engine_t {
> +    /** Disable rendering engine */
> +    libvlc_video_engine_none,
>      libvlc_video_engine_opengl,
>      libvlc_video_engine_gles2,
>      /** Direct3D11 rendering engine */
> diff --git a/lib/media_player.c b/lib/media_player.c
> index f68c5bf0c34..e609ec14c1d 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -593,6 +593,7 @@ libvlc_media_player_new( libvlc_instance_t *instance )
>      var_Create (mp, "vmem-height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
>      var_Create (mp, "vmem-pitch", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
> 
> +    var_Create (mp, "vout-cb-type", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );

I don't see why you need to inherit here, since the default value is 0 anyway.

And I don't think anything should assume a player over it, so that does not 
solve your original problem either.

>      var_Create( mp, "vout-cb-opaque", VLC_VAR_ADDRESS );
>      var_Create( mp, "vout-cb-setup", VLC_VAR_ADDRESS );
>      var_Create( mp, "vout-cb-cleanup", VLC_VAR_ADDRESS );
> @@ -1045,6 +1046,7 @@ bool
> libvlc_video_set_output_callbacks(libvlc_media_player_t *mp,
> libvlc_video_output_select_plane_cb select_plane_cb, void *opaque)
>  {
> +    static_assert(libvlc_video_engine_none == 0, "No engine set must
> default to 0"); #ifdef __ANDROID__
>      //use the default android window
>      var_SetString( mp, "window", "");
> @@ -1072,9 +1074,17 @@ bool
> libvlc_video_set_output_callbacks(libvlc_media_player_t *mp, var_SetString
> ( mp, "vout", "direct3d9" );
>          var_SetString ( mp, "dec-dev", "d3d9-device" );
>      }
> +    else if ( engine == libvlc_video_engine_none )
> +    {
> +        // use the default display module
> +        var_SetString ( mp, "vout", "" );
> +        // use the default decoder device
> +        var_SetString ( mp, "dec-dev", "" );
> +    }
>      else
>          return false;
> 
> +    var_SetInteger( mp, "vout-cb-type", engine );
>      var_SetAddress( mp, "vout-cb-opaque", opaque );
>      var_SetAddress( mp, "vout-cb-setup", setup_cb );
>      var_SetAddress( mp, "vout-cb-cleanup", cleanup_cb );
> diff --git a/modules/video_chroma/d3d11_fmt.c
> b/modules/video_chroma/d3d11_fmt.c index 97ba9e6ca71..7db32b7c0d7 100644
> --- a/modules/video_chroma/d3d11_fmt.c
> +++ b/modules/video_chroma/d3d11_fmt.c
> @@ -438,8 +438,11 @@ d3d11_decoder_device_t
> *(D3D11_CreateDevice)(vlc_object_t *obj, else
>  #endif
>      {
> -        libvlc_video_output_setup_cb setupDeviceCb = var_InheritAddress(
> obj, "vout-cb-setup" ); -        if ( setupDeviceCb )
> +        libvlc_video_engine_t engineType = var_InheritInteger( obj,
> "vout-cb-type" ); +        libvlc_video_output_setup_cb setupDeviceCb =
> NULL;
> +        if (engineType == libvlc_video_engine_d3d11)
> +            setupDeviceCb = var_InheritAddress( obj, "vout-cb-setup" );
> +        if ( setupDeviceCb != NULL)
>          {
>              /* decoder device coming from the external app */
>              sys->external.opaque          = var_InheritAddress( obj,
> "vout-cb-opaque" ); @@ -456,7 +459,8 @@ d3d11_decoder_device_t
> *(D3D11_CreateDevice)(vlc_object_t *obj, }
>              hr = D3D11_CreateDeviceExternal(obj, out.d3d11.device_context,
> true, &sys->dec_device.d3d_dev); }
> -        else
> +        else if ( engineType == libvlc_video_engine_none ||
> +                  engineType == libvlc_video_engine_d3d11 )
>          {
>              /* internal decoder device */
>  #if !VLC_WINSTORE_APP
> @@ -474,6 +478,8 @@ d3d11_decoder_device_t
> *(D3D11_CreateDevice)(vlc_object_t *obj,
> 
>              hr = CreateDevice( obj, &sys->hd3d, adapter, hw_decoding,
> &sys->dec_device.d3d_dev ); }
> +        else
> +            goto error;
>      }
> 
>  error:
> diff --git a/modules/video_chroma/d3d9_fmt.c
> b/modules/video_chroma/d3d9_fmt.c index 66c753e308c..a50e093f1a7 100644
> --- a/modules/video_chroma/d3d9_fmt.c
> +++ b/modules/video_chroma/d3d9_fmt.c
> @@ -67,8 +67,11 @@ d3d9_handle_t *hd3d = &sys->dec_device.hd3d;
>      int AdapterToUse;
> 
>      sys->cleanupDeviceCb = NULL;
> -    libvlc_video_output_setup_cb setupDeviceCb = var_InheritAddress( o,
> "vout-cb-setup" ); -    if ( setupDeviceCb )
> +    libvlc_video_engine_t engineType = var_InheritInteger( o,
> "vout-cb-type" ); +    libvlc_video_output_setup_cb setupDeviceCb = NULL;
> +    if (engineType == libvlc_video_engine_d3d9)
> +        setupDeviceCb = var_InheritAddress( o, "vout-cb-setup" );
> +    if ( setupDeviceCb != NULL)
>      {
>          /* external rendering */
>          libvlc_video_setup_device_info_t extern_out = { .d3d9.adapter = -1
> }; @@ -83,7 +86,9 @@ d3d9_handle_t *hd3d = &sys->dec_device.hd3d;
>          D3D9_CloneExternal( hd3d, (IDirect3D9 *) extern_out.d3d9.device );
>          AdapterToUse = extern_out.d3d9.adapter;
>      }
> -    else
> +    else if ( engineType == libvlc_video_engine_none ||
> +              engineType == libvlc_video_engine_d3d9 ||
> +              engineType == libvlc_video_engine_opengl )
>      {
>          /* internal rendering */
>          if (D3D9_Create(o, hd3d) != VLC_SUCCESS)
> @@ -94,6 +99,8 @@ d3d9_handle_t *hd3d = &sys->dec_device.hd3d;
>          /* find the best adapter to use, not based on the HWND used */
>          AdapterToUse = -1;
>      }
> +    else
> +        goto error;
> 
>      if (AdapterToUse == -1)
>      {
> diff --git a/modules/video_output/vgl.c b/modules/video_output/vgl.c
> index 99cf6f747eb..40487ea2476 100644
> --- a/modules/video_output/vgl.c
> +++ b/modules/video_output/vgl.c
> @@ -123,6 +123,11 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned
> height) {
>      vout_display_sys_t * sys;
> 
> +    libvlc_video_engine_t engineType = var_InheritInteger( gl,
> "vout-cb-type" ); +    if ( engineType != libvlc_video_engine_opengl &&
> +         engineType != libvlc_video_engine_gles2 )
> +        return VLC_EBADVAR;
> +
>      /* Allocate structure */
>      gl->sys = sys = vlc_obj_calloc(VLC_OBJECT(gl), 1, sizeof(*sys));
>      if( !sys )
> diff --git a/src/player/player.c b/src/player/player.c
> index 89c16caf6a8..fc624e5edca 100644
> --- a/src/player/player.c
> +++ b/src/player/player.c
> @@ -1951,6 +1951,8 @@ vlc_player_New(vlc_object_t *parent, enum
> vlc_player_lock_type lock_type, VAR_CREATE("audio-language", VLC_VAR_STRING
> | VLC_VAR_DOINHERIT); VAR_CREATE("sub-language", VLC_VAR_STRING |
> VLC_VAR_DOINHERIT);
> 
> +    VAR_CREATE("vout-cb-type", VLC_VAR_INTEGER);
> +
>      /* TODO: Override these variables since the player handle media ended
>       * action itself. */
>      VAR_CREATE("start-paused", VLC_VAR_BOOL);


-- 
Rémi Denis-Courmont
http://www.remlab.net/





More information about the vlc-devel mailing list