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

Steve Lhomme robux4 at ycbcr.xyz
Thu Feb 13 08:25:18 CET 2020


On 2020-02-12 17:57, Rémi Denis-Courmont wrote:
> 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.

Indeed, it's useless for now. I just followed the same pattern as 
previous code. But a quick look shows these variables aren't even 
defined anywhere else.

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

I'm not sure I understand. The variable in player.c does solve my 
problem when reading the value outside of a libvlc usage, from the 
display module(s). I don't think we can have a display module without a 
player.
The "decoder device" also uses the same code. So when transcoding with a 
GPU decoder/encoder the variable may also be read there. I suppose 
there's no player involved in that case ?

I'm fine with moving the "default" variable to input for example.

>>       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/
> 
> 
> 
> _______________________________________________
> 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