[vlc-devel] [PATCH 2/4] vgl: expose opengl callbacks through libvlc

Thomas Guillem thomas at gllm.fr
Tue Jul 3 17:50:16 CEST 2018



On Tue, Jul 3, 2018, at 14:38, Pierre Lamot wrote:
> ---
>  include/vlc/libvlc_media_player.h | 75 +++++++++++++++++++++++++++++++
>  lib/libvlc.sym                    |  1 +
>  lib/media_player.c                | 37 +++++++++++++++
>  3 files changed, 113 insertions(+)
> 
> diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/
> libvlc_media_player.h
> index 87d3368bf3..2f3b699fd0 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -421,6 +421,81 @@ void 
> libvlc_video_set_callbacks( libvlc_media_player_t *mp,
>                                   libvlc_video_display_cb display,
>                                   void *opaque );
>  
> +/**
> + * Callback prototype to configure rendering,
> + *
> + * You can allocate ressources required for rendering here.
> + *
> + * \param opaque private pointer passed to the @a 
> libvlc_video_set_opengl_callbacks() [IN]
> + * \param width video width in pixel [IN]
> + * \param height video height in pixel [IN]
> + * \version LibVLC 4.0.0 or later
> + */
> +typedef void (*libvlc_gl_create_cb)(void* opaque, size_t width, size_t 
> height);
> +
> +/**
> + * Callback prototype to release resources created by 
> libvlc_gl_create_cb
> + *
> + * \param opaque private pointer passed to the @a 
> libvlc_video_set_opengl_callbacks() [IN]
> + * \version LibVLC 4.0.0 or later
> + */
> +typedef void (*libvlc_gl_destroy_cb)(void* opaque);
> +
> +/**
> + * Callback prototype called before/after performing drawing calls.
> + * This funvtion will be called every time VLC renders a video frame,

*function*

> + * first before rendering with @a enter = true then after the rendering 
> with
> + * @a enter = false
> + *
> + * \param opaque private pointer passed to the @a 
> libvlc_video_set_opengl_callbacks() [IN]
> + * \param enter true before performing the rendering, false after [IN]
> + * \version LibVLC 4.0.0 or later
> + */
> +typedef void (*libvlc_gl_render_cb)(void* opaque, bool enter);
> +
> +/**

missing function description

> + * \param opaque private pointer passed to the @a 
> libvlc_video_set_opengl_callbacks() [IN]
> + * \param enter true to set the context as current, false to unset it 
> [IN]
> + * \version LibVLC 4.0.0 or later
> + */
> +typedef bool (*libvlc_gl_makeCurrent_cb)(void* opaque, bool enter);
> +
> +/**
> + * Callback prototype to load opengl functions
> + *
> + * \param opaque private pointer passed to the @a 
> libvlc_video_set_opengl_callbacks() [IN]
> + * \param enter true before performing the rendering, false after [IN]
> + * \param fct_name name of the opengl function to load
> + * \version LibVLC 4.0.0 or later
> + */
> +typedef void* (*libvlc_gl_getProcAddress_cb)(void* opaque, const char* 
> fct_name);
> +
> +/**
> + * Set callbacks and data to render decoded video to a custom OpenGL 
> texture
> + *
> + * \warning VLC will perform video rendering in its own thread and at 
> its own rate,
> + * You need to provide your own synchronisation mechanism.
> + *
> + * OpenGL context need to be created before playing a media.
> + *
> + * \param mp the media player
> + * \param create_cb resource creation callback (cannot be NULL)
> + * \param destroy_cb resource release callback (cannot be NULL)
> + * \param makeCurrent_cb callback called to enter/leave the opengl 
> context (cannot be NULL)
> + * \param getProcAddress_cb opengl function loading callback (cannot be 
> NULL)
> + * \param render_cb callback callback called before/after rendering a 
> video frame (cannot be NULL)
> + * \param opaque private pointer passed to callbacks
> + * \version LibVLC 4.0.0 or later
> + */
> +LIBVLC_API
> +void libvlc_video_set_opengl_callbacks( libvlc_media_player_t *mp,
> +                                        libvlc_gl_create_cb create_cb,
> +                                        libvlc_gl_destroy_cb 
> destroy_cb,
> +                                        libvlc_gl_makeCurrent_cb 
> makeCurrent_cb,
> +                                        libvlc_gl_getProcAddress_cb 
> getProcAddress_cb,
> +                                        libvlc_gl_render_cb render_cb,
> +                                        void* opaque );
> +
>  /**
>   * Set decoded video chroma and dimensions.
>   * This only works in combination with libvlc_video_set_callbacks(),
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index cdbcec9dc9..1787fbdc2f 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -248,6 +248,7 @@ libvlc_video_set_crop_geometry
>  libvlc_video_set_deinterlace
>  libvlc_video_set_format
>  libvlc_video_set_format_callbacks
> +libvlc_video_set_opengl_callbacks
>  libvlc_video_set_key_input
>  libvlc_video_set_logo_int
>  libvlc_video_set_logo_string
> diff --git a/lib/media_player.c b/lib/media_player.c
> index 2755048162..8d411ecd5e 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -625,6 +625,8 @@ libvlc_media_player_new( libvlc_instance_t 
> *instance )
>      /* Video */
>      var_Create (mp, "vout", VLC_VAR_STRING|VLC_VAR_DOINHERIT);
>      var_Create (mp, "window", VLC_VAR_STRING);
> +    var_Create (mp, "gl", VLC_VAR_STRING);
> +    var_Create (mp, "gles2", VLC_VAR_STRING);
>      var_Create (mp, "vmem-lock", VLC_VAR_ADDRESS);
>      var_Create (mp, "vmem-unlock", VLC_VAR_ADDRESS);
>      var_Create (mp, "vmem-display", VLC_VAR_ADDRESS);
> @@ -635,6 +637,14 @@ libvlc_media_player_new( libvlc_instance_t 
> *instance )
>      var_Create (mp, "vmem-width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
>      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, "vgl-create-cb", VLC_VAR_ADDRESS );
> +    var_Create( mp, "vgl-destroy-cb", VLC_VAR_ADDRESS );
> +    var_Create( mp, "vgl-render-cb", VLC_VAR_ADDRESS );
> +    var_Create( mp, "vgl-get-proc-address-cb", VLC_VAR_ADDRESS );
> +    var_Create( mp, "vgl-make-current-cb", VLC_VAR_ADDRESS );
> +    var_Create( mp, "vgl-opaque", VLC_VAR_ADDRESS );
> +
>      var_Create (mp, "avcodec-hw", VLC_VAR_STRING);
>      var_Create (mp, "drawable-xid", VLC_VAR_INTEGER);
>  #if defined (_WIN32) || defined (__OS2__)
> @@ -1133,6 +1143,33 @@ void 
> libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma,
>      var_SetInteger( mp, "vmem-pitch", pitch );
>  }
>  
> +void libvlc_video_set_opengl_callbacks( libvlc_media_player_t *mp,
> +                                        libvlc_gl_create_cb create_cb,
> +                                        libvlc_gl_destroy_cb 
> destroy_cb,
> +                                        libvlc_gl_makeCurrent_cb 
> makeCurrent_cb,
> +                                        libvlc_gl_getProcAddress_cb 
> getProcAddress_cb,
> +                                        libvlc_gl_render_cb render_cb,
> +                                        void* opaque)
> +{
> +#ifdef __ANDROID__
> +    var_SetString ( mp, "vout", "gles2");
> +    //use the default android window
> +    var_SetString( mp, "window", "");
> +#else
> +    var_SetString ( mp, "vout", "gl");
> +    var_SetString( mp, "window", "wdummy");
> +#endif

You can use gles2 on non Android plaforms. I think the GL/GLES2 should be given by a new argument in libvlc_video_set_opengl_callbacks().

> +    var_SetString ( mp, "gl", "vgl");
> +    var_SetString ( mp, "gles2", "vgl");
> +    var_SetAddress( mp, "vgl-create-cb", create_cb );
> +    var_SetAddress( mp, "vgl-destroy-cb", destroy_cb );
> +    var_SetAddress( mp, "vgl-render-cb", render_cb );
> +    var_SetAddress( mp, "vgl-get-proc-address-cb", getProcAddress_cb );
> +    var_SetAddress( mp, "vgl-make-current-cb", makeCurrent_cb );
> +    var_SetAddress( mp, "vgl-opaque", opaque );
> +}
> +
> +
>  /
> **************************************************************************
>   * set_nsobject
>   
> **************************************************************************/
> -- 
> 2.17.1
> 
> _______________________________________________
> 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