[vlc-devel] [PATCH v2 17/18] video_output: Add PPAPI plugin

Julian Scheel julian at jusst.de
Mon Mar 13 14:01:59 CET 2017


HI Filip,

On 13.03.2017 13:29, Filip Roséen wrote:
> Hi,
>
> There is a potential leak of |wnd->sys| in
> |modules/video_output/ppapi/window.c:Open|, see comment.

thanks for catching. sys->context is leaked with it potentially.
Fixing it.

-Julian

> On 2017-03-13 12:37, Dennis Hamester wrote:
>
>     |From: Julian Scheel <julian at jusst.de> --- configure.ac | 2 +
>     include/vlc_vout_window.h | 9 ++ modules/video_output/Makefile.am |
>     15 +++ modules/video_output/ppapi/gl.c | 186
>     ++++++++++++++++++++++++++++++++++++
>     modules/video_output/ppapi/window.c | 155
>     ++++++++++++++++++++++++++++++ 5 files changed, 367 insertions(+)
>     create mode 100644 modules/video_output/ppapi/gl.c create mode
>     100644 modules/video_output/ppapi/window.c diff --git a/configure.ac
>     b/configure.ac index 787421810e..ff7b6ede6c 100644 ---
>     a/configure.ac +++ b/configure.ac @@ -302,6 +302,8 @@ case
>     "${host_os}" in AC_DEFINE([_XOPEN_SOURCE], [700], [POSIX and XPG 7th
>     edition]) AC_LIBOBJ([recvmsg]) AC_LIBOBJ([sendmsg]) +
>     VLC_ADD_PLUGIN([gles2]) + VLC_ADD_LIBS([nacl],[-lppapi
>     -lppapi_gles2]) ;; *) SYS="${host_os}" diff --git
>     a/include/vlc_vout_window.h b/include/vlc_vout_window.h index
>     69a719bd2a..6f32a94e12 100644 --- a/include/vlc_vout_window.h +++
>     b/include/vlc_vout_window.h @@ -43,6 +43,9 @@ typedef struct
>     vout_window_sys_t vout_window_sys_t; struct wl_display; struct
>     wl_surface; +struct PPB_Graphics3D_1_0; +typedef struct
>     PPB_Graphics3D_1_0 PPB_Graphics3D; + /** * Window handle type */ @@
>     -53,6 +56,7 @@ enum { VOUT_WINDOW_TYPE_NSOBJECT,
>     VOUT_WINDOW_TYPE_ANDROID_NATIVE, VOUT_WINDOW_TYPE_WAYLAND, +
>     VOUT_WINDOW_TYPE_PPAPI, }; /** @@ -133,12 +137,17 @@ struct
>     vout_window_t { void *nsobject; /* Mac OSX view object */ void
>     *anativewindow; /* Android native window. */ struct wl_surface *wl;
>     /* Wayland surface */ + int32_t pp_context; /* PPAPI context ID */ }
>     handle; /* display server (mandatory) */ union { char *x11; /* X11
>     display (NULL = use default) */ struct wl_display *wl; /* Wayland
>     struct wl_display pointer */ + struct { + int32_t pp_instance; /*
>     PPAPI instance ID */ + PPB_Graphics3D *pp_graphics3d; /* PPAPI
>     graphics3d resource pointer */ + } ppapi; } display; /* Control on
>     the module (mandatory) diff --git a/modules/video_output/Makefile.am
>     b/modules/video_output/Makefile.am index 483a197053..2fdd000ef3
>     100644 --- a/modules/video_output/Makefile.am +++
>     b/modules/video_output/Makefile.am @@ -337,6 +337,21 @@ endif endif
>     +## NaCl/PPAPI ### + +libppapi_gl_plugin_la_SOURCES =
>     video_output/ppapi/gl.c +libppapi_gl_plugin_la_CFLAGS = $(AM_CFLAGS)
>     -DUSE_OPENGL_ES2 +libppapi_gl_plugin_la_LIBADD = $(LIBS_nacl) +
>     +libppapi_window_plugin_la_SOURCES = video_output/ppapi/window.c
>     +libppapi_window_plugin_la_CFLAGS = $(AM_CFLAGS)
>     +libppapi_window_plugin_la_LIBADD = $(LIBS_nacl) + +if HAVE_NACL
>     +vout_LTLIBRARIES += libppapi_gl_plugin.la libppapi_window_plugin.la
>     +endif + + ### FrameBuffer ### libdirectfb_plugin_la_SOURCES =
>     video_output/directfb.c diff --git a/modules/video_output/ppapi/gl.c
>     b/modules/video_output/ppapi/gl.c new file mode 100644 index
>     0000000000..a84e8e36dd --- /dev/null +++
>     b/modules/video_output/ppapi/gl.c @@ -0,0 +1,186 @@
>     +/*****************************************************************************
>     + * gl.c: GL extension for PPAPI/NaCl +
>     *****************************************************************************
>     + * Copyright © 2017 VLC authors and VideoLAN + * + * Authors:
>     Julian Scheel <julian at jusst.de> + * + * 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> + +#include
>     "../opengl/vout_helper.h" + +#include <ppapi/gles2/gl2ext_ppapi.h>
>     +#include <ppapi/c/ppb_graphics_3d.h> +#include <ppapi/c/ppb_view.h>
>     +#include <ppapi/c/pp_completion_callback.h> +#include
>     <ppapi/c/pp_instance.h> +#include <ppapi/c/pp_errors.h> +
>     +/*****************************************************************************
>     + * Module descriptor +
>     *****************************************************************************/
>     +static int Open(vlc_object_t *); +static void Close(vlc_object_t
>     *); + +vlc_module_begin() + set_shortname("PPAPI GL") +
>     set_description(N_("PPAPI extension for OpenGL")) +
>     set_category(CAT_VIDEO) + set_subcategory(SUBCAT_VIDEO_VOUT) + +
>     set_capability("opengl es2", 50) + set_callbacks(Open, Close) +
>     add_shortcut("ppapi-gl", "gles2") +vlc_module_end() +
>     +/*****************************************************************************
>     + * Local prototypes. +
>     *****************************************************************************/
>     + +struct vout_display_sys_t +{ + unsigned width; + unsigned height;
>     + + PP_Instance instance; + PP_Resource context; + PP_Resource
>     viewport; + PPB_Graphics3D *graphics3d; + PPB_View *view; +}; +
>     +static int GetViewSize(vlc_gl_t *gl, int32_t *width, int32_t
>     *height) +{ + vout_display_sys_t *sys = gl->sys; + + struct PP_Rect
>     rect; + if (sys->viewport && + sys->view->IsView(sys->viewport) && +
>     sys->view->GetRect(sys->viewport, &rect)) { + *width =
>     rect.size.width; + *height = rect.size.height; + return VLC_SUCCESS;
>     + } + + return VLC_EGENERIC; +} + +static void Resize(vlc_gl_t *gl,
>     unsigned w, unsigned h) +{ + vout_display_sys_t *sys = gl->sys; + +
>     if (sys->graphics3d->ResizeBuffers(sys->context, w, h) != PP_OK) +
>     msg_Err(gl, "Resizing buffers failed"); +} + +static void
>     Swap(vlc_gl_t *gl) +{ + vout_display_sys_t *sys = gl->sys; + +
>     sys->viewport = var_InheritInteger(gl, "ppapi-view"); + + int32_t
>     width, height; + if (GetViewSize(gl, &width, &height) !=
>     VLC_SUCCESS) + return; + + if (((unsigned)width != sys->width) || +
>     ((unsigned)height != sys->height)) { +
>     vout_window_ReportSize(gl->surface, width, height); + + sys->width =
>     width; + sys->height = height; + } + +
>     sys->graphics3d->SwapBuffers(sys->context, PP_BlockUntilComplete());
>     +} + +static void *GetProcAddress(vlc_gl_t *gl, const char *name) +{
>     + VLC_UNUSED(gl); + VLC_UNUSED(name); + return NULL; +} + +static
>     int MakeCurrent(vlc_gl_t *gl) +{ + vout_display_sys_t *sys =
>     gl->sys; + + glSetCurrentContextPPAPI(sys->context); + return
>     VLC_SUCCESS; +} + +static void ReleaseCurrent(vlc_gl_t *gl) +{ +
>     VLC_UNUSED(gl); + glSetCurrentContextPPAPI(0); +} + +static int
>     Open(vlc_object_t *obj) +{ + vlc_gl_t *gl = (vlc_gl_t *)obj; +
>     vout_display_sys_t *sys; + + /* Allocate structure */ + gl->sys =
>     sys = calloc(1, sizeof(*sys)); + if (!sys) + return VLC_ENOMEM; + +
>     vout_window_t *wnd = gl->surface; + if (wnd->type !=
>     VOUT_WINDOW_TYPE_PPAPI) + goto error; + + sys->graphics3d =
>     wnd->display.ppapi.pp_graphics3d; + sys->instance =
>     wnd->display.ppapi.pp_instance; + sys->context =
>     wnd->handle.pp_context; + + PPB_GetInterface ppb_get_interface =
>     var_InheritAddress(obj, "ppapi-ppb-get-interface"); + if
>     (ppb_get_interface == NULL) { + msg_Err(gl, "Variable
>     ppapi-ppb-get-interface is not set"); + goto error; + } + +
>     sys->view = (PPB_View*)ppb_get_interface(PPB_VIEW_INTERFACE); + if
>     (sys->view == NULL) { + msg_Err(gl, "Failed to get
>     PPB_VIEW_INTERFACE"); + goto error; + } + + gl->makeCurrent =
>     MakeCurrent; + gl->releaseCurrent = ReleaseCurrent; + gl->resize =
>     Resize; + gl->swap = Swap; + gl->getProcAddress = GetProcAddress; +
>     + return VLC_SUCCESS; + +error: + Close(obj); + return VLC_EGENERIC;
>     +} + +static void Close(vlc_object_t *obj) +{ + vlc_gl_t *gl =
>     (vlc_gl_t *)obj; + free(gl->sys); +} diff --git
>     a/modules/video_output/ppapi/window.c
>     b/modules/video_output/ppapi/window.c new file mode 100644 index
>     0000000000..6176b34c4d --- /dev/null +++
>     b/modules/video_output/ppapi/window.c @@ -0,0 +1,155 @@ +/** + *
>     @file window.c + * @brief PPAPI native window provider module for
>     VLC media player + */
>     +/*****************************************************************************
>     + * Copyright © 2017 VLC authors and VideoLAN + * + * Author: Julian
>     Scheel <julian at jusst.de> + * + * 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
>     <stdarg.h> + +#include <vlc_common.h> +#include <vlc_plugin.h>
>     +#include <vlc_vout_window.h> + +#include <ppapi/c/ppb.h> +#include
>     <ppapi/c/ppb_core.h> +#include <ppapi/c/ppb_graphics_3d.h> +#include
>     <ppapi/c/ppb_instance.h> +#include <ppapi/c/pp_instance.h> + +static
>     int Open(vout_window_t*, const vout_window_cfg_t*); +static void
>     Close(vout_window_t*); +static int Control(vout_window_t*, int,
>     va_list ap); + +/* + * Module descriptor + */ +vlc_module_begin() +
>     set_shortname(N_("PPAPI Window")) + set_description(N_("PPAPI
>     drawing area")) + set_category(CAT_VIDEO) +
>     set_subcategory(SUBCAT_VIDEO_VOUT) + set_capability("vout window",
>     10) + set_callbacks(Open, Close) +vlc_module_end() + +struct
>     vout_window_sys_t { + PP_Instance instance; + PP_Resource context; +
>     PPB_Graphics3D *graphics3d; + PPB_Core *core; +}; + +static int
>     Open(vout_window_t *wnd, const vout_window_cfg_t *cfg) +{ + if
>     (cfg->type != VOUT_WINDOW_TYPE_INVALID && + cfg->type !=
>     VOUT_WINDOW_TYPE_PPAPI) + return VLC_EGENERIC; + + vout_window_sys_t
>     *sys = malloc(sizeof (*sys)); + if (sys == NULL) + return
>     VLC_ENOMEM; + + wnd->sys = sys; + + sys->instance =
>     (int)var_InheritInteger(wnd, "ppapi-instance"); + if (sys->instance
>     == 0) + goto error; + + PPB_GetInterface ppb_get_interface =
>     var_InheritAddress(wnd, "ppapi-ppb-get-interface"); + if
>     (ppb_get_interface == NULL) { + msg_Err(wnd, "Variable
>     ppapi-ppb-get-interface is not set"); + goto error; + } + +
>     sys->core = (PPB_Core*)ppb_get_interface(PPB_CORE_INTERFACE); + if
>     (sys->core == NULL) { + msg_Err(wnd, "Failed to get
>     PPB_CORE_INTERFACE"); + goto error; + } + + sys->graphics3d =
>     (PPB_Graphics3D*)ppb_get_interface(PPB_GRAPHICS_3D_INTERFACE); + if
>     (sys->graphics3d == NULL) { + msg_Err(wnd, "Failed to get
>     PPB_GRAPHICS_3D_INTERFACE"); + goto error; + } + + int32_t attr[] =
>     { + PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 0, +
>     PP_GRAPHICS3DATTRIB_BLUE_SIZE, 8, + PP_GRAPHICS3DATTRIB_GREEN_SIZE,
>     8, + PP_GRAPHICS3DATTRIB_RED_SIZE, 8, +
>     PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 0, +
>     PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 0, + PP_GRAPHICS3DATTRIB_WIDTH,
>     (int32_t)cfg->width, + PP_GRAPHICS3DATTRIB_HEIGHT,
>     (int32_t)cfg->height, + PP_GRAPHICS3DATTRIB_GPU_PREFERENCE,
>     PP_GRAPHICS3DATTRIB_GPU_PREFERENCE_LOW_POWER, +
>     PP_GRAPHICS3DATTRIB_NONE + }; + sys->context =
>     sys->graphics3d->Create(sys->instance, 0, attr); +
>     if(!sys->graphics3d->IsGraphics3D(sys->context)) { + msg_Err(wnd,
>     "Failed to create context"); + goto error; + } + + PPB_Instance
>     *instance =
>     (PPB_Instance*)ppb_get_interface(PPB_INSTANCE_INTERFACE); + if
>     (instance == NULL) { + msg_Err(wnd, "Failed to get
>     PPB_INSTANCE_INTERFACE"); + goto error; + } + + if
>     (instance->BindGraphics(sys->instance, sys->context) != PP_TRUE) { +
>     msg_Err(wnd, "Binding PPAPI graphics context to instance failed"); +
>     goto error; + } + + wnd->type = VOUT_WINDOW_TYPE_PPAPI; +
>     wnd->display.ppapi.pp_graphics3d = sys->graphics3d; +
>     wnd->display.ppapi.pp_instance = sys->instance; +
>     wnd->handle.pp_context = sys->context; + wnd->control = Control; + +
>     return VLC_SUCCESS; + +error:|
>
> Leak of |wnd->sys|.
>
>     |+ return VLC_EGENERIC; +} + +static void Close(vout_window_t *wnd)
>     +{ + vout_window_sys_t *sys = wnd->sys; + if (sys->graphics3d && +
>     sys->graphics3d->IsGraphics3D(sys->context) && + sys->core) +
>     sys->core->ReleaseResource(sys->context); + free(sys); +} + +static
>     int Control(vout_window_t *wnd, int cmd, va_list ap) +{ +
>     VLC_UNUSED(cmd); + VLC_UNUSED(ap); + msg_Err(wnd, "control requests
>     not supported"); + return VLC_EGENERIC; +} -- 2.12.0
>     _______________________________________________ vlc-devel mailing
>     list To unsubscribe or modify your subscription options:
>     https://mailman.videolan.org/listinfo/vlc-devel|
>
>
>
> _______________________________________________
> 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