[vlc-devel] [PATCH v2 1/3] vgl: provide a module to allow rendering in a user defined opengl context

Rémi Denis-Courmont remi at remlab.net
Thu Jul 12 17:56:07 CEST 2018


Le torstaina 12. heinäkuuta 2018, 12.57.36 EEST Pierre Lamot a écrit :
>   This module aims to provide the same kind of functionnality as vmem but
> for opengl rendering.
> 
>   Users will have to provide different callbacks:
> 
>   * vgl-resize-cb will be called when video size changes
>   * vgl-cleanup-cb to release resources
>   * vgl-swap-cb that will be called once the current frame has been rendered
> * vgl-make-current-cb to enter/leave the opengl context
>   * vgl-get-proc-address-cb to provide opengl functions
> 
>   Note that users will have to ensure synchronisation on their side since
>   VLC will run and render OpenGL in its own thread.

Well it's a lot nicer now.

> ---
>  modules/video_output/Makefile.am          |   2 +
>  modules/video_output/opengl/vout_helper.c |   1 +
>  modules/video_output/vgl.c                | 161 ++++++++++++++++++++++
>  3 files changed, 164 insertions(+)
>  create mode 100644 modules/video_output/vgl.c
> 
> diff --git a/modules/video_output/Makefile.am
> b/modules/video_output/Makefile.am index 3013e3fd1d..9df738fff3 100644
> --- a/modules/video_output/Makefile.am
> +++ b/modules/video_output/Makefile.am
> @@ -454,10 +454,12 @@ libvdummy_plugin_la_SOURCES = video_output/vdummy.c
>  libvmem_plugin_la_SOURCES = video_output/vmem.c
>  libwdummy_plugin_la_SOURCES = video_output/wdummy.c
>  libyuv_plugin_la_SOURCES = video_output/yuv.c
> +libvgl_plugin_la_SOURCES = video_output/vgl.c
> 
>  vout_LTLIBRARIES += \
>  	libflaschen_plugin.la \
>  	libvdummy_plugin.la \
>  	libvmem_plugin.la \
>  	libwdummy_plugin.la \
> +	libvgl_plugin.la \
>  	libyuv_plugin.la
> diff --git a/modules/video_output/opengl/vout_helper.c
> b/modules/video_output/opengl/vout_helper.c index 33f738f579..e9b458515b
> 100644
> --- a/modules/video_output/opengl/vout_helper.c
> +++ b/modules/video_output/opengl/vout_helper.c
> @@ -979,6 +979,7 @@ vout_display_opengl_t
> *vout_display_opengl_New(video_format_t *fmt, }
> 
>      GL_ASSERT_NOERROR();
> +
>      return vgl;
>  }
> 

!?

> diff --git a/modules/video_output/vgl.c b/modules/video_output/vgl.c
> new file mode 100644
> index 0000000000..b565da4bea
> --- /dev/null
> +++ b/modules/video_output/vgl.c
> @@ -0,0 +1,161 @@
> +/**************************************************************************
> *** + * vgl.c: virtual LibVLC OpenGL extension
> +
> ***************************************************************************
> ** + * Copyright (c) 2018 VLC authors and VideoLAN
> + *
> + * Authors: Pierre Lamot <pierre at videolabs.io>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or + *
> (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +
> ***************************************************************************
> **/ +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <vlc_common.h>
> +#include <vlc_plugin.h>
> +#include <vlc_vout_display.h>
> +#include <vlc_opengl.h>
> +
> +
> +/**************************************************************************
> *** + * Local prototypes.
> +
> ***************************************************************************
> **/ +
> +struct vout_display_sys_t
> +{
> +    vlc_gl_t              *gl;
> +
> +    bool (*makeCurrentCb)(void* opaque, bool);
> +    void* (*getProcAddressCb)(void* opaque, const char *name);
> +    void (*swapCb)(void* opaque);
> +    void (*resizeCb)(void* opaque, unsigned, unsigned);
> +    void (*cleanupCb)(void* opaque);
> +
> +    void* opaque;
> +    unsigned width;
> +    unsigned height;
> +};
> +
> +
> +static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
> +{
> +    vout_display_sys_t *sys = gl->sys;
> +    return sys->getProcAddressCb(sys->opaque, name);
> +}
> +
> +static int MakeCurrent(vlc_gl_t *gl)
> +{
> +    vout_display_sys_t *sys = gl->sys;
> +    bool success = sys->makeCurrentCb(sys->opaque, true);
> +    return success ? VLC_SUCCESS : VLC_EGENERIC;
> +}
> +
> +static void ReleaseCurrent(vlc_gl_t *gl)
> +{
> +    vout_display_sys_t *sys = gl->sys;
> +    sys->makeCurrentCb(sys->opaque, false);
> +}
> +
> +static void SwapBuffers(vlc_gl_t *gl)
> +{
> +    vout_display_sys_t *sys = gl->sys;
> +    sys->swapCb(sys->opaque);
> +}
> +
> +static void Resize(vlc_gl_t * gl, unsigned w, unsigned h)
> +{
> +    vout_display_sys_t *sys = gl->sys;
> +    if ( sys->width == w && sys->height == h )
> +        return;
> +
> +    if ( !sys->resizeCb )
> +        return;
> +
> +    MakeCurrent(gl);
> +    sys->resizeCb(sys->opaque, w, h);
> +    ReleaseCurrent(gl);
> +    sys->width = w;
> +    sys->height = h;
> +}
> +
> +static void Close(vlc_object_t *object)
> +{
> +    vlc_gl_t *gl = (vlc_gl_t *)object;
> +    vout_display_sys_t *sys = gl->sys;
> +    if (sys->cleanupCb)
> +        sys->cleanupCb(sys->opaque);

What is the cleanup callback supposed to do? It seems unbalanced.

> +    free(sys);
> +}
> +
> +
> +#define SET_CALLBACK_ADDR(var, varname) \
> +    do {                                                           \
> +        var = var_InheritAddress(gl, varname);                     \
> +        if (! var) {                                               \
> +            msg_Err( gl, varname " address is missing" );          \

Nitpicking but %s would require fewer strings.

> +            goto error;                                            \
> +        }                                                          \
> +    } while(0)
> +
> +static int Open(vlc_object_t *object)
> +{
> +    vlc_gl_t *gl = (vlc_gl_t *)object;
> +    vout_display_sys_t *sys;
> +
> +    /* Allocate structure */
> +    gl->sys = sys = calloc(1, sizeof(*sys));
> +    if (!sys)
> +        return VLC_ENOMEM;
> +
> +    sys->opaque = var_InheritAddress(gl, "vgl-opaque");
> +    sys->resizeCb = var_InheritAddress(gl, "vgl-resize-cb");
> +    sys->cleanupCb = var_InheritAddress(gl, "vgl-cleanup-cb");
> +    SET_CALLBACK_ADDR(sys->makeCurrentCb, "vgl-make-current-cb");
> +    SET_CALLBACK_ADDR(sys->getProcAddressCb, "vgl-get-proc-address-cb");
> +    SET_CALLBACK_ADDR(sys->swapCb, "vgl-swap-cb");
> +
> +    gl->makeCurrent = MakeCurrent;
> +    gl->releaseCurrent = ReleaseCurrent;
> +    gl->resize = Resize;
> +    gl->swap = SwapBuffers;
> +    gl->getProcAddress = OurGetProcAddress;
> +    return VLC_SUCCESS;
> +
> +error:
> +    Close(object);
> +    return VLC_EGENERIC;
> +}
> +
> +#undef SET_CALLBACK_ADDR
> +
> +/**************************************************************************
> *** + * Module descriptor
> +
> ***************************************************************************
> **/ +
> +vlc_module_begin()
> +    set_shortname(N_("GL texture"))
> +    set_description(N_("GL texture output"))
> +    set_category(CAT_VIDEO)
> +    set_subcategory(SUBCAT_VIDEO_VOUT)
> +
> +    set_capability("opengl", 0)
> +    set_callbacks(Open, Close)
> +    add_shortcut("vglmem")
> +
> +    add_submodule ()
> +    set_capability ("opengl es2", 0)
> +    set_callbacks (Open, Close)
> +    add_shortcut ("vglmem")
> +vlc_module_end()


-- 
レミ・デニ-クールモン
http://www.remlab.net/





More information about the vlc-devel mailing list